Annotation of sbbs/sbbs2/ars.c, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.