Source:NetHack 2.2a/makedefs.c

Below is the full text to makedefs.c from the source code of NetHack 2.2a. To link to a particular line, write [[NetHack 2.2a/makedefs.c#line123 ]], for example.

Warning! This is the source code from an old release. For the latest release, see Source code

1.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 2.    /* makedefs.c - NetHack version 2.2 */ 3.    4.    static	char	SCCS_Id[] = "@(#)makedefs.c	2.2\t87/11/29"; 5.    6.    #include	  7.    #include	"config.h"  8. 9.   #ifdef MSDOS 10.  #undef	exit 11.  #define freopen _freopen 12.  #define	alloc	malloc 13.  #define RDMODE	"r" 14.  #define WRMODE	"w" 15.  #else 16.  #define RDMODE	"r+" 17.  #define WRMODE	"w+" 18.  #endif 19.   20.   /* construct definitions of object constants */ 21.  #define	OBJ_FILE	"objects.h"  22. #define	ONAME_FILE	"onames.h" 23. #define	TRAP_FILE	"trap.h" 24. #define	DATE_FILE	"date.h" 25. #define	RUMOR_FILE	"rumors" 26.  #define	DATA_FILE	"data" 27.   28.   char	inline[256], outline[256]; 29.   30.   main(argc, argv) 31.  	int	argc; 32.  	char	*argv[]; 33.  {  34.   	char	*option; 35.   36.   	if(argc == 2) { 37.  	    option = argv[1]; 38.  	    switch (option[1]) { 39.   40.   		case 'o': 41.  		case 'O':	do_objs; 42.  				break; 43.  		case 't': 44.  		case 'T':	do_traps; 45.  				break; 46.  		case 'r': 47.  		case 'R':	do_rumors; 48.  				break; 49.   50.   		case 'd':	do_data; 51.  				break; 52.   53.   		case 'D':	do_date; 54.  				break; 55.  		default: 56.  				fprintf(stderr, "Unknown option '%c'.\n", option[1]); 57.  				exit(1); 58.  	    }  59.   	    exit(0); 60.  	} else	fprintf(stderr, "Bad arg count (%d).\n", argc-1); 61.  	exit(1); 62.  }  63.    64.   do_traps { 65.  int	ntrap, getpid; 66.  char	tmpfile[30]; 67.  FILE	*freopen; 68.   69.   	sprintf(tmpfile, "makedefs.%d", getpid); 70.  	if(freopen(tmpfile, WRMODE, stdout) == NULL) { 71.   72.   		perror(tmpfile); 73.  		exit(1); 74.  	}  75.   	if(freopen(TRAP_FILE, RDMODE, stdin) == NULL) { 76.   77.   		perror(TRAP_FILE); 78.  		exit(1); 79.  	}  80.    81.   	while(gets(inline) != NULL) { 82.   83.   	    puts(inline); 84.  	    if(!strncmp(inline, "/* DO NOT REMOVE THIS LINE */", 29)) break; 85.  	}  86.   	ntrap = 10; 87.  	printf("\n"); 88.  #ifdef NEWTRAPS 89.  	printf("#define\tMGTRP\t\t%d\n", ntrap++); 90.  	printf("#define\tSQBRD\t\t%d\n", ntrap++); 91.  #endif 92.  #ifdef SPIDERS 93.  	printf("#define\tWEB\t\t%d\n", ntrap++); 94.  #endif 95.  #ifdef NEWCLASS 96.  	printf("#define\tSPIKED_PIT\t%d\n", ntrap++); 97.  	printf("#define\tLEVEL_TELEP\t%d\n", ntrap++); 98.  #endif 99.  #ifdef SPELLS 100. 	printf("#define\tANTI_MAGIC\t%d\n", ntrap++); 101. #endif 102. #ifdef KAA 103. 	printf("#define\tRUST_TRAP\t%d\n", ntrap++); 104. # ifdef RPH 105. 	printf("#define\tPOLY_TRAP\t%d\n", ntrap++); 106. # endif 107. #endif 108. 	printf("\n#define\tTRAPNUM\t%d\n", ntrap); 109. 	fclose(stdin); 110. 	fclose(stdout); 111. #ifdef MSDOS 112. 	remove(TRAP_FILE); 113. #endif 114. 	rename(tmpfile, TRAP_FILE); 115. }  116.   117.   118.  struct	hline { 119. 	struct	hline	*next; 120. 	char	*line; 121. }	*f_line; 122.  123.  do_rumors{ 124. struct	hline	*c_line; 125. char	infile[30]; 126. FILE	*freopen; 127.  128.  	if(freopen(RUMOR_FILE, WRMODE, stdout) == NULL) { 129.  130.  		perror(RUMOR_FILE); 131. 		exit(1); 132. 	}  133.  #ifdef MSDOS 134. 	sprintf(infile, "%s.bas", RUMOR_FILE); 135. #else 136. 	sprintf(infile, "%s.base", RUMOR_FILE); 137. #endif 138. 	if(freopen(infile, RDMODE, stdin) == NULL) { 139.  140.  		perror(infile); 141. 		exit(1); 142. 	}  143.   144.  	while(gets(inline) != NULL)	puts(inline); 145.  146.  #ifdef KAA 147. 	sprintf(infile, "%s.kaa", RUMOR_FILE); 148. 	if(freopen(infile, RDMODE, stdin) == NULL)	perror(infile); 149.  150.  	while(gets(inline) != NULL)	puts(inline); 151. #endif 152.  153.  #ifdef NEWCLASS 154. 	sprintf(infile, "%s.mrx", RUMOR_FILE); 155. 	if(freopen(infile, RDMODE, stdin) == NULL)	perror(infile); 156.  157.  	while(gets(inline) != NULL)	puts(inline); 158. #endif 159. 	fclose(stdin); 160. 	fclose(stdout); 161. }  162.   163.  do_date{ 164. int	getpid; 165. long	clock, time; 166. char	tmpfile[30], cbuf[30], *c, *ctime; 167. FILE	*freopen; 168.  169.  	sprintf(tmpfile, "makedefs.%d", getpid); 170. 	if(freopen(tmpfile, WRMODE, stdout) == NULL) { 171.  172.  		perror(tmpfile); 173. 		exit(1); 174. 	}  175.  	if(freopen(DATE_FILE, RDMODE, stdin) == NULL) { 176.  177.  		perror(DATE_FILE); 178. 		exit(1); 179. 	}  180.   181.  	while(gets(inline) != NULL) { 182.  183.  	    if(!strncmp(inline, "char datestring[] = ", 20)) break; 184. 	    puts(inline); 185. 	}  186.  	time(&clock); 187. 	strcpy(cbuf, ctime(&clock)); 188. 	for(c = cbuf; *c != '\n'; c++);	*c = 0; /* strip off the '\n' */ 189. 	printf("char datestring[] = %c%s%c;\n", '"', cbuf, '"'); 190.  191.  	fclose(stdin); 192. 	fclose(stdout); 193. #ifdef MSDOS 194. 	remove(DATE_FILE); 195. #endif 196. 	rename(tmpfile, DATE_FILE); 197. }  198.   199.  do_data{ 200. int	getpid; 201. char	tmpfile[30]; 202. FILE	*freopen; 203.  204.  	sprintf(tmpfile, "%s.base", DATA_FILE); 205. 	if(freopen(tmpfile, RDMODE, stdin) == NULL) { 206.  207.  		perror(tmpfile); 208. 		exit(1); 209. 	}  210.  	if(freopen(DATA_FILE, WRMODE, stdout) == NULL) { 211.  212.  		perror(DATA_FILE); 213. 		exit(1); 214. 	}  215.   216.  	while(gets(inline) != NULL) { 217. #ifdef KOPS 218. 	    if(!strcmp(inline, "K	a kobold")) 219. 		printf("K\ta Keystone Kop\n"); 220. 	    else 221. #endif 222. #ifdef KAA 223. 	    if(!strcmp(inline, "Q	a quasit")) 224. 		printf("Q\ta quantum mechanic\n"); 225. 	    else 226. #endif 227. #ifdef ROCKMOLE 228. 	    if(!strcmp(inline, "r	a giant rat")) 229. 		printf("r\ta rockmole\n"); 230. 	    else 231. #endif 232. #ifdef SPIDERS 233. 	    if(!strcmp(inline, "s	a scorpion")) 234. 		printf("s\ta giant spider\n"); 235. 	    else if (!strcmp(inline, "\"	an amulet"))  236.  		printf("\"\tan amulet (or a web)\n"); 237. 	    else 238. #endif 239. #ifdef	SPELLS 240. 	    if (!strcmp(inline, "+	a door")) 241. 		printf("+\ta door (or a spell book)\n"); 242. 	    else 243. #endif 244. #ifdef	FOUNTAINS 245. 	    if(!strcmp(inline, "}	water filled area")) { 246. 		puts(inline); 247. 		printf("{\ta fountain\n"); 248. 	    } else 249. #endif 250. #ifdef NEWCLASS 251. 	    if(!strcmp(inline, "^	a trap")) { 252. 		puts(inline); 253. 		printf("\\\tan opulent throne.\n"); 254. 	    } else 255. #endif 256. 		puts(inline); 257. 	}  258.  #ifdef SAC 259. 	printf("3\ta soldier\n"); 260. #endif 261. #ifdef RPH 262. 	printf("8\tthe medusa;\n"); 263. 	printf("\tThis hideous  creature from  ancient Greek myth was the doom\n"); 264. 	printf("\tof many a valiant adventurer.  It is said that one gaze from\n"); 265. 	printf("\tits eyes  could turn a man to stone.  One bite from the nest\n"); 266. 	printf("\tof  snakes which  crown its head could  cause instant death.\n"); 267. 	printf("\tThe only  way to kill this  monstrosity is to turn its  gaze\n"); 268. 	printf("\tback upon itself.\n"); 269. #endif 270. #ifdef KAA 271. 	printf("9\ta giant;\n"); 272. 	printf("\tGiants have always walked the earth, though they are rare in\n"); 273. 	printf("\tthese times.  They range in size from  little over nine feet\n"); 274. 	printf("\tto a towering twenty feet or more.  The larger ones use huge\n"); 275. 	printf("\tboulders as weapons, hurling them over large distances.  All\n"); 276. 	printf("\ttypes of giants share a love for men  -  roasted, boiled, or\n"); 277. 	printf("\tfried.  Their table manners are legendary.\n"); 278. #endif 279. 	fclose(stdin); 280. 	fclose(stdout); 281. }  282.   283.  #define	LINSZ	1000 284. #define	STRSZ	40 285.  286.  int	fd; 287. struct	objdef { 288.  289.  	struct	objdef	*next; 290. 	char	string[STRSZ]; 291. }	*more, *current; 292.  293.  do_objs{ 294. register int index = 0; 295. register int propct = 0; 296. #ifdef SPELLS 297. register int nspell = 0; 298. #endif 299. FILE	*freopen; 300. register char *sp; 301. char	*limit; 302. int skip; 303.  304.  	fd = open(OBJ_FILE, 0); 305. 	if(fd < 0) { 306. 		perror(OBJ_FILE); 307. 		exit(1); 308. 	}  309.   310.  	if(freopen(ONAME_FILE, WRMODE, stdout) == NULL) { 311. 		perror(ONAME_FILE); 312. 		exit(1); 313. 	}  314.   315.  	current = 0; newobj; 316. 	skipuntil("objects[] = {"); 317.  318.  	while(getentry(&skip)) { 319. 		if(!*(current->string)){ 320. 			if (skip) index++; 321. 			continue; 322. 		}  323.  		for(sp = current->string; *sp; sp++) 324. 			if(*sp == ' ' || *sp == '\t' || *sp == '-') 325. 				*sp = '_'; 326.  327.  		/* Do not process duplicates caused by #ifdef/#else pairs. */ 328.  		/* M. Stephenson					   */ 329. 		if (! duplicate) { 330.  331.  		    if(!strncmp(current->string, "RIN_", 4)) 332. 			    propct = specprop(current->string+4, propct); 333. 		    for(sp = current->string; *sp; sp++) capitalize(sp); 334. 		    /* avoid trouble with stupid C preprocessors */ 335. 		    if(!strncmp(current->string, "WORTHLESS_PIECE_OF_", 19)) 336. 			printf("/* #define\t%s\t%d */\n", current->string, index++); 337. 		    else  { 338. #ifdef SPELLS 339. 			if(!strncmp(current->string, "SPE_", 4))  nspell++; 340. 			printf("#define\t%s\t%d\n", limit(current->string), index++); 341. #else 342. 			if(strncmp(current->string, "SPE_", 4)) 343. 			    printf("#define\t%s\t%d\n", limit(current->string), index++); 344. #endif 345. 		    }  346.  		    newobj; 347. 		}  348.  	}  349.  	printf("\n#define	CORPSE		DEAD_HUMAN\n"); 350. #ifdef KOPS 351. 	printf("#define	DEAD_KOP		DEAD_KOBOLD\n"); 352. #endif 353. #ifdef SPIDERS 354. 	printf("#define	DEAD_GIANT_SPIDER	DEAD_GIANT_SCORPION\n"); 355. #endif 356. #ifdef ROCKMOLE 357. 	printf("#define	DEAD_ROCKMOLE		DEAD_GIANT_RAT\n"); 358. #endif 359. #ifndef KAA 360. 	printf("#define DEAD_QUASIT		DEAD_QUANTUM_MECHANIC\n"); 361. 	printf("#define DEAD_VIOLET_FUNGI	DEAD_VIOLET_FUNGUS\n"); 362. #endif 363. 	printf("#define	LAST_GEM	(JADE+1)\n"); 364. 	printf("#define	LAST_RING	%d\n", propct); 365. #ifdef SPELLS 366. 	printf("#define MAXSPELL	%d\n", nspell+1); 367. #endif 368. 	printf("#define	NROFOBJECTS	%d\n", index-1); 369. 	exit(0); 370. }  371.   372.  static	char	temp[32]; 373.  374.  char * 375. limit(name)	/* limit a name to 30 characters length */ 376. 	char	*name; 377. {  378.  	strncpy(temp, name, 30); 379. 	temp[30] = 0; 380. 	return(temp); 381. }  382.   383.  newobj 384. {  385.  	extern	long	*alloc; 386.  387.  	more = current; 388. 	current = (struct objdef *)alloc(sizeof(struct objdef)); 389. 	current->next = more; 390. }  391.   392.  struct inherent { 393.  394.  	char	*attrib, 395. 		*monsters; 396. }	abilities[] = { "Regeneration", "TVi", 397. 			"See_invisible", "I", 398. 			"Poison_resistance", "abcghikqsuvxyADFQSVWXZ&", 399. 			"Fire_resistance", "gD&", 400. 			"Cold_resistance", "gFY", 401. 			"Teleportation", "LNt", 402. 			"Teleport_control", "t", 403. 			"", "" };  404.   405.  specprop(name, count) 406.  407.  	char	*name; 408. 	int	count; 409. {  410.  	int	i; 411. 	char	*tname, *limit; 412.  413.  	tname = limit(name); 414. 	capitalize(tname); 415. 	for(i = 0; strlen(abilities[i].attrib); i++) 416. 	    if(!strcmp(abilities[i].attrib, tname)) { 417.  418.  		printf("#define\tH%s\tu.uprops[%d].p_flgs\n", tname, count); 419. 		printf("#define\t%s\t((H%s) || index(\"%s\", u.usym))\n",  420.  			tname, tname, abilities[i].monsters); 421. 		return(++count); 422. 	    }  423.   424.  	printf("#define\t%s\tu.uprops[%d].p_flgs\n", tname, count); 425. 	return(++count); 426. }  427.   428.  char line[LINSZ], *lp = line, *lp0 = line, *lpe = line; 429. int xeof; 430.  431.  readline{ 432. register int n = read(fd, lp0, (line+LINSZ)-lp0); 433. 	if(n < 0){ 434. 		printf("Input error.\n"); 435. 		exit(1); 436. 	}  437.  	if(n == 0) xeof++; 438. 	lpe = lp0+n; 439. }  440.   441.  char 442. nextchar{ 443. 	if(lp == lpe){ 444. 		readline; 445. 		lp = lp0; 446. 	}  447.  	return((lp == lpe) ? 0 : *lp++); 448. }  449.   450.  skipuntil(s) char *s; { 451. register char *sp0, *sp1; 452. loop: 453. 	while(*s != nextchar) 454. 		if(xeof) { 455. 			printf("Cannot skipuntil %s\n", s); 456. 			exit(1); 457. 		}  458.  	if(strlen(s) > lpe-lp+1){ 459. 		register char *lp1, *lp2; 460. 		lp2 = lp; 461. 		lp1 = lp = lp0; 462. 		while(lp2 != lpe) *lp1++ = *lp2++; 463. 		lp2 = lp0;	/* save value */ 464. 		lp0 = lp1; 465. 		readline; 466. 		lp0 = lp2; 467. 		if(strlen(s) > lpe-lp+1) { 468. 			printf("error in skipuntil"); 469. 			exit(1); 470. 		}  471.  	}  472.  	sp0 = s+1; 473. 	sp1 = lp; 474. 	while(*sp0 && *sp0 == *sp1) sp0++, sp1++; 475. 	if(!*sp0){ 476. 		lp = sp1; 477. 		return(1); 478. 	}  479.  	goto loop; 480. }  481.   482.  getentry(skip) int *skip; { 483. int inbraces = 0, inparens = 0, stringseen = 0, commaseen = 0; 484. int prefix = 0; 485. char ch; 486. #define	NSZ	10 487. char identif[NSZ], *ip; 488. 	current->string[0] = current->string[4] = 0; 489. 	/* read until {...} or XXX(...) followed by , 490. 	   skip comment and #define lines 491. 	   deliver 0 on failure 492. 	 */  493.  	while(1) { 494. 		ch = nextchar; 495. 	swi: 496. 		if(letter(ch)){ 497. 			ip = identif; 498. 			do { 499. 				if(ip < identif+NSZ-1) *ip++ = ch; 500. 				ch = nextchar; 501. 			} while(letter(ch) || digit(ch)); 502. 			*ip = 0; 503. 			while(ch == ' ' || ch == '\t') ch = nextchar; 504. 			if(ch == '(' && !inparens && !stringseen)  505.  				if(!strcmp(identif, "WAND") || 506. 				   !strcmp(identif, "RING") || 507. 				   !strcmp(identif, "POTION") || 508. 				   !strcmp(identif, "SPELL") || 509. 				   !strcmp(identif, "SCROLL"))  510.  				(void) strncpy(current->string, identif, 3),  511.  				current->string[3] = '_',  512.  				prefix = 4;  513.  		}  514.  		switch(ch) {  515.  		case '/':  516.  			/* watch for comment */  517.  			if((ch = nextchar) == '*')  518.  				skipuntil("*/");  519.  			goto swi;  520.  		case '{':  521.  			inbraces++;  522.  			continue;  523.  		case '(': 524. 			inparens++; 525. 			continue; 526. 		case '}': 527. 			inbraces--; 528. 			if(inbraces < 0) return(0); 529. 			continue; 530. 		case ')':  531.  			inparens--;  532.  			if(inparens < 0) {  533.  				printf("too many ) ?"); 534. 				exit(1); 535. 			}  536.  			continue; 537. 		case '\n': 538. 			/* watch for #define at begin of line */ 539. 			if((ch = nextchar) == '#'){ 540. 				register char pch; 541. 				/* skip until '\n' not preceded by '\\' */ 542. 				do { 543. 					pch = ch; 544. 					ch = nextchar; 545. 				} while(ch != '\n' || pch == '\\'); 546. 				continue; 547. 			}  548.  			goto swi; 549. 		case ',': 550. 			if(!inparens && !inbraces){ 551. 			    if(prefix && !current->string[prefix]) { 552. #ifndef SPELLS 553. 				*skip = strncmp(current->string, "SPE_", 4); 554. #else 555. 				*skip = 1; 556. #endif 557. 				current->string[0] = 0; 558. 			    }  559.  			    if(stringseen) return(1); 560. 			    printf("unexpected ,\n"); 561. 			    exit(1); 562. 			}  563.  			commaseen++; 564. 			continue; 565. 		case '\'': 566. 			if((ch = nextchar) == '\\') ch = nextchar; 567. 			if(nextchar != '\''){ 568. 				printf("strange character denotation?\n"); 569. 				exit(1); 570. 			}  571.  			continue; 572. 		case '"':  573.  			{  574.  				register char *sp = current->string + prefix;  575.  				register char pch;  576.  				register int store = (inbraces || inparens)  577.  					&& !stringseen++ && !commaseen;  578.  				do {  579.  					pch = ch;  580.  					ch = nextchar;  581.  					if(store && sp < current->string+STRSZ)  582.  						*sp++ = ch;  583.  				} while(ch != '"' || pch == '\\'); 584. 				if(store) *--sp = 0; 585. 				continue; 586. 			}  587.  		}  588.  	}  589.  }  590.   591.  duplicate { 592.  593.  	char	s[STRSZ]; 594. 	register char	*c; 595. 	register struct	objdef	*testobj; 596.  597.  	strcpy (s, current->string); 598. 	for(c = s; *c != 0; c++) capitalize(c); 599.  600.  	for(testobj = more; testobj != 0; testobj = testobj->next) 601. 		if(! strcmp(s, testobj->string)) return(1); 602.  603.  	return(0); 604. }  605.   606.  capitalize(sp) register char *sp; { 607. 	if('a' <= *sp && *sp <= 'z') *sp += 'A'-'a'; 608. }  609.   610.  letter(ch) register char ch; { 611. 	return( ('a' <= ch && ch <= 'z') ||  612.  		('A' <= ch && ch <= 'Z') ); 613. }  614.   615.  digit(ch) register char ch; { 616. 	return( '0' <= ch && ch <= '9' ); 617. }  618.   619.  /* a copy of the panic code from hack.pri.c, edited for standalone use */ 620.  621.  boolean	panicking = 0; 622.  623.  panic(str,a1,a2,a3,a4,a5,a6) 624. char *str; 625. {  626.  	if(panicking++) exit(1);    /* avoid loops - this should never happen*/ 627. 	fputs(" ERROR:  ", stdout); 628. 	printf(str,a1,a2,a3,a4,a5,a6); 629. #ifdef DEBUG 630. # ifdef UNIX 631. 	if(!fork) 632. 		abort;	/* generate core dump */ 633. # endif 634. #endif 635. 	exit(1); 636. }  637.   638.  #if defined(SYSV) || defined(GENIX) 639. rename(oldname, newname) 640. 	char	*oldname, *newname; 641. {  642.  	if (strcmp(oldname, newname)) { 643.  644.  		unlink(newname); 645. 		link(oldname, newname); 646. 		unlink(oldname); 647. 	}  648.  }  649.  #endif 650.  651.  #ifdef MSDOS 652. /* Get around bug in freopen when opening for writing	*/ 653. /* Supplied by Nathan Glasser (nathan@mit-eddie)	*/ 654. #undef freopen 655. FILE *_freopen(fname, fmode, fp) 656. char *fname, *fmode; 657. FILE *fp; 658. {  659.      if (!strncmp(fmode,"w",1)) 660.     {  661.          FILE *tmpfp; 662.  663.          if ((tmpfp = fopen(fname,fmode)) == NULL) 664.             return(NULL); 665.         if (dup2(fileno(tmpfp),fileno(fp)) < 0) 666.             return(NULL); 667.         fclose(tmpfp); 668.         return(fp); 669.     }  670.      else 671.         return(freopen(fname,fmode,fp)); 672. }  673.   674.  # ifdef __TURBOC__ 675. int getpid { 676. 	return(1); 677. }  678.  # endif 679. #endif