3 * Generic Queue Routines
5 * Copyright (C) 1988-1998 by the Massachusetts Institute of Technology.
6 * For copying and distribution information, please see the file
10 #include <mit-copyright.h>
18 struct save_queue *sq_create(void)
20 struct save_queue *sq;
22 sq = malloc(sizeof(struct save_queue));
31 int sq_save_data(struct save_queue *sq, void *data)
35 q = malloc(sizeof(struct save_queue));
39 q->q_prev = sq->q_prev;
40 sq->q_prev->q_next = q;
46 int sq_save_args(int argc, char *argv[], struct save_queue *sq)
51 argv_copy = malloc(argc * sizeof(char *));
54 for (i = 0; i < argc; i++)
56 n = strlen(argv[i]) + 1;
57 argv_copy[i] = malloc(n);
60 for (i--; i >= 0; i--)
65 memcpy(argv_copy[i], argv[i], n);
68 return sq_save_data(sq, argv_copy);
71 int sq_save_unique_data(struct save_queue *sq, void *data)
75 for (q = sq->q_next; q != sq; q = q->q_next)
77 if (q->q_data == data)
81 return sq_save_data(sq, data);
84 int sq_save_unique_string(struct save_queue *sq, char *data)
88 for (q = sq->q_next; q != sq; q = q->q_next)
90 if (!strcmp(q->q_data, data))
94 return sq_save_data(sq, data);
97 /* in sq_get_data and sq_remove_data, `data' is actually a pointer to the
98 variable to put the data in to. */
100 int sq_get_data(struct save_queue *sq, void *data)
104 if (sq->q_lastget == NULL)
105 sq->q_lastget = sq->q_next;
107 sq->q_lastget = sq->q_lastget->q_next;
109 if (sq->q_lastget == sq)
111 *dptr = sq->q_lastget->q_data;
115 int sq_remove_data(struct save_queue *sq, void *data)
119 if (sq->q_next != sq)
121 *dptr = sq->q_next->q_data;
122 sq->q_next = sq->q_next->q_next;
123 free(sq->q_next->q_prev);
124 sq->q_next->q_prev = sq;
130 void sq_remove_last_data(struct save_queue *sq)
132 struct save_queue *rem = sq->q_lastget;
136 rem->q_next->q_prev = sq->q_lastget = rem->q_prev;
137 rem->q_prev->q_next = rem->q_next;
142 int sq_empty(struct save_queue *sq)
144 if (sq->q_next == sq)
150 void sq_destroy(struct save_queue *sq)
152 struct save_queue *q;
154 for (q = sq->q_next; q != sq; q = sq->q_next)
156 sq->q_next = q->q_next;