home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Distributions / ucb / spencer_2bsd.tar.gz / 2bsd.tar / src / Mail / tty.c < prev    next >
C/C++ Source or Header  |  1980-02-17  |  2KB  |  127 lines

  1. /* Copyright (c) 1979 Regents of the University of California */
  2. #
  3.  
  4. /*
  5.  * Mail -- a mail program
  6.  *
  7.  * Generally useful tty stuff.
  8.  */
  9.  
  10. #include "rcv.h"
  11. #include <sgtty.h>
  12.  
  13. static    int    c_erase;        /* Current erase char */
  14. static    int    c_kill;            /* Current kill char */
  15.  
  16. /*
  17.  * Read all relevant header fields.
  18.  */
  19.  
  20. grabh(hp, gflags)
  21.     struct header *hp;
  22. {
  23.     struct sgttyb ttybuf;
  24.     register int s;
  25.     int (*savesigs[2])(), errs, set;
  26.  
  27.     errs = 0;
  28.     set = 0;
  29.     if (gtty(fileno(stdin), &ttybuf) < 0) {
  30.         perror("gtty");
  31.         return(-1);
  32.     }
  33.     c_erase = ttybuf.sg_erase;
  34.     c_kill = ttybuf.sg_kill;
  35.     ttybuf.sg_erase = 0;
  36.     ttybuf.sg_kill = 0;
  37.     for (s = SIGINT; s <= SIGQUIT; s++)
  38.         if ((savesigs[s-SIGINT] = signal(s, SIG_IGN)) == SIG_DFL)
  39.             signal(s, SIG_DFL);
  40.     if (gflags & GTO) {
  41.         if (!set && hp->h_to != NOSTR)
  42.             set++, stty(fileno(stdin), &ttybuf);
  43.         hp->h_to = readtty("To: ", hp->h_to);
  44.         if (hp->h_to != NOSTR)
  45.             hp->h_seq++;
  46.     }
  47.     if (gflags & GSUBJ) {
  48.         if (!set && hp->h_subj != NOSTR)
  49.             set++, stty(fileno(stdin), &ttybuf);
  50.         hp->h_subj = readtty("Subj: ", hp->h_subj);
  51.         if (hp->h_subj != NOSTR)
  52.             hp->h_seq++;
  53.     }
  54.     if (gflags & GCC) {
  55.         if (!set && hp->h_cc != NOSTR)
  56.             set++, stty(fileno(stdin), &ttybuf);
  57.         hp->h_cc = readtty("Cc: ", hp->h_cc);
  58.         if (hp->h_cc != NOSTR)
  59.             hp->h_seq++;
  60.     }
  61.     ttybuf.sg_erase = c_erase;
  62.     ttybuf.sg_kill = c_kill;
  63.     if (set)
  64.         stty(fileno(stdin), &ttybuf);
  65.  
  66. out:
  67.     for (s = SIGINT; s <= SIGQUIT; s++)
  68.         signal(s, savesigs[s-SIGINT]);
  69.     return(errs);
  70. }
  71.  
  72. /*
  73.  * Read up a header from standard input.
  74.  * The source string has the preliminary contents to
  75.  * be read.
  76.  *
  77.  */
  78.  
  79. char *
  80. readtty(pr, src)
  81.     char pr[], src[];
  82. {
  83.     char canonb[BUFSIZ];
  84.     register int c;
  85.     register char *cp, *cp2;
  86.  
  87.     fputs(pr, stdout);
  88.     if (src != NOSTR)
  89.         cp = copy(src, canonb);
  90.     else
  91.         cp = copy("", canonb);
  92.     fputs(canonb, stdout);
  93.     fflush(stdout);
  94.     if ((cp2 = gets(cp)) == NOSTR || *cp2 == '\0')
  95.         return(src);
  96.     cp = canonb;
  97.     cp2 = cp;
  98.     while (*cp != '\0') {
  99.         c = *cp++;
  100.         if (c == c_erase) {
  101.             if (cp2 == canonb)
  102.                 continue;
  103.             if (cp2[-1] == '\\') {
  104.                 cp2[-1] = c;
  105.                 continue;
  106.             }
  107.             cp2--;
  108.             continue;
  109.         }
  110.         if (c == c_kill) {
  111.             if (cp2 == canonb)
  112.                 continue;
  113.             if (cp2[-1] == '\\') {
  114.                 cp2[-1] = c;
  115.                 continue;
  116.             }
  117.             cp2 = canonb;
  118.             continue;
  119.         }
  120.         *cp2++ = c;
  121.     }
  122.     *cp2 = '\0';
  123.     if (equal("", canonb))
  124.         return(NOSTR);
  125.     return(savestr(canonb));
  126. }
  127.