ttydriv.c
上传用户:hepax88
上传日期:2007-01-03
资源大小:1101k
文件大小:3k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

  1. /* TTY input line editing
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include <stdio.h>
  5. #include <conio.h>
  6. #include "global.h"
  7. #include "mbuf.h"
  8. #include "session.h"
  9. #include "tty.h"
  10. #include "socket.h"
  11. #define OFF 0
  12. #define ON 1
  13. #define LINESIZE 256
  14. /* Accept characters from the incoming tty buffer and process them
  15.  * (if in cooked mode) or just pass them directly (if in raw mode).
  16.  *
  17.  * Echoing (if enabled) is direct to the raw terminal. This requires
  18.  * recording (if enabled) of locally typed info to be done by the session
  19.  * itself so that edited output instead of raw input is recorded.
  20.  *
  21.  * Returns the number of cooked characters ready to be read from the buffer.
  22.  */
  23. int
  24. ttydriv(sp,c)
  25. struct session *sp;
  26. uint8 c;
  27. {
  28. int rval;
  29. register struct ttystate *ttyp = &sp->ttystate;
  30. if(ttyp->line == NULL){
  31. /* First-time initialization */
  32. ttyp->lp = ttyp->line = calloc(1,LINESIZE);
  33. }
  34. switch(ttyp->edit){
  35. case OFF:
  36. /* Editing is off; add character to buffer
  37.  * and return the number of characters in it (probably 1)
  38.  */
  39. *ttyp->lp++ = c;
  40. if(ttyp->echo)
  41. fputc(c,Current->output);
  42. rval = ttyp->lp - ttyp->line;
  43. ttyp->lp = ttyp->line;
  44. return rval;
  45. case ON:
  46. /* Perform cooked-mode line editing */
  47. switch(c){
  48. case 'r': /* CR and LF both terminate the line */
  49. case 'n':
  50. if(ttyp->crnl)
  51. *ttyp->lp++ = 'n';
  52. else
  53. *ttyp->lp++ = c;
  54. if(ttyp->echo)
  55. putc('n',Current->output);
  56. rval = ttyp->lp - ttyp->line;
  57. ttyp->lp = ttyp->line;
  58. return rval;
  59. case DEL:
  60. case 'b': /* Character delete */
  61. if(ttyp->lp != ttyp->line){
  62. ttyp->lp--;
  63. if(ttyp->echo)
  64. fputs("b b",Current->output);
  65. }
  66. break;
  67. case CTLR: /* print line buffer */
  68. if(ttyp->echo){
  69. fprintf(Current->output,"^Rn");
  70. fwrite(ttyp->line,1,ttyp->lp-ttyp->line,
  71.  Current->output);
  72. }
  73. break;
  74. case CTLU: /* Line kill */
  75. while(ttyp->echo && ttyp->lp-- != ttyp->line){
  76. fputs("b b",Current->output);
  77. }
  78. ttyp->lp = ttyp->line;
  79. break;
  80. default: /* Ordinary character */
  81. *ttyp->lp++ = c;
  82. /* ^Z apparently hangs the terminal emulators under
  83.  * DoubleDos and Desqview. I REALLY HATE having to patch
  84.  * around other people's bugs like this!!!
  85.  */
  86. if(ttyp->echo &&
  87. #ifndef AMIGA
  88.  c != CTLZ &&
  89. #endif
  90.  ttyp->lp - ttyp->line < LINESIZE-1){
  91. putc(c,Current->output);
  92. } else if(ttyp->lp - ttyp->line >= LINESIZE-1){
  93. putc('07',Current->output); /* Beep */
  94. ttyp->lp--;
  95. }
  96. break;
  97. }
  98. break;
  99. }
  100. return 0;
  101. }