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

1.1       root        1: /* ars.c */
                      2: 
                      3: /* Synchronet Access Requirement String (ARS) functions */
                      4: 
                      5: /* $Id: ars.c,v 1.3 2000/11/08 09:19:30 rswindell Exp $ */
                      6: 
                      7: /****************************************************************************
                      8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                     10:  *                                                                                                                                                     *
                     11:  * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html         *
                     12:  *                                                                                                                                                     *
                     13:  * This program is free software; you can redistribute it and/or                       *
                     14:  * modify it under the terms of the GNU General Public License                         *
                     15:  * as published by the Free Software Foundation; either version 2                      *
                     16:  * of the License, or (at your option) any later version.                                      *
                     17:  * See the GNU General Public License for more details: gpl.txt or                     *
                     18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
                     19:  *                                                                                                                                                     *
                     20:  * Anonymous FTP access to the most recent released source is available at     *
                     21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
                     22:  *                                                                                                                                                     *
                     23:  * Anonymous CVS access to the development source and modification history     *
                     24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
                     25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
                     26:  *     (just hit return, no password is necessary)                                                     *
                     27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
                     28:  *                                                                                                                                                     *
                     29:  * For Synchronet coding style and modification guidelines, see                                *
                     30:  * http://www.synchro.net/source.html                                                                          *
                     31:  *                                                                                                                                                     *
                     32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
                     33:  * format) via e-mail to [email protected]                                                                      *
                     34:  *                                                                                                                                                     *
                     35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
                     36:  ****************************************************************************/
                     37: 
                     38: #include "sbbs.h"
                     39: 
                     40: /* Converts ASCII ARS string into binary ARS buffer */
                     41: 
                     42: #ifdef __BORLANDC__    /* Eliminate warning when buildling Baja */
                     43: #pragma argsused
                     44: #endif
                     45: uchar* arstr(ushort* count, char* str, scfg_t* cfg)
                     46: {
                     47:        static uchar nular[2]={0};
                     48:        char *p;
                     49:        uchar ar[256],*ar_buf;
                     50:        uint i,j,n,artype=AR_LEVEL,not=0,equal=0;
                     51: 
                     52:        for(i=j=0;str[i];i++) {
                     53:                if(str[i]==SP)
                     54:                        continue;
                     55: 
                     56:                if(str[i]=='(') {
                     57:                        if(not)
                     58:                                ar[j++]=AR_NOT;
                     59:                        not=equal=0;
                     60:                        ar[j++]=AR_BEGNEST;
                     61:                        continue; }
                     62: 
                     63:                if(str[i]==')') {
                     64:                        ar[j++]=AR_ENDNEST;
                     65:                        continue; }
                     66: 
                     67:                if(str[i]=='|') {
                     68:                        ar[j++]=AR_OR;
                     69:                        continue; }
                     70:     
                     71:                if(str[i]=='!') {
                     72:                        not=1;
                     73:                        continue; }
                     74: 
                     75:                if(str[i]=='=') {
                     76:                        equal=1;
                     77:                        continue; }
                     78: 
                     79:                if(str[i]=='&')
                     80:                        continue;
                     81: 
                     82:                if(isalpha(str[i])) {
                     83:                        if(!strncmp(str+i,"OR",2)) {
                     84:                                ar[j++]=AR_OR;
                     85:                                i++;
                     86:                                continue; }
                     87: 
                     88:                        if(!strncmp(str+i,"AND",3)) {    /* AND is ignored */
                     89:                                i+=2;
                     90:                                continue; }
                     91: 
                     92:                        if(!strncmp(str+i,"NOT",3)) {
                     93:                                not=1;
                     94:                                i+=2;
                     95:                                continue; }
                     96: 
                     97:                        if(!strncmp(str+i,"EQUAL TO",8)) {
                     98:                                equal=1;
                     99:                                i+=7;
                    100:                                continue; }
                    101: 
                    102:                        if(!strncmp(str+i,"EQUAL",5)) {
                    103:                                equal=1;
                    104:                                i+=4;
                    105:                                continue; }
                    106: 
                    107:                        if(!strncmp(str+i,"EQUALS",6)) {
                    108:                                equal=1;
                    109:                                i+=5;
                    110:                                continue; } }
                    111: 
                    112:                if(str[i]=='$') {
                    113:                        switch(str[i+1]) {
                    114:                                case 'A':
                    115:                                        artype=AR_AGE;
                    116:                                        break;
                    117:                                case 'B':
                    118:                                        artype=AR_BPS;
                    119:                                        break;
                    120:                                case 'C':
                    121:                                        artype=AR_CREDIT;
                    122:                                        break;
                    123:                                case 'D':
                    124:                                        artype=AR_UDFR;
                    125:                                        break;
                    126:                                case 'E':
                    127:                                        artype=AR_EXPIRE;
                    128:                                        break;
                    129:                                case 'F':
                    130:                                        artype=AR_FLAG1;
                    131:                                        break;
                    132:                                case 'G':
                    133:                                        artype=AR_LOCAL;
                    134:                                        if(not)
                    135:                                                ar[j++]=AR_NOT;
                    136:                                        not=0;
                    137:                                        ar[j++]=artype;
                    138:                                        break;
                    139:                                case 'H':
                    140:                                        artype=AR_SUB;
                    141:                                        break;
                    142:                                case 'I':
                    143:                                        artype=AR_LIB;
                    144:                                        break;
                    145:                                case 'J':
                    146:                                        artype=AR_DIR;
                    147:                                        break;
                    148:                                case 'K':
                    149:                                        artype=AR_UDR;
                    150:                                        break;
                    151:                                case 'L':
                    152:                                        artype=AR_LEVEL;
                    153:                                        break;
                    154:                                case 'M':
                    155:                                        artype=AR_GROUP;
                    156:                                        break;
                    157:                                case 'N':
                    158:                                        artype=AR_NODE;
                    159:                                        break;
                    160:                                case 'O':
                    161:                                        artype=AR_TUSED;
                    162:                                        break;
                    163:                                case 'P':
                    164:                                        artype=AR_PCR;
                    165:                                        break;
                    166:                                case 'Q':
                    167:                                        artype=AR_RANDOM;
                    168:                                        break;
                    169:                                case 'R':
                    170:                                        artype=AR_TLEFT;
                    171:                                        break;
                    172:                                case 'S':
                    173:                                        artype=AR_SEX;
                    174:                                        break;
                    175:                                case 'T':
                    176:                                        artype=AR_TIME;
                    177:                                        break;
                    178:                                case 'U':
                    179:                                        artype=AR_USER;
                    180:                                        break;
                    181:                                case 'V':
                    182:                                        artype=AR_LOGONS;
                    183:                                        break;
                    184:                                case 'W':
                    185:                                        artype=AR_DAY;
                    186:                                        break;
                    187:                                case 'X':
                    188:                                        artype=AR_EXEMPT;
                    189:                                        break;
                    190:                                case 'Y':   /* Days since last on */
                    191:                                        artype=AR_LASTON;
                    192:                                        break;
                    193:                                case 'Z':
                    194:                                        artype=AR_REST;
                    195:                                        break;
                    196:                                case '[':
                    197:                                        artype=AR_ANSI;
                    198:                                        if(not)
                    199:                                                ar[j++]=AR_NOT;
                    200:                                        not=0;
                    201:                                        ar[j++]=artype;
                    202:                                        break;
                    203:                                case '0':
                    204:                                        artype=AR_NULL;
                    205:                                        break;
                    206:                                case '*':
                    207:                                        artype=AR_RIP;
                    208:                                        if(not)
                    209:                                                ar[j++]=AR_NOT;
                    210:                                        not=0;
                    211:                                        ar[j++]=artype;
                    212:                                        break;
                    213: 
                    214:                                }
                    215:                        i++;
                    216:                        continue; }
                    217: 
                    218:                if(isalpha(str[i])) {
                    219:                        n=i;
                    220:                        if(!strncmp(str+i,"AGE",3)) {
                    221:                                artype=AR_AGE;
                    222:                                i+=2; }
                    223:                        else if(!strncmp(str+i,"BPS",3)) {
                    224:                                artype=AR_BPS;
                    225:                                i+=2; }
                    226:                        else if(!strncmp(str+i,"PCR",3)) {
                    227:                                artype=AR_PCR;
                    228:                                i+=2; }
                    229:                        else if(!strncmp(str+i,"SEX",3)) {
                    230:                                artype=AR_SEX;
                    231:                                i+=2; }
                    232:                        else if(!strncmp(str+i,"UDR",3)) {
                    233:                                artype=AR_UDR;
                    234:                                i+=2; }
                    235:                        else if(!strncmp(str+i,"DAY",3)) {
                    236:                                artype=AR_DAY;
                    237:                                i+=2; }
                    238:                        else if(!strncmp(str+i,"RIP",3)) {
                    239:                                artype=AR_RIP;
                    240:                                if(not)
                    241:                                        ar[j++]=AR_NOT;
                    242:                                not=0;
                    243:                                ar[j++]=artype;
                    244:                                i+=2; }
                    245:                        else if(!strncmp(str+i,"WIP",3)) {
                    246:                                artype=AR_WIP;
                    247:                                if(not)
                    248:                                        ar[j++]=AR_NOT;
                    249:                                not=0;
                    250:                                ar[j++]=artype;
                    251:                                i+=2; }
                    252:                        else if(!strncmp(str+i,"OS2",3)) {
                    253:                                artype=AR_OS2;
                    254:                                if(not)
                    255:                                        ar[j++]=AR_NOT;
                    256:                                not=0;
                    257:                                ar[j++]=artype;
                    258:                                i+=2; }
                    259:                        else if(!strncmp(str+i,"DOS",3)) {
                    260:                                artype=AR_DOS;
                    261:                                if(not)
                    262:                                        ar[j++]=AR_NOT;
                    263:                                not=0;
                    264:                                ar[j++]=artype;
                    265:                                i+=2; }
                    266:                        else if(!strncmp(str+i,"WIN32",5)) {
                    267:                                artype=AR_WIN32;
                    268:                                if(not)
                    269:                                        ar[j++]=AR_NOT;
                    270:                                not=0;
                    271:                                ar[j++]=artype;
                    272:                                i+=2; }
                    273:                        else if(!strncmp(str+i,"UNIX",4)) {
                    274:                                artype=AR_UNIX;
                    275:                                if(not)
                    276:                                        ar[j++]=AR_NOT;
                    277:                                not=0;
                    278:                                ar[j++]=artype;
                    279:                                i+=2; }
                    280:                        else if(!strncmp(str+i,"LINUX",5)) {
                    281:                                artype=AR_LINUX;
                    282:                                if(not)
                    283:                                        ar[j++]=AR_NOT;
                    284:                                not=0;
                    285:                                ar[j++]=artype;
                    286:                                i+=2; }
                    287:                        else if(!strncmp(str+i,"SUBCODE",7)) {
                    288:                                artype=AR_SUBCODE;
                    289:                                i+=6; }
                    290:                        else if(!strncmp(str+i,"SUB",3)) {
                    291:                                artype=AR_SUB;
                    292:                                i+=2; }
                    293:                        else if(!strncmp(str+i,"LIB",3)) {
                    294:                                artype=AR_LIB;
                    295:                                i+=2; }
                    296:                        else if(!strncmp(str+i,"DIRCODE",7)) {
                    297:                                artype=AR_DIRCODE;
                    298:                                i+=6; }
                    299:                        else if(!strncmp(str+i,"DIR",3)) {
                    300:                                artype=AR_DIR;
                    301:                                i+=2; }
                    302:                        else if(!strncmp(str+i,"ANSI",4)) {
                    303:                                artype=AR_ANSI;
                    304:                                if(not)
                    305:                                        ar[j++]=AR_NOT;
                    306:                                not=0;
                    307:                                ar[j++]=artype;
                    308:                                i+=3; }
                    309:                        else if(!strncmp(str+i,"UDFR",4)) {
                    310:                                artype=AR_UDFR;
                    311:                                i+=3; }
                    312:                        else if(!strncmp(str+i,"FLAG",4)) {
                    313:                                artype=AR_FLAG1;
                    314:                                i+=3; }
                    315:                        else if(!strncmp(str+i,"NODE",4)) {
                    316:                                artype=AR_NODE;
                    317:                                i+=3; }
                    318:                        else if(!strncmp(str+i,"NULL",4)) {
                    319:                                artype=AR_NULL;
                    320:                                i+=3; }
                    321:                        else if(!strncmp(str+i,"USER",4)) {
                    322:                                artype=AR_USER;
                    323:                                i+=3; }
                    324:                        else if(!strncmp(str+i,"TIME",4)) {
                    325:                                artype=AR_TIME;
                    326:                                i+=3; }
                    327:                        else if(!strncmp(str+i,"REST",4)) {
                    328:                                artype=AR_REST;
                    329:                                i+=3; }
                    330:                        else if(!strncmp(str+i,"LEVEL",5)) {
                    331:                                artype=AR_LEVEL;
                    332:                                i+=4; }
                    333:                        else if(!strncmp(str+i,"TLEFT",5)) {
                    334:                                artype=AR_TLEFT;
                    335:                                i+=4; }
                    336:                        else if(!strncmp(str+i,"TUSED",5)) {
                    337:                                artype=AR_TUSED;
                    338:                                i+=4; }
                    339:                        else if(!strncmp(str+i,"LOCAL",5)) {
                    340:                                artype=AR_LOCAL;
                    341:                                if(not)
                    342:                                        ar[j++]=AR_NOT;
                    343:                                not=0;
                    344:                                ar[j++]=artype;
                    345:                                i+=4; }
                    346:                        else if(!strncmp(str+i,"GROUP",5)) {
                    347:                                artype=AR_GROUP;
                    348:                                i+=4; }
                    349:                        else if(!strncmp(str+i,"EXPIRE",6)) {
                    350:                                artype=AR_EXPIRE;
                    351:                                i+=5; }
                    352:                        else if(!strncmp(str+i,"EXPERT",6)) {
                    353:                                artype=AR_EXPERT;
                    354:                                if(not)
                    355:                                        ar[j++]=AR_NOT;
                    356:                                not=0;
                    357:                                ar[j++]=artype;
                    358:                                i+=5; }
                    359:                        else if(!strncmp(str+i,"SYSOP",5)) {
                    360:                                artype=AR_SYSOP;
                    361:                                if(not)
                    362:                                        ar[j++]=AR_NOT;
                    363:                                not=0;
                    364:                                ar[j++]=artype;
                    365:                                i+=4; }
                    366:                        else if(!strncmp(str+i,"QUIET",5)) {
                    367:                                artype=AR_QUIET;
                    368:                                if(not)
                    369:                                        ar[j++]=AR_NOT;
                    370:                                not=0;
                    371:                                ar[j++]=artype;
                    372:                                i+=4; }
                    373:                        else if(!strncmp(str+i,"EXEMPT",6)) {
                    374:                                artype=AR_EXEMPT;
                    375:                                i+=5; }
                    376:                        else if(!strncmp(str+i,"RANDOM",6)) {
                    377:                                artype=AR_RANDOM;
                    378:                                i+=5; }
                    379:                        else if(!strncmp(str+i,"LASTON",6)) {
                    380:                                artype=AR_LASTON;
                    381:                                i+=5; }
                    382:                        else if(!strncmp(str+i,"LOGONS",6)) {
                    383:                                artype=AR_LOGONS;
                    384:                                i+=5; }
                    385:                        else if(!strncmp(str+i,"CREDIT",6)) {
                    386:                                artype=AR_CREDIT;
                    387:                                i+=5; }
                    388:                        else if(!strncmp(str+i,"MAIN_CMDS",9)) {
                    389:                                artype=AR_MAIN_CMDS;
                    390:                                i+=8; }
                    391:                        else if(!strncmp(str+i,"FILE_CMDS",9)) {
                    392:                                artype=AR_FILE_CMDS;
                    393:                                i+=8; }
                    394:                        if(n!=i)            /* one of the above */
                    395:                                continue; }
                    396: 
                    397:                if(not)
                    398:                        ar[j++]=AR_NOT;
                    399:                if(equal)
                    400:                        ar[j++]=AR_EQUAL;
                    401:                not=equal=0;
                    402: 
                    403:                if(artype==AR_FLAG1 && isdigit(str[i])) {   /* flag set specified */
                    404:                        switch(str[i]) {
                    405:                                case '2':
                    406:                                        artype=AR_FLAG2;
                    407:                                        break;
                    408:                                case '3':
                    409:                                        artype=AR_FLAG3;
                    410:                                        break;
                    411:                                case '4':
                    412:                                        artype=AR_FLAG4;
                    413:                                        break; }
                    414:                        continue; }
                    415: 
                    416:                if(artype==AR_SUB && !isdigit(str[i]))
                    417:                        artype=AR_SUBCODE;
                    418:                if(artype==AR_DIR && !isdigit(str[i]))
                    419:                        artype=AR_DIRCODE;
                    420: 
                    421:                ar[j++]=artype;
                    422:                if(isdigit(str[i])) {
                    423:                        if(artype==AR_TIME) {
                    424:                                n=atoi(str+i)*60;
                    425:                                p=strchr(str+i,':');
                    426:                                if(p)
                    427:                                        n+=atoi(p+1);
                    428:                                *((short *)(ar+j))=n;
                    429:                                j+=2;
                    430:                                while(isdigit(str[i+1]) || str[i+1]==':') i++;
                    431:                                continue; }
                    432:                        n=atoi(str+i);
                    433:                        switch(artype) {
                    434:                                case AR_DAY:
                    435:                                        if(n>6)     /* not past saturday */
                    436:                                                n=6;
                    437:                                case AR_AGE:    /* byte operands */
                    438:                                case AR_PCR:
                    439:                                case AR_UDR:
                    440:                                case AR_UDFR:
                    441:                                case AR_NODE:
                    442:                                case AR_LEVEL:
                    443:                                case AR_TLEFT:
                    444:                                case AR_TUSED:
                    445:                                        ar[j++]=n;
                    446:                                        break;
                    447:                                case AR_BPS:    /* int operands */
                    448:                                        if(n<300)
                    449:                                                n*=100;
                    450:                                case AR_MAIN_CMDS:
                    451:                                case AR_FILE_CMDS:
                    452:                                case AR_EXPIRE:
                    453:                                case AR_CREDIT:
                    454:                                case AR_USER:
                    455:                                case AR_RANDOM:
                    456:                                case AR_LASTON:
                    457:                                case AR_LOGONS:
                    458:                                        *((short *)(ar+j))=n;
                    459:                                        j+=2;
                    460:                                        break;
                    461:                                case AR_GROUP:
                    462:                                case AR_LIB:
                    463:                                case AR_DIR:
                    464:                                case AR_SUB:
                    465:                                        if(n) n--;              /* convert to 0 base */
                    466:                                        *((short *)(ar+j))=n;
                    467:                                        j+=2;
                    468:                                        break;
                    469:                                default:                    /* invalid numeric AR type */
                    470:                                        j--;
                    471:                                        break; }
                    472:                        while(isdigit(str[i+1])) i++;
                    473:                        continue; }
                    474:                if(artype==AR_SUBCODE || artype==AR_DIRCODE) {
                    475:                        for(n=0;n<8
                    476:                                && str[i]
                    477:                                && str[i]!=SP
                    478:                                && str[i]!='('
                    479:                                && str[i]!=')'
                    480:                                && str[i]!='='
                    481:                                && str[i]!='|'
                    482:                                ;n++)
                    483:                                ar[j++]=str[i++];
                    484:                        ar[j++]=0;
                    485:                        continue; }
                    486:                switch(artype) {
                    487:                        case AR_FLAG1:
                    488:                        case AR_FLAG2:
                    489:                        case AR_FLAG3:
                    490:                        case AR_FLAG4:
                    491:                        case AR_EXEMPT:
                    492:                        case AR_SEX:
                    493:                        case AR_REST:
                    494:                                ar[j++]=str[i];
                    495:                                break;
                    496:        #ifdef SBBS
                    497:                        case AR_SUB:
                    498:                                for(n=0;n<cfg->total_subs;n++)
                    499:                                        if(!strnicmp(str+i,cfg->sub[n]->code,strlen(cfg->sub[n]->code)))
                    500:                                                break;
                    501:                                if(n<cfg->total_subs) {
                    502:                                        *((short *)(ar+j))=n;
                    503:                                        j+=2; }
                    504:                                else        /* Unknown sub-board */
                    505:                                        j--;
                    506:                                while(isalpha(str[i+1])) i++;
                    507:                                break;
                    508:                        case AR_DIR:
                    509:                                for(n=0;n<cfg->total_dirs;n++)
                    510:                                        if(!strnicmp(str+i,cfg->dir[n]->code,strlen(cfg->dir[n]->code)))
                    511:                                                break;
                    512:                                if(n<cfg->total_dirs) {
                    513:                                        *((short *)(ar+j))=n;
                    514:                                        j+=2; }
                    515:                                else        /* Unknown directory */
                    516:                                        j--;
                    517:                                while(isalpha(str[i+1])) i++;
                    518:                                break;
                    519:        #endif
                    520:                        case AR_DAY:
                    521:                                if(str[i]=='S' && str[i+1]=='U')            /* Sunday */
                    522:                                        ar[j++]=0;
                    523:                                else if(str[i]=='M')                        /* Monday */
                    524:                                        ar[j++]=1;
                    525:                                else if(str[i]=='T' && str[i+1]=='U')       /* Tuesday */
                    526:                                        ar[j++]=2;
                    527:                                else if(str[i]=='W')                        /* Wednesday */
                    528:                                        ar[j++]=3;
                    529:                                else if(str[i]=='T' && str[i+1]=='H')       /* Thursday */
                    530:                                        ar[j++]=4;
                    531:                                else if(str[i]=='F')                        /* Friday */
                    532:                                        ar[j++]=5;
                    533:                                else ar[j++]=6;                             /* Saturday */
                    534:                                while(isalpha(str[i+1])) i++;
                    535:                                break;
                    536:                        default:        /* Badly formed ARS, digit expected */
                    537:                                j--;
                    538:                                break;
                    539:                } 
                    540:        }
                    541:        if(!j)
                    542:                return(nular);  /* Save memory */
                    543: 
                    544:        ar[j++]=AR_NULL;
                    545:        /** DEBUG stuff
                    546:        for(i=0;i<j;i++)
                    547:                lprintf("%02X ",(uint)ar[i]);
                    548:        lputs("\r\n");
                    549:        ***/
                    550:        if((ar_buf=(uchar *)calloc(j+4,1))==NULL)       /* Padded for ushort dereferencing */
                    551:                return(NULL);
                    552:        memcpy(ar_buf,ar,j);
                    553:        if(count)
                    554:                (*count)=j;
                    555:        return(ar_buf);
                    556: }
                    557: 

unix.superglobalmegacorp.com

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