3 * Copyright (C) 1987-1998 by the Massachusetts Institute of Technology
4 * For copying and distribution information, please see the file
8 #include <mit-copyright.h>
16 extern struct query Queries[];
17 extern int QueryCount;
19 int qcmp(const void *q1, const void *q2);
21 struct query *get_query_by_name(char *name, int version)
27 if (strlen(name) == 4)
31 if (!strcmp(Queries[i].shortname, name) &&
32 Queries[i].version <= version)
40 if (!strcmp(Queries[i].name, name) &&
41 Queries[i].version <= version)
49 void list_queries(client *cl, int (*action)(int, char *[], void *),
52 static struct query **squeries = NULL;
54 struct query *q, **sq;
61 squeries = sq = xmalloc(QueryCount * sizeof(struct query *));
63 for (i = 0; i < QueryCount; i++)
65 if (q->version > cl->version)
67 if (i > 0 && strcmp((*sq)->name, q->name))
71 qcount = (sq - squeries) + 1;
72 qsort(squeries, qcount, sizeof(struct query *), qcmp);
77 for (i = qcount; --i >= 0; sq++)
79 sprintf(qnames, "%s (%s)", (*sq)->name, (*sq)->shortname);
80 (*action)(1, &qnp, actarg);
82 strcpy(qnames, "_help");
83 (*action)(1, &qnp, actarg);
84 strcpy(qnames, "_list_queries");
85 (*action)(1, &qnp, actarg);
86 strcpy(qnames, "_list_users");
87 (*action)(1, &qnp, actarg);
90 void help_query(struct query *q, int (*action)(int, char *[], void *),
101 if (q->type == UPDATE || q->type == APPEND)
107 sprintf(qname, " %s, %s ()", q->name, q->shortname);
113 sprintf(qname, " %s, %s (%s)", q->name, q->shortname, q->fields[0]);
119 sprintf(qname, " %s, %s (%s, %s)", q->name, q->shortname,
120 q->fields[0], q->fields[1]);
126 sprintf(qname, " %s, %s (%s", q->name, q->shortname, q->fields[0]);
129 for (i = 1; i < argcount; i++)
130 argv[i] = q->fields[i];
131 sprintf(argn, "%s)", q->fields[argcount]);
132 argv[argcount++] = argn;
136 if (q->type == RETRIEVE)
138 sprintf(argr, "%s => %s", argv[--argcount], q->fields[q->argc]);
139 argv[argcount++] = argr;
142 for (i = q->argc + 1; i < q->vcnt + q->argc; i++)
143 argv[argcount++] = q->fields[i];
146 (*action)(argcount, argv, actarg);
149 int qcmp(const void *q1, const void *q2)
151 return strcmp((*(struct query **)q1)->name, (*(struct query **)q2)->name);