|
|
1.1 root 1: /* ARS.C */
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: #ifdef __WATCOMC__
6: #include <malloc.h>
7: #else
8: #include <alloc.h>
9: #endif
10: #include "ars_defs.h"
11:
12: #ifdef SBBS
13: #include "sbbs.h"
14: #endif
15:
16: char *arstr(ushort *count, char *str)
17: {
18: static char *nular="";
19: char ar[256],*p;
20: uint i,j,n,artype=AR_LEVEL,not=0,equal=0,x;
21:
22: for(i=j=0;str[i];i++) {
23: if(str[i]==SP)
24: continue;
25:
26: if(str[i]=='(') {
27: if(not)
28: ar[j++]=AR_NOT;
29: not=equal=0;
30: ar[j++]=AR_BEGNEST;
31: continue; }
32:
33: if(str[i]==')') {
34: ar[j++]=AR_ENDNEST;
35: continue; }
36:
37: if(str[i]=='|') {
38: ar[j++]=AR_OR;
39: continue; }
40:
41: if(str[i]=='!') {
42: not=1;
43: continue; }
44:
45: if(str[i]=='=') {
46: equal=1;
47: continue; }
48:
49: if(str[i]=='&')
50: continue;
51:
52: if(isalpha(str[i])) {
53: if(!strncmp(str+i,"OR",2)) {
54: ar[j++]=AR_OR;
55: i++;
56: continue; }
57:
58: if(!strncmp(str+i,"AND",3)) { /* AND is ignored */
59: i+=2;
60: continue; }
61:
62: if(!strncmp(str+i,"NOT",3)) {
63: not=1;
64: i+=2;
65: continue; }
66:
67: if(!strncmp(str+i,"EQUAL TO",8)) {
68: equal=1;
69: i+=7;
70: continue; }
71:
72: if(!strncmp(str+i,"EQUAL",5)) {
73: equal=1;
74: i+=4;
75: continue; }
76:
77: if(!strncmp(str+i,"EQUALS",6)) {
78: equal=1;
79: i+=5;
80: continue; } }
81:
82: if(str[i]=='$') {
83: switch(str[i+1]) {
84: case 'A':
85: artype=AR_AGE;
86: break;
87: case 'B':
88: artype=AR_BPS;
89: break;
90: case 'C':
91: artype=AR_CREDIT;
92: break;
93: case 'D':
94: artype=AR_UDFR;
95: break;
96: case 'E':
97: artype=AR_EXPIRE;
98: break;
99: case 'F':
100: artype=AR_FLAG1;
101: break;
102: case 'G':
103: artype=AR_LOCAL;
104: if(not)
105: ar[j++]=AR_NOT;
106: not=0;
107: ar[j++]=artype;
108: break;
109: case 'H':
110: artype=AR_SUB;
111: break;
112: case 'I':
113: artype=AR_LIB;
114: break;
115: case 'J':
116: artype=AR_DIR;
117: break;
118: case 'K':
119: artype=AR_UDR;
120: break;
121: case 'L':
122: artype=AR_LEVEL;
123: break;
124: case 'M':
125: artype=AR_GROUP;
126: break;
127: case 'N':
128: artype=AR_NODE;
129: break;
130: case 'O':
131: artype=AR_TUSED;
132: break;
133: case 'P':
134: artype=AR_PCR;
135: break;
136: case 'Q':
137: artype=AR_RANDOM;
138: break;
139: case 'R':
140: artype=AR_TLEFT;
141: break;
142: case 'S':
143: artype=AR_SEX;
144: break;
145: case 'T':
146: artype=AR_TIME;
147: break;
148: case 'U':
149: artype=AR_USER;
150: break;
151: case 'V':
152: artype=AR_LOGONS;
153: break;
154: case 'W':
155: artype=AR_DAY;
156: break;
157: case 'X':
158: artype=AR_EXEMPT;
159: break;
160: case 'Y': /* Days since last on */
161: artype=AR_LASTON;
162: break;
163: case 'Z':
164: artype=AR_REST;
165: break;
166: case '[':
167: artype=AR_ANSI;
168: if(not)
169: ar[j++]=AR_NOT;
170: not=0;
171: ar[j++]=artype;
172: break;
173: case '0':
174: artype=AR_NULL;
175: break;
176: case '*':
177: artype=AR_RIP;
178: if(not)
179: ar[j++]=AR_NOT;
180: not=0;
181: ar[j++]=artype;
182: break;
183:
184: }
185: i++;
186: continue; }
187:
188: if(isalpha(str[i])) {
189: n=i;
190: if(!strncmp(str+i,"AGE",3)) {
191: artype=AR_AGE;
192: i+=2; }
193: else if(!strncmp(str+i,"BPS",3)) {
194: artype=AR_BPS;
195: i+=2; }
196: else if(!strncmp(str+i,"PCR",3)) {
197: artype=AR_PCR;
198: i+=2; }
199: else if(!strncmp(str+i,"SEX",3)) {
200: artype=AR_SEX;
201: i+=2; }
202: else if(!strncmp(str+i,"UDR",3)) {
203: artype=AR_UDR;
204: i+=2; }
205: else if(!strncmp(str+i,"DAY",3)) {
206: artype=AR_DAY;
207: i+=2; }
208: else if(!strncmp(str+i,"RIP",3)) {
209: artype=AR_RIP;
210: if(not)
211: ar[j++]=AR_NOT;
212: not=0;
213: ar[j++]=artype;
214: i+=2; }
215: else if(!strncmp(str+i,"WIP",3)) {
216: artype=AR_WIP;
217: if(not)
218: ar[j++]=AR_NOT;
219: not=0;
220: ar[j++]=artype;
221: i+=2; }
222: else if(!strncmp(str+i,"OS2",3)) {
223: artype=AR_OS2;
224: if(not)
225: ar[j++]=AR_NOT;
226: not=0;
227: ar[j++]=artype;
228: i+=2; }
229: else if(!strncmp(str+i,"DOS",3)) {
230: artype=AR_DOS;
231: if(not)
232: ar[j++]=AR_NOT;
233: not=0;
234: ar[j++]=artype;
235: i+=2; }
236: else if(!strncmp(str+i,"SUBCODE",7)) {
237: artype=AR_SUBCODE;
238: i+=6; }
239: else if(!strncmp(str+i,"SUB",3)) {
240: artype=AR_SUB;
241: i+=2; }
242: else if(!strncmp(str+i,"LIB",3)) {
243: artype=AR_LIB;
244: i+=2; }
245: else if(!strncmp(str+i,"DIRCODE",7)) {
246: artype=AR_DIRCODE;
247: i+=6; }
248: else if(!strncmp(str+i,"DIR",3)) {
249: artype=AR_DIR;
250: i+=2; }
251: else if(!strncmp(str+i,"ANSI",4)) {
252: artype=AR_ANSI;
253: if(not)
254: ar[j++]=AR_NOT;
255: not=0;
256: ar[j++]=artype;
257: i+=3; }
258: else if(!strncmp(str+i,"UDFR",4)) {
259: artype=AR_UDFR;
260: i+=3; }
261: else if(!strncmp(str+i,"FLAG",4)) {
262: artype=AR_FLAG1;
263: i+=3; }
264: else if(!strncmp(str+i,"NODE",4)) {
265: artype=AR_NODE;
266: i+=3; }
267: else if(!strncmp(str+i,"NULL",4)) {
268: artype=AR_NULL;
269: i+=3; }
270: else if(!strncmp(str+i,"USER",4)) {
271: artype=AR_USER;
272: i+=3; }
273: else if(!strncmp(str+i,"TIME",4)) {
274: artype=AR_TIME;
275: i+=3; }
276: else if(!strncmp(str+i,"REST",4)) {
277: artype=AR_REST;
278: i+=3; }
279: else if(!strncmp(str+i,"LEVEL",5)) {
280: artype=AR_LEVEL;
281: i+=4; }
282: else if(!strncmp(str+i,"TLEFT",5)) {
283: artype=AR_TLEFT;
284: i+=4; }
285: else if(!strncmp(str+i,"TUSED",5)) {
286: artype=AR_TUSED;
287: i+=4; }
288: else if(!strncmp(str+i,"LOCAL",5)) {
289: artype=AR_LOCAL;
290: if(not)
291: ar[j++]=AR_NOT;
292: not=0;
293: ar[j++]=artype;
294: i+=4; }
295: else if(!strncmp(str+i,"GROUP",5)) {
296: artype=AR_GROUP;
297: i+=4; }
298: else if(!strncmp(str+i,"EXPIRE",6)) {
299: artype=AR_EXPIRE;
300: i+=5; }
301: else if(!strncmp(str+i,"EXPERT",6)) {
302: artype=AR_EXPERT;
303: if(not)
304: ar[j++]=AR_NOT;
305: not=0;
306: ar[j++]=artype;
307: i+=5; }
308: else if(!strncmp(str+i,"SYSOP",5)) {
309: artype=AR_SYSOP;
310: if(not)
311: ar[j++]=AR_NOT;
312: not=0;
313: ar[j++]=artype;
314: i+=4; }
315: else if(!strncmp(str+i,"QUIET",5)) {
316: artype=AR_QUIET;
317: if(not)
318: ar[j++]=AR_NOT;
319: not=0;
320: ar[j++]=artype;
321: i+=4; }
322: else if(!strncmp(str+i,"EXEMPT",6)) {
323: artype=AR_EXEMPT;
324: i+=5; }
325: else if(!strncmp(str+i,"RANDOM",6)) {
326: artype=AR_RANDOM;
327: i+=5; }
328: else if(!strncmp(str+i,"LASTON",6)) {
329: artype=AR_LASTON;
330: i+=5; }
331: else if(!strncmp(str+i,"LOGONS",6)) {
332: artype=AR_LOGONS;
333: i+=5; }
334: else if(!strncmp(str+i,"CREDIT",6)) {
335: artype=AR_CREDIT;
336: i+=5; }
337: else if(!strncmp(str+i,"MAIN_CMDS",9)) {
338: artype=AR_MAIN_CMDS;
339: i+=8; }
340: else if(!strncmp(str+i,"FILE_CMDS",9)) {
341: artype=AR_FILE_CMDS;
342: i+=8; }
343: if(n!=i) /* one of the above */
344: continue; }
345:
346: if(not)
347: ar[j++]=AR_NOT;
348: if(equal)
349: ar[j++]=AR_EQUAL;
350: not=equal=0;
351:
352: if(artype==AR_FLAG1 && isdigit(str[i])) { /* flag set specified */
353: switch(str[i]) {
354: case '2':
355: artype=AR_FLAG2;
356: break;
357: case '3':
358: artype=AR_FLAG3;
359: break;
360: case '4':
361: artype=AR_FLAG4;
362: break; }
363: continue; }
364:
365: if(artype==AR_SUB && !isdigit(str[i]))
366: artype=AR_SUBCODE;
367: if(artype==AR_DIR && !isdigit(str[i]))
368: artype=AR_DIRCODE;
369:
370: ar[j++]=artype;
371: if(isdigit(str[i])) {
372: if(artype==AR_TIME) {
373: n=atoi(str+i)*60;
374: p=strchr(str+i,':');
375: if(p)
376: n+=atoi(p+1);
377: *((short *)(ar+j))=n;
378: j+=2;
379: while(isdigit(str[i+1]) || str[i+1]==':') i++;
380: continue; }
381: n=atoi(str+i);
382: switch(artype) {
383: case AR_DAY:
384: if(n>6) /* not past saturday */
385: n=6;
386: case AR_AGE: /* byte operands */
387: case AR_PCR:
388: case AR_UDR:
389: case AR_UDFR:
390: case AR_NODE:
391: case AR_LEVEL:
392: case AR_TLEFT:
393: case AR_TUSED:
394: ar[j++]=n;
395: break;
396: case AR_BPS: /* int operands */
397: if(n<300)
398: n*=100;
399: case AR_MAIN_CMDS:
400: case AR_FILE_CMDS:
401: case AR_EXPIRE:
402: case AR_CREDIT:
403: case AR_USER:
404: case AR_RANDOM:
405: case AR_LASTON:
406: case AR_LOGONS:
407: *((short *)(ar+j))=n;
408: j+=2;
409: break;
410: case AR_GROUP:
411: case AR_LIB:
412: case AR_DIR:
413: case AR_SUB:
414: if(n) n--; /* convert to 0 base */
415: *((short *)(ar+j))=n;
416: j+=2;
417: break;
418: default: /* invalid numeric AR type */
419: j--;
420: break; }
421: while(isdigit(str[i+1])) i++;
422: continue; }
423: if(artype==AR_SUBCODE || artype==AR_DIRCODE) {
424: for(n=0;n<8
425: && str[i]
426: && str[i]!=SP
427: && str[i]!='('
428: && str[i]!=')'
429: && str[i]!='='
430: && str[i]!='|'
431: ;n++)
432: ar[j++]=str[i++];
433: ar[j++]=0;
434: continue; }
435: switch(artype) {
436: case AR_FLAG1:
437: case AR_FLAG2:
438: case AR_FLAG3:
439: case AR_FLAG4:
440: case AR_EXEMPT:
441: case AR_SEX:
442: case AR_REST:
443: ar[j++]=str[i];
444: break;
445: #ifdef SBBS
446: case AR_SUB:
447: for(n=0;n<total_subs;n++)
448: if(!strnicmp(str+i,sub[n]->code,strlen(sub[n]->code)))
449: break;
450: if(n<total_subs) {
451: *((short *)(ar+j))=n;
452: j+=2; }
453: else /* Unknown sub-board */
454: j--;
455: while(isalpha(str[i+1])) i++;
456: break;
457: case AR_DIR:
458: for(n=0;n<total_dirs;n++)
459: if(!strnicmp(str+i,dir[n]->code,strlen(dir[n]->code)))
460: break;
461: if(n<total_dirs) {
462: *((short *)(ar+j))=n;
463: j+=2; }
464: else /* Unknown directory */
465: j--;
466: while(isalpha(str[i+1])) i++;
467: break;
468: #endif
469: case AR_DAY:
470: if(str[i]=='S' && str[i+1]=='U') /* Sunday */
471: ar[j++]=0;
472: else if(str[i]=='M') /* Monday */
473: ar[j++]=1;
474: else if(str[i]=='T' && str[i+1]=='U') /* Tuesday */
475: ar[j++]=2;
476: else if(str[i]=='W') /* Wednesday */
477: ar[j++]=3;
478: else if(str[i]=='T' && str[i+1]=='H') /* Thursday */
479: ar[j++]=4;
480: else if(str[i]=='F') /* Friday */
481: ar[j++]=5;
482: else ar[j++]=6; /* Saturday */
483: while(isalpha(str[i+1])) i++;
484: break;
485: } }
486: if(!j)
487: return(nular); /* Save memory */
488:
489: ar[j++]=AR_NULL;
490: /** DEBUG stuff
491: for(i=0;i<j;i++)
492: lprintf("%02X ",(uint)ar[i]);
493: lputs("\r\n");
494: ***/
495: if((p=(char *)MALLOC(j))==NULL)
496: return(NULL);
497: memcpy(p,ar,j);
498: if(count)
499: (*count)=j;
500: return(p);
501: }
502:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.