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