Annotation of coherent/d/usr/lib/scn/scn.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Quick and dirty screen builder.
        !             3:  * by Charles Fiterman on 2-6-90
        !             4:  *
        !             5:  * pass 1 count lines with data and field start chars.
        !             6:  * allocate tables.
        !             7:  * pass 2 build data.
        !             8:  * pass 3 output data to .c file.
        !             9:  */
        !            10: #include <misc.h>
        !            11: #include <scn.h>
        !            12: #include <ctype.h>
        !            13: 
        !            14: extern char *strrchr();
        !            15: extern char *strchr();
        !            16: extern char *strcpy();
        !            17: 
        !            18: static char *fileName = NULL;
        !            19: static char *outFile;
        !            20: static char fieldDesig = '!';
        !            21: static int errCt = 0, line = 1;
        !            22: static int backCnt, locCnt;
        !            23: static loc *locTab;
        !            24: static long filePos;
        !            25: 
        !            26: static FILE *ifp, *ofp, *hfp;
        !            27: 
        !            28: static char *buf;
        !            29: 
        !            30: #define MAXTOKEN 5
        !            31: 
        !            32: /*
        !            33:  * Usage message documents program usage.
        !            34:  */
        !            35: void
        !            36: Usage()
        !            37: {
        !            38:        fprintf(stderr, "Usage: scn [-fc] filename\n");
        !            39:        fprintf(stderr, "\t-fc sets field designator to c\n");
        !            40:        exit(1);
        !            41: }
        !            42: 
        !            43: /*
        !            44:  * Read into buff.
        !            45:  */
        !            46: qread()
        !            47: {
        !            48:        return (NULL != (buf = getline(ifp, &line)));
        !            49: }
        !            50: 
        !            51: /*
        !            52:  * this routine breaks command_string into individual tokens, putting
        !            53:  * pointers to these tokens into the array tokenlist. 
        !            54:  * no more than maxtoken tokens will be found.
        !            55:  * Note that the string is modified to place '\0' over
        !            56:  * token separators. The tokenlist points into the string.
        !            57:  * Tokens are separated by spaces, tabs and commas.
        !            58:  */
        !            59: void
        !            60: tokenize(s, tokenlist, maxtoken)
        !            61: register char *s;
        !            62: char *tokenlist[];
        !            63: int  maxtoken;
        !            64: {
        !            65:        register int state, i;
        !            66: 
        !            67:        for (i = 0; i < maxtoken; i++)
        !            68:                tokenlist[i] = NULL;
        !            69: 
        !            70:        for (i = state = 0; ; s++) {
        !            71:                switch (*s) {
        !            72:                case ' ':
        !            73:                case '\t':
        !            74:                        *s = state = 0;
        !            75:                        continue;
        !            76:                case ',':
        !            77:                        *s = state = 0;
        !            78:                        if (maxtoken > ++i)
        !            79:                                continue;
        !            80:                        fprintf(stderr, "Too many tokens in line %d\n", line);
        !            81:                        errCt++;
        !            82:                case 0:
        !            83:                        return;
        !            84:                }
        !            85:                if (!state) {   /* was in whitespace */
        !            86:                        tokenlist[i] = s;
        !            87:                        state = 1;      /* in token */
        !            88:                }
        !            89:        }
        !            90: }
        !            91: 
        !            92: /*
        !            93:  * Count lines and fields allocate space.
        !            94:  */
        !            95: void
        !            96: pass1()
        !            97: {
        !            98:        register char *p, c;
        !            99:        int sw, pos, nameCt, nlines, repits;
        !           100: 
        !           101:        fprintf(ofp, "/*\n");
        !           102:        fprintf(ofp, " * This file generated by scn from %s\n", fileName);
        !           103:        fprintf(ofp, " */\n");
        !           104: 
        !           105:        for (nlines = repits = nameCt = 0; qread(); ) {
        !           106:                char *token[MAXTOKEN];  /* name len default verifyProc */
        !           107:                int len;
        !           108: 
        !           109:                if ('%' == buf[0]) {            /* control statemnet */
        !           110:                        switch (buf[1]) {
        !           111:                        case '%': /* done with preface */
        !           112:                                filePos = ftell(ifp);
        !           113:                                break;
        !           114:                        case 'h': /* help line */
        !           115:                                continue;
        !           116:                        case ' ': /* group line */
        !           117:                        case 'g':
        !           118:                                if (2 == sscanf(buf + 2, "%d %d",
        !           119:                                                &nlines, &repits))
        !           120:                                        continue;
        !           121:                        default:
        !           122:                                fatal("Improper control line line %d", line);
        !           123:                        }
        !           124:                        break;
        !           125:                }
        !           126:                tokenize(buf, token, MAXTOKEN);
        !           127:                if (token[0] != NULL) {
        !           128:                        if (!(len = abs(atoi(token[1]))))
        !           129:                                len = abs(atoi(token[2]));
        !           130:                        len++;
        !           131:                        if (nlines) {
        !           132:                                nlines--;
        !           133:                                nameCt += repits;
        !           134:                                fprintf(hfp,
        !           135:                                        "extern char %s[%d][%d];\n",
        !           136:                                        token[0],
        !           137:                                        repits,
        !           138:                                        len);
        !           139:                                fprintf(ofp,
        !           140:                                        "char %s[%d][%d];\n",
        !           141:                                        token[0],
        !           142:                                        repits,
        !           143:                                        len);
        !           144:                        }
        !           145:                        else {
        !           146:                                nameCt++;
        !           147:                                fprintf(hfp, "extern char %s[%d];\n",
        !           148:                                        token[0], len);
        !           149:                                fprintf(ofp, "char %s[%d];\n",
        !           150:                                        token[0], len);
        !           151:                        }
        !           152:                }
        !           153:                else {
        !           154:                        errCt++;
        !           155:                        fprintf(stderr, "No field in line %d\n", line);
        !           156:                }
        !           157:                if (NULL != token[3])
        !           158:                        fprintf(ofp, "extern int (*%s)();\n", token[3]);
        !           159:                if ((NULL != token[2]) && (NULL != token[1]) &&
        !           160:                   ((len = atoi(token[1])) > 0) &&
        !           161:                   (strlen(token[2]) > len)) {
        !           162:                        errCt++;
        !           163:                        fprintf(stderr, "default %s greater then %d line %d\n",
        !           164:                                token[2], len, line);
        !           165:                }
        !           166:        }
        !           167: 
        !           168:        fprintf(ofp, "/* C tables for the screen:\n");
        !           169:        while (qread()) {
        !           170:                pos = sw = 0;
        !           171:                for (p = buf; c = *p; p++, pos++) {
        !           172:                        if (c == fieldDesig)
        !           173:                                locCnt++;
        !           174:                        else if (!isspace(c))
        !           175:                                sw = 1;
        !           176:                        else if ('\t' == c)
        !           177:                                pos |= 7;
        !           178:                }
        !           179:                backCnt += sw;
        !           180:                if (pos > 80) {
        !           181:                        errCt++;
        !           182:                        fprintf(stderr, "Line %d too long", line);
        !           183:                        continue;
        !           184:                }
        !           185:                for (p = buf; c = *p++; sw = c) {
        !           186:                        if ((('/' ==  c) && ('*' == sw)) ||
        !           187:                           (('/' == sw) && ('*' == c)))
        !           188:                                c = '?';
        !           189:                        fputc(c, ofp);
        !           190:                }
        !           191:                fputc('\n', ofp);
        !           192:        }
        !           193:        fprintf(ofp, " */\n\n");
        !           194:        if (nameCt != locCnt)
        !           195:                fatal("%d field names but %d fileds", nameCt, locCnt);
        !           196:        if (errCt)
        !           197:                exit(1);
        !           198:        if (locCnt)
        !           199:                locTab  = alloc(locCnt  * sizeof(loc));
        !           200: }
        !           201: 
        !           202: /*
        !           203:  * Put together tables.
        !           204:  */
        !           205: void
        !           206: pass2()
        !           207: {
        !           208:        int dataLine, row, lc;
        !           209: 
        !           210:        fseek(ifp, filePos, 0); /* pass %% */
        !           211: 
        !           212:        fprintf(ofp, "/*\n");
        !           213:        fprintf(ofp, " * Screen background data.\n");
        !           214:        fprintf(ofp, " */\n");
        !           215:        fprintf(ofp, "#include <scn.h>\n\n");
        !           216:        fprintf(ofp, "struct backGrnd %s_data[] = {\n", fileName);
        !           217: 
        !           218:        for (lc = row = dataLine = 0; qread(); row++) {
        !           219:                register char *p, c, *p1;
        !           220:                int spos, pos;
        !           221: 
        !           222:                for ((p1 = NULL), (p = buf), (pos = 0); c = *p; pos++, p++) {
        !           223:                        if (c == fieldDesig) {
        !           224:                                locTab[lc].row = row;
        !           225:                                locTab[lc].col = pos;
        !           226:                                *p = ' ';
        !           227:                                lc++;
        !           228:                                continue;
        !           229:                        }
        !           230:                        switch (c) {
        !           231:                        case '\t':
        !           232:                                pos |= 7;
        !           233:                        case ' ':
        !           234:                                continue;
        !           235:                        }
        !           236:                        if (NULL == p1) {       /* mark start of line */
        !           237:                                spos = pos;
        !           238:                                p1 = p;
        !           239:                        }
        !           240:                }
        !           241:                if (NULL == p1) /* no printable data on line */
        !           242:                        continue;
        !           243: 
        !           244:                for (p--; isspace(*p); p--)     /* trim line */
        !           245:                        *p = '\0';
        !           246: 
        !           247:                fputc('"', ofp);
        !           248:                for (pos = spos; c = *p1; p1++) {
        !           249:                        switch (c) {
        !           250:                        case '\t':      /* raw mode ignores tabs */
        !           251:                                do {    /* make them spaces */
        !           252:                                        fputc(' ', ofp);
        !           253:                                } while (++pos & 7);
        !           254:                                continue;
        !           255:                        case '\\':
        !           256:                        case '"':
        !           257:                                fputc('\\', ofp);
        !           258:                        default:
        !           259:                                fputc(c, ofp);
        !           260:                        }
        !           261:                        pos++;
        !           262:                }
        !           263:                fprintf(ofp, "\",\n\t %d, %d,\n", row, spos);
        !           264:        }
        !           265:        fprintf(ofp, "NULL\n");
        !           266:        fprintf(ofp, "};\n\n");
        !           267: }
        !           268: 
        !           269: #define nc(t, x) ((NULL != t) ? t : x)
        !           270: void
        !           271: pass3()
        !           272: {
        !           273:        register int i;
        !           274:        int nlines, skipout;
        !           275: 
        !           276:        rewind(ifp);
        !           277: 
        !           278:        fprintf(ofp, "/*\n");
        !           279:        fprintf(ofp, " * Screen data location table.\n");
        !           280:        fprintf(ofp, " */\n");
        !           281:        fprintf(ofp, "struct loc %s_locs[] = {\n", fileName);
        !           282:        for (skipout = nlines = i = 0; i < locCnt; i++) {
        !           283:                char *token[MAXTOKEN];  /* name len default verifyProc */
        !           284:                char helpMsg[80];
        !           285:                int skip, len, slines, j, repits;
        !           286: 
        !           287:                helpMsg[0] = 0;
        !           288:                for (qread(); '%' == buf[0]; qread()) {
        !           289:                        switch (buf[1]) {
        !           290:                        case ' ':
        !           291:                        case 'g':
        !           292:                                sscanf(buf + 2, "%d %d", &nlines, &repits);
        !           293:                                j = 0;
        !           294:                                slines = nlines;
        !           295:                                skipout = nlines * repits;
        !           296:                                filePos = ftell(ifp);
        !           297:                                break;
        !           298:                        case 'h':
        !           299:                                strcpy(helpMsg, buf + 3);
        !           300:                        }
        !           301:                }
        !           302:                tokenize(buf, token, MAXTOKEN);
        !           303:                if (NULL == token[1])   /* no length given */
        !           304:                        len = 79 - locTab[i].col;
        !           305:                else
        !           306:                        len = atoi(token[1]);
        !           307: 
        !           308:                if (skipout)
        !           309:                        skipout--;
        !           310:                skip = 0;
        !           311:                if (NULL != token[4]) {
        !           312:                        if (strcmp(token[4], "group"))
        !           313:                                skip = atoi(token[4]);
        !           314:                        else
        !           315:                                skip = skipout;
        !           316:                }
        !           317:                else if (!len)
        !           318:                        skip = atoi(token[2]);
        !           319: 
        !           320:                if (nlines) {
        !           321:                        if (len <= 0)
        !           322:                                fprintf(ofp,    /* field is default */
        !           323:                                 "\t%s[%d], %d, %s[%d], %s, %d, %d, %d,",
        !           324:                                 token[0], j,
        !           325:                                 -len,
        !           326:                                 ((len && NULL != token[2]) ?
        !           327:                                   token[2] : token[0]),
        !           328:                                 j,
        !           329:                                 nc(token[3], "NULL"),
        !           330:                                 locTab[i].row,
        !           331:                                 locTab[i].col,
        !           332:                                 skip);
        !           333:                        else
        !           334:                                fprintf(ofp,
        !           335:                                 "\t%s[%d], %d, \"%s\", %s, %d, %d, %d,",
        !           336:                                 token[0], j,
        !           337:                                 len,
        !           338:                                 nc(token[2], ""),
        !           339:                                 nc(token[3], "NULL"),
        !           340:                                 locTab[i].row,
        !           341:                                 locTab[i].col,
        !           342:                                 skip);
        !           343: 
        !           344:                        if (!--nlines && (++j != repits)) {
        !           345:                                fseek(ifp, filePos, 0);
        !           346:                                nlines = slines;
        !           347:                        }
        !           348:                }
        !           349:                else {
        !           350:                        if (len <= 0)
        !           351:                                fprintf(ofp,
        !           352:                                        "\t%s, %d, %s, %s, %d, %d, %d,",
        !           353:                                        token[0],
        !           354:                                        -len,
        !           355:                                        ((len && NULL != token[2]) ?
        !           356:                                                token[2] : token[0]),
        !           357:                                        nc(token[3], "NULL"),
        !           358:                                        locTab[i].row,
        !           359:                                        locTab[i].col,
        !           360:                                        skip);
        !           361:                        else
        !           362:                                fprintf(ofp,
        !           363:                                        "\t%s, %d, \"%s\", %s, %d, %d, %d,",
        !           364:                                        token[0],
        !           365:                                        len,
        !           366:                                        nc(token[2], ""),
        !           367:                                        nc(token[3], "NULL"),
        !           368:                                        locTab[i].row,
        !           369:                                        locTab[i].col,
        !           370:                                        skip);
        !           371:                }
        !           372:                if (helpMsg[0])
        !           373:                        fprintf(ofp, "\n\t\"%s\",\n", helpMsg);
        !           374:                else
        !           375:                        fprintf(ofp, " NULL,\n");
        !           376:        }
        !           377:        fprintf(ofp, "\tNULL\n};\n");
        !           378: }
        !           379: 
        !           380: /*
        !           381:  * Process args and call phases.
        !           382:  */
        !           383: main(argc, argv)
        !           384: char **argv;
        !           385: {
        !           386:        register char *arg;
        !           387: 
        !           388:        while (NULL != (arg = *++argv)) {
        !           389:                if ('-' == *arg) {
        !           390:                        switch (*++arg) {
        !           391:                        case 'f':
        !           392:                                fieldDesig = *++arg;
        !           393:                                break;
        !           394:                        default:
        !           395:                                Usage();
        !           396:                        }
        !           397:                        continue;
        !           398:                }
        !           399:                fileName = arg;
        !           400:        }
        !           401:        if (NULL == fileName)
        !           402:                Usage();
        !           403:        
        !           404:        ifp = xopen(fileName, "r");
        !           405:        if (NULL != (arg = strrchr(fileName, '/')))
        !           406:                fileName = arg + 1;
        !           407:        if (NULL != (arg = strrchr(fileName, '.')))
        !           408:                *arg = '\0';
        !           409:        outFile = alloc(strlen(fileName) + 3);
        !           410:        sprintf(outFile, "%s.c", fileName);
        !           411:        ofp = xopen(outFile, "w");
        !           412:        sprintf(outFile, "%s.h", fileName);
        !           413:        hfp = xopen(outFile, "w");
        !           414:        fprintf(hfp, "/*\n");
        !           415:        fprintf(hfp, " * This file generated by scn from %s\n", fileName);
        !           416:        fprintf(hfp, " */\n");
        !           417:        fprintf(hfp, "#include <scn.h>\n\n");
        !           418:        fprintf(hfp, "extern loc %s_locs[];\n", fileName);
        !           419:        fprintf(hfp, "extern backGrnd %s_data[];\n", fileName);
        !           420:        pass1();
        !           421:        pass2();
        !           422:        pass3();
        !           423:        exit(0);
        !           424: }

unix.superglobalmegacorp.com

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