Annotation of sbbs/sbbs2/ars.c, revision 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.