]>
Commit | Line | Data |
---|---|---|
3e10560e | 1 | /* |
2 | * $Source$ | |
3 | * $Author$ | |
4 | * $Header$ | |
5 | * | |
6 | * Copyright (C) 1987 by the Massachusetts Institute of Technology | |
7 | * | |
8 | * $Log$ | |
9 | * Revision 1.2 1987-06-08 03:08:15 wesommer | |
10 | * Reindented; added header. | |
11 | * | |
12 | */ | |
13 | ||
14 | #ifndef lint | |
15 | static char *rcsid_qsubs_c = "$Header$"; | |
16 | #endif lint | |
17 | ||
97479f6f | 18 | #include "query.h" |
19 | ||
20 | extern struct query Queries[]; | |
21 | extern int QueryCount; | |
3e10560e | 22 | #ifdef notdef |
97479f6f | 23 | extern struct s_query S_Queries[]; |
24 | extern int S_QueryCount; | |
3e10560e | 25 | #endif notdef |
97479f6f | 26 | |
27 | struct query * | |
28 | get_query_by_name(name) | |
3e10560e | 29 | register char *name; |
97479f6f | 30 | { |
3e10560e | 31 | register struct query *q; |
32 | register int i; | |
33 | ||
34 | q = Queries; | |
35 | i = QueryCount; | |
36 | ||
37 | if (strlen(name) == 4) { | |
38 | while (--i >= 0) { | |
39 | if (!strcmp(q->shortname, name)) return(q); | |
40 | q++; | |
97479f6f | 41 | } |
3e10560e | 42 | } else { |
43 | while (--i >= 0) { | |
44 | if (!strcmp(q->name, name)) return(q); | |
45 | q++; | |
46 | } | |
47 | } | |
97479f6f | 48 | |
3e10560e | 49 | return((struct query *)0); |
97479f6f | 50 | } |
51 | ||
52 | get_input_fields(q, argc, argv) | |
3e10560e | 53 | register struct query *q; |
54 | int *argc; | |
55 | char ***argv; | |
97479f6f | 56 | { |
3e10560e | 57 | *argv = q->fields; |
58 | *argc = q->sargc + q->argc; | |
59 | if (q->type == UPDATE || q->type == APPEND) | |
60 | *argc += q->vcnt; | |
97479f6f | 61 | } |
62 | ||
63 | get_output_fields(q, argc, argv) | |
3e10560e | 64 | register struct query *q; |
65 | int *argc; | |
66 | char ***argv; | |
97479f6f | 67 | { |
3e10560e | 68 | if (q->type == RETRIEVE) { |
69 | *argc = q->vcnt; | |
70 | *argv = &q->fields[q->sargc + q->argc]; | |
71 | } else { | |
72 | *argc = 0; | |
73 | *argv = (char **)0; | |
74 | } | |
97479f6f | 75 | } |
76 | ||
77 | char * | |
78 | get_field(q, argv, name) | |
3e10560e | 79 | register struct query *q; |
80 | char *argv[]; | |
81 | char *name; | |
97479f6f | 82 | { |
3e10560e | 83 | register char **fp; |
84 | register char *field; | |
85 | register int i; | |
86 | ||
87 | if (q->type != RETRIEVE) return((char *)0); | |
88 | ||
89 | if (*name == '*') name++; | |
90 | fp = &q->fields[q->sargc + q->argc]; | |
91 | for (i = 0; i < q->vcnt; i++) { | |
92 | field = *fp++; | |
93 | if (*field == '*') field++; | |
94 | if (!strcmp(field, name)) return(argv[i]); | |
95 | } | |
96 | return((char *)0); | |
97479f6f | 97 | } |
98 | ||
99 | put_field(q, argv, name, value) | |
3e10560e | 100 | register struct query *q; |
101 | char *argv[]; | |
102 | char *name; | |
103 | char *value; | |
97479f6f | 104 | { |
3e10560e | 105 | register char **fp; |
106 | register char *field; | |
107 | register int i; | |
108 | register int n; | |
109 | ||
110 | n = q->sargc + q->argc; | |
111 | if (q->type == UPDATE || q->type == APPEND) n += q->vcnt; | |
112 | ||
113 | if (*name == '*') name++; | |
114 | fp = q->fields; | |
115 | for (i = 0; i < n; i++) { | |
116 | field = *fp++; | |
117 | if (*field == '*') field++; | |
118 | if (!strcmp(field, name)) { | |
119 | strcpy(argv[i], value); | |
120 | return(0); | |
97479f6f | 121 | } |
3e10560e | 122 | } |
123 | return(-1); | |
97479f6f | 124 | } |
125 | ||
126 | ||
127 | /* Generic Queue Routines */ | |
128 | ||
129 | struct save_queue * | |
130 | sq_create() | |
131 | { | |
3e10560e | 132 | register struct save_queue *sq; |
97479f6f | 133 | |
3e10560e | 134 | sq = (struct save_queue *)malloc(sizeof (struct save_queue)); |
135 | sq->q_next = sq; | |
136 | sq->q_prev = sq; | |
137 | sq->q_lastget = 0; | |
138 | return(sq); | |
97479f6f | 139 | } |
140 | ||
141 | sq_save_data(sq, data) | |
3e10560e | 142 | register struct save_queue *sq; |
143 | char *data; | |
97479f6f | 144 | { |
3e10560e | 145 | register struct save_queue *q; |
146 | ||
147 | q = (struct save_queue *)malloc(sizeof (struct save_queue)); | |
148 | q->q_next = sq; | |
149 | q->q_prev = sq->q_prev; | |
150 | sq->q_prev->q_next = q; | |
151 | sq->q_prev = q; | |
152 | q->q_data = data; | |
97479f6f | 153 | } |
154 | ||
155 | sq_get_data(sq, data) | |
3e10560e | 156 | register struct save_queue *sq; |
157 | register char **data; | |
97479f6f | 158 | { |
3e10560e | 159 | if (sq->q_lastget == (struct save_queue *)0) { |
160 | sq->q_lastget = sq->q_next; | |
161 | } else { | |
162 | sq->q_lastget = sq->q_lastget->q_next; | |
163 | } | |
164 | ||
165 | if (sq->q_lastget == sq) return(0); | |
166 | *data = sq->q_lastget->q_data; | |
167 | return(1); | |
97479f6f | 168 | } |
169 | ||
170 | sq_destroy(sq) | |
3e10560e | 171 | register struct save_queue *sq; |
97479f6f | 172 | { |
3e10560e | 173 | register struct save_queue *q; |
97479f6f | 174 | |
3e10560e | 175 | for (q = sq->q_next; q != sq; q = sq->q_next) { |
176 | sq->q_next = q->q_next; | |
177 | free(q); | |
178 | } | |
179 | free(sq); | |
97479f6f | 180 | } |
3e10560e | 181 | |
182 | ||
183 | /* | |
184 | * Local Variables: | |
185 | * mode: c | |
186 | * c-indent-level: 4 | |
187 | * c-continued-statement-offset: 4 | |
188 | * c-brace-offset: -4 | |
189 | * c-argdecl-indent: 4 | |
190 | * c-label-offset: -4 | |
191 | * End: | |
192 | */ |