|
|
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.