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

  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include <curses.h>
  4. #include <strings.h>
  5.  
  6. #define HISTLEN 20
  7. #define LINELEN 500
  8. #define PRLINELEN 1000
  9.  
  10. outc(ch)
  11. char ch;
  12. {
  13.  putc(ch,stderr);
  14. }
  15.  
  16. sigpipe()
  17. {
  18.  close(0); /* guaranteeing that the next character we read will be an EOF */
  19. }
  20.  
  21. main(argc,argv)
  22. int argc;
  23. char *argv[];
  24. {
  25.  char bp[1024];
  26.  char ts[256];
  27.  char fs[256];
  28.  char ce[256];
  29.  char us[256];
  30.  char ue[256];
  31.  char *cptr;
  32.  char errbuf[BUFSIZ];
  33.  char history[HISTLEN][LINELEN];
  34.  char prhistory[HISTLEN][PRLINELEN];
  35.  char ahistory[HISTLEN][LINELEN];
  36.  char aprhistory[HISTLEN][PRLINELEN];
  37.  int histpos = 0;
  38.  int minhistpos = 0;
  39.  int temphistpos;
  40.  char *line;
  41.  char *linepr;
  42.  char *aline;
  43.  char *alinepr;
  44.  int ch;
  45.  char *chpr;
  46.  int x;
  47.  int xpr;
  48.  int y;
  49.  int ypr;
  50.  int flagcharmode = 0;
  51.  int co;
  52.  int i;
  53.  
  54.  signal(SIGPIPE,sigpipe);
  55.  setbuf(stderr,errbuf);
  56.  
  57.  tgetent(bp,getenv("TERM"));
  58.  cptr = ts;
  59.  if (!tgetstr("ts",&cptr))
  60.    ; /*XXX*/
  61.  cptr = fs;
  62.  if (!tgetstr("fs",&cptr))
  63.    ; /*XXX*/
  64.  cptr = ce;
  65.  if (!tgetstr("ce",&cptr))
  66.    ; /*XXX*/
  67.  cptr = us;
  68.  if (!tgetstr("us",&cptr))
  69.    ; /*XXX*/
  70.  cptr = ue;
  71.  if (!tgetstr("ue",&cptr))
  72.    ; /*XXX*/
  73.  co = tgetnum("co");
  74. #define TS tputs(ts,1,outc)
  75. #define CE tputs(ce,1,outc)
  76. #define FS tputs(fs,1,outc)
  77. #define US tputs(us,1,outc)
  78. #define UE tputs(ue,1,outc)
  79.  
  80.  for (;;)
  81.    if (flagcharmode)
  82.     {
  83.      if ((ch = getchar()) == EOF)
  84.        break;
  85.      if (ch == 0001)
  86.        flagcharmode = 0;
  87.      else
  88.       {
  89.        putchar(ch);
  90.        fflush(stdout);
  91.       }
  92.     }
  93.    else
  94.     {
  95.      line = history[histpos];
  96.      aline = ahistory[histpos];
  97.      linepr = prhistory[histpos];
  98.      alinepr = aprhistory[histpos];
  99.      temphistpos = histpos;
  100.      TS; CE; US; putc(' ',stderr); UE; FS; fflush(stderr);
  101.      x = xpr = 0;
  102.      line[x] = linepr[xpr] = '\0';
  103.      y = ypr = 0;
  104.      aline[y] = alinepr[ypr] = '\0';
  105.      while ((ch = getchar()) != '\n')
  106.       {
  107.        if ((temphistpos != histpos) && (ch != 2) && (ch != 6))
  108.     {
  109.      strcpy(history[histpos],line); line = history[histpos];
  110.      strcpy(ahistory[histpos],aline); aline = ahistory[histpos];
  111.      strcpy(prhistory[histpos],linepr); linepr = prhistory[histpos];
  112.      strcpy(aprhistory[histpos],alinepr); alinepr = aprhistory[histpos];
  113.      temphistpos = histpos;
  114.     }
  115.        if (ch == 4)
  116.      break;
  117.        if (ch == EOF)
  118.      break;
  119.        if (ch == '\r')
  120.     {
  121.      ch = '\n';
  122.      break;
  123.     }
  124.        if (ch == 1)
  125.     {
  126.      flagcharmode = 1;
  127.      break;
  128.     }
  129.        switch(ch)
  130.         {
  131.      case 6: if (temphistpos != histpos)
  132.           {
  133.            temphistpos++;
  134.            if (temphistpos == HISTLEN)
  135.              temphistpos = 0;
  136.           }
  137.                  line = history[temphistpos];
  138.                  aline = ahistory[temphistpos];
  139.                  linepr = prhistory[temphistpos];
  140.                  alinepr = aprhistory[temphistpos];
  141.          x = strlen(line);
  142.          y = strlen(aline);
  143.          xpr = strlen(linepr);
  144.          ypr = strlen(alinepr);
  145.          break;
  146.      case 2: if (temphistpos != minhistpos)
  147.           {
  148.            if (temphistpos == 0)
  149.              temphistpos = HISTLEN;
  150.            temphistpos--;
  151.           }
  152.                  line = history[temphistpos];
  153.                  aline = ahistory[temphistpos];
  154.                  linepr = prhistory[temphistpos];
  155.                  alinepr = aprhistory[temphistpos];
  156.          x = strlen(line);
  157.          y = strlen(aline);
  158.          xpr = strlen(linepr);
  159.          ypr = strlen(alinepr);
  160.          break;
  161.      case 21: x = xpr = 0;
  162.                   line[x] = linepr[xpr] = '\0';
  163.           break;
  164.      case 23: while (x && (line[x - 1] == ' '))
  165.            {
  166.             x--;
  167.             xpr--;
  168.            }
  169.               while (x && (line[x - 1] != ' '))
  170.            {
  171.             x--;
  172.             chpr = unctrl(line[x]);
  173.             while (*(chpr++))
  174.               xpr--;
  175.            }
  176.             linepr[xpr] = '\0';
  177.             line[x] = '\0';
  178.             break;
  179.          case '\b': if (!x)
  180.               break;
  181.             x--;
  182.             aline[y] = line[x];
  183.             y++;
  184.             chpr = unctrl(line[x]);
  185.             while (*(chpr++))
  186.              {
  187.               xpr--;
  188.               alinepr[ypr] = linepr[xpr];
  189.               ypr++;
  190.              }
  191.             linepr[xpr] = '\0';
  192.             line[x] = '\0';
  193.             alinepr[ypr] = '\0';
  194.             aline[y] = '\0';
  195.             break;
  196.      case 12: if (!y)
  197.             break;
  198.           y--;
  199.           line[x] = aline[y];
  200.           x++;
  201.           chpr = unctrl(aline[y]);
  202.           while (*(chpr++))
  203.            {
  204.             ypr--;
  205.             linepr[xpr] = alinepr[ypr];
  206.             xpr++;
  207.            }
  208.           linepr[xpr] = '\0';
  209.           line[x] = '\0';
  210.           alinepr[ypr] = '\0';
  211.           aline[y] = '\0';
  212.           break;
  213.          case 127: if (!x)
  214.              break;
  215.            x--;
  216.              chpr = unctrl(line[x]);
  217.              while (*(chpr++))
  218.                xpr--;
  219.              linepr[xpr] = '\0';
  220.              line[x] = '\0';
  221.              break;
  222.      case 22: ch = getchar();
  223.      case 0: ; /*XXX*/
  224.          default: if ((x == LINELEN - 1) || (xpr == PRLINELEN - 1))
  225.            {
  226.             putchar(7);
  227.             break;
  228.            }
  229.           line[x++] = ch;
  230.             line[x] = '\0';
  231.             chpr = unctrl(ch);
  232.             while(*chpr)
  233.               linepr[xpr++] = *(chpr++);
  234.             linepr[xpr] = '\0';
  235.         }
  236.        TS;
  237.        if (ypr)
  238.     {
  239.      if (xpr > co - 7)
  240.       {
  241.        fputs("<- ",stderr); fputs(linepr + xpr - co + 10,stderr);
  242.        US; putc(aline[ypr - 1],stderr); UE;
  243.        if (ypr != 1)
  244.         {
  245.          putc(' ',stderr); putc('-',stderr); putc('>',stderr);
  246.         }
  247.           }
  248.      else
  249.       {
  250.        fputs(linepr,stderr);
  251.        US; putc(aline[ypr - 1],stderr); UE;
  252.            for (i = ypr - 2;(i >= 0) && (i >= xpr + ypr - co + 6);i--)
  253.          putc(aline[i],stderr);
  254.        if (i != -1)
  255.         {
  256.          putc(' ',stderr); putc('-',stderr); putc('>',stderr);
  257.         }
  258.       }
  259.     }
  260.        else
  261.     {
  262.          if (xpr > co - 6)
  263.       { fputs("<- ",stderr); fputs(linepr + xpr - co + 9,stderr); }
  264.          else
  265.       { fputs(linepr,stderr); } 
  266.      US; putc(' ',stderr); UE;
  267.     }
  268.        CE; FS; fflush(stderr);
  269.       }
  270.      if ((ch == EOF) || (ch == 4))
  271.       {
  272.        for (i = 0;i < x;i++)
  273.      putchar(line[i]);
  274.        for (i = y - 1;i >= 0;i--)
  275.      putchar(aline[i]);
  276.        putchar(4);
  277.        fflush(stdout);
  278.        if (ch == EOF)
  279.      break;
  280.        /* On a normal ^D, we won't die until after our output does. */
  281.       }
  282.      else if (ch == 1)
  283.       {
  284.        for (i = 0;i < x;i++)
  285.      putchar(line[i]);
  286.        for (i = y - 1;i >= 0;i--)
  287.      putchar(aline[i]);
  288.        fflush(stdout);
  289.        TS; CE; FS; fflush(stderr);
  290.       }
  291.      else
  292.       {
  293.        for (i = 0;i < x;i++)
  294.      putchar(line[i]);
  295.        for (i = y - 1;i >= 0;i--)
  296.      putchar(aline[i]);
  297.        putchar('\n');
  298.        fflush(stdout);
  299.       }
  300.      histpos++;
  301.      if (histpos == HISTLEN)
  302.        histpos = 0;
  303.      if (histpos == minhistpos)
  304.       {
  305.        minhistpos++;
  306.        if (minhistpos == HISTLEN)
  307.      minhistpos = 0;
  308.       }
  309.     }
  310.  TS; CE; FS; fflush(stderr);
  311.  exit(0);
  312. }
  313.