xtsubs.c
上传用户:duobangkj
上传日期:2007-01-07
资源大小:70k
文件大小:6k
源码类别:

Telnet客户端

开发平台:

Unix_Linux

  1. /* xtsubs.c -- subroutines for XT
  2. This file uses 4-character tabstops
  3. */
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <sys/types.h>
  7. #include <sys/timeb.h>
  8. #include <sys/stat.h>
  9. #include <ctype.h>
  10. #include <signal.h>
  11. #include <termio.h>
  12. #include <setjmp.h>
  13. #include "xt.h"
  14. extern jmp_buf erret;
  15. char line[SM_BUFF], /* Input line */
  16.  word[SM_BUFF], /* Parsed word */
  17.  *wptr, *lptr, /* Word and line pointers */
  18.  *tgetstr(), *tgoto();
  19. int LI, /* One less than screen length in termcap entry */
  20. CO; /* Screen width */
  21. short ospeed;
  22. static char tc[LG_BUFF], /* termcap buffer */
  23. tbuf[LG_BUFF], *CD, *CE, *CF, *CL, *CM, *CN, *SO, *SE;
  24. void show();
  25. #define Tgetstr(code) ((s = tgetstr(code,&p)) ? s : "")
  26. time_t
  27. mtime()
  28. {
  29. static struct timeb tb;
  30. ftime(&tb);
  31. return 1000 * tb.time + tb.millitm;
  32. }
  33. void
  34. msecs(t)
  35. time_t t;
  36. {
  37. time_t start;
  38. start = mtime();
  39. while (mtime()-start < t)
  40. ;
  41. }
  42. /* Do the fork call, packaging the error return so that the caller
  43. need not have code for it.
  44. */
  45. forkem()
  46. {
  47. int i;
  48. if ((i = fork()) < 0){
  49. S1("XT: Fork failed");
  50. longjmp(erret,1);
  51. }
  52. return i;
  53. }
  54. /* Line input routine to be used when the raw terminal mode is in effect. */
  55. void 
  56. getline()
  57. {
  58. int c, i = 0;
  59. char *ptr;
  60. lptr = line;
  61. memset(line, 0, SM_BUFF);
  62. while ((c = getchar()) != 'r' && c != 'n'){
  63. if (c == BS){
  64. if (i > 0){
  65. ptr = unctrl(line[--i]);
  66. line[i] = '';
  67. while (*ptr++ != '')
  68. fputs("b b",tfp);
  69. } else
  70. beep();
  71. continue;
  72. }
  73. if (c == LK){
  74. while (i > 0){
  75. ptr = unctrl(line[--i]);
  76. while (*ptr++ != '')
  77. fputs("b b",tfp);
  78. }
  79. memset(line, 0, SM_BUFF);
  80. continue;
  81. }
  82. if (c == ('v' & 0x1f))
  83. c = getchar();
  84. line[i++] = c;
  85. fputs(unctrl(c), tfp);
  86. }
  87. }
  88. /* Parse the "line" array for a word */
  89. void 
  90. getword()
  91. {
  92. char quote, *ptr = word;
  93. short carat = FALSE, backslash = FALSE;
  94. wptr = lptr;
  95. memset(word, 0, SM_BUFF);
  96. while (isspace(*lptr))
  97. lptr++;
  98. if (*lptr == '')
  99. return;
  100. if (*lptr == ''' || *lptr == '"' || *lptr == 0x7f)
  101. quote = *lptr++;
  102. else
  103. quote = '';
  104. for (; *lptr != ''; lptr++){
  105. if (quote){
  106. if (*lptr == ''){
  107. word[0] = '';
  108. sprintf(Msg,"Unmatched quote: %s", line);
  109. S;
  110. s_exit();
  111. }
  112. if (*lptr == quote)
  113. break;
  114. } else if (!backslash && isspace(*lptr))
  115. break;
  116. if (carat)
  117. *ptr++ = *lptr & 0x1f,
  118. carat = FALSE;
  119. else if (backslash)
  120. *ptr++ = *lptr,
  121. backslash = FALSE;
  122. else if (*lptr == '^')
  123. carat = TRUE;
  124. else if (*lptr == '\')
  125. backslash = TRUE;
  126. else
  127. *ptr++ = *lptr;
  128. }
  129. lptr++;
  130. }
  131. /* Make the specified word all lower case */
  132. void 
  133. lc_word(ptr)
  134. char *ptr;
  135. {
  136. while (*ptr){
  137. *ptr = tolower(*ptr);
  138. ptr++;
  139. }
  140. }
  141. /* Make the specified word all upper case */
  142. void
  143. uc_word(ptr)
  144. char *ptr;
  145. {
  146. while (*ptr){
  147. *ptr = toupper(*ptr);
  148. ptr++;
  149. }
  150. }
  151. void 
  152. mode(flag)
  153. int flag;
  154. {
  155. if (flag == NEWMODE)
  156. ioctl(0, TCSETAF, &newmode);
  157. else if (flag == SIGMODE)
  158. ioctl(0, TCSETAF, &sigmode);
  159. else if (flag == OLDMODE)
  160. ioctl(0, TCSETAF, &oldmode);
  161. }
  162. beep()
  163. {
  164. putc(7,tfp);
  165. return SUCCESS;
  166. }
  167. /* initialize termcap stuff */
  168. void 
  169. get_ttype()
  170. {
  171. char *ttytype;
  172. char *p = tbuf;
  173. char *s;
  174. if (!(ttytype = getenv("TERM"))){
  175. S1("TERM not set");
  176. exit(6);
  177. }
  178. if (tgetent(tc, ttytype) != 1){
  179. sprintf(Msg,"Can't load %s", ttytype);
  180. S;
  181. exit(7);
  182. }
  183. ospeed = newmode.c_cflag & CBAUD;
  184. if (s = getenv("LINES"))
  185. LI=atoi(s);
  186. else
  187. LI = tgetnum("li");
  188. if (LI == -1)
  189. LI = 24;
  190. LI--;
  191. if (s = getenv("COLUMNS"))
  192. CO=atoi(s);
  193. else
  194. CO = tgetnum("co");
  195. if (CO == -1)
  196. CO = 80;
  197. CD = Tgetstr("cd");
  198. CE = Tgetstr("ce");
  199. CL = Tgetstr("cl");
  200. CM = Tgetstr("cm");
  201. SE = Tgetstr("se");
  202. SO = Tgetstr("so");
  203. CF = Tgetstr("CF");
  204. CN = Tgetstr("CN");
  205. if (strlen(CF) && ! strlen(CN))
  206. CN = Tgetstr("CO");
  207. }
  208. /* putchr() is a routine to pass to tputs() */
  209. void
  210. putchr(c) int c; { putc(c,tfp); }
  211. void
  212. cls() { tputs(CL,LI,putchr); }
  213. void
  214. cur_on() { tputs(CN,1,putchr); }
  215. void
  216. cur_off() { tputs(CF,1,putchr); }
  217. void
  218. cl_line() { tputs(CE,1,putchr); }
  219. void
  220. cl_end() { tputs(CD,LI,putchr); }
  221. void 
  222. ttgoto(row, col) int row, col; { tputs(tgoto(CM, col, row),1,putchr); }
  223. void 
  224. drawline(row, col, len)
  225. int row, col, len;
  226. {
  227. ttgoto(row, col);
  228. while (len--)
  229. fputc('-', tfp);
  230. }
  231. void 
  232. show(flag, str)
  233. short flag;
  234. char *str;
  235. {
  236. if (!flag){
  237. beep();
  238. ttgoto(LI,0),
  239. cl_line(),
  240. ttgoto(LI,(CO-(int)strlen(str))/2 -1);
  241. }
  242. if (flag == 2)
  243. putc('n',tfp),
  244. putc('r',tfp);
  245. tputs(SO,1,putchr);
  246. putc(' ',tfp);
  247. fputs(str, tfp);
  248. putc(' ',tfp);
  249. tputs(SE,1,putchr);
  250. if (flag > 0)
  251. putc('n',tfp),
  252. putc('r',tfp);
  253. }
  254. void 
  255. show_abort() { S2("USER ABORT"); }
  256. FILE *
  257. isregfile(pathname)
  258. char *pathname;
  259. {
  260. struct stat statbuf;
  261. if (stat(pathname,&statbuf) || (statbuf.st_mode & S_IFMT) != S_IFREG)
  262. return NIL(FILE);
  263. return fopen(pathname, "r");
  264. }
  265. FILE *
  266. openfile(name)
  267. char *name;
  268. {
  269. FILE *fp = NIL(FILE);
  270. char *home, fullname[SM_BUFF], *path, *pathend;
  271. int pathlen;
  272. if ((path = getenv("XT_PATH"))){
  273. while (!fp){
  274. if (!(pathend = strchr(path, ':')))
  275. pathlen = (int)strlen(path);
  276. else
  277. pathlen = pathend - path;
  278. sprintf(fullname, "%.*s/%s", pathlen, path, name);
  279. fp = isregfile(fullname);
  280. path += pathlen;
  281. if (*path == '')
  282. break;
  283. path++;
  284. }
  285. }
  286. if (!fp)
  287. fp = isregfile(name);
  288. if (!fp){
  289. if ((home = getenv("HOME")))
  290. sprintf(fullname, "%s/%s", home, name);
  291. fp = isregfile(fullname);
  292. }
  293. if (!fp){
  294. sprintf(fullname, "%s/%s", LIBDIR, name);
  295. fp = isregfile(fullname);
  296. }
  297. return fp;
  298. }
  299. /* Translate the character specified by 'c' to its ASCII display name.
  300. Note: This routine is specific to the ASCII character set.
  301. */
  302. char *
  303. unctrl(c)
  304. int c;
  305. {
  306. static char buffer[3], buf1[2];
  307. memset(buffer, 0, 3);
  308. memset(buf1, 0, 2);
  309. if (c == 0x7f)
  310. strcpy(buffer, "^?");
  311. else {
  312. if (iscntrl(c))
  313. strcpy(buffer, "^"),
  314. c += '@';
  315. buf1[0] = c;
  316. strcat(buffer, buf1);
  317. }
  318. return buffer;
  319. }