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

  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. int GetInt(Default, field_width)
  5. int Default, field_width;
  6.  
  7. /*
  8.  ---------------------------------------------------------------------------
  9.  
  10.    Last revision - 
  11.     16 November 1984 - GWS
  12.     Ignore XON, XOFF
  13.  
  14.      11 April 1984 - GWS
  15.  
  16.  
  17.    NAME
  18.      GetInt - "crash-proof" integer from keyboard routine
  19.  
  20.    SYNOPSIS
  21.     int GetInt(Default, field_width)
  22.     int Default, field_width;
  23.  
  24.    DESCRIPTION
  25.     On a good day this routine will get an integer value from the
  26.     keyboard and return it safely.  The terminal is placed in raw
  27.     mode and most non-digit values are beeped at and discarded.  Entry
  28.     is terminated by filling the field or by CR.  CR as first character
  29.     assumes Default.  ^X restarts.
  30.  
  31.    SEE ALSO
  32.     TermSetUp, TermRewind 
  33.  
  34.    DIAGNOSTICS
  35.     none - cannot fail :-) 
  36.  
  37.    BUGS
  38.     Doesn't check for silly things like Default too big to fit in
  39.     field_width, etc.  Let's be particularly careful out there.
  40.  
  41.    AUTHOR
  42.      George W. Sherouse
  43.      6 April 1984
  44.  
  45.  ---------------------------------------------------------------------------
  46. */
  47.  
  48. {
  49.     int c, val;
  50.     int loop;
  51.     char line_buff[20];
  52.     char Format[80];
  53.     char erase, pad;
  54.     int count;
  55.     int cookie;
  56.  
  57.     void underline();
  58.     void clean_up();
  59.     int tgetnum();
  60.     char TermSetUp();
  61.     void TermRewind();
  62.  
  63.     pad = ' ';
  64.     if ((cookie = tgetnum("ug")) < 0)
  65.         cookie = 0;
  66.  
  67.     underline(1);
  68.  
  69.     for (loop = 0; loop < field_width; loop++)
  70.         printf(" ");
  71.     if (cookie)
  72.     {
  73.         underline(0);
  74.         TermRewind(cookie);
  75.     }
  76.     TermRewind(field_width);
  77.  
  78.     sprintf(Format, "%%%dd", field_width);
  79.     printf(Format, Default);
  80.     TermRewind(field_width);
  81.     for (loop = 0; loop <= field_width; loop++)
  82.         line_buff[loop] = 0;
  83.  
  84.     erase = TermSetUp();    /* set no echo, single char input */
  85.                 /* get erase character */
  86.     count = 0;
  87.     while (1)
  88.     {
  89.         switch (c = (getchar() & 0177))
  90.         {
  91.         case '\015':
  92.         if (count && line_buff[count - 1] != '-')
  93.         {
  94.             sscanf(line_buff, "%d", &val);
  95.             clean_up(count, field_width, Format, val);
  96.             return(val);
  97.         }
  98.         else
  99.         {
  100.             clean_up(count, field_width, Format, Default);
  101.             return(Default);
  102.         }
  103.         break;
  104.         case 030:
  105.         TermRewind(count);
  106.         for (loop = 0; loop < field_width; loop++)
  107.             line_buff[loop] = 0;
  108.         count = 0;
  109.         printf(Format, Default);
  110.         TermRewind(field_width);
  111.         break;
  112.         case '\021':
  113.         case '\023':
  114.         break;
  115.         default:
  116.         if (c == erase && count)
  117.         {
  118.             printf("\b%c\b", pad);
  119.             line_buff[--count] = 0;
  120.             break;
  121.         }
  122.  
  123.         if (!count && c == '-')
  124.         {
  125.             for (loop = 0; loop < field_width; loop++)
  126.             printf("%c", pad);
  127.             TermRewind(field_width);
  128.             for (loop = 0; loop < field_width; loop++)
  129.                 line_buff[loop] = 0;
  130.  
  131.             line_buff[count++] = (char) c;
  132.             printf("-");
  133.             break;
  134.         }
  135.  
  136.         if (isdigit(c) && count < field_width)
  137.         {
  138.             if (!count)
  139.             {
  140.             for (loop = 0; loop < field_width; loop++)
  141.                 printf("%c", pad);
  142.             TermRewind(field_width);
  143.             for (loop = 0; loop < field_width; loop++)
  144.                 line_buff[loop] = 0;
  145.             }
  146.             printf("%c", c);
  147.             line_buff[count++] = (char) c;
  148.         }
  149.         else
  150.             printf("%c", '\007');
  151.         }
  152.     }
  153. }
  154.  
  155. void clean_up(count, field_width, Format, val)
  156. int count, field_width;
  157. char *Format;
  158. int val;
  159.  
  160. {
  161.     int loop;
  162.     void underline();
  163.     char TermSetUp();
  164.     void TermRewind();
  165.  
  166.     TermRewind(count);
  167.     printf(Format, val);
  168.  
  169.     underline(0);
  170.     (void) TermSetUp();
  171. }
  172.