term.c
上传用户:minyiyu
上传日期:2018-12-24
资源大小:864k
文件大小:5k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. /*
  2.     Pirate Bulletin Board System
  3.     Copyright (C) 1990, Edward Luke, lush@Athena.EE.MsState.EDU
  4.     Eagles Bulletin Board System
  5.     Copyright (C) 1992, Raymond Rocker, rocker@rock.b11.ingr.com
  6.                         Guy Vega, gtvega@seabass.st.usm.edu
  7.                         Dominic Tynes, dbtynes@seabass.st.usm.edu
  8.     Firebird Bulletin Board System
  9.     Copyright (C) 1996, Hsien-Tsung Chang, Smallpig.bbs@bbs.cs.ccu.edu.tw
  10.                         Peng Piaw Foong, ppfoong@csie.ncu.edu.tw
  11.     This program is free software; you can redistribute it and/or modify
  12.     it under the terms of the GNU General Public License as published by
  13.     the Free Software Foundation; either version 1, or (at your option)
  14.     any later version.
  15.     This program is distributed in the hope that it will be useful,
  16.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.     GNU General Public License for more details.
  19. */
  20. /*
  21. $Id: term.c,v 1.1 2000/01/15 01:45:29 edwardc Exp $
  22. */
  23. #include "bbs.h"
  24. #include <sys/ioctl.h>
  25. #ifdef HP_UX
  26. #define O_HUPCL 01
  27. #define O_XTABS 02
  28. #endif
  29. #ifdef TERMIOS
  30. #include <termios.h>
  31. #define stty(fd, data) tcsetattr( fd, TCSANOW, data )
  32. #define gtty(fd, data) tcgetattr( fd, data )
  33. struct termios tty_state, tty_new;
  34. #else
  35. struct sgttyb tty_state, tty_new;
  36. #endif
  37. #ifndef TANDEM
  38. #define TANDEM 0x00000001
  39. #endif
  40. #ifndef CBREAK
  41. #define CBREAK  0x00000002
  42. #endif
  43. int
  44. get_tty()
  45. {
  46. if (gtty(1, &tty_state) < 0) {
  47. fprintf(stderr, "gtty failedn");
  48. exit(-1);
  49. }
  50. return 1;
  51. }
  52. #ifdef TERMIOS
  53. void
  54. init_tty()
  55. {
  56. long    vdisable;
  57. memcpy(&tty_new, &tty_state, sizeof(tty_new));
  58. tty_new.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ISIG);
  59. tty_new.c_cflag &= ~CSIZE;
  60. tty_new.c_cflag |= CS8;
  61. tty_new.c_cc[VMIN] = 1;
  62. tty_new.c_cc[VTIME] = 0;
  63. if ((vdisable = fpathconf(STDIN_FILENO, _PC_VDISABLE)) >= 0) {
  64. tty_new.c_cc[VSTART] = vdisable;
  65. tty_new.c_cc[VSTOP] = vdisable;
  66. tty_new.c_cc[VLNEXT] = vdisable;
  67. }
  68. tcsetattr(1, TCSANOW, &tty_new);
  69. }
  70. #else
  71. void
  72. init_tty()
  73. {
  74. memcpy(&tty_new, &tty_state, sizeof(tty_new));
  75. tty_new.sg_flags |= RAW;
  76. #ifdef HP_UX
  77. tty_new.sg_flags &= ~(O_HUPCL | O_XTABS | LCASE | ECHO | CRMOD);
  78. #else
  79. tty_new.sg_flags &= ~(TANDEM | CBREAK | LCASE | ECHO | CRMOD);
  80. #endif
  81. stty(1, &tty_new);
  82. }
  83. #endif
  84. void
  85. reset_tty()
  86. {
  87. stty(1, &tty_state);
  88. }
  89. void
  90. restore_tty()
  91. {
  92. stty(1, &tty_new);
  93. }
  94. #define TERMCOMSIZE (255)
  95. int     dumb_term = YEA;
  96. char    clearbuf[TERMCOMSIZE];
  97. int     clearbuflen;
  98. char    cleolbuf[TERMCOMSIZE];
  99. int     cleolbuflen;
  100. char    cursorm[TERMCOMSIZE];
  101. char   *cm;
  102. char    scrollrev[TERMCOMSIZE];
  103. int     scrollrevlen;
  104. char    strtstandout[TERMCOMSIZE];
  105. int     strtstandoutlen;
  106. char    endstandout[TERMCOMSIZE];
  107. int     endstandoutlen;
  108. int     t_lines = 24;
  109. int     t_columns = 255;
  110. int     automargins;
  111. char   *outp;
  112. int    *outlp;
  113. static
  114. outcf(ch)
  115. char    ch;
  116. {
  117. if (*outlp < TERMCOMSIZE) {
  118. (*outlp)++;
  119. *outp++ = ch;
  120. }
  121. }
  122. int
  123. term_init(term)
  124. char   *term;
  125. {
  126. extern char PC, *UP, *BC;
  127. extern short ospeed;
  128. static char UPbuf[TERMCOMSIZE];
  129. static char BCbuf[TERMCOMSIZE];
  130. static char buf[5120];
  131. char    sbuf[5120];
  132. char   *sbp, *s;
  133. char   *tgetstr();
  134. #ifdef TERMIOS
  135. ospeed = cfgetospeed(&tty_state);
  136. #else
  137. ospeed = tty_state.sg_ospeed;
  138. #endif
  139. if (tgetent(buf, term) != 1)
  140. return NA;
  141. sbp = sbuf;
  142. s = tgetstr("pc", &sbp);/* get pad character */
  143. if (s)
  144. PC = *s;
  145. t_lines = tgetnum("li");
  146. t_columns = tgetnum("co");
  147. automargins = tgetflag("am");
  148. outp = clearbuf; /* fill clearbuf with clear screen command */
  149. outlp = &clearbuflen;
  150. clearbuflen = 0;
  151. sbp = sbuf;
  152. s = tgetstr("cl", &sbp);
  153. if (s)
  154. tputs(s, t_lines, outcf);
  155. outp = cleolbuf; /* fill cleolbuf with clear to eol command */
  156. outlp = &cleolbuflen;
  157. cleolbuflen = 0;
  158. sbp = sbuf;
  159. s = tgetstr("ce", &sbp);
  160. if (s)
  161. tputs(s, 1, outcf);
  162. outp = scrollrev;
  163. outlp = &scrollrevlen;
  164. scrollrevlen = 0;
  165. sbp = sbuf;
  166. s = tgetstr("sr", &sbp);
  167. if (s)
  168. tputs(s, 1, outcf);
  169. outp = strtstandout;
  170. outlp = &strtstandoutlen;
  171. strtstandoutlen = 0;
  172. sbp = sbuf;
  173. s = tgetstr("so", &sbp);
  174. if (s)
  175. tputs(s, 1, outcf);
  176. outp = endstandout;
  177. outlp = &endstandoutlen;
  178. endstandoutlen = 0;
  179. sbp = sbuf;
  180. s = tgetstr("se", &sbp);
  181. if (s)
  182. tputs(s, 1, outcf);
  183. sbp = cursorm;
  184. cm = tgetstr("cm", &sbp);
  185. if (cm)
  186. dumb_term = NA;
  187. else
  188. dumb_term = YEA;
  189. sbp = UPbuf;
  190. UP = tgetstr("up", &sbp);
  191. sbp = BCbuf;
  192. BC = tgetstr("bc", &sbp);
  193. if (dumb_term) {
  194. t_lines = 24;
  195. t_columns = 255;
  196. }
  197. return YEA;
  198. }
  199. void
  200. do_move(destcol, destline, outc)
  201. int     destcol, destline;
  202. int     (*outc) ();
  203. {
  204. tputs(tgoto(cm, destcol, destline), 0, outc);
  205. }