home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / TELECOM / stg_v4.lzh / get_line.c < prev    next >
C/C++ Source or Header  |  1994-11-11  |  2KB  |  165 lines

  1. /*
  2.  * get_line(buf,len,echo) - input line with 60 sec timeout
  3.  *
  4.  * 92/10/29 StG - rewrite from scratch (used to be tor() in login)
  5.  * 92/11/11 StG - added word wrap mode and timeout beep
  6.  * 93/01/06 StG - hacked for unix
  7. */
  8.  
  9. #include "stglib.h"
  10.  
  11. /* TODO: add tabs */
  12.  
  13. #define TIME_RES 10
  14. #define TIME_OUT _time_out
  15.  
  16. extern int _time_out; 
  17.  
  18. int wrap_len=0;
  19. char wrap_buf[256];
  20.  
  21. get_line(buf,len,echo)
  22. char *buf;
  23. int len;
  24. char echo;
  25. {
  26.     int wrap;
  27.     int to;
  28.     char *p;
  29.     char *s;
  30.     char c;
  31.  
  32.     if (!len)
  33.         return(ERR);
  34.  
  35.     if (wrap=(len<0))
  36.         len=-len;
  37.  
  38.     to=TIME_OUT*TIME_RES;
  39.     p=buf;
  40.     len--;
  41.  
  42.     if (wrap && wrap_len)
  43.     {
  44.         s=wrap_buf;
  45. /*
  46.         while (wrap_len && *s==' ')
  47.         {
  48.             s++;
  49.             wrap_len--;
  50.         }
  51. */
  52.         while (wrap_len)
  53.         {
  54.             writeln(2,s,1);
  55.             *p++=*s++;
  56.             wrap_len--;
  57.         }
  58.     }
  59.     wrap_len=0;
  60.  
  61.     signal(SIGINT,SIG_IGN);
  62.     signal(SIGQUIT,SIG_IGN);
  63.     _ss_mode(2,3);
  64.  
  65.     while (to--)
  66.     {
  67.          if (_gs_rdy(2)==ERR /* && errno==246 */)
  68.         {
  69.             if (to<TIME_OUT/4 && !(to%TIME_RES))
  70.                 writeln(2,"\7",1);
  71.  
  72.             usleep(1000000/TIME_RES);
  73.             continue;
  74.         }
  75.  
  76. /*        _ss_echo(2,0); */
  77.         if (read(2,p,1)!=1)
  78.         {
  79.             writeln(2,"\7",1);
  80.             continue;
  81.         }
  82. /*        _ss_echo(2,1); */
  83.  
  84.         if (*p=='\n')
  85.         {
  86.             writeln(2,p,1);
  87.             *p=0;
  88.             _ss_mode(2,0);
  89.             signal(SIGINT,SIG_DFL);
  90.             signal(SIGQUIT,SIG_DFL);
  91.             return(p-buf);
  92.         }
  93.  
  94.         if (*p==8)
  95.         {
  96.             if (p-buf)
  97.             {
  98.                 writeln(2,"\b \b",3);
  99.                 --p;
  100.             }
  101.             continue;
  102.         }
  103.  
  104.         if (*p==24)
  105.         {
  106.             while (p-buf)
  107.             {
  108.                 writeln(2,"\b \b",3);
  109.                 --p;
  110.             }
  111.             continue;
  112.         }
  113.  
  114.         if (p-buf==len)
  115.         {
  116.             if (!wrap || !len)
  117.             {
  118.                 writeln(2,"\7",1);
  119.                 continue;
  120.             }
  121.             s=p-1;
  122.             while (s>buf && *s==' ')
  123.                 s--;
  124.             while (s>buf && *s!=' ')
  125.                 s--;
  126.             if (s-buf<len/8)
  127.             {
  128.                 writeln(2,"\7",1);
  129.                 continue;
  130.             }
  131.             wrap_len=p-s;
  132.             strncpy(wrap_buf,s+1,wrap_len);
  133.             while (p-s)
  134.             {
  135.                 writeln(2,"\b \b",3);
  136.                 --p;
  137.             }
  138.             writeln(2,"\n",1);
  139.             *p=0;
  140.             _ss_mode(2,0);
  141.             signal(SIGINT,SIG_DFL);
  142.             signal(SIGQUIT,SIG_DFL);
  143.             return(p-buf);
  144.         }
  145.  
  146.         if (*p<32 || *p>126)
  147.         {
  148.             writeln(2,"\7",1);
  149.             continue;
  150.         }
  151.  
  152.         if (echo)
  153.             writeln(2,&echo,1);
  154.         else
  155.             writeln(2,p,1);
  156.  
  157.         p++;
  158.     }
  159.     writeln(2,"\n",1);
  160.     _ss_mode(2,0);
  161.     signal(SIGINT,SIG_DFL);
  162.     signal(SIGQUIT,SIG_DFL);
  163.     return(ERR);
  164. }
  165.