home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 1 / 1630 / qterm.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-12-28  |  3.6 KB  |  200 lines

  1. /* qterm.c -- query the terminal to determine the terminal name.
  2.    This is done by sending an enquiry string
  3.    to the terminal and reading its response.
  4.  
  5.    Author: Craig Bishop
  6.    modified by David MacKenzie
  7.    loosly based on original program by Michael Cooper. */
  8.  
  9. #include <stdio.h>
  10. #include <signal.h>
  11.  
  12. #include "qterm.h"
  13.  
  14. int user_table = FALSE;        /* use user's own .qterm file */
  15. int user_table_only = FALSE;    /* same, but don't add standard table */
  16. int quiet_mode = FALSE;        /* quiet mode */
  17. int print_strings = FALSE;    /* print strings */
  18.  
  19. char querystr[FIELDSIZ];
  20. char recvbuf[FIELDSIZ];
  21. char *program_name;
  22. char *unterm = "dumb";        /* default terminal type */
  23.  
  24. void
  25. usage ()
  26. {
  27.   fprintf (stderr, "Usage: %s [-adefFqs] [-u unknown-term]\n",
  28.        program_name);
  29.   exit (1);
  30. }
  31.  
  32. struct qt *termtab[MAXTERMS];
  33.  
  34. void
  35. main (argc, argv)
  36.      int argc;
  37.      char **argv;
  38. {
  39.   extern int optind;
  40.   extern char *optarg;
  41.   register int i;
  42.   struct qt *qtp;
  43.  
  44.   program_name = argv[0];
  45.  
  46.   while ((i = getopt (argc, argv, "adefFqsu:")) != EOF)
  47.     {
  48.       switch (i)
  49.     {
  50.     case 'a':
  51.       strncpy (querystr, ALTSEND, FIELDSIZ);
  52.       break;
  53.     case 'd':
  54.       strncpy (querystr, DFLTSEND, FIELDSIZ);
  55.       break;
  56.     case 'e':
  57.       strncpy (querystr, ABSEND, FIELDSIZ);
  58.       break;
  59.     case 'f':
  60.       user_table = TRUE;
  61.       break;
  62.     case 'F':
  63.       user_table_only = TRUE;
  64.       break;
  65.     case 'q':
  66.       quiet_mode = TRUE;
  67.       break;
  68.     case 's':
  69.       print_strings = TRUE;
  70.       break;
  71.     case 'u':
  72.       unterm = optarg;
  73.       break;
  74.     default:
  75.       usage ();
  76.     }
  77.     }
  78.   if (optind < argc)
  79.     usage ();
  80.  
  81.   if (!isatty (0))
  82.     {
  83.       fprintf (stderr, "%s: standard input must be a tty\n", program_name);
  84.       exit (1);
  85.     }
  86.  
  87.   if (mktable () == FALSE)
  88.     exit (1);
  89.  
  90.   setterm ();
  91.   signal (SIGHUP, catchint);
  92.   signal (SIGINT, catchint);
  93.   signal (SIGQUIT, catchint);
  94.   setbuf (stdout, NULLSTR);
  95.   setbuf (stderr, NULLSTR);
  96.   qtp = queryterm ();
  97.   fixterm ();
  98.  
  99.   if (qtp != NULLQT)
  100.     prinfo (qtp);
  101.   else
  102.     unknown ();
  103.  
  104.   exit (0);
  105. }
  106.  
  107.  
  108. /* Signal handler; clean up and die. */
  109.  
  110. void
  111. catchint ()
  112. {
  113.   fixterm ();
  114.   exit (1);
  115. }
  116.  
  117. /* Announce which terminal type we think we have. */
  118.  
  119. void
  120. prinfo (ttent)
  121.      register struct qt *ttent;
  122. {
  123.   register int len;
  124.  
  125.   if (print_strings)
  126.     {
  127.       len = strlen (recvbuf);
  128.       fprintf (stderr, "%s: received %d character%s: %s\n",
  129.            program_name, len, len == 1 ? "" : "s",
  130.            decode (recvbuf));
  131.     }
  132.   if (!quiet_mode)
  133.     {
  134.       fprintf (stderr, "Terminal recognized as %s", ttent->termname);
  135.       if (*ttent->fullname)
  136.     fprintf (stderr, " (%s)\n", ttent->fullname);
  137.       else
  138.     fprintf (stderr, "\n");
  139.     }
  140.   puts (ttent->termname);
  141. }
  142.  
  143. /* Announce that we don't know what type of terminal we have. */
  144.  
  145. void
  146. unknown ()
  147. {
  148.   register int len;
  149.  
  150.   if (print_strings)
  151.     {
  152.       len = strlen (recvbuf);
  153.       fprintf (stderr, "%s: received %d character%s",
  154.            program_name, len, len == 1 ? "" : "s");
  155.       if (len)
  156.     fprintf (stderr, ": %s\n", decode (recvbuf));
  157.       else
  158.     fputs ("\n", stderr);
  159.     }
  160.   if (!quiet_mode)
  161.     fprintf (stderr, "Terminal not recognized - defaulting to %s\n", unterm);
  162.  
  163.   puts (unterm);
  164. }
  165.  
  166. /* Return a pointer to a copy of the string STR with unprintable
  167.    characters made printable. */
  168.  
  169. char *
  170. decode (str)
  171.      register char *str;
  172. {
  173.   static char decodebuf[BUFSIZ];
  174.   char tmp[10];
  175.  
  176.   /* Use register variables for speed. */
  177.   register char *dbp = decodebuf;
  178.   register char *tmpp = tmp;
  179.  
  180.   for (*dbp = 0; *str; str++)
  181.     {
  182.       if (*str == 27)
  183.     {
  184.       strcat (dbp, "<ESC> ");
  185.     }
  186.       else if (*str <= 33 || *str == 127)
  187.     {
  188.       sprintf (tmpp, "\\%o ", *str);
  189.       strcat (dbp, tmpp);
  190.     }
  191.       else
  192.     {
  193.       sprintf (tmpp, "%c ", *str);
  194.       strcat (dbp, tmpp);
  195.     }
  196.     }
  197.  
  198.   return dbp;
  199. }
  200.