|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.