np.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. /* RDLINE- READ INPUT LINE */
  2. /*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
  3. /* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
  4. /* WRITTEN BY R. M. SUPNIK */
  5. #include <stdio.h>
  6. #include <ctype.h>
  7. #include "funcs.h"
  8. #include "vars.h"
  9. /* This declaration is here since many systems don't have <stdlib.h> */
  10. extern int system P((const char *));
  11. static logical lex_ P((char *, integer *, integer *, logical));
  12. void rdline_(buffer, who)
  13. char *buffer;
  14. integer who;
  15. {
  16. /* Local variables */
  17. char *z, *zlast;
  18. /* Function Body */
  19. L5:
  20. switch (who + 1) {
  21. case 1: goto L90;
  22. case 2: goto L10;
  23. }
  24. /* !SEE WHO TO PROMPT FOR. */
  25. L10:
  26. printf(">");
  27. /* !PROMPT FOR GAME. */
  28. L90:
  29. (void) fflush(stdout);
  30. if (fgets(buffer, 78, stdin) == NULL)
  31. exit_();
  32. more_input();
  33. if (buffer[0] == '!') {
  34. system(buffer + 1);
  35. goto L5;
  36. }
  37. zlast = buffer - 1;
  38. for (z = buffer; *z != '\0' && *z != '\n'; z++) {
  39. if (*z != ' ')
  40. zlast = z;
  41. if (islower(*z))
  42. *z = toupper(*z);
  43. }
  44. z = zlast + 1;
  45. if (z == buffer)
  46. goto L5;
  47. *z = '\0';
  48. prsvec_1.prscon = 1;
  49. /* !RESTART LEX SCAN. */
  50. } /* rdline_ */
  51. /* PARSE- TOP LEVEL PARSE ROUTINE */
  52. /* THIS ROUTINE DETAILS ON BIT 0 OF PRSFLG */
  53. logical parse_(inbuf, vbflag)
  54. char *inbuf;
  55. logical vbflag;
  56. {
  57. /* System generated locals */
  58. integer i__1;
  59. logical ret_val;
  60. /* Local variables */
  61. integer outbuf[40], outlnt;
  62. /* Parameter adjustments */
  63. --inbuf;
  64. /* Function Body */
  65. ret_val = FALSE_;
  66. /* !ASSUME FAILS. */
  67. prsvec_1.prsa = 0;
  68. /* !ZERO OUTPUTS. */
  69. prsvec_1.prsi = 0;
  70. prsvec_1.prso = 0;
  71. if (! lex_(inbuf + 1, outbuf, &outlnt, vbflag)) {
  72. goto L100;
  73. }
  74. if ((i__1 = sparse_(outbuf, outlnt, vbflag)) < 0) {
  75. goto L100;
  76. } else if (i__1 == 0) {
  77. goto L200;
  78. } else {
  79. goto L300;
  80. }
  81. /* !DO SYN SCAN. */
  82. /* PARSE REQUIRES VALIDATION */
  83. L200:
  84. if (! (vbflag)) {
  85. goto L350;
  86. }
  87. /* !ECHO MODE, FORCE FAIL. */
  88. if (! synmch_()) {
  89. goto L100;
  90. }
  91. /* !DO SYN MATCH. */
  92. if (prsvec_1.prso > 0 & prsvec_1.prso < xsrch_1.xmin) {
  93. last_1.lastit = prsvec_1.prso;
  94. }
  95. /* SUCCESSFUL PARSE OR SUCCESSFUL VALIDATION */
  96. L300:
  97. ret_val = TRUE_;
  98. L350:
  99. orphan_(0, 0, 0, 0, 0);
  100. /* !CLEAR ORPHANS. */
  101. return ret_val;
  102. /* PARSE FAILS, DISALLOW CONTINUATION */
  103. L100:
  104. prsvec_1.prscon = 1;
  105. return ret_val;
  106. } /* parse_ */
  107. /* ORPHAN- SET UP NEW ORPHANS */
  108. /* DECLARATIONS */
  109. void orphan_(o1, o2, o3, o4, o5)
  110. integer o1;
  111. integer o2;
  112. integer o3;
  113. integer o4;
  114. integer o5;
  115. {
  116. orphs_1.oflag = o1;
  117. /* !SET UP NEW ORPHANS. */
  118. orphs_1.oact = o2;
  119. orphs_1.oslot = o3;
  120. orphs_1.oprep = o4;
  121. orphs_1.oname = o5;
  122. } /* orphan_ */
  123. /* LEX- LEXICAL ANALYZER */
  124. /* THIS ROUTINE DETAILS ON BIT 1 OF PRSFLAG */
  125. static logical lex_(inbuf, outbuf, op, vbflag)
  126. char *inbuf;
  127. integer *outbuf;
  128. integer *op;
  129. logical vbflag;
  130. {
  131. /* Initialized data */
  132. static const char dlimit[9] = { 'A', 'Z', 'A' - 1,
  133. '1', '9', '1' - 31,
  134. '-', '-', '-' - 27 };
  135. /* System generated locals */
  136. logical ret_val;
  137. /* Local variables */
  138. integer i;
  139. char j;
  140. integer k, j1, j2, cp;
  141. /* Parameter adjustments */
  142. --outbuf;
  143. --inbuf;
  144. /* Function Body */
  145. for (i = 1; i <= 40; ++i) {
  146. /* !CLEAR OUTPUT BUF. */
  147. outbuf[i] = 0;
  148. /* L100: */
  149. }
  150. ret_val = FALSE_;
  151. /* !ASSUME LEX FAILS. */
  152. *op = -1;
  153. /* !OUTPUT PTR. */
  154. L50:
  155. *op += 2;
  156. /* !ADV OUTPUT PTR. */
  157. cp = 0;
  158. /* !CHAR PTR=0. */
  159. L200:
  160. j = inbuf[prsvec_1.prscon];
  161. /* !GET CHARACTER */
  162. if (j == '\0')
  163. goto L1000;
  164. /* !END OF INPUT? */
  165. ++prsvec_1.prscon;
  166. /* !ADVANCE PTR. */
  167. if (j == '.') {
  168. goto L1000;
  169. }
  170. /* !END OF COMMAND? */
  171. if (j == ',') {
  172. goto L1000;
  173. }
  174. /* !END OF COMMAND? */
  175. if (j == ' ') {
  176. goto L6000;
  177. }
  178. /* !SPACE? */
  179. for (i = 1; i <= 9; i += 3) {
  180. /* !SCH FOR CHAR. */
  181. if (j >= dlimit[i - 1] & j <= dlimit[i]) {
  182. goto L4000;
  183. }
  184. /* L500: */
  185. }
  186. if (vbflag) {
  187. rspeak_(601);
  188. }
  189. /* !GREEK TO ME, FAIL. */
  190. return ret_val;
  191. /* END OF INPUT, SEE IF PARTIAL WORD AVAILABLE. */
  192. L1000:
  193. if (inbuf[prsvec_1.prscon] == '\0') {
  194. prsvec_1.prscon = 1;
  195. }
  196. /* !FORCE PARSE RESTART. */
  197. if (cp == 0 & *op == 1) {
  198. return ret_val;
  199. }
  200. if (cp == 0) {
  201. *op += -2;
  202. }
  203. /* !ANY LAST WORD? */
  204. ret_val = TRUE_;
  205. return ret_val;
  206. /* LEGITIMATE CHARACTERS: LETTER, DIGIT, OR HYPHEN. */
  207. L4000:
  208. j1 = j - dlimit[i + 1];
  209. if (cp >= 6) {
  210. goto L200;
  211. }
  212. /* !IGNORE IF TOO MANY CHAR. */
  213. k = *op + cp / 3;
  214. /* !COMPUTE WORD INDEX. */
  215. switch (cp % 3 + 1) {
  216. case 1: goto L4100;
  217. case 2: goto L4200;
  218. case 3: goto L4300;
  219. }
  220. /* !BRANCH ON CHAR. */
  221. L4100:
  222. j2 = j1 * 780;
  223. /* !CHAR 1... *780 */
  224. outbuf[k] = outbuf[k] + j2 + j2;
  225. /* !*1560 (40 ADDED BELOW). */
  226. L4200:
  227. outbuf[k] += j1 * 39;
  228. /* !*39 (1 ADDED BELOW). */
  229. L4300:
  230. outbuf[k] += j1;
  231. /* !*1. */
  232. ++cp;
  233. goto L200;
  234. /* !GET NEXT CHAR. */
  235. /* SPACE */
  236. L6000:
  237. if (cp == 0) {
  238. goto L200;
  239. }
  240. /* !ANY WORD YET? */
  241. goto L50;
  242. /* !YES, ADV OP. */
  243. } /* lex_ */