Commit | Line | Data |
---|---|---|
29afbb53 WJ |
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 | } |