home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 2 / 2017 / pmlined.c next >
Encoding:
C/C++ Source or Header  |  1990-12-28  |  2.8 KB  |  158 lines

  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include <curses.h>
  4.  
  5. #define LINELEN 1000
  6. #define PRLINELEN 2000
  7.  
  8. outc(ch)
  9. char ch;
  10. {
  11.  putc(ch,stderr);
  12. }
  13.  
  14. sigpipe()
  15. {
  16.  close(0); /* guaranteeing that the next character we read will be an EOF */
  17. }
  18.  
  19. main(argc,argv)
  20. int argc;
  21. char *argv[];
  22. {
  23.  char bp[1024];
  24.  char ts[256];
  25.  char fs[256];
  26.  char ce[256];
  27.  char *cptr;
  28.  char errbuf[BUFSIZ];
  29.  char line[LINELEN];
  30.  char linepr[PRLINELEN];
  31.  int ch;
  32.  char *chpr;
  33.  int x;
  34.  int xpr;
  35.  int flagcharmode = 0;
  36.  int co;
  37.  
  38.  signal(SIGPIPE,sigpipe);
  39.  setbuf(stderr,errbuf);
  40.  
  41.  tgetent(bp,getenv("TERM"));
  42.  cptr = ts;
  43.  if (!tgetstr("ts",&cptr))
  44.    ; /*XXX*/
  45.  cptr = fs;
  46.  if (!tgetstr("fs",&cptr))
  47.    ; /*XXX*/
  48.  cptr = ce;
  49.  if (!tgetstr("ce",&cptr))
  50.    ; /*XXX*/
  51.  co = tgetnum("co");
  52. #define TS tputs(ts,1,outc)
  53. #define CE tputs(ce,1,outc)
  54. #define FS tputs(fs,1,outc)
  55.  
  56.  for (;;)
  57.    if (flagcharmode)
  58.     {
  59.      if ((ch = getchar()) == EOF)
  60.        break;
  61.      if (ch == 0001)
  62.        flagcharmode = 0;
  63.      else
  64.       {
  65.        putchar(ch);
  66.        fflush(stdout);
  67.       }
  68.     }
  69.    else
  70.     {
  71.      TS; CE; putc('_',stderr); FS; fflush(stderr);
  72.      x = xpr = 0;
  73.      line[x] = linepr[xpr] = '\0';
  74.      while ((ch = getchar()) != '\n')
  75.       {
  76.        if (ch == 4)
  77.      break;
  78.        if (ch == EOF)
  79.      break;
  80.        if (ch == '\r')
  81.     {
  82.      ch = '\n';
  83.      break;
  84.     }
  85.        if (ch == 1)
  86.     {
  87.      flagcharmode = 1;
  88.      break;
  89.     }
  90.        switch(ch)
  91.         {
  92.      case 21: x = xpr = 0;
  93.                   line[x] = linepr[xpr] = '\0';
  94.           break;
  95.      case 23: while (x && (line[x - 1] == ' '))
  96.            {
  97.             x--;
  98.             xpr--;
  99.            }
  100.               while (x && (line[x - 1] != ' '))
  101.            {
  102.             x--;
  103.             chpr = unctrl(line[x]);
  104.             while (*(chpr++))
  105.               xpr--;
  106.            }
  107.             linepr[xpr] = '\0';
  108.             line[x] = '\0';
  109.             break;
  110.          case '\b':
  111.          case 127: if (!x)
  112.              break;
  113.            x--;
  114.              chpr = unctrl(line[x]);
  115.              while (*(chpr++))
  116.                xpr--;
  117.              linepr[xpr] = '\0';
  118.              line[x] = '\0';
  119.              break;
  120.      case 22: ch = getchar();
  121.          default: if ((x == LINELEN - 1) || (xpr == PRLINELEN - 1))
  122.            {
  123.             putchar(7);
  124.             break;
  125.            }
  126.           line[x++] = ch;
  127.             line[x] = '\0';
  128.             chpr = unctrl(ch);
  129.             while(*chpr)
  130.               linepr[xpr++] = *(chpr++);
  131.             linepr[xpr] = '\0';
  132.         }
  133.        TS; if (x > co-4) { fputs("<- ",stderr); fputs(linepr + x-co+7,stderr); }
  134.        else fputs(linepr,stderr); putc('_',stderr); CE; FS; fflush(stderr);
  135.       }
  136.      if ((ch == EOF) || (ch == 4))
  137.       {
  138.        fputs(line,stdout);
  139.        putchar(4);
  140.        fflush(stdout);
  141.        if (ch == EOF)
  142.      break;
  143.        /* On a normal ^D, we won't die until after our output does. */
  144.       }
  145.      else if (ch == 1)
  146.       {
  147.        fputs(line,stdout); fflush(stdout);
  148.        TS; CE; FS; fflush(stderr);
  149.       }
  150.      else
  151.       {
  152.        puts(line); fflush(stdout);
  153.       }
  154.     }
  155.  TS; CE; FS; fflush(stderr);
  156.  exit(0);
  157. }
  158.