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