diff options
Diffstat (limited to 'games/hack/makedefs.c')
-rw-r--r-- | games/hack/makedefs.c | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/games/hack/makedefs.c b/games/hack/makedefs.c new file mode 100644 index 0000000..aa113b9 --- /dev/null +++ b/games/hack/makedefs.c @@ -0,0 +1,224 @@ +/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ +/* makedefs.c - version 1.0.2 */ + +#include <stdio.h> + +/* construct definitions of object constants */ +#define LINSZ 1000 +#define STRSZ 40 + +int fd; +char string[STRSZ]; + +main(argc, argv) + int argc; + char **argv; +{ +register int index = 0; +register int propct = 0; +register char *sp; + if (argc != 2) { + (void)fprintf(stderr, "usage: makedefs file\n"); + exit(1); + } + if ((fd = open(argv[1], 0)) < 0) { + perror(argv[1]); + exit(1); + } + skipuntil("objects[] = {"); + while(getentry()) { + if(!*string){ + index++; + continue; + } + for(sp = string; *sp; sp++) + if(*sp == ' ' || *sp == '\t' || *sp == '-') + *sp = '_'; + if(!strncmp(string, "RIN_", 4)){ + capitalize(string+4); + printf("#define %s u.uprops[%d].p_flgs\n", + string+4, propct++); + } + for(sp = string; *sp; sp++) capitalize(sp); + /* avoid trouble with stupid C preprocessors */ + if(!strncmp(string, "WORTHLESS_PIECE_OF_", 19)) + printf("/* #define %s %d */\n", string, index); + else + printf("#define %s %d\n", string, index); + index++; + } + printf("\n#define CORPSE DEAD_HUMAN\n"); + printf("#define LAST_GEM (JADE+1)\n"); + printf("#define LAST_RING %d\n", propct); + printf("#define NROFOBJECTS %d\n", index-1); + exit(0); +} + +char line[LINSZ], *lp = line, *lp0 = line, *lpe = line; +int eof; + +readline(){ +register int n = read(fd, lp0, (line+LINSZ)-lp0); + if(n < 0){ + printf("Input error.\n"); + exit(1); + } + if(n == 0) eof++; + lpe = lp0+n; +} + +char +nextchar(){ + if(lp == lpe){ + readline(); + lp = lp0; + } + return((lp == lpe) ? 0 : *lp++); +} + +skipuntil(s) char *s; { +register char *sp0, *sp1; +loop: + while(*s != nextchar()) + if(eof) { + printf("Cannot skipuntil %s\n", s); + exit(1); + } + if(strlen(s) > lpe-lp+1){ + register char *lp1, *lp2; + lp2 = lp; + lp1 = lp = lp0; + while(lp2 != lpe) *lp1++ = *lp2++; + lp2 = lp0; /* save value */ + lp0 = lp1; + readline(); + lp0 = lp2; + if(strlen(s) > lpe-lp+1) { + printf("error in skipuntil"); + exit(1); + } + } + sp0 = s+1; + sp1 = lp; + while(*sp0 && *sp0 == *sp1) sp0++, sp1++; + if(!*sp0){ + lp = sp1; + return(1); + } + goto loop; +} + +getentry(){ +int inbraces = 0, inparens = 0, stringseen = 0, commaseen = 0; +int prefix = 0; +char ch; +#define NSZ 10 +char identif[NSZ], *ip; + string[0] = string[4] = 0; + /* read until {...} or XXX(...) followed by , + skip comment and #define lines + deliver 0 on failure + */ + while(1) { + ch = nextchar(); + swi: + if(letter(ch)){ + ip = identif; + do { + if(ip < identif+NSZ-1) *ip++ = ch; + ch = nextchar(); + } while(letter(ch) || digit(ch)); + *ip = 0; + while(ch == ' ' || ch == '\t') ch = nextchar(); + if(ch == '(' && !inparens && !stringseen) + if(!strcmp(identif, "WAND") || + !strcmp(identif, "RING") || + !strcmp(identif, "POTION") || + !strcmp(identif, "SCROLL")) + (void) strncpy(string, identif, 3), + string[3] = '_', + prefix = 4; + } + switch(ch) { + case '/': + /* watch for comment */ + if((ch = nextchar()) == '*') + skipuntil("*/"); + goto swi; + case '{': + inbraces++; + continue; + case '(': + inparens++; + continue; + case '}': + inbraces--; + if(inbraces < 0) return(0); + continue; + case ')': + inparens--; + if(inparens < 0) { + printf("too many ) ?"); + exit(1); + } + continue; + case '\n': + /* watch for #define at begin of line */ + if((ch = nextchar()) == '#'){ + register char pch; + /* skip until '\n' not preceded by '\\' */ + do { + pch = ch; + ch = nextchar(); + } while(ch != '\n' || pch == '\\'); + continue; + } + goto swi; + case ',': + if(!inparens && !inbraces){ + if(prefix && !string[prefix]) + string[0] = 0; + if(stringseen) return(1); + printf("unexpected ,\n"); + exit(1); + } + commaseen++; + continue; + case '\'': + if((ch = nextchar()) == '\\') ch = nextchar(); + if(nextchar() != '\''){ + printf("strange character denotation?\n"); + exit(1); + } + continue; + case '"': + { + register char *sp = string + prefix; + register char pch; + register int store = (inbraces || inparens) + && !stringseen++ && !commaseen; + do { + pch = ch; + ch = nextchar(); + if(store && sp < string+STRSZ) + *sp++ = ch; + } while(ch != '"' || pch == '\\'); + if(store) *--sp = 0; + continue; + } + } + } +} + +capitalize(sp) register char *sp; { + if('a' <= *sp && *sp <= 'z') *sp += 'A'-'a'; +} + +letter(ch) register char ch; { + return( ('a' <= ch && ch <= 'z') || + ('A' <= ch && ch <= 'Z') ); +} + +digit(ch) register char ch; { + return( '0' <= ch && ch <= '9' ); +} |