ecuphrase.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. /*+-----------------------------------------------------------------
  2. ecuphrases.c - %# phrase management
  3. wht@wht.net
  4. Defined functions:
  5. phrase_help()
  6. phrases(nargc, nargv)
  7. read_phrases()
  8. God made the Idiot for practice, and then He made the School
  9. Board -- Mark Twain
  10. ------------------------------------------------------------------------*/
  11. /*+:EDITS:*/
  12. /*:04-26-2000-11:15-wht@bob-RELEASE 4.42 */
  13. /*:01-24-1997-02:37-wht@yuriatin-SOURCE RELEASE 4.00 */
  14. /*:09-11-1996-20:00-wht@yuriatin-3.48-major telnet,curses,structural overhaul */
  15. /*:07-31-1996-17:12-dgy@rtd.com-fix phrase_help ^p */
  16. /*:11-23-1995-11:20-wht@kepler-source control 3.37 for tsx-11 */
  17. /*:11-14-1995-10:23-wht@kepler-3.37.80-source control point: SOCKETS */
  18. /*:05-11-1995-15:55-wht@n4hgf-ck_sigint fools optimizing compilers */
  19. /*:05-04-1994-04:39-wht@n4hgf-ECU release 3.30 */
  20. /*:09-10-1992-13:58-wht@n4hgf-ECU release 3.20 */
  21. /*:08-22-1992-15:38-wht@n4hgf-ECU release 3.20 BETA */
  22. /*:07-25-1991-12:56-wht@n4hgf-ECU release 3.10 */
  23. /*:07-17-1991-07:04-wht@n4hgf-avoid SCO UNIX nap bug */
  24. /*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  25. #include "ecu.h"
  26. #define P_N_QUAN 23
  27. char *phrases_string[P_N_QUAN];
  28. char *phrases_label[P_N_QUAN];
  29. int phrases_count = 0;
  30. int phrases_resident = 0;
  31. /*+-----------------------------------------------------------------------
  32. read_phrases()
  33. ------------------------------------------------------------------------*/
  34. void
  35. read_phrases()
  36. {
  37. char *phrases_str;
  38. char phrases_buf[256];
  39. char phrases_buf_copy[256];
  40. char *phrases_lbl;
  41. FILE *fd_phrase;
  42. if (phrases_resident)
  43. {
  44. while (phrases_count)
  45. free(phrases_string[--phrases_count]);
  46. phrases_resident = 0;
  47. }
  48. get_home_dir(phrases_buf);
  49. strcat(phrases_buf, "/.ecu/phrases");
  50. if (!(fd_phrase = fopen(phrases_buf, "r")))
  51. {
  52. ff(se, "\r\n");
  53. perror(phrases_buf);
  54. ff(se, "\r\n");
  55. ff(se, "... no phrases resident\r\n");
  56. return;
  57. }
  58. /* we have an open .ecu/phrase file */
  59. phrases_count = 0;
  60. while (fgets(phrases_buf, sizeof(phrases_buf), fd_phrase))
  61. {
  62. phrases_buf[strlen(phrases_buf) - 1] = 0;
  63. if (strlen(phrases_buf) == 0)
  64. continue;
  65. if (phrases_count == P_N_QUAN)
  66. {
  67. ff(se, "\r\nMaximum number of phrases %d exceeded\r\n", P_N_QUAN);
  68. ff(se, "rest of file ignored, starting with the following:\r\n");
  69. ff(se, "--> %s\r\n\r\n", phrases_buf);
  70. phrases_resident = 1;
  71. fclose(fd_phrase);
  72. return;
  73. }
  74. strcpy(phrases_buf_copy, phrases_buf);
  75. phrases_lbl = phrases_buf_copy;
  76. for (phrases_str = phrases_buf_copy; *phrases_str; phrases_str++)
  77. {
  78. if (*phrases_str == ':')
  79. {
  80. *phrases_str++ = 0;
  81. break;
  82. }
  83. if (*phrases_str == 0)
  84. {
  85. ff(se, "invalid entry `%s'\n", phrases_buf);
  86. continue;
  87. }
  88. }
  89. if (!(phrases_string[phrases_count] =
  90. malloc(strlen(phrases_str) + 2)) ||
  91. !(phrases_label[phrases_count] =
  92. malloc(strlen(phrases_lbl) + 2)))
  93. {
  94. ff(se, "\r\nNo more memory for phrases\r\n");
  95. ff(se, "rest of file ignored, starting with the following:\r\n");
  96. ff(se, "--> %s\r\n\r\n", phrases_buf);
  97. phrases_resident = 1;
  98. fclose(fd_phrase);
  99. if (phrases_string[phrases_count])
  100. free(phrases_string[phrases_count]);
  101. return;
  102. }
  103. strcpy(phrases_string[phrases_count], phrases_str);
  104. strcpy(phrases_label[phrases_count], phrases_lbl);
  105. phrases_count++;
  106. } /* while records left to read */
  107. fclose(fd_phrase);
  108. phrases_resident = 1;
  109. } /* end of read_phrases */
  110. /*+-------------------------------------------------------------------------
  111. phrases(nargc,nargv)
  112. --------------------------------------------------------------------------*/
  113. phrases(nargc, nargv)
  114. int nargc;
  115. char **nargv;
  116. {
  117. int itmp;
  118. int ichar;
  119. char *cp;
  120. int old_ttymode = get_ttymode();
  121. extern int icmd_prompt_len;
  122. for (itmp = icmd_prompt_len + strlen(nargv[0]); itmp; itmp--)
  123. fputs("\b \b", se);
  124. itmp = atoi(nargv[0]);
  125. if (itmp == 0)
  126. {
  127. ff(se, "\r\n");
  128. read_phrases();
  129. if (!phrases_count)
  130. return (0);
  131. tcap_stand_out();
  132. ff(se,
  133. " # | mnemonic | phrase ");
  134. tcap_stand_end();
  135. ff(se, "\r\n");
  136. for (itmp = 0; itmp < phrases_count; itmp++)
  137. {
  138. ff(se, "%2d | %12s | %s\r\n", itmp + 1, phrases_label[itmp],
  139. phrases_string[itmp]);
  140. }
  141. return (0);
  142. }
  143. else if (phrases_resident == 0)
  144. read_phrases();
  145. if (itmp > phrases_count)
  146. {
  147. ff(se, " unknown: %d\r\n", itmp);
  148. return (-1);
  149. }
  150. else
  151. {
  152. cp = phrases_string[itmp - 1];
  153. ttymode(2);
  154. while (*cp)
  155. {
  156. if (ck_sigint())
  157. break;
  158. switch (ichar = *cp++)
  159. {
  160. case '^':
  161. ichar = *cp++;
  162. if ((ichar >= '@') && (ichar <= '_'))
  163. lputc_paced(0, ichar & 0x1F);
  164. else if (ichar == '?')
  165. lputc_paced(0, 0x7F);
  166. else
  167. {
  168. switch (ichar)
  169. {
  170. case 0:
  171. goto NUL_FOUND;
  172. case 'r':
  173. lputc_paced(0, '\r');
  174. break;
  175. case 'n':
  176. lputc_paced(0, '\n');
  177. break;
  178. case 't':
  179. lputc_paced(0, '\t');
  180. break;
  181. case '^':
  182. lputc_paced(0, '^');
  183. break;
  184. case 'p':
  185. itmp = atoi(cp);
  186. while ((*cp >= '0') && (*cp <= '9'))
  187. cp++;
  188. if (*cp == '.')
  189. cp++;
  190. if (!itmp)
  191. itmp = 1;
  192. Nap((long)itmp * 100L);
  193. break;
  194. case 'a':
  195. itmp = atoi(cp);
  196. while ((*cp >= '0') && (*cp <= '9'))
  197. cp++;
  198. if (*cp == '.')
  199. cp++;
  200. if (itmp < nargc)
  201. {
  202. lputs_paced(0, nargv[itmp]);
  203. itmp = strlen(nargv[itmp]);
  204. }
  205. break;
  206. }
  207. }
  208. break;
  209. default:
  210. lputc_paced(0, ichar);
  211. }
  212. }
  213. NUL_FOUND:
  214. if (ck_sigint())
  215. {
  216. sigint = 0;
  217. ff(se, "\r\n--> interrupted\r\n");
  218. }
  219. }
  220. ttymode(old_ttymode);
  221. return (0);
  222. } /* end of phrases */
  223. /*+-------------------------------------------------------------------------
  224. phrase_help()
  225. --------------------------------------------------------------------------*/
  226. void
  227. phrase_help()
  228. {
  229. ff(se, "^r == \\r ^n == \\n ^t == \\t ^^ == '^'\r\n");
  230. ff(se, "^p#. pause # decisecs\r\n");
  231. ff(se, "^a#. arg number # of %%# invocation\r\n");
  232. } /* end of phrase_help */
  233. /* vi: set tabstop=4 shiftwidth=4: */