3 * Generic Queue Routines
5 * (c) Copyright 1988 by the Massachusetts Institute of Technology.
6 * For copying and distribution information, please see the file
10 #include <mit-copyright.h>
15 struct save_queue *sq_create(void)
17 register struct save_queue *sq;
19 sq = malloc(sizeof(struct save_queue));
28 int sq_save_data(register struct save_queue *sq, char *data)
30 register struct save_queue *q;
32 q = malloc(sizeof(struct save_queue));
36 q->q_prev = sq->q_prev;
37 sq->q_prev->q_next = q;
43 int sq_save_args(register int argc, register char *argv[],
44 register struct save_queue *sq)
46 register char **argv_copy;
50 argv_copy = malloc(argc * sizeof(char *));
53 for (i = 0; i < argc; i++)
55 n = strlen(argv[i]) + 1;
56 argv_copy[i] = malloc(n);
59 for (i--; i >= 0; i--)
64 memcpy(argv_copy[i], argv[i], n);
67 return sq_save_data(sq, (char *)argv_copy);
70 int sq_save_unique_data(register struct save_queue *sq, char *data)
72 register struct save_queue *q;
74 for (q = sq->q_next; q != sq; q = q->q_next)
76 if (q->q_data == data)
80 return sq_save_data(sq, data);
83 int sq_save_unique_string(register struct save_queue *sq, char *data)
85 register struct save_queue *q;
87 for (q = sq->q_next; q != sq; q = q->q_next)
89 if (!strcmp(q->q_data, data))
93 return sq_save_data(sq, data);
96 int sq_get_data(register struct save_queue *sq, register char **data)
98 if (sq->q_lastget == (struct save_queue *)0)
99 sq->q_lastget = sq->q_next;
101 sq->q_lastget = sq->q_lastget->q_next;
103 if (sq->q_lastget == sq)
105 *data = sq->q_lastget->q_data;
109 int sq_remove_data(register struct save_queue *sq, register char **data)
111 if (sq->q_next != sq)
113 *data = sq->q_next->q_data;
114 sq->q_next = sq->q_next->q_next;
115 free(sq->q_next->q_prev);
116 sq->q_next->q_prev = sq;
122 int sq_empty(register struct save_queue *sq)
124 if (sq->q_next == sq)
130 sq_destroy(register struct save_queue *sq)
132 register struct save_queue *q;
134 for (q = sq->q_next; q != sq; q = sq->q_next)
136 sq->q_next = q->q_next;