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