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