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>
14 extern char *malloc();
19 register struct save_queue *sq;
21 sq = (struct save_queue *)malloc(sizeof (struct save_queue));
30 sq_save_data(sq, data)
31 register struct save_queue *sq;
34 register struct save_queue *q;
36 q = (struct save_queue *)malloc(sizeof (struct save_queue));
39 q->q_prev = sq->q_prev;
40 sq->q_prev->q_next = q;
47 sq_save_args(argc, argv, sq)
48 register struct save_queue *sq;
50 register char *argv[];
52 register char **argv_copy;
56 argv_copy = (char **)malloc(argc * sizeof (char *));
57 if (!argv_copy) return 0;
58 for (i = 0; i < argc; i++) {
59 n = strlen(argv[i]) + 1;
60 argv_copy[i] = (char *)malloc(n);
62 for(i--; i>=0; i--) free(argv_copy[i]);
63 free((char **)argv_copy);
66 memcpy(argv_copy[i], argv[i], n);
69 return sq_save_data(sq, (char *)argv_copy);
73 sq_save_unique_data(sq, data)
74 register struct save_queue *sq;
77 register struct save_queue *q;
79 for (q = sq->q_next; q != sq; q = q->q_next)
80 if (q->q_data == data) return;
82 return sq_save_data(sq, data);
86 sq_save_unique_string(sq, data)
87 register struct save_queue *sq;
90 register struct save_queue *q;
92 for (q = sq->q_next; q != sq; q = q->q_next)
93 if (!strcmp(q->q_data, data)) return;
95 return sq_save_data(sq, data);
100 register struct save_queue *sq;
101 register char **data;
103 if (sq->q_lastget == (struct save_queue *)0) {
104 sq->q_lastget = sq->q_next;
106 sq->q_lastget = sq->q_lastget->q_next;
109 if (sq->q_lastget == sq) return(0);
110 *data = sq->q_lastget->q_data;
115 sq_remove_data(sq, data)
116 register struct save_queue *sq;
117 register char **data;
119 if (sq->q_next != sq) {
120 *data = sq->q_next->q_data;
121 sq->q_next = sq->q_next->q_next;
122 free(sq->q_next->q_prev);
123 sq->q_next->q_prev = sq;
130 register struct save_queue *sq;
132 if (sq->q_next == sq)
139 register struct save_queue *sq;
141 register struct save_queue *q;
143 for (q = sq->q_next; q != sq; q = sq->q_next) {
144 sq->q_next = q->q_next;