home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mitsch75.zip / scheme-7_5_17-src.zip / scheme-7.5.17 / src / microcode / uxutil.c < prev    next >
C/C++ Source or Header  |  2000-01-18  |  5KB  |  233 lines

  1. /* -*-C-*-
  2.  
  3. $Id: uxutil.c,v 1.7 2000/01/18 05:11:28 cph Exp $
  4.  
  5. Copyright (c) 1990, 1991, 1999, 2000 Massachusetts Institute of Technology
  6.  
  7. This program is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2 of the License, or (at
  10. your option) any later version.
  11.  
  12. This program is distributed in the hope that it will be useful, but
  13. WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15. General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with this program; if not, write to the Free Software
  19. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21.  
  22. #include "ux.h"
  23. #include "uxutil.h"
  24. #include <ctype.h>
  25.  
  26. extern void EXFUN (terminal_state_raw, (Ttty_state *, int));
  27.  
  28. static CONST char *
  29. DEFUN (char_description_brief, (c), unsigned char c)
  30. {
  31.   static char buffer [5];
  32.   switch (c)
  33.     {
  34.     case ' ': return ("SPC");
  35.     case '\t': return ("TAB");
  36.     case '\r': return ("RET");
  37.     case '\n': return ("LFD");
  38.     case '\033': return ("ESC");
  39.     case '\177': return ("DEL");
  40.     default:
  41.       if (c < ' ')
  42.     {
  43.       (buffer[0]) = '^';
  44.       (buffer[1]) = (c + '@');
  45.       (buffer[2]) = '\0';
  46.     }
  47.       else if (c < '\177')
  48.     {
  49.       (buffer[0]) = c;
  50.       (buffer[1]) = '\0';
  51.     }
  52.       else
  53.     {
  54.       (buffer[0]) = '\\';
  55.       (buffer[1]) = (c >> 6);
  56.       (buffer[2]) = ((c >> 3) & 7);
  57.       (buffer[3]) = (c & 7);
  58.       (buffer[4]) = '\0';
  59.     }
  60.       return (buffer);
  61.     }
  62. }
  63.  
  64. CONST char *
  65. DEFUN (char_description, (c, long_p), unsigned char c AND int long_p)
  66. {
  67.   static char buffer [64];
  68.   CONST char * description = (char_description_brief (c));
  69.   if (long_p)
  70.     {
  71.       int meta = (c >= 0200);
  72.       int cc = (c & 0177);
  73.       int control = (cc < 0040);
  74.       if (meta || control)
  75.     {
  76.       sprintf (buffer, "`%s' (%s%s%c)",
  77.            description,
  78.            (meta ? "meta-" : ""),
  79.            (control ? "control-" : ""),
  80.            (control ? (cc + 0100) : cc));
  81.       return (buffer);
  82.     }
  83.     }
  84.   sprintf (buffer, "`%s'", description);
  85.   return (buffer);
  86. }
  87.  
  88. static Ttty_state original_tty_state;
  89.  
  90. void
  91. DEFUN_VOID (UX_initialize_userio)
  92. {
  93.   UX_terminal_get_state (STDIN_FILENO, (&original_tty_state));
  94. }
  95.  
  96. static void
  97. DEFUN (restore_input_state, (ap), PTR ap)
  98. {
  99.   UX_terminal_set_state (STDIN_FILENO, ap);
  100. }
  101.  
  102. static Ttty_state *
  103. DEFUN_VOID (save_input_state)
  104. {
  105.   Ttty_state * s = (dstack_alloc (sizeof (Ttty_state)));
  106.   UX_terminal_get_state (STDIN_FILENO, s);
  107.   transaction_record_action (tat_always, restore_input_state, s);
  108.   return (s);
  109. }
  110.  
  111. void
  112. DEFUN_VOID (userio_buffered_input)
  113. {
  114.   save_input_state ();
  115.   UX_terminal_set_state (STDIN_FILENO, (&original_tty_state));
  116. }
  117.  
  118. char
  119. DEFUN_VOID (userio_read_char)
  120. {
  121.   char c;
  122.   while (1)
  123.     {
  124.       int nread;
  125.  
  126.       errno = 0;
  127.       nread = (UX_read (STDIN_FILENO, (&c), 1));
  128.       if (nread == 1)
  129.     break;
  130.       if (errno != EINTR)
  131.     {
  132.       c = '\0';
  133.       break;
  134.     }
  135.     }
  136.   return (c);
  137. }
  138.  
  139. char
  140. DEFUN_VOID (userio_read_char_raw)
  141. {
  142.   transaction_begin ();
  143.   {
  144.     /* Must split declaration and assignment because some compilers
  145.        do not permit aggregate initializers. */
  146.     Ttty_state state;
  147.     state = (* (save_input_state ()));
  148.     terminal_state_raw ((&state), STDIN_FILENO);
  149.     UX_terminal_set_state (STDIN_FILENO, (&state));
  150.   }
  151.   {
  152.     char c = (userio_read_char ());
  153.     transaction_commit ();
  154.     return (c);
  155.   }
  156. }
  157.  
  158. char
  159. DEFUN (userio_choose_option, (herald, prompt, choices),
  160.        CONST char * herald AND
  161.        CONST char * prompt AND
  162.        CONST char ** choices)
  163. {
  164.   while (1)
  165.     {
  166.       fputs (herald, stdout);
  167.       putc ('\n', stdout);
  168.       {
  169.     CONST char ** scan = choices;
  170.     while (1)
  171.       {
  172.         CONST char * choice = (*scan++);
  173.         if (choice == 0)
  174.           break;
  175.         fprintf (stdout, "  %s\n", choice);
  176.       }
  177.       }
  178.       fputs (prompt, stdout);
  179.       fflush (stdout);
  180.       {
  181.     char command = (userio_read_char_raw ());
  182.     if ((command == '\0') && (errno != 0))
  183.       return (command);
  184.     putc ('\n', stdout);
  185.     fflush (stdout);
  186.     if (islower (command))
  187.       command = (toupper (command));
  188.     {
  189.       CONST char ** scan = choices;
  190.       while (1)
  191.         {
  192.           CONST char * choice = (*scan++);
  193.           if (choice == 0)
  194.         break;
  195.           {
  196.         char option = (*choice);
  197.         if (islower (option))
  198.           option = (toupper (option));
  199.         if (command == option)
  200.           return (option);
  201.           }
  202.         }
  203.     }
  204.       }
  205.     }
  206. }
  207.  
  208. int
  209. DEFUN (userio_confirm, (prompt), CONST char * prompt)
  210. {
  211.   while (1)
  212.     {
  213.       fputs (prompt, stdout);
  214.       fflush (stdout);
  215.       switch (userio_read_char_raw ())
  216.     {
  217.     case 'y':
  218.     case 'Y':
  219.       return (1);
  220.     case 'n':
  221.     case 'N':
  222.       return (0);
  223.     case '\0':
  224.       if (errno != 0)
  225.       {
  226.         /* IO problems, assume everything scrod. */
  227.         fprintf (stderr, "Problems reading keyboard input -- exiting.\n");
  228.         termination_eof ();
  229.       }
  230.     }
  231.     }
  232. }
  233.