home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / filesbbs / dos / sbbs_src.exe / SBBS / ARS.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-13  |  12.7 KB  |  503 lines

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