home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume3 / lib_term / GetString.c < prev    next >
C/C++ Source or Header  |  1986-11-30  |  2KB  |  132 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. void GetString(string, size, nullOK)
  5. char *string;
  6. int size;
  7. int nullOK;
  8.  
  9. /*
  10.  ---------------------------------------------------------------------------
  11.  
  12.    Last revision - 
  13.     16 November 1984 - GWS
  14.     Ignore XON, XOFF
  15.  
  16.      11 April 1984 - GWS
  17.  
  18.  
  19.    NAME
  20.      GetString - "crash-proof" routine for terminal input of string
  21.  
  22.    SYNOPSIS
  23.     void GetString(string, size, nullOK)
  24.     char *string;
  25.     int size;
  26.     int nullOK;
  27.  
  28.    DESCRIPTION
  29.     This routine prompts and nudges the user through entry of a
  30.     character string.  'Size' is the number of characters in'string'.
  31.     'String' should therefore be dimensioned to size + 1.
  32.     'NullOK' is a boolean that tells us whether a null string is
  33.     acceptable.
  34.  
  35.    SEE ALSO
  36.  
  37.  
  38.    DIAGNOSTICS
  39.     none 
  40.  
  41.    BUGS
  42.     none known
  43.  
  44.    AUTHOR
  45.      George W. Sherouse
  46.      11 April 1984
  47.  
  48.  ---------------------------------------------------------------------------
  49. */
  50.  
  51. {
  52.     int c;
  53.     char erase;
  54.     int loop;
  55.     int cookie;
  56.     int count;
  57.  
  58.     void underline();
  59.     int tgetnum();
  60.     char TermSetUp();
  61.     void TermRewind();
  62.  
  63.     if ((cookie = tgetnum("ug")) < 0)
  64.     cookie = 0;
  65.  
  66.     underline(1);
  67.     for (loop = 0; loop < size; loop++)
  68.     {
  69.     printf(" ");
  70.     string[loop] = (char) 0;
  71.     }
  72.     string[size] = (char) 0;
  73.  
  74.     if (cookie)
  75.     {
  76.     underline(0);
  77.     TermRewind(cookie);
  78.     }
  79.     TermRewind(size);
  80.  
  81.     erase = TermSetUp();    /* set no echo, single char input */
  82.                     /* get erase character */
  83.  
  84.     count = 0;
  85.     while (1)
  86.     {
  87.     switch (c = (getchar() & 0177))
  88.     {
  89.     case '\015':
  90.         if (count || nullOK)
  91.         {
  92.         for (loop = count; loop < size; loop++)
  93.             printf(" ");
  94.         underline(0);
  95.         (void) TermSetUp();
  96.         return;
  97.         }
  98.         else
  99.         {
  100.         printf("%c", '\007');
  101.         break;
  102.         }
  103.     case '\030':
  104.         while (count)
  105.         {
  106.         string[--count] = (char) 0;
  107.         printf("\b \b");
  108.         }
  109.         break;
  110.     case '\021':
  111.     case '\023':
  112.         break;
  113.     default:
  114.         if (count && c == erase)
  115.         {
  116.         printf("\b \b");
  117.         string[--count] = (char) 0;
  118.         break;
  119.         }
  120.  
  121.         if (isprint(c) && count < size)
  122.         {
  123.         printf("%c", c);
  124.         string[count++] = c;
  125.         break;
  126.         }
  127.  
  128.         printf("%c", '\007');
  129.     }
  130.     }
  131. }
  132.