Annotation of researchv10no/cmd/gre/bm.c, revision 1.1

1.1     ! root        1: #include       "re.h"
        !             2: #include       "lre.h"
        !             3: #include       "hdr.h"
        !             4: 
        !             5: /*
        !             6:        this next one is dirty but i can't think of a good way out now.
        !             7:        essentially, LARGE has to be a bit bigger than the biggest buffer
        !             8:        we are ever given by rdfn
        !             9: */
        !            10: #define                LARGE   (100000000+2)
        !            11: 
        !            12: static int bb(re_bm *, unsigned char*, unsigned char*);
        !            13: 
        !            14: re_bm *
        !            15: re_bmcomp(char *ppb, char *ppe, unsigned char *map)
        !            16: {
        !            17:        register unsigned char *pb = (unsigned char *)ppb;
        !            18:        register unsigned char *pe = (unsigned char *)ppe;
        !            19:        register int j;
        !            20:        int delta[256];
        !            21:        register re_bm *b;
        !            22: 
        !            23:        b = (re_bm *)malloc(sizeof *b);
        !            24:        if(b == 0){
        !            25:                re_error("b malloc fail");
        !            26:                return 0;
        !            27:        }
        !            28:        b->patlen = pe-pb;
        !            29:        memmove((char *)b->cmap, (char *)map, sizeof b->cmap);
        !            30:        b->bmpat = malloc(b->patlen);
        !            31:        if(b->bmpat == 0){
        !            32:                re_error("bmpat malloc fail");
        !            33:                free((char*)b);
        !            34:                return 0;
        !            35:        }
        !            36:        if (bb(b, pb, pe) == 0){
        !            37:                free((char*)b->bmpat);
        !            38:                free((char*)b);
        !            39:                return 0;
        !            40:        }
        !            41:        for(j = 0; pb+j < pe; j++)
        !            42:                b->bmpat[j] = b->cmap[pb[j]];
        !            43:        for(j = 0; j < 256; j++)
        !            44:                delta[j] = b->patlen;
        !            45:        for(pe--; pb < pe; pb++)
        !            46:                delta[b->cmap[*pb]] = pe-pb;
        !            47:        delta[b->cmap[*pb]] = LARGE;
        !            48:        for(j = 0; j < 256; j++)
        !            49:                b->delta0[j] = delta[b->cmap[j]];
        !            50:        return(b);
        !            51: }
        !            52: 
        !            53: static int
        !            54: bb(register re_bm *b, register unsigned char *pb, register unsigned char *pe)
        !            55: {
        !            56:        int *f;
        !            57:        register m = pe-pb;
        !            58:        register i, k, j;
        !            59: 
        !            60:        f = (int *)malloc(sizeof(int)*(m+1));
        !            61:        if(f == 0){
        !            62:                re_error("delta2 f malloc");
        !            63:                return 0;
        !            64:        }
        !            65:        pb--;
        !            66:        b->delta2 = (int *)malloc(sizeof(int)*(b->patlen+1));
        !            67:        if(b->delta2 == 0){
        !            68:                re_error("delta2 malloc");
        !            69:                free((char*)f);
        !            70:                return 0;
        !            71:        }               
        !            72:        for(i = 1; i <= m; i++)
        !            73:                b->delta2[i] = 2*m-i;
        !            74:        j = m;
        !            75:        k = m+1;
        !            76:        while(j > 0){
        !            77:                f[j] = k;
        !            78:                while((k <= m) && (pb[j] != pb[k])){
        !            79:                        if(m-j < b->delta2[k])
        !            80:                                b->delta2[k] = m-j;
        !            81:                        k = f[k];
        !            82:                }
        !            83:                j--;
        !            84:                k--;
        !            85:        }
        !            86:        for(i = 1; i <= k; i++){
        !            87:                if(b->delta2[i] > m+k-i)
        !            88:                        b->delta2[i] = m+k-i;
        !            89:        }
        !            90:        free((char *)f);
        !            91:        return 1;
        !            92: }
        !            93: 
        !            94: re_bmexec(void *re_b, RDFN rdfn, MATCHFN matchfn)
        !            95: {
        !            96:        register re_bm *b = (re_bm*)re_b;
        !            97:        register unsigned char *sp;
        !            98:        register unsigned char *e, *s;
        !            99:        unsigned char *re, *rs;
        !           100:        register k;
        !           101: 
        !           102:        for(rs = 0; (k = (*rdfn)((char**)&rs, (char**)&re)) > 0; rs = s, re = e){
        !           103:                e = re;
        !           104:                s = rs;
        !           105:                while(s < e){
        !           106:                        while((s += b->delta0[*s]) < e)
        !           107:                                ;
        !           108:                        if(s < e+b->patlen){    /* no match */
        !           109:                                s = e;
        !           110:                                break;
        !           111:                        }
        !           112:                        s -= LARGE;
        !           113:                        for(k = b->patlen-2, sp = s-1; k >= 0; k--)
        !           114:                                if(b->cmap[*sp--] != b->bmpat[k])
        !           115:                                        break;
        !           116: /*print("k=%d s=%d sp=%d\n", k, s, sp);/**/
        !           117:                        if(k < 0){
        !           118:                                unsigned char *bm = ++sp, *em = s+1;
        !           119:                                if((k = (*matchfn)((char**)&bm, (char**)&em)) <= 0)
        !           120:                                        return(k);
        !           121:                                s = bm;
        !           122:                                e = em;
        !           123:                        } else {
        !           124:                                /*j = b->delta2[k+1];
        !           125:                                k = b->delta0[cmap[*++sp]];
        !           126:                                if((j > k) || (k == LARGE))
        !           127:                                         k = j;
        !           128:                                s = sp+k;*/s++;
        !           129:                        }
        !           130:                }
        !           131:        }
        !           132:        return(k);
        !           133: }
        !           134: 
        !           135: void
        !           136: re_bmfree(re_bm *pat)
        !           137: {
        !           138:        free((char *)pat->delta2);
        !           139:        free(pat->bmpat);
        !           140:        free((char *)pat);
        !           141: }

unix.superglobalmegacorp.com

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