home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / program / dlibsrc / tttty.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-10-03  |  2.0 KB  |  116 lines

  1. /*
  2.  *    teeny-tiny tty driver
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <osbind.h>
  7. #include <errno.h>
  8.  
  9. #define    EXIT_BREAK    EINVFN        /* ^C exit value */
  10.  
  11. #define    cecho(c)    Bconout(2,(c))    /* echo character to console */
  12.  
  13. _tttty(fp)
  14.     register FILE *fp;
  15.     {
  16.     register int f;
  17.     register unsigned char *bp = fp->_base;
  18.     char c;
  19.     register int n = 0, m = 0;
  20.  
  21.     f = fp->_flag;
  22. #ifdef DEBUG
  23. fprintf(stderr, "[_tttty: entry, mode=%s]\n",
  24.     ((f & _IOBIN)
  25.         ? "binary"
  26.         : ((f & _IONBF)
  27.             ? "unbuffered"
  28.             : "buffered")));
  29. #endif
  30.     for(;;)
  31.         {
  32.         m = read(fp->_file, &c, 1);
  33.         if(m <= 0)        /* file read error or EOF */
  34.             return(n ? n : m);
  35.         if(f & _IOBIN)
  36.             {
  37.             ++n;
  38.             *bp++ = c;
  39.             }
  40.         else if(f & _IONBF)
  41.             {
  42.             ++n;
  43.             if((*bp++ = c) == '\003')    /* ^C (BREAK) */
  44.                 exit(EXIT_BREAK);
  45.             }
  46.         else
  47.             {
  48.             switch(c)
  49.                 {
  50.                 case '\b':    /* BS */
  51.                 case '\177':    /* DEL */
  52.                     if(n > 0)
  53.                         {
  54.                         --n;
  55.                         --bp;
  56.                         if(c == '\177')
  57.                             {
  58.                             cecho('\b');
  59.                             cecho(' ');
  60.                             cecho('\b');
  61.                             cecho('\b');
  62.                             }
  63.                         cecho(' ');
  64.                         cecho('\b');
  65.                         }
  66.                     break;
  67.  
  68.                 case '\004':    /* ^D (acts like ^Z) */
  69.                     c = '\032';
  70.                     /* fall-thru */
  71.  
  72.                 case '\032':    /* EOF */
  73.                     cecho('\r');
  74.                     /* fall-thru */
  75.  
  76.                 case '\r':    /* CR */
  77.                 case '\n':    /* LF */
  78.                     *bp = c;
  79.                     ++n;
  80.                     cecho((c == '\n') ? '\r' : '\n');
  81. #ifdef DEBUG
  82. fprintf(stderr, "[_tttty: eof/cr/nl exit, n=%d]\n", n);
  83. #endif
  84.                     return(n);
  85.  
  86.                 case '\025':    /* ^U */
  87.                 case '\0':    /* ^@ */
  88.                     /* erase all characters in buffer */
  89.                     while(n > 0)
  90.                         {
  91.                         --n;
  92.                         --bp;
  93.                         cecho('\b');
  94.                         cecho(' ');
  95.                         cecho('\b');
  96.                         }
  97.                     break;
  98.  
  99.                 case '\003':    /* ^C (BREAK) */
  100.                     exit(EXIT_BREAK);
  101.  
  102.                 default:
  103.                     ++n;
  104.                     *bp++ = c;
  105.                     break;
  106.                 }
  107.             }
  108.         if(n >= fp->_bsiz)
  109.             break;
  110.         }
  111. #ifdef DEBUG
  112. fprintf(stderr, "[_tttty: buffer full exit, n=%d]\n", n);
  113. #endif
  114.     return(n);
  115.     }
  116.