]> andersk Git - moira.git/blame - clients/mrtest/tst.c
sync'ing files for RCS->CVS migration
[moira.git] / clients / mrtest / tst.c
CommitLineData
92e88c2c 1/*
2 * $Source$
3 * $Author$
4 * $Header$
5 *
6 * Copyright (C) 1991 by the Massachusetts Institute of Technology
7 * For copying and distribution information, please see the file
8 * <mit-copyright.h>.
9 *
10 */
11
12
13#include <stdio.h>
14#include <sys/types.h>
15#include <sys/file.h>
16#include <ctype.h>
f071d8a7 17#include <string.h>
92e88c2c 18#include <moira.h>
2b6bd16d 19#include <ss/ss.h>
92e88c2c 20#include "mr_err_array.h"
21
22extern ss_execute_line();
23extern print_reply();
24extern CompData();
25extern int ss;
26extern int errno;
27extern int count;
28extern int recursion;
29
30char *DataBuf;
31char *ErrorBuf;
32
33test_test (argc, argv)
34int argc;
35char *argv[];
36{
37 FILE *inp, *outp;
f071d8a7 38 char *cp;
92e88c2c 39 int LineNum;
40 int status;
41 int NumArgs;
42 char *ValArgs[50];
43 char lastcmd[BUFSIZ], input[BUFSIZ], cmd[BUFSIZ];
44
45 DataBuf = (char *)malloc (2222);
46 ErrorBuf = (char *)malloc (30);
47
48 if (recursion > 8) {
49 ss_perror(ss, 0, "too many levels deep in script/test files\n");
50 return;
51 }
52
53 if (argc < 2) {
54 ss_perror(ss, 0, "Usage: test input_file [ output_file ]");
55 return;
56 }
57
58 inp = fopen(argv[1], "r");
59 if (inp == NULL) {
bddd8492 60 sprintf(cmd, "Cannot open input file %s", argv[1]);
61 ss_perror(ss, 0, cmd);
92e88c2c 62 return;
63 }
64
65 if (argc == 3) {
66 outp = fopen(argv[2], "a");
67 if (!outp) {
bddd8492 68 sprintf(cmd, "Unable to open output for %s\n", argv[2]);
69 ss_perror(ss, errno, cmd);
92e88c2c 70 return;}}
71 else outp = stdout;
72
73 *lastcmd = '\0';
74
75 recursion++;
76
77 for(LineNum = 0;;LineNum++) {
78 *DataBuf = '\0';
79 *ErrorBuf = '\0';
80 if (fgets(input, BUFSIZ, inp) == NULL) {
81 if (lastcmd[0] != '\0') {
82 strcpy (input, lastcmd);
83 lastcmd[0] = '\0';}
84 else break;}
f071d8a7 85 if ((cp = strchr(input, '\n')) != (char *)NULL)
92e88c2c 86 *cp = 0;
87 if (input[0] == 0) continue;
88
89 if (input[0] == '%') {
90 for (cp = &input[1]; *cp && isspace(*cp); cp++);
91 strcat(DataBuf, "Comment: ");
92 strcat(DataBuf, cp);
93 strcat(DataBuf, "\n");
94 continue;
95 }
96
97 if (input[0] == '>') { /* Load in a Comparison String */
98 if (lastcmd[0] == '\0') {
99 fprintf(outp,
100 "\nERROR IN LINE %d: Comparison String Without Comparable Command\n",
101 LineNum);
102 fprintf(outp, "%s\n", input);
103 *DataBuf = '\0';
104 continue;}
105 else { /* Parse and Execute command with compare */
106 sprintf (cmd, "COMPARE_%s", lastcmd);
f071d8a7 107 memset((char *)ValArgs, 0, sizeof(ValArgs));
92e88c2c 108 Partial_parse_string(0, cmd, &NumArgs, ValArgs);
109 ValArgs[NumArgs] = (char *)malloc(sizeof(char) * (1+strlen(input)));
110 strcpy(ValArgs[NumArgs], input);
111 status = ss_execute_command(ss, ValArgs);
112 lastcmd[0] = '\0';
113
114/* Dump errors and data if necessary */
115 if (!strcmp(ErrorBuf, "Malformed Comparison String0")) {
116 fprintf(outp, "\nERROR IN LINE %d: %s\n", LineNum, ErrorBuf);
117 fprintf(outp, "%s\n", input);
118 continue;}
119 else if (*ErrorBuf) { /* Data Error */
120 fprintf(outp, "\nERROR IN LINE %d: %s\n", LineNum, ErrorBuf);
121 fprintf(outp, "%s\n", DataBuf);
122 continue;}
123 else continue; /* Command Checks */
124 }}
125
126/* It wasn't a Comparison line, so clear the stack */
127 if (lastcmd[0] != '\0') { /* Run an old command w/o a comparison string */
128 ss_execute_line(ss, lastcmd, &status);
129 if (status == SS_ET_COMMAND_NOT_FOUND)
130 printf("Bad command: %s\n", input);
131 *lastcmd = '\0';}
132
133/* Push command on the stack if it's comparable (currently only queries are) */
134 if (!(strncasecmp (input, "qy ", 3) && strncasecmp (input, "query ", 6))) {
135 /* Delay this command in case there's a comparison line following it */
136 strcpy (lastcmd, input);
137 continue;}
138
139/* Non-comparible command; execute immediately */
140 ss_execute_line(ss, input, &status);
141 if (status == SS_ET_COMMAND_NOT_FOUND) {
142 printf("Bad command: %s\n", input);
143 }
144 }
145
146 recursion--;
147
148 fclose(inp);
149 if (argc > 2)
150 close(outp);
151}
152
153/**********************************/
154
155test_query_compare(argc, argv)
156 int argc;
157 char **argv;
158{ /* argv = "COMPARE_qy" + args to query + compstring */
159 int Qstatus = 0; /* Status returned from the query */
160 char *CompTo[5];
161 int NumWordsComp=0, i;
162
163 if (argc < 2) {
164 ss_perror(ss, 0, "Usage: query handle [ args ... ]");
165 return;
166 }
167/* Execute query with a comparison string */
168 count = 0;
169
170 /* Parse comp string into '>', char, ErrMsg, NumEntries, and Data */
f071d8a7 171 memset((char *)CompTo, 0, sizeof(CompTo));
92e88c2c 172 Partial_parse_string (4, argv[argc-1], &NumWordsComp, CompTo);
173 if (NumWordsComp < 3) { /* Too few args in comparison string */
174 strcpy(ErrorBuf, "Malformed Comparison String1");}
175 else {
176
177 for (i=0;i<argc;i++) {
178 printf("argv[%d] = %s\n", i, argv[i]);}
179 printf("CompTo[3] = %s\n\n", CompTo[3]);
180
181
182 Qstatus = mr_query(argv[1], argc-3, argv+2, CompData,
183 (char *)(&CompTo[3]));
184
185/* Check the number of tuples returned */
186 if (*CompTo[2] == '<') {
187 if (isdigit(*(CompTo[2] + 1))) {
188 if (atoi(CompTo[2] + 1) <= count)
189 strcat(ErrorBuf, "\nToo many tuples returned");}
190 else if (*ErrorBuf == '\0')
191 strcpy(ErrorBuf, "Malformed Comparison String2");}
192 else if (*CompTo[2] == '>') {
193 if (isdigit(*(CompTo[2] + 1))) {
194 if (atoi(CompTo[2] + 1) >= count)
195 strcat(ErrorBuf, "\nToo few tuples returned");}
196 else if (*ErrorBuf == '\0')
197 strcpy(ErrorBuf, "Malformed Comparison String3");}
198 else if (isdigit(*(CompTo[2]))) {
199 if (atoi(CompTo[2]) != count)
200 strcat(ErrorBuf, "\nWrong number tuples returned");}
201 else if (strcmp(CompTo[2], "*"))
202 if (*ErrorBuf == '\0')
203 strcpy(ErrorBuf, "Malformed Comparison String4");
204
205 /* Check return status */
206 if (!Comp_mr_err_table(Qstatus, CompTo[1]))
207 {
208 strcat(ErrorBuf, "\nRet Status Error, returns: ");
209 if (Qstatus)
210 strcat(ErrorBuf, MR_ERR_ARRAY[Qstatus - ERROR_TABLE_BASE_sms]);
211 else
212 strcat(ErrorBuf, "SUCCESS");}
213
214 }}
215
216/********************************************/
217
218int Comp_mr_err_table (ErrNum, ErrName)
219int ErrNum;
220char *ErrName;
221
222/* Returns 1 if ErrNum = the string in ErrName in MR_ERR_ARRAY, else 0 */
223
224{
225if (!ErrNum && ((!strcasecmp(ErrName, "SUCCESS"))
226 || (!strcasecmp(ErrName, "S"))))
227 return(1);
228else if (!ErrNum) return (0);
229else if (ErrNum >= ERROR_TABLE_BASE_sms)
230 return (!strcmp (MR_ERR_ARRAY[ErrNum - ERROR_TABLE_BASE_sms], ErrName));
231else return (0);
232}
233
234/********************************************/
235
236int NumWords (Str)
237char *Str;
238{
239int Count;
240int CharIndex;
241
242for (CharIndex = 0, Count = 0;*(Str + CharIndex);) {
243 if (isspace(*(Str + CharIndex)))
244 for (;isspace(*(Str + CharIndex));CharIndex++);
245 else if (*(Str + CharIndex) && !isspace(*(Str + CharIndex)))
246 for (Count++;(*(Str + CharIndex) && !isspace(*(Str + CharIndex)));
247 CharIndex++);
248}
249return(Count);
250}
251
252/**********************/
253
254/*
255 * Partial_parse_string(MaxWords, Str, argc_ptr, argv_ptr)
256 *
257 * Function:
258 * Parses line, dividing at whitespace, into tokens, returns
259 * the "argc" and "argv" values, up to MaxWords-1 tokens. Remaining
260 * tokens after MaxWords-1 are all returned as one set in the final
261 * slot of "argv". If MaxWords = 0, the number of tokens is not limited.
262 * Arguments:
263 * MaxWords (int)
264 * Maximum number of tokens/strings to return
265 * Str (char *)
266 * Pointer to text string to be parsed.
267 * argc_ptr (int *)
268 * Where to put the "argc" (number of tokens) value.
269 * argv_ptr (char *[])
270 * Series of pointers to parsed tokens
271 */
272
273Partial_parse_string (MaxWords, Str, argc_ptr, argv_ptr)
274int MaxWords;
275char *Str;
276int *argc_ptr;
277char *argv_ptr[];
278
279{
280char Buf[BUFSIZ];
281int NumTokens;
282int CharIndex;
283int i;
284
285for (CharIndex = 0, NumTokens = 0;*(Str + CharIndex)
286 && ((NumTokens < MaxWords-1) || !MaxWords);) {
287 if (isspace(*(Str + CharIndex)))
288 for (;isspace(*(Str + CharIndex));CharIndex++);
289 else if (*(Str + CharIndex) && !isspace(*(Str + CharIndex)))
290 for (NumTokens++, i=0;(*(Str + CharIndex) && !isspace(*(Str + CharIndex)));
291 CharIndex++, i++) Buf[i] = *(Str + CharIndex);
292 Buf[i] = '\0';
293 argv_ptr[NumTokens-1] = (char *)malloc(sizeof(char) * (strlen(Buf) + 1));
294 strcpy(argv_ptr[NumTokens-1], Buf);
295}
296*argc_ptr = NumTokens;
297if (NumTokens = MaxWords) {
298 argv_ptr[NumTokens-1]=
299 (char *) malloc(sizeof(char) * (1 + strlen(Str + CharIndex)));
300 strcpy (argv_ptr[NumTokens-1], (Str + CharIndex));}
301
302}
303
This page took 0.096468 seconds and 5 git commands to generate.