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