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