]> andersk Git - moira.git/blame - server/qsubs.c
.dc -> .pc
[moira.git] / server / qsubs.c
CommitLineData
3e10560e 1/*
2 * $Source$
3 * $Author$
4 * $Header$
5 *
6 * Copyright (C) 1987 by the Massachusetts Institute of Technology
c801de4c 7 * For copying and distribution information, please see the file
8 * <mit-copyright.h>.
3e10560e 9 *
3e10560e 10 */
11
12#ifndef lint
13static char *rcsid_qsubs_c = "$Header$";
14#endif lint
15
c801de4c 16#include <mit-copyright.h>
d548a4e7 17#include <moira.h>
03c05291 18#include "mr_server.h"
97479f6f 19#include "query.h"
20
c5a0c32c 21#ifdef MULTIPROTOCOLS
c351960a 22extern struct query Queries1[], Queries2[];
23extern int QueryCount1, QueryCount2;
c5a0c32c 24#else
25extern struct query Queries2[];
26extern int QueryCount2;
27#endif MULTIPROTOCOLS
97479f6f 28
29struct query *
c351960a 30get_query_by_name(name, version)
3e10560e 31 register char *name;
c351960a 32 int version;
97479f6f 33{
3e10560e 34 register struct query *q;
35 register int i;
36
c5a0c32c 37#ifdef MULTIPROTOCOLS
d548a4e7 38 if (version == MR_VERSION_1) {
c351960a 39 q = Queries1;
40 i = QueryCount1;
41 } else {
c5a0c32c 42#endif
c351960a 43 q = Queries2;
44 i = QueryCount2;
c5a0c32c 45#ifdef MULTIPROTOCOLS
c351960a 46 }
c5a0c32c 47#endif
3e10560e 48
49 if (strlen(name) == 4) {
50 while (--i >= 0) {
51 if (!strcmp(q->shortname, name)) return(q);
52 q++;
97479f6f 53 }
3e10560e 54 } else {
55 while (--i >= 0) {
56 if (!strcmp(q->name, name)) return(q);
57 q++;
58 }
59 }
97479f6f 60
3e10560e 61 return((struct query *)0);
97479f6f 62}
63
03c05291 64void list_queries(version, action, actarg)
c351960a 65 int version;
ab70c698 66 int (*action)();
960b073b 67 char *actarg;
ab70c698 68{
69 register struct query *q;
70 register int i;
c5a0c32c 71#ifdef MULTIPROTOCOLS
c351960a 72 static struct query **squeries1 = (struct query **)0;
c5a0c32c 73#endif
c351960a 74 static struct query **squeries2 = (struct query **)0;
ab70c698 75 register struct query **sq;
76 char qnames[80];
77 char *qnp;
c351960a 78 int count;
ab70c698 79 int qcmp();
80
c5a0c32c 81#ifdef MULTIPROTOCOLS
d548a4e7 82 if (version == MR_VERSION_1) {
c351960a 83 count = QueryCount1;
84 if (squeries1 == (struct query **)0) {
85 sq = (struct query **)malloc(count * sizeof (struct query *));
86 squeries1 = sq;
87 q = Queries1;
88 for (i = count; --i >= 0; )
89 *sq++ = q++;
90 qsort(squeries1, count, sizeof (struct query *), qcmp);
91 }
92 sq = squeries1;
93 } else {
c5a0c32c 94#endif
c351960a 95 count = QueryCount2;
96 if (squeries2 == (struct query **)0) {
97 sq = (struct query **)malloc(count * sizeof (struct query *));
98 squeries2 = sq;
99 q = Queries2;
100 for (i = count; --i >= 0; )
101 *sq++ = q++;
102 qsort(squeries2, count, sizeof (struct query *), qcmp);
103 }
104 sq = squeries2;
c5a0c32c 105#ifdef MULTIPROTOCOLS
c351960a 106 }
c5a0c32c 107#endif
ab70c698 108
109 qnp = qnames;
c351960a 110 for (i = count; --i >= 0; sq++) {
ab70c698 111 sprintf(qnames, "%s (%s)", (*sq)->name, (*sq)->shortname);
112 (*action)(1, &qnp, actarg);
113 }
c351960a 114 strcpy(qnames, "_help");
115 (*action)(1, &qnp, actarg);
116 strcpy(qnames, "_list_queries");
117 (*action)(1, &qnp, actarg);
118 strcpy(qnames, "_list_users");
119 (*action)(1, &qnp, actarg);
ab70c698 120}
121
03c05291 122void help_query(q, action, actarg)
ab70c698 123 register struct query *q;
124 int (*action)();
960b073b 125 char *actarg;
ab70c698 126{
127 register int argcount;
128 register int i;
129 char argn[32];
c351960a 130 char qname[512];
131 char argr[512];
ab70c698 132 char *argv[32];
133
134 argcount = q->argc;
135 if (q->type == UPDATE || q->type == APPEND) argcount += q->vcnt;
136
137 switch (argcount) {
138 case 0:
c351960a 139 sprintf(qname, " %s, %s ()", q->name, q->shortname);
ab70c698 140 argv[0] = qname;
c351960a 141 argcount = 1;
ab70c698 142 break;
143
144 case 1:
c351960a 145 sprintf(qname, " %s, %s (%s)", q->name, q->shortname, q->fields[0]);
ab70c698 146 argv[0] = qname;
c351960a 147 argcount = 1;
ab70c698 148 break;
149
150 case 2:
c351960a 151 sprintf(qname, " %s, %s (%s, %s)", q->name, q->shortname,
152 q->fields[0], q->fields[1]);
ab70c698 153 argv[0] = qname;
c351960a 154 argcount = 1;
ab70c698 155 break;
156
157 default:
c351960a 158 sprintf(qname, " %s, %s (%s", q->name, q->shortname, q->fields[0]);
ab70c698 159 argv[0] = qname;
160 argcount--;
161 for (i = 1; i < argcount; i++) argv[i] = q->fields[i];
162 sprintf(argn, "%s)", q->fields[argcount]);
c351960a 163 argv[argcount++] = argn;
ab70c698 164 break;
165 }
c351960a 166 if (q->type == RETRIEVE) {
167 sprintf(argr, "%s => %s", argv[--argcount], q->fields[q->argc]);
168 argv[argcount++] = argr;
169 if (q->vcnt > 1)
170 for (i = q->argc + 1; i < q->vcnt + q->argc; i++)
171 argv[argcount++] = q->fields[i];
172 }
173 (*action)(argcount, argv, actarg);
ab70c698 174}
175
176qcmp(q1, q2)
177 struct query **q1;
178 struct query **q2;
179{
180 return(strcmp((*q1)->name, (*q2)->name));
181}
This page took 0.108505 seconds and 5 git commands to generate.