home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / internet / tcpipsrc / h / if / Misc / c / ttydriv < prev   
Encoding:
Text File  |  1994-06-24  |  5.5 KB  |  181 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include "global.h"
  4. #include "misc.h"
  5.  
  6. /* TTY input driver */
  7.  
  8. int ttymode;
  9. #define TTY_COOKED      0
  10. #define TTY_RAW         1
  11.  
  12. int ttyecho = 1;
  13. #define TTY_NOECHO      0
  14. #define TTY_ECHO        1
  15.  
  16. #define LINESIZE        256
  17.  
  18. #define ESC     29
  19. #define CTLR    18
  20. #define CTLW    23
  21. #define F3      0x183
  22.  
  23. void raw(void)
  24. {
  25.   ttymode = TTY_RAW;
  26. }
  27.  
  28. void cooked(void)
  29. {
  30.   ttymode = TTY_COOKED;
  31. }
  32.  
  33. void echo(void)
  34. {
  35.   ttyecho = TTY_ECHO;
  36. }
  37.  
  38. void noecho(void)
  39. {
  40.   ttyecho = TTY_NOECHO;
  41. }
  42.  
  43. /* Accept characters from the incoming tty buffer and process them
  44.  * (if in cooked mode) or just pass them directly (if in raw mode).
  45.  * Returns the number of characters available for use; if non-zero,
  46.  * also stashes a pointer to the character(s) in the "buf" argument.
  47.  *
  48.  * Control-R added by df for retype of lines - useful in Telnet
  49.  * Then df got impatient and added Control-W for erasing words
  50.  * Then g1emm got even more impatient and added F-3 line recall.
  51.  */
  52.  
  53. int ttydriv(int c, char **buf)
  54. {
  55.         static char linebuf[LINESIZE];
  56.         static char *cp = linebuf;
  57.         char *rp ;
  58.         static int tty_done_init = 0;
  59.         int cnt;
  60.         int seenprint ;
  61.  
  62.         if(buf == (char **)NULL)
  63.                 return 0;       /* paranoia check */
  64.  
  65.         if(!tty_done_init)
  66.         {
  67.                 for(cp = linebuf; cp < &linebuf[LINESIZE]; *cp++ = '\r');
  68.                 cp = linebuf;
  69.                 tty_done_init = 1;
  70.         }
  71.  
  72.         cnt = 0;
  73.         switch(ttymode)
  74.         {
  75.         case TTY_RAW:
  76.                 if (c < 128)
  77.                 {
  78.                         *cp++ = c;
  79.                         cnt = cp - linebuf;
  80.                         cp = linebuf;
  81.                 }
  82.                 break;
  83.         case TTY_COOKED:
  84.                 /* Perform cooked-mode line editing */
  85.                 switch(c)
  86.                 {
  87.                 case '\r':      /* CR and LF are equivalent */
  88.                 case '\n':
  89.                         *cp++ = '\r';
  90.                         *cp++ = '\n';
  91.                         cwprintf(NULL, "\r\n");
  92.                         cnt = cp - linebuf;
  93.                         cp = linebuf;
  94.                         break;
  95.                 case '\b':              /* Backspace */
  96.                 case 0x7F:              /* Delete */
  97.                         if(cp != linebuf)
  98.                         {
  99.                                 cp--;
  100.                                 if (ttyecho)
  101.                                         cwputs(NULL, "\b \b");
  102.                         }
  103.                         break;
  104.                 case CTLR:      /* print line buffer */
  105.                         if (ttyecho)
  106.                                 cwprintf(NULL, "^R");
  107.                         cwputs(NULL, "\r\n");
  108.                         if (ttyecho)
  109.                         {
  110.                                 rp = linebuf ;
  111.                                 while (rp < cp)
  112.                                         cwputchar(NULL, *rp++);
  113.                         }
  114.                         break ;
  115.                 case F3:      /* Repeat last line */
  116.                         while (*cp != '\n' && *cp != '\r' && cp < &linebuf[LINESIZE])
  117.                         {
  118.                                 if (*cp == 0)
  119.                                         *cp = ' ' ;
  120.                                 if (ttyecho)
  121.                                         cwputchar(NULL, *cp++) ;
  122.                         }
  123.                         if(cp != linebuf && *cp == '\n')
  124.                         {
  125.                                 cp--;
  126.                                 *cp = '\r';
  127.                                 if (ttyecho)
  128.                                         cwputchar(NULL, '\b'); /* to allow for one trailing space */
  129.                         }
  130.                         break ;
  131.                 case ESC:      /* Line kill */
  132.                         if (ttyecho)
  133.                         {
  134.                                 while(cp != linebuf)
  135.                                 {
  136.                                         cp--;
  137.                                         cwputchar(NULL, '\b');
  138.                                 }
  139.                         }
  140.                         else
  141.                                 cp = linebuf;
  142.                         break;
  143.                 case CTLW:      /* erase word */
  144.                         seenprint = 0 ; /* we haven't seen a printable char yet */
  145.                         while (cp != linebuf)
  146.                         {
  147.                                 cp--;
  148.                                 cwputchar(NULL, '\b') ;
  149.                                 if (isspace(*cp))
  150.                                 {
  151.                                         if (seenprint)
  152.                                                 break ;
  153.                                 }
  154.                                 else
  155.                                         seenprint = 1 ;
  156.                         }
  157.                         break ;
  158.                 default:        /* Ordinary character */
  159.                         *cp++ = c;
  160.                         if (ttyecho)
  161.                                 cwputchar(NULL, c);
  162.                         if (cp >= &linebuf[LINESIZE])
  163.                         {
  164.                                 cnt = cp - linebuf;
  165.                                 cp = linebuf;
  166.                         }
  167.                         break;
  168.                 }
  169.         }
  170.         if(cnt != 0)
  171.         {
  172.                 *buf = linebuf;
  173.                 for(rp = &linebuf[cnt]; rp < &linebuf[LINESIZE]; *rp++ = '\r');
  174.         }
  175.         else
  176.                 *buf = NULLCHAR;
  177.  
  178.         return cnt;
  179. }
  180.  
  181.