Annotation of 43BSD/ingres/source/parser/par_util.c, revision 1.1.1.1

1.1       root        1: # include      <ingres.h>
                      2: # include      <aux.h>
                      3: # include      <tree.h>
                      4: # include      "parser.h"
                      5: # include      <catalog.h>
                      6: # include      <pv.h>
                      7: # include      <symbol.h>
                      8: # include      <sccs.h>
                      9: # include      "scanner.h"
                     10: # include      <errors.h>
                     11: 
                     12: SCCSID(@(#)par_util.c  8.2     2/14/85)
                     13: 
                     14: /*
                     15: **  PAR_UTIL -- parser utility functions
                     16: **
                     17: **     These functions are generally unrelated except that they are
                     18: **     needed to operate the parser and are too small to be considered
                     19: **     seperate modules.
                     20: **
                     21: **     Defined Constants:
                     22: **
                     23: **     Defines:
                     24: **             timeofday       -- convert arguments to minutes since midnight
                     25: **             tlprepend       -- attach two target list components
                     26: **             header          -- prints the header for a retrieve to terminal
                     27: **             patmat          -- converts pattern matching characters in a string
                     28: **             permcom         -- adds a command to the permit command vector
                     29: **
                     30: **     Requires:
                     31: **             nothing
                     32: **
                     33: **     Required By:
                     34: **             y.tab.c         -- the grammar
                     35: **
                     36: **     Files:
                     37: **             none
                     38: **
                     39: **     Compilation Flags:
                     40: **             none
                     41: **
                     42: **     Trace Flags:
                     43: **             PAR_UTIL.C ~~ 62, 63
                     44: **
                     45: **     History:
                     46: **             20 Dec 1978     -- written (rick)
                     47: */
                     48: 
                     49: 
                     50: 
                     51: 
                     52: 
                     53: 
                     54: 
                     55: 
                     56: /*
                     57: **  TIMEOFDAY -- convert 2 integers to minutes since midnight
                     58: **
                     59: **     Converts the hours and minutes parameters to minutes since midnight
                     60: **     performing some error (bounds) checking on the time.
                     61: **
                     62: **     To answer the question about what is midnight, both 0:00 and 24:00
                     63: **     are handled, but not the same way.  The former is zero minutes from
                     64: **     midnight and the latter is 1440 minutes from midnight.  (1440 is
                     65: **     24 hrs times 60 minutes, or 1 minute past the end of the day.)
                     66: **
                     67: **     Parameters:
                     68: **             hrs             -- an integer pointer to the hour
                     69: **             mins            -- an integer pointer to the minutes
                     70: **
                     71: **     Returns:
                     72: **             integer time since midnight
                     73: **
                     74: **     Side Effects:
                     75: **             may detect an error and call par_error which never returns.
                     76: **
                     77: **     Requires:
                     78: **             that the pointers be on integer boundaries
                     79: **
                     80: **     Called By:
                     81: **             y.tab.c         -- the grammar
                     82: **
                     83: **     Trace Flags:
                     84: **             none
                     85: **
                     86: **     Diagnostics:
                     87: **             BADHOURS        -- No such hour
                     88: **             BADMINS         -- No such minute
                     89: **             BAD24TIME       -- only 24:00 allowed
                     90: **
                     91: **     Syserrs:
                     92: **             none
                     93: **
                     94: **     History:
                     95: **             20 Dec 1978     -- written (rick)
                     96: */
                     97: timeofday(hrs, mins)
                     98: short  *hrs;
                     99: short  *mins;
                    100: {
                    101:        register int    h;
                    102:        register int    m;
                    103:        register int    rtval;
                    104: 
                    105:        h = *hrs;
                    106:        m = *mins;
                    107:        if (h > 24 || h < 0)
                    108:                /* no such hour */
                    109:                par_error(BADHOURS, WARN, iocv(h), 0);
                    110:        if (m > 59 || m < 0)
                    111:                /* no such minute */
                    112:                par_error(BADMINS, WARN, iocv(m), 0);
                    113:        if (h == 24)
                    114:        {
                    115:                h = 1440;
                    116:                if (m != 0)
                    117:                        /* can only use 24:00 */
                    118:                        par_error(BAD24TIME, WARN, iocv(m), 0);
                    119:        }
                    120:        rtval = (h * 60) + m;
                    121:        return (rtval);
                    122: }
                    123: 
                    124: 
                    125: /*
                    126: **  TLPREPEND -- combine two target list components
                    127: **
                    128: **     Attach two target list components to each other.
                    129: **     Neither component need be a single element.  The
                    130: **     'a' component will be attached at the extreme left
                    131: **     of the 'b' component.
                    132: **
                    133: **     Parameters:
                    134: **             a               -- tl component to attach
                    135: **             b               -- tl base for attaching
                    136: **
                    137: **     Returns:
                    138: **             nothing
                    139: **
                    140: **     Side Effects:
                    141: **             this routine is a side effect.  It attaches a to b
                    142: **             and when it returns a is attached to b but the pointer
                    143: **             to b never changes (neither does the pointer to a)
                    144: **
                    145: **     Requires:
                    146: **             nothing
                    147: **
                    148: **     Called By:
                    149: **             y.tab.c         -- the grammar
                    150: **
                    151: **     Trace Flags:
                    152: **             tlprepend ~~ 62.4
                    153: **
                    154: **     Diagnostics:
                    155: **             none
                    156: **
                    157: **     Syserrs:
                    158: **             none
                    159: **
                    160: **     History:
                    161: **             20 Dec 1978     -- written (rick)
                    162: */
                    163: 
                    164: QTREE *
                    165: tlprepend(a, b)
                    166: QTREE  *a;
                    167: QTREE  *b;
                    168: {
                    169:        register QTREE  *q;
                    170: 
                    171: # ifdef        xPTR1
                    172:        tTfp(62, 4, "tlprepend\n");
                    173: # endif
                    174: 
                    175:        if (b==NULL)
                    176:            return(a);
                    177:        /* scan to the left end of b */
                    178:        for (q = b; q->left != NULL; q = q->left)
                    179:                ;       /* no action */
                    180:        
                    181:        /* attach a to the end of b */
                    182:        q->left = a;
                    183:        return (b);
                    184: }
                    185: 
                    186: 
                    187: 
                    188: /*
                    189: **  HEADER.C -- print header for retrieve to terminal
                    190: **
                    191: **     "setp" to reconstruct the field names and types and passing
                    192: **     them to the normal printhdr etc.
                    193: **
                    194: **     Defines:
                    195: **             header()
                    196: **
                    197: **     Requires:
                    198: **             printhdr        - utility lib
                    199: **             beginhdr        - utility lib
                    200: **             printeol        - utility lib
                    201: **             printeh         - utility lib
                    202: **             atoi            - utility lib
                    203: **             Dc              - vble, number of params in list
                    204: **             Dv              - vble, list of parameters
                    205: **
                    206: **     Trace Flags:
                    207: **             none
                    208: **
                    209: **     History:
                    210: **             written (ancient history) (rick)
                    211: */
                    212: header(pv)
                    213: PARM   *pv;
                    214: {
                    215:        int             len;
                    216:        HDRINFO         *hptr;
                    217:        HDRINFO         *tptr;
                    218:        int             start = 1;
                    219:        extern HDRINFO  *Hdrptr;
                    220:        extern HDRINFO  *Fieldwidth;
                    221:        extern int      Hdr;
                    222: 
                    223:        Hdr = TRUE;
                    224:        beginhdr();
                    225: 
                    226: 
                    227:        for (; pv->pv_type != PV_EOF; pv += 2)
                    228:        {
                    229:                if ((pv[1].pv_val.pv_str[0] & I1MASK) == 'c')
                    230:                {
                    231:                        tptr = (HDRINFO *) malloc(sizeof(HDRINFO));
                    232:                        if (start)
                    233:                        {
                    234:                                Hdrptr = tptr;
                    235:                                Fieldwidth = Hdrptr;
                    236:                                start = 0;
                    237:                        }
                    238:                        else
                    239:                                hptr->next = tptr;
                    240:                        hptr = tptr;
                    241:                }
                    242: 
                    243:                len = atoi(&pv[1].pv_val.pv_str[1]);
                    244:                printhdr(pv[1].pv_val.pv_str[0] & I1MASK, len, pv->pv_val.pv_str);
                    245: 
                    246:                if ((pv[1].pv_val.pv_str[0] & I1MASK) == 'c')
                    247:                {
                    248:                        tptr->len = len;
                    249:                        tptr->len &= 0377;
                    250:                        tptr->next = NULL;
                    251:                }
                    252:        }
                    253:        printeol();
                    254:        printeh();
                    255: }
                    256: 
                    257: 
                    258: 
                    259: 
                    260: 
                    261: 
                    262: /*
                    263: **  PATMAT -- converts pattern matching characters in a string
                    264: **
                    265: **     Searches a string up to a null byte for one of the pattern
                    266: **     matching characters '*', '?', '[', and ']'. It then converts
                    267: **     these characters to their internal control character equivalents.
                    268: **
                    269: **     Parameters:
                    270: **             str             -- the string to search
                    271: **
                    272: **     Returns:
                    273: **             0               -- always
                    274: **
                    275: **     Side Effects:
                    276: **             none
                    277: **
                    278: **     Requires:
                    279: **             symbol.h
                    280: **
                    281: **     Called By:
                    282: **             y.tab.c         -- grammar
                    283: **
                    284: **     Trace Flags:
                    285: **             none
                    286: **
                    287: **     Diagnostics:
                    288: **             none
                    289: **
                    290: **     Syserrs:
                    291: **             none
                    292: **
                    293: **     History:
                    294: **             written (ancient history) (rick)
                    295: **             amended (Heidi) -- checks for numbers after PAT_SPEC's 
                    296: **                     and does away with flags making pattern matching
                    297: **                     characters legal in strings
                    298: */
                    299: 
                    300: 
                    301: /*
                    302: ** PATMAT
                    303: **     hunts through a string and converts the pattern matching
                    304: **     characters and replaces with the corresponding cntrl chars
                    305: */
                    306: patmat(str)
                    307: char   *str;
                    308: {
                    309:        register int    i;              /* index variables */
                    310:        register char   *p, *q, c;
                    311:        extern int      Qlflag;
                    312: 
                    313:        q = str;
                    314:        for (p = str; *p; p++)
                    315:        {       
                    316:                if (*p == '\\')
                    317:                {
                    318:                        *q++ = *++p;
                    319:                        continue;
                    320:                }
                    321:                switch (*p)
                    322:                {
                    323:                  case '#':
                    324:                        if (*(p + 1) == '#') 
                    325:                        {
                    326:                                p++;
                    327:                                if ((c = *(p + 1)) == '0')
                    328:                                {
                    329:                                        *q++ = PAT_GLOB;
                    330:                                        p++;
                    331:                                }
                    332:                                else if (c >= '1' && c <= '9')
                    333:                                {
                    334:                                        if ( !Qlflag )               /* target*/
                    335:                                            Patspec_flag[c - '0'] = 1;
                    336:                                        else                     /* qualifier */
                    337:                                        {
                    338:                                            if( Patspec_flag[c - '0'] == (TARGBIT | QUALBIT))
                    339:                                            {
                    340:                                                for (i=0; i<PATNUM; i++)
                    341:                                                        Patspec_flag[i] = 0;
                    342:                                                par_error(DUPINDEX,WARN,0);
                    343:                                            }
                    344:                                            /* allows for repeated indices in
                    345:                                            ** qualifier as long as index is not
                    346:                                            ** mentioned in target
                    347:                                            */
                    348:                                            else
                    349:                                                Patspec_flag[c - '0'] = Patspec_flag[c - '0'] | QUALBIT;
                    350:                                        }
                    351:                                        *q++ = PAT_SPEC;
                    352:                                }
                    353:                                else 
                    354:                                        par_error(NOINDEX,WARN,0);
                    355:                                continue;
                    356:                        }
                    357:                        else
                    358:                                *q++ = *p;
                    359:                        continue;
                    360:       
                    361:                  case '*':
                    362:                        if (!Qlflag)
                    363:                                par_error(NOPATMAT, WARN, 0);
                    364:                        *q++ = PAT_ANY;
                    365:                        continue;
                    366: 
                    367:                  case '?':
                    368:                        if (!Qlflag)
                    369:                                par_error(NOPATMAT, WARN, 0);
                    370:                        *q++ = PAT_ONE;
                    371:                        continue;
                    372: 
                    373:                  case '[':
                    374:                        if (!Qlflag)
                    375:                                par_error(NOPATMAT, WARN, 0);
                    376:                        *q++ = PAT_LBRAC;
                    377:                        continue;
                    378: 
                    379:                  case ']':
                    380:                        if (!Qlflag)
                    381:                                par_error(NOPATMAT, WARN, 0);
                    382:                        *q++ = PAT_RBRAC;
                    383:                        continue;
                    384: 
                    385:                  default:
                    386:                        *q++ = *p;
                    387:                        continue;
                    388:                }
                    389:        }
                    390:        *q = '\0';
                    391:        return (0);
                    392: }
                    393: /*
                    394: **  PERMCOM -- map command allowed into protection catalog bits
                    395: **
                    396: **     translates the QMODE type symbols into the appropriate counterparts
                    397: **     for the permit statement allowed command vector.  The manifest
                    398: **     constants are designed to be inclusive or'd together to form a
                    399: **     composite bit map of OK actions.
                    400: **
                    401: **     Parameters:
                    402: **             a               -- the QMODE type symbol for the command to add
                    403: **
                    404: **     Returns:
                    405: **             none
                    406: **
                    407: **     Side Effects:
                    408: **             changes the variable Permcomd to reflect the additional permission
                    409: **
                    410: **     Requires:
                    411: **             Permcomd must be define globally
                    412: **             catalog.h for the proper constants
                    413: **
                    414: **     Called By:
                    415: **             y.tab.c         -- the grammar
                    416: **
                    417: **     Trace Flags:
                    418: **             none
                    419: **
                    420: **     Diagnostics:
                    421: **             none
                    422: **
                    423: **     Syserrs:
                    424: **             bad QMODE(%d)   -- a bad symbol has been passed for mapping
                    425: **
                    426: **     History:
                    427: **             28 Dec 1978     -- written (rick)
                    428: */
                    429: 
                    430: permcom(a)
                    431: int    a;
                    432: {
                    433:        extern int              Permcomd;
                    434:        switch (a)
                    435:        {
                    436:          case mdRETR:
                    437:                Permcomd |= PRO_RETR;
                    438:                break;
                    439: 
                    440:          case mdAPP:
                    441:                Permcomd |= PRO_APP;
                    442:                break;
                    443:        
                    444:          case mdREPL:
                    445:                Permcomd |= PRO_REPL;
                    446:                break;
                    447: 
                    448:          case mdDEL:
                    449:                Permcomd |= PRO_DEL;
                    450:                break;
                    451: 
                    452:          case -1:
                    453:                Permcomd |= 0177777;            /* all bits set */
                    454:                break;
                    455:        
                    456:          default:
                    457:                syserr("permcom: bad QMODE(%d)", a);
                    458:        }
                    459: }
                    460: 
                    461: char   *
                    462: makestr(str)
                    463: register char  *str;
                    464: {
                    465:        register char   *result;
                    466:        register int    len;
                    467: 
                    468:        len = length(str) + 1;
                    469: 
                    470:        result = (char *) need(Qbuf, len);
                    471: 
                    472:        bmove(str, result, len);
                    473: 
                    474:        return (result);
                    475: }
                    476: 
                    477: 
                    478: /*
                    479: **     QUALINDEX -- 
                    480: **             check to see if a PAT_SPEC index was used in a target
                    481: **             list and not in a qualifier list
                    482: **
                    483: **             Returns: 0 if ok
                    484: **                      calls par_error if not ok
                    485: **
                    486: **             Called by: y.tab.c   -grammar
                    487: */
                    488: 
                    489: qualindex()
                    490: {
                    491:        int i;
                    492: 
                    493:        for (i=0; i<PATNUM; i++)
                    494:        {
                    495:                if (Patspec_flag[i] == TARGBIT)
                    496:                {
                    497:                        /* reset the rest of the flag array */
                    498:                        while (i++ < PATNUM)
                    499:                             Patspec_flag[i] = 0;
                    500:                        par_error(NOQUALINDX, WARN, 0);
                    501:                }
                    502:                Patspec_flag[i] = 0;
                    503:        }
                    504:        return(0);
                    505: }

unix.superglobalmegacorp.com

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