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

1.1     ! root        1: #include       <string.h>
        !             2: #include       <stdio.h>
        !             3: #if defined(__STDC__) || defined(c_plusplus) || defined(__cplusplus)
        !             4: #include       <stdlib.h>
        !             5: #endif
        !             6: #include       "re.h"
        !             7: 
        !             8: #ifdef MAIN
        !             9: 
        !            10: main(argc, argv)
        !            11:        char **argv;
        !            12: {
        !            13:        Expr *re;
        !            14:        re_re *r;
        !            15:        char *pat;
        !            16:        FILE *tmp;
        !            17:        char *tmpn;
        !            18:        extern char *tmpnam();
        !            19:        char e1[4096], e2[4096];
        !            20:        unsigned char map[256];
        !            21:        int n;
        !            22: 
        !            23:        if(argc != 2){
        !            24:                fprintf(stderr, "Usage: efile pattern\n");
        !            25:                exit(1);
        !            26:        }
        !            27:        pat = argv[1];
        !            28:        for(n = 0; n < 256; n++)
        !            29:                map[n] = n;
        !            30:        r = re_recomp(pat, pat+strlen(pat), map);
        !            31:        if(r == 0)
        !            32:                exit(1);
        !            33:        re = r->root;
        !            34:        tmpn = tmpnam((char *)0);
        !            35:        if((tmp = fopen(tmpn, "w+r")) == NULL){
        !            36:                perror(tmpn);
        !            37:                exit(1);
        !            38:        }
        !            39:        eg_epr(re, e1, 0);
        !            40:        re_refile(r, tmp);
        !            41:        rewind(tmp);
        !            42:        r = re_filere(tmp);
        !            43:        eg_epr(r->root, e2, 0);
        !            44:        if(strcmp(e1, e2))
        !            45:                printf("MISMATCH!!\nbefore:\n%s\nafter:\n%s\n", e1, e2);
        !            46:        else
        !            47:                printf("ok\n");
        !            48:        re_refree(r);
        !            49:        exit(0);
        !            50: }
        !            51: #else
        !            52: 
        !            53: #include       "lre.h"
        !            54: 
        !            55: #if defined(__STDC__) || defined(c_plusplus) || defined(__cplusplus)
        !            56: static void etofile(Expr *, FILE *);
        !            57: static Expr *filetoe(FILE *);
        !            58: #else
        !            59: static void etofile();
        !            60: static Expr *filetoe();
        !            61: #endif
        !            62: 
        !            63: #define                REVERSION               2
        !            64: 
        !            65: void
        !            66: re_refile(re_re *re, FILE *fp)
        !            67: {
        !            68:        if(re == 0)
        !            69:                return;
        !            70:        if(putc(REVERSION, fp) != REVERSION){
        !            71:                re_error("couldn't write version");
        !            72:                return;
        !            73:        }
        !            74:        if(fwrite(re->mymap, 256, 1, fp) != 1){
        !            75:                re_error("couldn't write char map");
        !            76:                return;
        !            77:        }
        !            78:        putw(re->carat, fp);
        !            79:        etofile(re->root, fp);
        !            80: }
        !            81: 
        !            82: static void
        !            83: etofile(Expr *e, FILE *fp)
        !            84: {
        !            85:        Expr ee;
        !            86: 
        !            87:        if(e == 0){
        !            88:                e = &ee;
        !            89:                e->type = Null;
        !            90:        }
        !            91:        putw(e->type, fp);
        !            92:        putw(e->lit, fp);
        !            93:        putc(e->backref, fp);
        !            94:        putc(e->parens, fp);
        !            95:        switch(e->type)
        !            96:        {
        !            97:        case Null:
        !            98:        case Literal:
        !            99:        case Dot:
        !           100:        case Carat:
        !           101:        case Dollar:
        !           102:        case Backref:
        !           103:                break;
        !           104:        case Compcharclass:
        !           105:        case Charclass:
        !           106:                putw((int)e->l, fp);
        !           107:                fwrite((char *)e->r, (int)e->l, 1, fp);
        !           108:                break;
        !           109:        case Cat:
        !           110:        case Alternate:
        !           111:                etofile(e->l, fp);
        !           112:                etofile(e->r, fp);
        !           113:                break;
        !           114:        case Star:
        !           115:        case Plus:
        !           116:        case Quest:
        !           117:        case Group:
        !           118:        case EOP:
        !           119:                etofile(e->l, fp);
        !           120:                break;
        !           121:        }
        !           122: }
        !           123: 
        !           124: re_re *
        !           125: re_filere(FILE *fp)
        !           126: {
        !           127:        register re_re *r;
        !           128: 
        !           129:        r = (re_re *)egmalloc(sizeof (re_re), "allocating re_re");
        !           130:        if(r == 0)
        !           131:                return(0);
        !           132:        memset((char *)r, 0, sizeof (re_re));
        !           133:        if(getc(fp) != REVERSION){
        !           134:                re_error("read bad version number");
        !           135:                goto err;
        !           136:        }
        !           137:        if(fread(r->mymap, 256, 1, fp) != 1){
        !           138:                re_error("couldn't read char map");
        !           139:                goto err;
        !           140:        }
        !           141:        r->carat = getw(fp);
        !           142:        eg_lexinit((char *)0, (char *)0);
        !           143:        if((r->root = filetoe(fp)) == 0){
        !           144: err:
        !           145:                free((char *)r);
        !           146:                return(0);
        !           147:        }
        !           148:        egpost(r);
        !           149:        if(r->backref || r->parens)
        !           150:                egbr(r);
        !           151:        else
        !           152:                eginit(r, r->carat);
        !           153:        return(r);
        !           154: }
        !           155: 
        !           156: static Expr *
        !           157: filetoe(FILE *fp)
        !           158: {
        !           159:        Expr *ee, *er, *el, *ret;
        !           160:        int t, l;
        !           161:        Exprtype et;
        !           162:        char res[256];
        !           163:        int br, parens;
        !           164: 
        !           165:        t = getw(fp);
        !           166:        if((t == EOF) && feof(fp))
        !           167:                return(0);
        !           168:        et = (Exprtype)t;
        !           169:        l = getw(fp);
        !           170:        br = getc(fp);
        !           171:        parens = getc(fp);
        !           172:        switch(et)
        !           173:        {
        !           174:        case Null:
        !           175:                return(0);
        !           176:        case Literal:
        !           177:        case Dot:
        !           178:        case Carat:
        !           179:        case Dollar:
        !           180:        case Backref:
        !           181:                ret = eg_newexpr(et, l, (Expr *)0, (Expr *)0);
        !           182:                break;
        !           183:        case Compcharclass:
        !           184:        case Charclass:
        !           185:                ee = eg_newexpr(et, l, (Expr *)0, (Expr *)0);
        !           186:                l = getw(fp);
        !           187:                ee->r = (Expr *)egmalloc(l, "filetoe copy");
        !           188:                if (!ee->r)
        !           189:                        return 0;
        !           190:                ee->l = (Expr *)l;
        !           191:                fread((char *)ee->r, l, 1, fp);
        !           192:                ret = ee;
        !           193:                break;
        !           194:        case Cat:
        !           195:        case Alternate:
        !           196:                el = filetoe(fp);
        !           197:                er = filetoe(fp);
        !           198:                ret = eg_newexpr(et, l, el, er);
        !           199:                break;
        !           200:        case Star:
        !           201:        case Plus:
        !           202:        case Quest:
        !           203:        case Group:
        !           204:        case EOP:
        !           205:                el = filetoe(fp);
        !           206:                ret = eg_newexpr(et, l, el, (Expr *)0);
        !           207:                break;
        !           208:        default:
        !           209:                SPR res, "<reading expr undef type %d lit=%d>", t, l);
        !           210:                re_error(res);
        !           211:                return((Expr *)0);
        !           212:        }
        !           213:        ret->backref = br;
        !           214:        ret->parens = parens;
        !           215:        return(ret);
        !           216: }
        !           217: #endif

unix.superglobalmegacorp.com

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