Annotation of researchv10no/ipc/mgrs/svcmgr/re.c, revision 1.1.1.1

1.1       root        1: #include <setjmp.h>
                      2: #include <stdio.h>
                      3: #include <ctype.h>
                      4: #include <libc.h>
                      5: #include "mgr.h"
                      6: 
                      7: /*
                      8:  *  Compressed regular expressions.  A single lists represents all regular
                      9:  *  expressions.  Whenever a new one is created, the list is searched for an
                     10:  *  equivalent re.  If one is found, it is returned and its reference count
                     11:  *  incremented.  If the regular expression is a simple string, it is not
                     12:  *  compiled and strcmp is used to check for equivalence.
                     13:  */
                     14: 
                     15: Cregexp *relist;       /* the list */
                     16: 
                     17: /*
                     18:  * trap errors from recomp and regexec
                     19:  */
                     20: jmp_buf rxerr;
                     21: 
                     22: regerror(s)
                     23: char *s;
                     24: {
                     25:        logevent("regex error: %s\n", s);
                     26:        longjmp(rxerr, 1);
                     27: }
                     28: 
                     29: /*
                     30:  *  compile a regular expression inserting a ^ at the beginning and
                     31:  *  a $ at the end.
                     32:  */
                     33: Cregexp *
                     34: newre(re)
                     35:        char *re;
                     36: {
                     37:        char fullre[ARB];
                     38:        register Cregexp *rp;
                     39:        int i;
                     40: 
                     41:        /*
                     42:         *  look for a previous version of the same
                     43:         */
                     44:        for(rp=relist; rp; rp=rp->next)
                     45:                if(strcmp(rp->re, re)==0){
                     46:                        rp->ref++;
                     47:                        return(rp);
                     48:                }
                     49: 
                     50:        /*
                     51:         *  alloc a new one
                     52:         */
                     53:        rp = (Cregexp *)malloc(sizeof(Cregexp));
                     54:        if(rp == NULL)
                     55:                return((Cregexp *)0);
                     56:        rp->re = strdup(re);
                     57:        rp->ref = 1;
                     58:        rp->prog = NULL;
                     59:        if(setjmp(rxerr)){
                     60:                freere(rp);
                     61:                return((Cregexp *)0);
                     62:        }
                     63: 
                     64:        /*
                     65:         *  add the ^$
                     66:         */
                     67:        if(*re != '^')
                     68:                strcpy(fullre, "^");
                     69:        else
                     70:                fullre[0] = 0;
                     71:        strcat(fullre, re);
                     72:        i = strlen(fullre);
                     73:        if(fullre[i-1] != '$')
                     74:                strcat(fullre, "$");
                     75: 
                     76:        /*
                     77:         *  compile the re
                     78:         */
                     79:        rp->prog = regcomp(fullre);
                     80:        if(rp->prog == NULL){
                     81:                freere(rp);
                     82:                return((Cregexp *)0);
                     83:        }
                     84: 
                     85:        /*
                     86:         *  thread into list 
                     87:         */
                     88:        rp->next = relist;
                     89:        relist = rp;
                     90:        return(rp);
                     91: }
                     92: 
                     93: /*
                     94:  *  free a regular expression
                     95:  */
                     96: freere(rp)
                     97:        Cregexp *rp;
                     98: {
                     99: /*
                    100:  *  This code is left if the need arises.  Normally, it is cheaper
                    101:  *  in space to not free re's since most are eventually reused.
                    102:        Cregexp *trp;
                    103: 
                    104:        if(--(rp->ref) > 0)
                    105:                return;
                    106:        free(rp->re);
                    107:        if(rp->prog != NULL)
                    108:                free((char *)(rp->prog));
                    109:        if(relist == rp)
                    110:                relist = rp->next;
                    111:        else {
                    112:                for(trp=relist; trp->next!=rp; trp=trp->next)
                    113:                        ;
                    114:                trp->next = rp->next;
                    115:        }
                    116:        free((char *)rp);
                    117: */
                    118: }
                    119: 
                    120: /*
                    121:  *  execute a regular expression
                    122:  */
                    123: execre(rp, string, sub, nsub)
                    124:        Cregexp *rp;
                    125:        char *string;
                    126:        regsubexp *sub; /* subexpression elements */
                    127:        int nsub;       /* number of elements pointed to by sub */
                    128: {
                    129:        int rv;
                    130: 
                    131:        if(rp->prog==NULL){
                    132:                rv = strcmp(string, rp->re)==0;
                    133:                if(rv && sub && nsub>1){
                    134:                        sub[0].sp = string;
                    135:                        sub[0].ep = string+strlen(string);
                    136:                }
                    137:                return(rv);
                    138:        } else
                    139:                return(regexec(rp->prog, string, sub, nsub));
                    140: }

unix.superglobalmegacorp.com

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