RCSID("$Header$");
-extern struct query Queries2[];
-extern int QueryCount2;
+extern struct query Queries[];
+extern int QueryCount;
int qcmp(const void *q1, const void *q2);
-struct query *get_query_by_name(char *name)
+struct query *get_query_by_name(char *name, int version)
{
- struct query *q;
int i;
- q = Queries2;
- i = QueryCount2;
+ i = QueryCount;
if (strlen(name) == 4)
{
while (--i >= 0)
{
- if (!strcmp(q->shortname, name))
- return q;
- q++;
+ if (!strcmp(Queries[i].shortname, name) &&
+ Queries[i].version <= version)
+ return &Queries[i];
}
}
else
{
while (--i >= 0)
{
- if (!strcmp(q->name, name))
- return q;
- q++;
+ if (!strcmp(Queries[i].name, name) &&
+ Queries[i].version <= version)
+ return &Queries[i];
}
}
return NULL;
}
-void list_queries(int (*action)(int, char *[], void *), void *actarg)
+void list_queries(client *cl, int (*action)(int, char *[], void *),
+ void *actarg)
{
- struct query *q;
- int i;
- static struct query **squeries2 = NULL;
- struct query **sq;
+ struct query **squeries = NULL;
+ int qcount;
+ struct query *q, **sq;
char qnames[80];
char *qnp;
- int count;
+ int i;
- count = QueryCount2;
- if (!squeries2)
+ squeries = sq = xmalloc(QueryCount * sizeof(struct query *));
+ q = Queries;
+ for (i = 0; i < QueryCount; i++)
{
- sq = malloc(count * sizeof(struct query *));
- squeries2 = sq;
- q = Queries2;
- for (i = count; --i >= 0; )
- *sq++ = q++;
- qsort(squeries2, count, sizeof(struct query *), qcmp);
+ if (q->version > cl->version)
+ {
+ q++;
+ continue;
+ }
+ if (i > 0 && strcmp((*sq)->name, q->name))
+ sq++;
+ *sq = q++;
}
- sq = squeries2;
+ qcount = (sq - squeries) + 1;
+ qsort(squeries, qcount, sizeof(struct query *), qcmp);
+
+ sq = squeries;
qnp = qnames;
- for (i = count; --i >= 0; sq++)
+ for (i = qcount; --i >= 0; sq++)
{
sprintf(qnames, "%s (%s)", (*sq)->name, (*sq)->shortname);
(*action)(1, &qnp, actarg);
(*action)(1, &qnp, actarg);
strcpy(qnames, "_list_users");
(*action)(1, &qnp, actarg);
+
+ free(squeries);
}
void help_query(struct query *q, int (*action)(int, char *[], void *),