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