Annotation of researchv10dc/cmd/library/checkdoc.c, revision 1.1.1.1

1.1       root        1: /*     library:checkdoc.c      1.7     */
                      2: #include "sccsid.h"
                      3: VERSION(@(#)library:checkdoc.c 1.7)
                      4: 
                      5: /*************   checkdoc.c   ***************/
                      6: 
                      7: /* This routine checks whether a given document id is legal.
                      8:  * It checks in file
                      9:  *     WHERE/known.list
                     10:  * to see if the document id meets any of the document ID formats
                     11:  * listed there.
                     12:  *
                     13:  * The lines in known.list  have 3 forms:
                     14:  *     start with ? mark - help text
                     15:  *     start with #   - comments
                     16:  *     start with ^regular expression.  This causes all the following
                     17:  *           lines to be scanned, ignoring if the given expression starts the
                     18:  *           document id
                     19:  *     all others are regular expression document ID formats.
                     20:  * Return value:
                     21:  *     <0   on failure.
                     22:  *     0    success - but no remarks allowed
                     23:  *     >0   success - remarks allowed.
                     24:  */
                     25: #include <stdio.h>
                     26: #include <ctype.h>
                     27: static char *exp_ptr;
                     28: 
                     29: #define INIT           register char *sp = exp_ptr;
                     30: #define GETC()         (*sp++)
                     31: #define PEEKC()                (*sp)
                     32: #define UNGETC(x)      (--sp)
                     33: #define RETURN(c)      { exp_ptr = sp; return(c); }
                     34: #define ERROR(c)       return(NULL);
                     35: #include "regexp.h"
                     36: #define LBSIZE 256
                     37: char *strchr();
                     38: 
                     39: checkdoc(str)
                     40: char *str;
                     41:  {
                     42:     char expbuf[LBSIZE], rhsbuf[LBSIZE];
                     43:     char genbuf[LBSIZE], line[100];
                     44:     register char *ptr, *mstr;
                     45:     static FILE *infile=NULL;
                     46:     long value;
                     47:     static char *bchecks="ABCDEFGHJKLMNPQRTSVWXYZ";
                     48:     static char *schecks="ABCDEFHJKLMNPQRTVWXY";
                     49: 
                     50:     if (infile == NULL) {
                     51:            sprintf(line, "%s/known.list", WHERE);
                     52:            if ((infile = fopen(line, "r")) == NULL) {
                     53:                fprintf(stderr, "No ID format file!! No requests sent!!\n");
                     54:                exit(1);
                     55:                }
                     56:            }
                     57:     rewind(infile);
                     58:     *line = '^';
                     59:     mstr = str;
                     60:     while (fgets(line+1, 100, infile) != NULL) {
                     61:        ptr = line+1;
                     62:        if (*ptr == '?') continue;
                     63:        if (*ptr == '#') continue;
                     64:        if (*ptr == '\n') continue;
                     65:        if (*ptr == '^') {
                     66:            ptr++;
                     67:            /* just a ^ resets to start of string */
                     68:            if (*ptr == '\n') {
                     69:                mstr = str;
                     70:                continue;
                     71:                }
                     72:            *expbuf = 0;
                     73:            exp_ptr = line+1;
                     74:            if (compile((char *) 0, expbuf, expbuf+LBSIZE, '\t') == NULL)
                     75:                    return(-2);
                     76:            compsub(rhsbuf, '\t'); 
                     77:            if (match(expbuf, 0, mstr, genbuf)) mstr = loc2;
                     78:            continue;
                     79:            }
                     80:        *expbuf = 0;
                     81:        exp_ptr = line;
                     82:        if (compile((char *) 0, expbuf, expbuf+LBSIZE, '\t') == NULL)
                     83:                return(-2);
                     84:        compsub(rhsbuf, '\t'); 
                     85:        if (match(expbuf, 0, mstr, genbuf)) {
                     86:            ptr = strchr(line, '\t');
                     87:            if (ptr++ == NULL) return(0);
                     88:            if (strncmp(ptr, "REMARK", 6) == 0) return(1);
                     89:            else if (strncmp(ptr+1, "CHECK", 5) == 0) {
                     90:                    if (strlen(loc2) != 1) return(-3);
                     91:                    /* accept a question mark */
                     92:                    if (*loc2 == '?') return(0);
                     93:                    /* get the sum of the digits - note done with mstr */
                     94:                    for (value = 0, mstr=str; *mstr; mstr++)
                     95:                        if (isdigit(*mstr)) value = value * 10 + *mstr - '0';
                     96:                    /* check the check char */
                     97:                    if (*ptr == 'B')
                     98:                            ptr = bchecks;
                     99:                    else    ptr = schecks;
                    100:                    value = (value % strlen(ptr));
                    101:                    if (*loc2 != ptr[value]) return(-3);
                    102:                    return(0);
                    103:                    }
                    104:            if (strlen(loc2)) continue; /* more id than allowed - continue */
                    105:            return(0);
                    106:            }
                    107:        }
                    108:     return(-1);
                    109:     }
                    110: 
                    111: match(expbuf, gf, linebuf, genbuf)
                    112: char   *expbuf, *linebuf, *genbuf;
                    113: {
                    114:     register char   *p1, *p2;
                    115: 
                    116:     if(gf) {
                    117:            if (circf) return(0);
                    118:            p1 = linebuf;
                    119:            p2 = genbuf;
                    120:            while(*p1++ = *p2++);
                    121:            locs = p1 = loc2;
                    122:            }
                    123:     else {
                    124:            p1 = linebuf;
                    125:            locs = 0;
                    126:            }
                    127:     return(step(p1, expbuf));
                    128:     }
                    129: 
                    130: compsub(rhsbuf, sseof)
                    131: char    *rhsbuf, sseof;
                    132: {
                    133:     register char   *p, *q;
                    134: 
                    135:     p = rhsbuf;
                    136:     q = exp_ptr;
                    137:     for(;;) {
                    138:        if((*p = *q++) == '\\') {
                    139:                *p = *q++;
                    140:                if(*p > nbra + '0' && *p <= '9') return(NULL); 
                    141:                *p++ |= 0200;
                    142:                continue;
                    143:                }
                    144:        if(*p == sseof) {
                    145:                *p++ = '\0';
                    146:                exp_ptr = q;
                    147:                break;
                    148:                }
                    149:        if(*p++ == '\0') return(-1);
                    150:        }
                    151:     return(0);
                    152:     }

unix.superglobalmegacorp.com

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