Annotation of researchv10no/cmd/ccom/vax/gentable.c, revision 1.1

1.1     ! root        1: #include "stdio.h"
        !             2: 
        !             3: char line[10240];
        !             4: struct arg {
        !             5:        char *val;
        !             6:        int len;
        !             7: } args[1000];
        !             8: int narg;
        !             9: struct arg words[2000];
        !            10: extern char *wordskip(), *matchskip();
        !            11: 
        !            12: main()
        !            13: {      char *p, *q;
        !            14:        for(;;) {
        !            15:                (void) fgets(line, sizeof(line), stdin);
        !            16:                if(feof(stdin))
        !            17:                        exit(0);
        !            18:                narg = 0;
        !            19:                p = wordskip(line, '\t');
        !            20:                q = matchskip(p);
        !            21:                if(!findargs(p))
        !            22:                        continue;
        !            23:                if(!uniqargs())
        !            24:                        continue;
        !            25:                if(!matchargs(q))
        !            26:                        continue;
        !            27:                if(!checktemp(q))
        !            28:                        continue;
        !            29:                fixtree();
        !            30:                prleft(q);
        !            31:        }
        !            32: }
        !            33: 
        !            34: fixtree()
        !            35: {      int i, j;
        !            36:        for(i = 0; i < narg; i++)
        !            37:        for(j = 0; j < args[i].len; j++)
        !            38:                args[i].val[j] = i;
        !            39: }
        !            40: 
        !            41: 
        !            42: checktemp(q)
        !            43: char *q;       /* [^\].(fp) is an unusable temporary, and ,$n */
        !            44: {      char *p;
        !            45:        for(p = q; *p != '\n'; p++)
        !            46:                if(*p == 'f' && *(p-1) == '(' && *(p-2) > ' ')
        !            47:                        return(0);
        !            48:        for(p = q; *p != '\n'; p++)
        !            49:                if(*p == ',' && *(p+1) == '$' && *(p+2) > ' ')
        !            50:                        return(0);
        !            51:        for(p = q; *p != '\n'; p++)
        !            52:                if(*p == '$' && *(p+1) == '-')
        !            53:                        return(0);
        !            54:        return(1);
        !            55: }
        !            56: 
        !            57: prleft(q)
        !            58: char *q;
        !            59: {      char *p, *s;
        !            60:        for(p = line; *p != '\t'; p++)
        !            61:                ;
        !            62:        *p = ' ';
        !            63:        for(p = line; *p != '\n'; ) {
        !            64:                if(*p >= ' ') {
        !            65:                        putchar(*p++);
        !            66:                        continue;
        !            67:                }
        !            68:                for(s = p; *s == *p; s++)
        !            69:                        ;
        !            70:                if(*p < 10)
        !            71:                        printf("\\%d", *p);
        !            72:                else
        !            73:                        printf("\\%c", *p - 9 + 'a');
        !            74:                p = s;
        !            75:        }
        !            76:        putchar('\n');
        !            77: }
        !            78: int alens[33]; /* if an arg > 32, forget it */
        !            79: matchargs(s)
        !            80: char *s;
        !            81: {      char *p;
        !            82:        int i, j, ok;
        !            83:        for(i = 0; i < 33; i++)
        !            84:                alens[i] = 0;
        !            85:        for(i = 0; i < narg; i++)
        !            86:                if(args[i].len <= 32)
        !            87:                        alens[args[i].len]++;
        !            88:                else
        !            89:                        return(0);
        !            90:        for(j = 32; j >= 1; j--) {
        !            91:                if(alens[j] == 0)
        !            92:                        continue;
        !            93:                for(i = 0; i < narg; i++) {
        !            94:                        if(args[i].len != j)
        !            95:                                continue;
        !            96:                        ok = 0;
        !            97:                        for(p = s; *p != '\n'; p++)
        !            98:                                if(*p == args[i].val[0])
        !            99:                                        ok += matchit(p, i);
        !           100:                        if(ok == 0)
        !           101:                                return(0);
        !           102:                }
        !           103:        }
        !           104:        return(1);
        !           105: }
        !           106: 
        !           107: matchit(p, i)
        !           108: char *p;
        !           109: {      int j, c;
        !           110:        for(j = 0; j < args[i].len; j++)
        !           111:                if(p[j] != args[i].val[j])
        !           112:                        return(0);
        !           113:        if((c = p[j]) <= '9' && c >= '0')
        !           114:                return(0);
        !           115:        if(c <= 'z' && c >= 'a')
        !           116:                return(0);
        !           117:        if(c <= 'Z' && c >= 'A')
        !           118:                return(0);
        !           119:        for(j = 0; j < args[i].len; j++)
        !           120:                p[j] = i;       /* assumes narg < 32!!!!*/
        !           121:        return(1);
        !           122: }
        !           123: 
        !           124: findargs(p)
        !           125: char *p;
        !           126: {      int cnt, i, j;
        !           127:        struct arg *a;
        !           128:        if(*p != '(') {
        !           129:                fprintf(stderr, "findargs fmt %s", line);
        !           130:                return(0);
        !           131:        }
        !           132:        cnt = setwords(p);
        !           133:        for(i = 0; i <= cnt; i++)
        !           134:                stripcrud(words + i);
        !           135:        for(i = 0; i <= cnt; i++) {
        !           136:                a = &words[i];
        !           137:                if(a->len == 0)
        !           138:                        continue;
        !           139:                switch(numargs(a->val)) {
        !           140:                case 0:
        !           141:                        continue;
        !           142:                case 2:
        !           143:                        args[narg++] = words[++i];
        !           144:                case 1:
        !           145:                        args[narg++] = words[++i];
        !           146:                        continue;
        !           147:                default:
        !           148:                        fprintf(stderr, "unk op %s|%s", a->val, line);
        !           149:                        return(0);
        !           150:                }
        !           151:        }
        !           152:        return(1);
        !           153: }
        !           154: 
        !           155: struct {
        !           156:        char *val;
        !           157:        int num, len;
        !           158: } ops[] = {
        !           159:        {"and", 0},
        !           160:        {"asg", 0},     /* asg ops are binary*/
        !           161:        {"assign", 0},
        !           162:        {"call", 1},
        !           163:        {"cm", 0},
        !           164:        {"comop", 0},
        !           165:        {"compl", 0},
        !           166:        {"conv", 0},
        !           167:        {"decr", 0},
        !           168:        {"div", 0},
        !           169:        {"er", 0},
        !           170:        {"fld", 2},
        !           171:        {"funarg", 0},
        !           172:        {"genbr", 2},
        !           173:        {"genlab", 1},
        !           174:        {"genubr", 1},
        !           175:        {"icon", 1},
        !           176:        {"init", 0},
        !           177:        {"incr", 0},
        !           178:        {"ls", 0},
        !           179:        {"minus", 0},
        !           180:        {"mod", 0},
        !           181:        {"mul", 0},
        !           182:        {"name", 1},
        !           183:        {"not", 0},
        !           184:        {"or", 0},
        !           185:        {"plus", 0},
        !           186:        {"reg", 1},
        !           187:        {"return", 0},
        !           188:        {"unary", 0},   /* common prefix for unary ops */
        !           189:        {"rnode", 0},
        !           190:        {"qnode", 0},
        !           191:        {"snode", 0},
        !           192:        {"rs", 0},
        !           193:        {"star", 0},
        !           194:        {"starg", 2},
        !           195:        {"stasg", 1},
        !           196:        {"stcall", 2},
        !           197:        {"vauto", 1},
        !           198:        {"vparam", 1},
        !           199:        {0,0}
        !           200: };
        !           201: 
        !           202: numargs(s)
        !           203: char *s;
        !           204: {      int i;
        !           205:        static int init = 0;
        !           206:        if(!init++)
        !           207:                for(i = 0; ops[i].val; i++)
        !           208:                        ops[i].len = strlen(ops[i].val);
        !           209:        for(i = 0; ops[i].val; i++)
        !           210:                if(strncmp(s+1, ops[i].val,ops[i].len) == 0)
        !           211:                        return(ops[i].num);
        !           212:        return(-1);
        !           213: }
        !           214: 
        !           215: stripcrud(a)
        !           216: struct arg *a;
        !           217: {      char *p;
        !           218:        for(p = a->val + a->len - 1; *p == ' ' || *p == ')'; p--)
        !           219:                ;
        !           220:        if(p < a->val)
        !           221:                p = a->val - 1;
        !           222:        a->len = p - a->val + 1;
        !           223: }
        !           224: 
        !           225: setwords(p)
        !           226: char *p;
        !           227: {      int i;
        !           228:        i = 0;
        !           229: loop:
        !           230:        words[i].val = p;
        !           231:        p = wordskip(p, ' ');
        !           232:        words[i].len = p - words[i].val;
        !           233:        if(*p == '\\')
        !           234:                return(i);
        !           235:        i++;
        !           236:        goto loop;
        !           237: }
        !           238: 
        !           239: argcmp(a, b)
        !           240: struct arg *a, *b;
        !           241: {      int n, i;
        !           242:        n = a->len;
        !           243:        if(b->len < n)
        !           244:                n = b->len;
        !           245:        i = strncmp(a->val, b->val, n);
        !           246:        if(i != 0)
        !           247:                return(i);
        !           248:        if(a->len < b->len)
        !           249:                return(-1);
        !           250:        else if(a->len > b->len)
        !           251:                return(1);
        !           252:        return(0);
        !           253: }
        !           254: 
        !           255: uniqargs()
        !           256: {      int i, j;
        !           257:        for(i = 1; i < narg; i++) {
        !           258:                if(args[i].len <= 0)
        !           259:                        continue;
        !           260:                for(j = 0; j < i; j++) {
        !           261:                        if(args[j].len <= 0)
        !           262:                                continue;
        !           263:                        if(argcmp(args + i, args + j) == 0) {
        !           264:                                /*printf("%5.5s %5.5s ", args[i].val, args[j].val);
        !           265:                                */return(0);
        !           266:                        }
        !           267:                }
        !           268:        }
        !           269:        return(1);
        !           270: }
        !           271: 
        !           272: char *
        !           273: wordskip(p, c)
        !           274: char *p;
        !           275: {
        !           276:        for(; *p != c; p++)
        !           277:                ;
        !           278:        for(; *p == c; p++)
        !           279:                ;
        !           280:        return(p);
        !           281: }
        !           282: 
        !           283: char *
        !           284: matchskip(p)
        !           285: char *p;
        !           286: {      int cnt;
        !           287:        for(cnt = 0; ; p++)
        !           288:                if(*p == '(')
        !           289:                        cnt++;
        !           290:                else if(*p == ')')
        !           291:                        if(--cnt <= 0)
        !           292:                                return(p+1);
        !           293: }

unix.superglobalmegacorp.com

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