Home | History | Annotate | Line # | Download | only in hack
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