Annotation of 43BSDReno/games/hack/makedefs.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
                      2: /* makedefs.c - version 1.0.2 */
                      3: 
                      4: #include <stdio.h>
                      5: 
                      6: /* construct definitions of object constants */
                      7: #define        LINSZ   1000
                      8: #define        STRSZ   40
                      9: 
                     10: int fd;
                     11: char string[STRSZ];
                     12: 
                     13: main(argc, argv)
                     14:        int argc;
                     15:        char **argv;
                     16: {
                     17: register int index = 0;
                     18: register int propct = 0;
                     19: register char *sp;
                     20:        if (argc != 2) {
                     21:                (void)fprintf(stderr, "usage: makedefs file\n");
                     22:                exit(1);
                     23:        }
                     24:        if ((fd = open(argv[1], 0)) < 0) {
                     25:                perror(argv[1]);
                     26:                exit(1);
                     27:        }
                     28:        skipuntil("objects[] = {");
                     29:        while(getentry()) {
                     30:                if(!*string){
                     31:                        index++;
                     32:                        continue;
                     33:                }
                     34:                for(sp = string; *sp; sp++)
                     35:                        if(*sp == ' ' || *sp == '\t' || *sp == '-')
                     36:                                *sp = '_';
                     37:                if(!strncmp(string, "RIN_", 4)){
                     38:                        capitalize(string+4);
                     39:                        printf("#define %s      u.uprops[%d].p_flgs\n",
                     40:                                string+4, propct++);
                     41:                }
                     42:                for(sp = string; *sp; sp++) capitalize(sp);
                     43:                /* avoid trouble with stupid C preprocessors */
                     44:                if(!strncmp(string, "WORTHLESS_PIECE_OF_", 19))
                     45:                        printf("/* #define %s   %d */\n", string, index);
                     46:                else
                     47:                        printf("#define %s      %d\n", string, index);
                     48:                index++;
                     49:        }
                     50:        printf("\n#define       CORPSE  DEAD_HUMAN\n");
                     51:        printf("#define LAST_GEM        (JADE+1)\n");
                     52:        printf("#define LAST_RING       %d\n", propct);
                     53:        printf("#define NROFOBJECTS     %d\n", index-1);
                     54:        exit(0);
                     55: }
                     56: 
                     57: char line[LINSZ], *lp = line, *lp0 = line, *lpe = line;
                     58: int eof;
                     59: 
                     60: readline(){
                     61: register int n = read(fd, lp0, (line+LINSZ)-lp0);
                     62:        if(n < 0){
                     63:                printf("Input error.\n");
                     64:                exit(1);
                     65:        }
                     66:        if(n == 0) eof++;
                     67:        lpe = lp0+n;
                     68: }
                     69: 
                     70: char
                     71: nextchar(){
                     72:        if(lp == lpe){
                     73:                readline();
                     74:                lp = lp0;
                     75:        }
                     76:        return((lp == lpe) ? 0 : *lp++);
                     77: }
                     78: 
                     79: skipuntil(s) char *s; {
                     80: register char *sp0, *sp1;
                     81: loop:
                     82:        while(*s != nextchar())
                     83:                if(eof) {
                     84:                        printf("Cannot skipuntil %s\n", s);
                     85:                        exit(1);
                     86:                }
                     87:        if(strlen(s) > lpe-lp+1){
                     88:                register char *lp1, *lp2;
                     89:                lp2 = lp;
                     90:                lp1 = lp = lp0;
                     91:                while(lp2 != lpe) *lp1++ = *lp2++;
                     92:                lp2 = lp0;      /* save value */
                     93:                lp0 = lp1;
                     94:                readline();
                     95:                lp0 = lp2;
                     96:                if(strlen(s) > lpe-lp+1) {
                     97:                        printf("error in skipuntil");
                     98:                        exit(1);
                     99:                }
                    100:        }
                    101:        sp0 = s+1;
                    102:        sp1 = lp;
                    103:        while(*sp0 && *sp0 == *sp1) sp0++, sp1++;
                    104:        if(!*sp0){
                    105:                lp = sp1;
                    106:                return(1);
                    107:        }
                    108:        goto loop;
                    109: }
                    110: 
                    111: getentry(){
                    112: int inbraces = 0, inparens = 0, stringseen = 0, commaseen = 0;
                    113: int prefix = 0;
                    114: char ch;
                    115: #define        NSZ     10
                    116: char identif[NSZ], *ip;
                    117:        string[0] = string[4] = 0;
                    118:        /* read until {...} or XXX(...) followed by ,
                    119:           skip comment and #define lines
                    120:           deliver 0 on failure
                    121:         */
                    122:        while(1) {
                    123:                ch = nextchar();
                    124:        swi:
                    125:                if(letter(ch)){
                    126:                        ip = identif;
                    127:                        do {
                    128:                                if(ip < identif+NSZ-1) *ip++ = ch;
                    129:                                ch = nextchar();
                    130:                        } while(letter(ch) || digit(ch));
                    131:                        *ip = 0;
                    132:                        while(ch == ' ' || ch == '\t') ch = nextchar();
                    133:                        if(ch == '(' && !inparens && !stringseen)
                    134:                                if(!strcmp(identif, "WAND") ||
                    135:                                   !strcmp(identif, "RING") ||
                    136:                                   !strcmp(identif, "POTION") ||
                    137:                                   !strcmp(identif, "SCROLL"))
                    138:                                (void) strncpy(string, identif, 3),
                    139:                                string[3] = '_',
                    140:                                prefix = 4;
                    141:                }
                    142:                switch(ch) {
                    143:                case '/':
                    144:                        /* watch for comment */
                    145:                        if((ch = nextchar()) == '*')
                    146:                                skipuntil("*/");
                    147:                        goto swi;
                    148:                case '{':
                    149:                        inbraces++;
                    150:                        continue;
                    151:                case '(':
                    152:                        inparens++;
                    153:                        continue;
                    154:                case '}':
                    155:                        inbraces--;
                    156:                        if(inbraces < 0) return(0);
                    157:                        continue;
                    158:                case ')':
                    159:                        inparens--;
                    160:                        if(inparens < 0) {
                    161:                                printf("too many ) ?");
                    162:                                exit(1);
                    163:                        }
                    164:                        continue;
                    165:                case '\n':
                    166:                        /* watch for #define at begin of line */
                    167:                        if((ch = nextchar()) == '#'){
                    168:                                register char pch;
                    169:                                /* skip until '\n' not preceded by '\\' */
                    170:                                do {
                    171:                                        pch = ch;
                    172:                                        ch = nextchar();
                    173:                                } while(ch != '\n' || pch == '\\');
                    174:                                continue;
                    175:                        }
                    176:                        goto swi;
                    177:                case ',':
                    178:                        if(!inparens && !inbraces){
                    179:                                if(prefix && !string[prefix])
                    180:                                        string[0] = 0;
                    181:                                if(stringseen) return(1);
                    182:                                printf("unexpected ,\n");
                    183:                                exit(1);
                    184:                        }
                    185:                        commaseen++;
                    186:                        continue;
                    187:                case '\'':
                    188:                        if((ch = nextchar()) == '\\') ch = nextchar();
                    189:                        if(nextchar() != '\''){
                    190:                                printf("strange character denotation?\n");
                    191:                                exit(1);
                    192:                        }
                    193:                        continue;
                    194:                case '"':
                    195:                        {
                    196:                                register char *sp = string + prefix;
                    197:                                register char pch;
                    198:                                register int store = (inbraces || inparens)
                    199:                                        && !stringseen++ && !commaseen;
                    200:                                do {
                    201:                                        pch = ch;
                    202:                                        ch = nextchar();
                    203:                                        if(store && sp < string+STRSZ)
                    204:                                                *sp++ = ch;
                    205:                                } while(ch != '"' || pch == '\\');
                    206:                                if(store) *--sp = 0;
                    207:                                continue;
                    208:                        }
                    209:                }
                    210:        }
                    211: }
                    212: 
                    213: capitalize(sp) register char *sp; {
                    214:        if('a' <= *sp && *sp <= 'z') *sp += 'A'-'a';
                    215: }
                    216: 
                    217: letter(ch) register char ch; {
                    218:        return( ('a' <= ch && ch <= 'z') ||
                    219:                ('A' <= ch && ch <= 'Z') );
                    220: }
                    221: 
                    222: digit(ch) register char ch; {
                    223:        return( '0' <= ch && ch <= '9' );
                    224: }

unix.superglobalmegacorp.com

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