6 * Copyright (C) 1987 by the Massachusetts Institute of Technology
9 * Revision 1.4 1987-08-29 00:04:14 mike
10 * added sq_save_unique_string
12 * Revision 1.3 87/08/22 17:44:39 wesommer
13 * Cleaning up after mike again.
15 * Revision 1.2 87/06/08 03:08:15 wesommer
16 * Reindented; added header.
21 static char *rcsid_qsubs_c = "$Header$";
26 extern struct query Queries[];
27 extern int QueryCount;
29 extern struct s_query S_Queries[];
30 extern int S_QueryCount;
34 get_query_by_name(name)
37 register struct query *q;
43 if (strlen(name) == 4) {
45 if (!strcmp(q->shortname, name)) return(q);
50 if (!strcmp(q->name, name)) return(q);
55 return((struct query *)0);
58 list_queries(action, actarg)
62 register struct query *q;
64 static struct query **squeries = (struct query **)0;
65 register struct query **sq;
70 if (squeries == (struct query **)0)
72 sq = (struct query **)malloc(QueryCount * sizeof (struct query *));
75 for (i = QueryCount; --i >= 0; )
77 qsort(squeries, QueryCount, sizeof (struct query *), qcmp);
84 for (i = QueryCount; --i >= 0; sq++) {
85 sprintf(qnames, "%s (%s)", (*sq)->name, (*sq)->shortname);
86 (*action)(1, &qnp, actarg);
90 help_query(q, action, actarg)
91 register struct query *q;
95 register int argcount;
102 if (q->type == UPDATE || q->type == APPEND) argcount += q->vcnt;
106 sprintf(qname, " %s ()", q->shortname);
108 (*action)(1, argv, actarg);
112 sprintf(qname, " %s (%s)", q->shortname, q->fields[0]);
114 (*action)(1, argv, actarg);
118 sprintf(qname, " %s (%s, %s)", q->shortname, q->fields[0],
121 (*action)(1, argv, actarg);
125 sprintf(qname, " %s (%s", q->shortname, q->fields[0]);
128 for (i = 1; i < argcount; i++) argv[i] = q->fields[i];
129 sprintf(argn, "%s)", q->fields[argcount]);
130 argv[argcount] = argn;
131 (*action)(argcount+1, argv, actarg);
140 return(strcmp((*q1)->name, (*q2)->name));
143 get_input_fields(q, argc, argv)
144 register struct query *q;
150 if (q->type == UPDATE || q->type == APPEND)
154 get_output_fields(q, argc, argv)
155 register struct query *q;
159 if (q->type == RETRIEVE) {
161 *argv = &q->fields[q->argc];
169 get_field(q, argv, name)
170 register struct query *q;
175 register char *field;
178 if (q->type != RETRIEVE) return((char *)0);
180 if (*name == '*') name++;
181 fp = &q->fields[q->argc];
182 for (i = 0; i < q->vcnt; i++) {
184 if (*field == '*') field++;
185 if (!strcmp(field, name)) return(argv[i]);
190 put_field(q, argv, name, value)
191 register struct query *q;
197 register char *field;
202 if (q->type == UPDATE || q->type == APPEND) n += q->vcnt;
204 if (*name == '*') name++;
206 for (i = 0; i < n; i++) {
208 if (*field == '*') field++;
209 if (!strcmp(field, name)) {
210 strcpy(argv[i], value);
218 /* Generic Queue Routines */
223 register struct save_queue *sq;
225 sq = (struct save_queue *)malloc(sizeof (struct save_queue));
232 sq_save_data(sq, data)
233 register struct save_queue *sq;
236 register struct save_queue *q;
238 q = (struct save_queue *)malloc(sizeof (struct save_queue));
240 q->q_prev = sq->q_prev;
241 sq->q_prev->q_next = q;
246 sq_save_args(argc, argv, sq)
247 register struct save_queue *sq;
249 register char *argv[];
251 register char **argv_copy;
255 argv_copy = (char **)malloc(argc * sizeof (char *));
256 for (i = 0; i < argc; i++) {
257 n = strlen(argv[i]) + 1;
258 argv_copy[i] = (char *)malloc(n);
259 bcopy(argv[i], argv_copy[i], n);
262 sq_save_data(sq, argv_copy);
265 sq_save_unique_data(sq, data)
266 register struct save_queue *sq;
269 register struct save_queue *q;
271 for (q = sq->q_next; q != sq; q = sq->q_next)
272 if (q->q_data == data) return;
274 sq_save_data(sq, data);
277 sq_save_unique_string(sq, data)
278 register struct save_queue *sq;
281 register struct save_queue *q;
283 for (q = sq->q_next; q != sq; q = sq->q_next)
284 if (!strcmp(q->q_data, data)) return;
286 sq_save_data(sq, data);
289 sq_get_data(sq, data)
290 register struct save_queue *sq;
291 register char **data;
293 if (sq->q_lastget == (struct save_queue *)0) {
294 sq->q_lastget = sq->q_next;
296 sq->q_lastget = sq->q_lastget->q_next;
299 if (sq->q_lastget == sq) return(0);
300 *data = sq->q_lastget->q_data;
305 register struct save_queue *sq;
307 register struct save_queue *q;
309 for (q = sq->q_next; q != sq; q = sq->q_next) {
310 sq->q_next = q->q_next;
321 * c-continued-statement-offset: 4
323 * c-argdecl-indent: 4