Annotation of 43BSD/contrib/B/src/b/convert.c, revision 1.1

1.1     ! root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
        !             2: /* $Header: convert.c,v 1.1 85/08/22 14:33:43 timo Exp $ */
        !             3: 
        !             4: /*
        !             5:  * Utility to recover the contents of a B workspace.
        !             6:  *
        !             7:  * Call as: convert [\'\"\<\>=]?* (this should be done by a shell script).
        !             8:  *
        !             9:  * It constructs a completely new ".b_perm" file with references to all files
        !            10:  * mentioned (if they exist).
        !            11:  * Files whose name starts with '=' and files with an extension of ".tar"
        !            12:  * or ".TAR" are taken to be targets; all others are assumed to contain
        !            13:  * units (if they contain garbage, they are ignored).  (".tar" and ".TAR"
        !            14:  * are used on the IBM-PC.)
        !            15:  * For units, the name, type and adicity are extracted from the source;
        !            16:  * for targets, the target name is taken to be the file name with all
        !            17:  * illegal characters removed (upper case converted to lowercase).
        !            18:  *
        !            19:  * BUGS:
        !            20:  * - should augment the old ".b_perm" file instead of just overwriting it;
        !            21:  * - target names can get truncated when the original target name was longer
        !            22:  *   than what fits in a legal file name.
        !            23:  * - doesn't detect multiple files defining the same name
        !            24:  * - on the IBM-PC, the file name expansion should be in the program for it to
        !            25:  *   be of any use, because the MS-DOS "shell" doesn't expand * in file names
        !            26:  *
        !            27:  * $Log:       convert.c,v $
        !            28:  * Revision 1.1  85/08/22  14:33:43  timo
        !            29:  * Initial revision
        !            30:  * 
        !            31:  * Revision 1.3.2.1  85/06/04  13:36:04  guido
        !            32:  * Create consistent branch 1.3.2.
        !            33:  * 
        !            34:  * Revision 1.3  85/06/04  13:35:33  guido
        !            35:  * Added MS-DOS support.
        !            36:  * 
        !            37:  * Revision 1.2  85/04/12  22:33:33  guido
        !            38:  * added treatment of targets; added warning and fatal error messages.
        !            39:  * 
        !            40:  * Revision 1.1  85/01/29  12:48:09  guido
        !            41:  * used given file names instead of constructing file names from unit names.
        !            42:  *
        !            43:  * Revision --- frank
        !            44:  * created.
        !            45:  */
        !            46: 
        !            47: #include <stdio.h>
        !            48: 
        !            49: #ifdef MSDOS
        !            50: #define BPERMFILE "PERM.BIF"
        !            51: #define DELIM '\\'
        !            52: #define index strchr
        !            53: #define rindex strrchr
        !            54: #endif
        !            55: 
        !            56: #ifdef unix
        !            57: #define BPERMFILE ".b_perm"
        !            58: #define DELIM '/'
        !            59: #endif
        !            60: 
        !            61: char *rindex(), *index();
        !            62: 
        !            63: #ifdef MSDOS
        !            64: char *defargv[]= {"convert", "*.how", "*.zer", "*.mon", "*.dya", "*.tar", 0};
        !            65: #define defargc (sizeof defargv/sizeof defargv[0] - 1)
        !            66: #endif
        !            67: 
        !            68: FILE *ofile;
        !            69: 
        !            70: char buffer[BUFSIZ];
        !            71: char *pbuf, *first, *last, *filename;
        !            72: char *progname = "convert";
        !            73: int status= 0;
        !            74: 
        !            75: #define Oputc(c) putc(c, ofile)
        !            76: 
        !            77: /*VARARGS1*/
        !            78: warning(fmt, a1, a2)
        !            79:        char *fmt;
        !            80: {
        !            81:        status= 1;
        !            82:        fprintf(stderr, "*** %s: ", progname);
        !            83:        fprintf(stderr, fmt, a1, a2);
        !            84:        fprintf(stderr, "\n");
        !            85: }
        !            86: 
        !            87: /*VARARGS2*/
        !            88: quit(sts, msg, a1, a2)
        !            89:        int sts;
        !            90:        char *msg;
        !            91: {
        !            92:        warning(msg, a1, a2);
        !            93:        exit(sts ? sts : status);
        !            94: }
        !            95: 
        !            96: main(argc, argv)
        !            97:        int argc; char **argv;
        !            98: {
        !            99: #ifndef MSDOS
        !           100:        if (argc < 2)
        !           101:                quit(2, "Usage: %s file ...", progname);
        !           102:        /* Don't do this under MSDOS -- program name is always 'c'... */
        !           103:        progname= rindex(*argv, '/');
        !           104:        if (progname)
        !           105:                ++progname;
        !           106:        else
        !           107:                progname= *argv;
        !           108: #endif
        !           109: 
        !           110:        ofile= fopen(BPERMFILE, "w");
        !           111:        if (!ofile)
        !           112:                quit(2, "%s: can't create %s", progname, BPERMFILE);
        !           113:        Oputc('{');
        !           114: #ifdef defargc
        !           115:        if (argc <= 1) {
        !           116:                argv= defargv;
        !           117:                argc= defargc;
        !           118:        }
        !           119: #endif
        !           120:        while (argc > 1) {
        !           121:                --argc; ++argv;
        !           122:                treat_file(*argv);
        !           123:        }
        !           124:        Oputc('}');
        !           125:        Oputc('\n');
        !           126:        fclose(ofile);
        !           127:        exit(status);
        !           128: }
        !           129: 
        !           130: treat_file(file)
        !           131:        char *file;
        !           132: {
        !           133:        FILE *ifile;
        !           134:        static int recursive= 0;
        !           135: 
        !           136:        ifile= fopen(filename= file, "r");
        !           137:        if (!ifile) {
        !           138:                if (index(filename, '*') && !recursive) {
        !           139:                        /* Assume failed '*' expansion */
        !           140:                        /* Ignore on UNIX, expand on MSDOS */
        !           141: #ifdef MSDOS
        !           142:                        char **list= getfiles(filename);
        !           143:                        if (list) {
        !           144:                                recursive= 1;
        !           145:                                for (; *list; ++list)
        !           146:                                        treat_file(*list);
        !           147:                                recursive= 0;
        !           148:                        }
        !           149: #endif
        !           150:                }
        !           151:                else
        !           152:                        warning("%s: can't read", filename);
        !           153:        }
        !           154:        else {
        !           155:                if (!fgets(buffer, BUFSIZ, ifile))
        !           156:                        warning("%s: empty file", filename);
        !           157:                else if (is_target(filename))
        !           158:                        treat_target();
        !           159:                else
        !           160:                        treat_line();
        !           161:                fclose(ifile);
        !           162:        }
        !           163: }
        !           164: 
        !           165: #define CapLetter ('A' <= *pbuf && *pbuf <= 'Z')
        !           166: #define Letter ('a' <= *pbuf && *pbuf <= 'z')
        !           167: #define Digit ('0' <= *pbuf && *pbuf <= '9')
        !           168: #define Quote (*pbuf == '\'' || *pbuf == '"')
        !           169: #define Colon (*pbuf == ':')
        !           170: #define Open (*pbuf == '(')
        !           171: #define Close (*pbuf == ')')
        !           172: #define Space (*pbuf == ' ' || *pbuf == '\t')
        !           173: #define Tagmark (Letter || Digit || Quote)
        !           174: #define Keymark (CapLetter || Digit || Quote)
        !           175: 
        !           176: #define ToLower(c) ((c) - 'A' + 'a')
        !           177: 
        !           178: skip_tag()
        !           179: {
        !           180:        first= pbuf;
        !           181:        while (Tagmark) pbuf++;
        !           182:        last= pbuf;
        !           183: }
        !           184: 
        !           185: skip_keyword()
        !           186: {
        !           187:        first= pbuf;
        !           188:        while (Keymark) pbuf++;
        !           189:        last= pbuf;
        !           190: }
        !           191: 
        !           192: skip_space()
        !           193: {
        !           194:        while (Space) pbuf++;
        !           195: }
        !           196: 
        !           197: skip_open_close()
        !           198: {
        !           199:        if (Open) { skip_to_close(); pbuf++; }
        !           200: }
        !           201: 
        !           202: skip_to_close()
        !           203: {
        !           204:        while (++pbuf, !Close) if (Open) skip_to_close();
        !           205: }
        !           206: 
        !           207: treat_line()
        !           208: {
        !           209:        pbuf= buffer;
        !           210:        switch (*pbuf) {
        !           211:                case 'H': howto_unit(); break;
        !           212:                case 'Y':
        !           213:                case 'T': funprd_unit(); break;
        !           214:                default: warning("%s: not a valid B unit", filename); break;
        !           215:        }
        !           216: }
        !           217: 
        !           218: #define Zer 0
        !           219: #define Mon 1
        !           220: #define Dya 2
        !           221: #define How 3
        !           222: #define Tar 4
        !           223: 
        !           224: howto_unit()
        !           225: {
        !           226:        skip_keyword();
        !           227:        skip_space();
        !           228:        skip_keyword();
        !           229:        put_entry(How);
        !           230: }
        !           231: 
        !           232: funprd_unit()
        !           233: {
        !           234:        skip_keyword();
        !           235:        skip_space();
        !           236:        if (Letter) {
        !           237:                skip_tag();
        !           238:                skip_space();
        !           239:                if (Colon) put_entry(Zer);
        !           240:                else if (!Letter) put_entry(Mon);
        !           241:                else {
        !           242:                        char *sv_first= first, *sv_last= last;
        !           243:                        skip_tag();
        !           244:                        skip_space();
        !           245:                        if (Colon) {
        !           246:                                first= sv_first; last= sv_last;
        !           247:                                put_entry(Mon);
        !           248:                        } else
        !           249:                                put_entry(Dya);
        !           250:                }
        !           251:        } else {
        !           252:                skip_open_close(); 
        !           253:                skip_space();
        !           254:                skip_tag();
        !           255:                put_entry(Dya);
        !           256:        }               
        !           257: }
        !           258: 
        !           259: treat_target()
        !           260: {
        !           261:        pbuf= filename;
        !           262: #ifdef MSDOS
        !           263:        if (index(pbuf, ':'))
        !           264:                pbuf= index(pbuf, ':') + 1;
        !           265: #endif
        !           266:        if (rindex(pbuf, DELIM))
        !           267:                pbuf= index(pbuf, DELIM) + 1;
        !           268:        first= last= buffer;
        !           269:        while (*pbuf && !Letter && !CapLetter)
        !           270:                ++pbuf;
        !           271:        for (; *pbuf; ++pbuf) {
        !           272:                if (CapLetter)
        !           273:                        *last++= ToLower(*pbuf);
        !           274:                else if (Letter || Digit || Quote)
        !           275:                        *last++= *pbuf;
        !           276:                else if (*pbuf == '.')
        !           277:                        break; /* Stop before extension ".tar" or ".TAR" */
        !           278:        }
        !           279:        if (last == first)
        !           280:                warning("%s: cannot deduce target name", filename);
        !           281:        else
        !           282:                put_entry(Tar);
        !           283: }
        !           284: 
        !           285: put_entry(type)
        !           286:        int type;
        !           287: {
        !           288:        static int first_elem= 1;
        !           289:        if (!first_elem) Oputc(';');
        !           290:        else first_elem= 0;
        !           291:        Oputc('[');
        !           292:        put_key(type);
        !           293:        Oputc(']');
        !           294:        Oputc(':');
        !           295:        put_assoc(type);
        !           296: }
        !           297: 
        !           298: #define Text_quote '"'
        !           299: #define Back_quote '`'
        !           300: #define Double(c) if ((c) == Text_quote || (c) == Back_quote) Oputc(c)
        !           301: 
        !           302: put_key(type)
        !           303:        int type;
        !           304: {
        !           305:        char *p= first;
        !           306:        Oputc(Text_quote);
        !           307:        switch (type) {
        !           308:                case Zer: Oputc('0'); break;
        !           309:                case Mon: Oputc('1'); break;
        !           310:                case Dya: Oputc('2'); break;
        !           311:                case How: Oputc('3'); break;
        !           312:                case Tar: Oputc('4'); break;
        !           313:                default: break;
        !           314:        }
        !           315:        while (p < last) {
        !           316:                Double(*p);
        !           317:                Oputc(*p++);
        !           318:        }
        !           319:        Oputc(Text_quote);
        !           320: }
        !           321: 
        !           322: put_assoc(type)
        !           323:        int type;
        !           324: {
        !           325:        char *p= filename;
        !           326:        Oputc(Text_quote);
        !           327:        while (*p != '\0') {
        !           328:                Double(*p);
        !           329:                Oputc(*p++);    
        !           330:        }
        !           331:        Oputc(Text_quote);
        !           332: }
        !           333: 
        !           334: is_target(name)
        !           335:        char *name;
        !           336: {
        !           337:        if (*name == '=')
        !           338:                return 1;
        !           339:        name= rindex(name, '.');
        !           340:        if (!name)
        !           341:                return 0;
        !           342:        return strcmp(name, ".TAR") == 0 || strcmp(name, ".tar") == 0;
        !           343: }

unix.superglobalmegacorp.com

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