| abstract
| - Below is the full text to getline.c from the source code of NetHack 3.0.0. To link to a particular line, write [[NetHack 3.0.0/getline.c#line123]], for example. Warning! This is the source code from an old release. For the latest release, see Source code 1. /* SCCS Id: @(#)getline.c 3.0 89/06/16 2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3. /* NetHack may be freely redistributed. See license for details. */ 4. 5. #include "hack.h" 6. #include "func_tab.h" 7. 8. /* 9. * Some systems may have getchar() return EOF for various reasons, and 10. * we should not quit before seeing at least NR_OF_EOFS consecutive EOFs. 11. */ 12. #ifdef SYSV 13. #define NR_OF_EOFS 20 14. #endif 15. 16. char morc = 0; /* tell the outside world what char he used */ 17. 18. extern char erase_char, kill_char; /* from appropriate tty.c file */ 19. 20. /* 21. * Read a line closed with '
' into the array char bufp[BUFSZ]. 22. * (The '
' is not stored. The string is closed with a '\0'.) 23. * Reading can be interrupted by an escape ('\033') - now the 24. * resulting string is "\033". 25. */ 26. void 27. getlin(bufp) 28. register char *bufp; 29. { 30. register char *obufp = bufp; 31. register int c; 32. 33. flags.toplin = 2; /* nonempty, no --More-- required */ 34. for(;;) { 35. (void) fflush(stdout); 36. if((c = Getchar()) == EOF) { 37. *bufp = 0; 38. return; 39. } 40. if(c == '\033') { 41. *obufp = c; 42. obufp[1] = 0; 43. return; 44. } 45. if(c == erase_char || c == '\b') { 46. if(bufp != obufp) { 47. bufp--; 48. putstr("\b \b");/* putsym converts \b */ 49. } else bell(); 50. } else if(c == '
') { 51. *bufp = 0; 52. return; 53. } else if(' ' <= c && c < '\177' && 54. (bufp-obufp < BUFSZ-1 || bufp-obufp < COLNO)) { 55. /* avoid isprint() - some people don't have it 56. ' ' is not always a printing char */ 57. *bufp = c; 58. bufp[1] = 0; 59. putstr(bufp); 60. bufp++; 61. } else if(c == kill_char || c == '\177') { /* Robert Viduya */ 62. /* this test last - @ might be the kill_char */ 63. while(bufp != obufp) { 64. bufp--; 65. if(curx == 1 && cury > 1) { 66. putstr("\b \b\b"); 67. curx = CO; 68. } else putstr("\b \b"); 69. } 70. } else 71. bell(); 72. } 73. } 74. 75. void 76. getret() { 77. cgetret(""); 78. } 79. 80. void 81. cgetret(s) 82. register char *s; 83. { 84. putsym('
'); 85. if(flags.standout) 86. standoutbeg(); 87. putstr("Hit "); 88. putstr(flags.cbreak ? "space" : "return"); 89. putstr(" to continue: "); 90. if(flags.standout) 91. standoutend(); 92. xwaitforspace(s); 93. } 94. 95. 96. void 97. xwaitforspace(s) 98. register char *s; /* chars allowed besides space or return */ 99. { 100. register int c; 101. 102. morc = 0; 103. 104. while((c = readchar()) != '
') { 105. if(flags.cbreak) { 106. if(c == ' ') break; 107. if(s && index(s,c)) { 108. morc = c; 109. break; 110. } 111. bell(); 112. } 113. } 114. } 115. 116. static int last_multi; 117. 118. char * 119. parse() 120. { 121. #ifdef LINT /* static char in_line[COLNO]; */ 122. char in_line[COLNO]; 123. #else 124. static char in_line[COLNO]; 125. #endif 126. register int foo; 127. 128. multi = 0; 129. flags.move = 1; 130. curs_on_u(); 131. 132. if (!flags.num_pad || (foo = readchar()) == 'n') 133. while((foo = readchar()) >= '0' && foo <= '9') { 134. multi = 10*multi+foo-'0'; 135. if (multi < 0 || multi > LARGEST_INT) 136. multi = LARGEST_INT; 137. if (multi > 9) { 138. remember_topl(); 139. home(); 140. cl_end(); 141. Printf("Count: %d", multi); 142. } 143. last_multi = multi; 144. } 145. # ifdef REDO 146. if (foo == DOAGAIN || in_doagain) 147. multi = last_multi; 148. else { 149. savech(0); /* reset input queue */ 150. savech(foo); 151. } 152. # endif 153. if(multi) { 154. multi--; 155. save_cm = in_line; 156. } 157. in_line[0] = foo; 158. in_line[1] = 0; 159. if(foo == 'g' || foo == 'G'){ 160. in_line[1] = Getchar(); 161. #ifdef REDO 162. savech(in_line[1]); 163. #endif 164. in_line[2] = 0; 165. } 166. if(foo == 'm' || foo == 'M'){ 167. in_line[1] = Getchar(); 168. #ifdef REDO 169. savech(in_line[1]); 170. #endif 171. in_line[2] = 0; 172. } 173. clrlin(); 174. return(in_line); 175. } 176. 177. #ifdef UNIX 178. static void 179. end_of_input() 180. { 181. settty("End of input?
"); 182. clearlocks(); 183. exit(0); 184. } 185. #endif 186. 187. char 188. readchar() { 189. register int sym; 190. 191. (void) fflush(stdout); 192. #ifdef UNIX 193. if((sym = Getchar()) == EOF) 194. # ifdef NR_OF_EOFS 195. { /* 196. * Some SYSV systems seem to return EOFs for various reasons 197. * (?like when one hits break or for interrupted systemcalls?), 198. * and we must see several before we quit. 199. */ 200. register int cnt = NR_OF_EOFS; 201. while (cnt--) { 202. clearerr(stdin); /* omit if clearerr is undefined */ 203. if((sym = Getchar()) != EOF) goto noteof; 204. } 205. end_of_input(); 206. noteof: ; 207. } 208. # else 209. end_of_input(); 210. # endif /* NR_OF_EOFS /**/ 211. #else 212. sym = Getchar(); 213. #endif /* UNIX */ 214. if(flags.toplin == 1) 215. flags.toplin = 2; 216. return((char) sym); 217. } 218. 219. #ifdef COM_COMPL 220. /* Read in an extended command - doing command line completion for 221. * when enough characters have been entered to make a unique command. 222. * This is just a modified getlin(). -jsb 223. */ 224. void 225. get_ext_cmd(bufp) 226. register char *bufp; 227. { 228. register char *obufp = bufp; 229. register int c; 230. int com_index, oindex; 231. 232. flags.toplin = 2; /* nonempty, no --More-- required */ 233. 234. for(;;) { 235. (void) fflush(stdout); 236. if((c = readchar()) == EOF) { 237. *bufp = 0; 238. return; 239. } 240. if(c == '\033') { 241. *obufp = c; 242. obufp[1] = 0; 243. return; 244. } 245. if(c == erase_char || c == '\b') { 246. if(bufp != obufp) { 247. bufp--; 248. putstr("\b \b"); /* putsym converts \b */ 249. } else bell(); 250. } else if(c == '
') { 251. *bufp = 0; 252. return; 253. } else if(' ' <= c && c < '\177') { 254. /* avoid isprint() - some people don't have it 255. ' ' is not always a printing char */ 256. *bufp = c; 257. bufp[1] = 0; 258. oindex = 0; 259. com_index = -1; 260. 261. while(extcmdlist[oindex].ef_txt != NULL){ 262. if(!strncmp(obufp, extcmdlist[oindex].ef_txt, 263. strlen(obufp))) 264. if(com_index == -1) /* No matches yet*/ 265. com_index = oindex; 266. else /* More than 1 match */ 267. com_index = -2; 268. oindex++; 269. } 270. if(com_index >= 0){ 271. Strcpy(obufp, extcmdlist[com_index].ef_txt); 272. /* finish printing our string */ 273. putstr(bufp); 274. bufp = obufp; /* reset it */ 275. if(strlen(obufp) < BUFSIZ-1 && 276. strlen(obufp) < COLNO) 277. /* set bufp at the end of our string */ 278. bufp += strlen(obufp); 279. } else { 280. putstr(bufp); 281. if(bufp-obufp < BUFSZ-1 && bufp-obufp < COLNO) 282. bufp++; 283. } 284. } else if(c == kill_char || c == '\177') { /* Robert Viduya */ 285. /* this test last - @ might be the kill_char */ 286. while(bufp != obufp) { 287. bufp--; 288. putstr("\b \b"); 289. } 290. } else 291. bell(); 292. } 293. 294. } 295. #endif /* COM_COMPL */
|