home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 4 / DATAFILE_PDCD4.iso / unix / unixlib36d / src / c / termcap < prev   
Text File  |  1994-03-08  |  16KB  |  979 lines

  1. #ifdef __STDC__
  2. static char sccs_id[] = "@(#) termcap.c 5.6 " __DATE__ " HJR";
  3. #else
  4. static char sccs_id[] = "@(#) termcap.c 5.6 25/2/92 HJR";
  5. #endif
  6.  
  7. /* termcap.c (c) Copyright 1989/1990/1991/1992 H.Rogers */
  8.  
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <ctype.h>
  12.  
  13. #ifdef __STDC__            /* implies ANSI C compilation */
  14. #include <stdlib.h>
  15. #else
  16. char *getenv ();
  17. char *malloc ();
  18. extern long strtol ();
  19. #define const
  20. #endif
  21.  
  22. #include "termcap.h"
  23.  
  24. #ifdef ARCH
  25. #define T_BUILTIN        /* builtin termcap */
  26.  
  27. static char *t_bname = "acorn0";
  28. static unsigned char *t_btenv = (unsigned char *)
  29. "av|acorn0|Acorn VDU Driver Mode 0:"
  30. ":li#32:co#80:am:cl=^L:bs:cm=^_%r%.%.:up=^K:ho=^^:bl=^G:bw:"
  31. ":ce=^W^H^E^F\\200\\200\\200\\200\\200\\200:"
  32. ":so=^W^Q^E\\200\\200\\200\\200\\200\\200\\200:"
  33. ":se=^W^Q^E\\200\\200\\200\\200\\200\\200\\200:"
  34. ":sb=^W^G^A^B\\200\\200\\200\\200\\200\\200:"
  35. ":sf=^W^G^A^C\\200\\200\\200\\200\\200\\200:"
  36. ":is=^C^F^D^O^V\\200:";
  37. #endif
  38.  
  39. #define T_IOCTL            /* use TIOCGWINSIZ to get LI,CO */
  40.  
  41. #ifdef T_IOCTL
  42. #include "termio.h"
  43.  
  44. #ifdef __STDC__
  45. extern int ioctl (int, int, void *);
  46. #else
  47. extern int ioctl ();
  48. #endif
  49. #endif
  50.  
  51. /* #define T_TEST */
  52. /* test main() */
  53.  
  54. /* #define T_DEBUG */
  55. /* debugging output to t_debug */
  56.  
  57. #define T_FILE "/etc/termcap"    /* the database file */
  58.  
  59. #ifdef __STDC__
  60. static int t_tgetnam (unsigned char **, unsigned char **);
  61. static int t_tgetln (FILE *, unsigned char *);
  62. static int t_tentcp (unsigned char *);
  63. static unsigned char *t_tgetid (char *);
  64. static unsigned char t_tcoord (int, unsigned int *);
  65. #else
  66. static int t_tgetnam ();    /* extracts the next name from entry */
  67. static int t_tgetln ();        /* reads line from termcap file */
  68. static int t_tentcp ();        /* copies the termcap entry into bp */
  69. static unsigned char *t_tgetid ();    /* returns a pointer to a capability */
  70. static unsigned char t_tcoord ();    /* converts a coord to an output val */
  71. #endif /* __STDC__ */
  72.  
  73. #define MAXTC 64        /* max. tc indirections */
  74.  
  75. static char __PC, *__BC, *__UP;
  76.  
  77. static char *t_tbp;
  78. static unsigned char *t_tbpstart;
  79. static int t_recurs, t_tbpspace;
  80. static unsigned char *t_tenv;
  81.  
  82. #ifdef T_DEBUG
  83. static FILE *t_debug;
  84. #endif
  85.  
  86. /* tgetent() */
  87.  
  88. int
  89. tgetent (bp, name)
  90.      char *bp, *name;
  91. {
  92.   unsigned char *tenv, *tent, *tentbuf, tc;
  93.   unsigned char *tp1, *tp2;
  94.   char *fnam;
  95.   FILE *tfile = 0;
  96.   int nbyt, rval;
  97.  
  98. #ifdef T_DEBUG
  99.   if (!t_recurs)
  100.     {
  101.       if (!(t_debug = fopen ("t_debug", "w")))
  102.     return (-1);
  103.       setvbuf (t_debug, (char *) 0, _IONBF, BUFSIZ);
  104.     }
  105. #endif
  106.  
  107.   if (!(t_tbp = bp))
  108.     return (-1);
  109.  
  110.   if (!name)
  111. #ifdef T_BUILTIN
  112. #ifdef T_DEBUG
  113.     fputs ("tgetent(\"(null)\")\n", t_debug);
  114. #endif
  115.   name = t_bname;
  116. #else
  117.     return (-1);
  118. #endif
  119.  
  120.   fnam = T_FILE;
  121.  
  122.   if (!t_recurs)
  123.     t_tbpspace = 1024;
  124.  
  125.   if (!t_recurs)
  126.     {
  127.       char *t = getenv ("TERM");
  128.  
  129.       if (!t)
  130.     t = "";
  131.       if (!strcmp (name, t))
  132.     t_tenv = (unsigned char *) getenv ("TERMCAP");
  133.       else
  134.     t_tenv = 0;
  135.     }
  136.  
  137.   if (tenv = t_tenv)
  138.     {
  139.       if (!t_recurs && *tenv != '/')
  140.     {
  141. #ifdef T_BUILTIN
  142.     builtin:
  143. #endif
  144.  
  145.       while (isspace (*tenv))
  146.         tenv++;
  147.       tp1 = tp2 = tenv;
  148.  
  149. #ifdef T_DEBUG
  150.       fprintf (t_debug, "tgetent(\"%s\") < $TERMCAP\n", name);
  151. #endif
  152.  
  153.       while (t_tgetnam (&tp1, &tp2))
  154.         {
  155.           tc = *tp2;
  156.           *tp2 = 0;
  157.  
  158. #ifdef T_DEBUG
  159.           fprintf (t_debug, "t_tgetnam(): %s\n", (char *) tp1);
  160. #endif
  161.  
  162.           if (!strcmp ((char *) tp1, name))
  163.         {
  164.           *tp2 = tc;
  165.  
  166. #ifdef T_DEBUG
  167.           fputs ("t_tgetnam() - MATCH -\n", t_debug);
  168. #endif
  169.  
  170.           if (strlen ((char *) tenv) > t_tbpspace)
  171.             return (-1);
  172.           return (t_tentcp (tenv) ? -1 : 1);
  173.         }
  174.           else
  175.         *tp2 = tc;
  176.         }
  177.     }
  178.       else if (*tenv == '/')
  179.     {
  180.  
  181. #ifdef T_DEBUG
  182.       fprintf (t_debug, "tgetent(\"%s\") < %s\n", name, (char *) tenv);
  183. #endif
  184.  
  185.       fnam = (char *) tenv;
  186.     }
  187.     }
  188.  
  189. #ifdef T_DEBUG
  190.   if (fnam != (char *) t_tenv)
  191.     fprintf (t_debug, "tgetent(\"%s\") < /etc/termcap\n", name);
  192. #endif
  193.  
  194.   if (!(tfile = fopen (fnam, "r")))
  195. #ifdef T_BUILTIN
  196.     {
  197.       if (fnam != (char *) t_tenv && !strcmp (name, t_bname))
  198.     {
  199.       tenv = t_btenv;
  200.       goto builtin;
  201.     }
  202.       else
  203.     return (-1);
  204.     }
  205. #else
  206.     return (-1);
  207. #endif
  208.  
  209.   tent = tentbuf = (unsigned char *) malloc (1024);
  210.  
  211.   while (nbyt = t_tgetln (tfile, tent))
  212.     {
  213.       if (*tent != '#')
  214.     {
  215.       while (isspace (*tent))
  216.         tent++;
  217.       tp1 = tp2 = tent;
  218.       while (t_tgetnam (&tp1, &tp2))
  219.         {
  220.           tc = *tp2;
  221.           *tp2 = 0;
  222.  
  223. #ifdef T_DEBUG
  224.           fprintf (t_debug, "t_tgetnam(): %s\n", (char *) tp1);
  225. #endif
  226.  
  227.           if (!strcmp ((char *) tp1, name))
  228.         {
  229.           *tp2 = tc;
  230.  
  231. #ifdef T_DEBUG
  232.           fprintf (t_debug, "t_tgetnam() - MATCH -\n");
  233.           fprintf (t_debug, "t_tgetnam(): [%d (%d)] %s\n", nbyt, t_tbpspace, tent);
  234. #endif
  235.  
  236.           if (nbyt > t_tbpspace || nbyt < 0)
  237.             {
  238.               free ((char *) tentbuf);
  239.               return (-1);
  240.             }
  241.           if (tfile)
  242.             {
  243.               fclose (tfile);
  244.               tfile = 0;
  245.             }
  246.           rval = t_tentcp (tent);
  247.           free ((char *) tentbuf);
  248.           return (rval ? -1 : 1);
  249.         }
  250.           else
  251.         *tp2 = tc;
  252.         }
  253.     }
  254.     }
  255.  
  256.   if (tfile)
  257.     {
  258.       fclose (tfile);
  259.       tfile = 0;
  260.     }
  261.  
  262.   free ((char *) tentbuf);
  263.  
  264.   return (0);
  265. }
  266.  
  267. /* t_tgetnam() */
  268.  
  269. static int
  270. t_tgetnam (t1, t2)
  271.      unsigned char **t1, **t2;
  272. {
  273.   register unsigned char *tp1 = *t1, *tp2 = *t2;
  274.  
  275.   while ((*tp2 == '|') || isspace (*tp2))
  276.     tp2++;
  277.   if (*tp2 == ':')
  278.     return (0);
  279.   tp1 = tp2;
  280.   while ((*tp2 != '|') && (*tp2 != ':'))
  281.     tp2++;
  282.  
  283.   *t1 = tp1;
  284.   *t2 = tp2;
  285.   return (-1);
  286. }
  287.  
  288. /* t_tentcp() */
  289.  
  290. static int
  291. t_tentcp (s)
  292.      unsigned char *s;
  293. {
  294.   register unsigned char *s1, *s2, *sp;
  295.   char *t_tbp_;
  296.   char *tcnam, *tcn;
  297.  
  298. #ifdef T_DEBUG
  299.   fputs ("t_tentcp()\n", t_debug);
  300. #endif
  301.  
  302.   tcnam = (char *) malloc (256);
  303.  
  304.   s1 = (unsigned char *) t_tbp;
  305.   s2 = s;
  306.  
  307.   while (*s2)
  308.     {
  309.       if (*s2 == ':')        /* strips out empty capabilities :: */
  310.     {
  311.       sp = s2 + 1;
  312.       while (isspace (*sp))
  313.         sp++;
  314.       if (*sp == ':')
  315.         s2 = sp;
  316.     }
  317.       *s1++ = *s2++;
  318.     }
  319.  
  320.   *s1 = 0;
  321.  
  322.   if (!t_recurs)
  323.     {
  324.       sp = (unsigned char *) t_tbp;
  325.       while (*sp++ != ':');
  326.       t_tbpstart = sp;
  327.     }
  328.  
  329.   if (sp = t_tgetid ("tc"))
  330.     {
  331.  
  332. #ifdef T_DEBUG
  333.       fprintf (t_debug, "tgetent()# %d\n", t_recurs);
  334. #endif
  335.  
  336.       if (++t_recurs > (MAXTC - 1))
  337.     {
  338.       free (tcnam);
  339.       return (-1);
  340.     }
  341.       t_tbp_ = t_tbp;
  342.  
  343.       tcn = tcnam;
  344.       s1 = sp = sp - 2;
  345.       t_tbpspace -= (int) (s1 - (unsigned char *) t_tbp);
  346.       if (tgetent ((char *) s1, tgetstr ("tc", &tcn)) < 1)
  347.     {
  348.       free (tcnam);
  349.       return (-1);
  350.     }
  351.  
  352.       while (*sp++ != ':');
  353.       while (*s1++ = *sp++);
  354.  
  355.       t_tbp = t_tbp_;
  356.       t_recurs--;
  357.     }
  358.  
  359. #ifdef T_DEBUG
  360.   fprintf (t_debug, "tgetent(): %s\n", t_tbp);
  361. #endif
  362.  
  363.   if (!t_recurs)
  364.     {
  365.       __PC = 0;
  366.       __BC = "\b";
  367.       __UP = "\v";
  368.     }
  369.  
  370.   free (tcnam);
  371.  
  372.   return (0);
  373. }
  374.  
  375. /* t_tgetln() */
  376.  
  377. static int
  378. t_tgetln (tfile, buf)
  379.      FILE *tfile;
  380.      register unsigned char *buf;
  381. {
  382.   register unsigned char *bufp;
  383.   register int nbyt;
  384.  
  385.   bufp = buf;
  386.   nbyt = 0;
  387.  
  388.   while (-1)
  389.     {
  390.       if (!fgets ((char *) bufp, t_tbpspace - nbyt, tfile))
  391.     return (nbyt);
  392.       while (*bufp++);
  393.       bufp--;
  394.       if (*--bufp != '\n')
  395.     ++bufp;
  396.       nbyt += (bufp - buf);
  397.       if (!nbyt)
  398.     continue;
  399.       if (*--bufp != '\\')
  400.     {
  401.       *++bufp = 0;
  402.       return (nbyt);
  403.     }
  404.       buf = bufp;
  405.       nbyt--;
  406.     }
  407. }
  408.  
  409. /* t_tgetid() */
  410.  
  411. static unsigned char *
  412. t_tgetid (id)
  413.      register char *id;
  414. {
  415.   register unsigned char *bptr;
  416.   int found;
  417.  
  418.   if ((!id) || (!t_tbpstart))
  419.     return (0);
  420.  
  421.   bptr = t_tbpstart;
  422.   while (*bptr)
  423.     {
  424.       found = (((unsigned char) *id++ == *bptr++) ? \
  425.            ((unsigned char) *id == *bptr) : 0);
  426.       bptr++;
  427.       id--;
  428.       if (found)
  429.     {
  430.       if (*bptr == '@')
  431.         return (0);
  432.       else
  433.         return (bptr);
  434.     }
  435.       while ((*bptr != ':') && (*bptr != 0))
  436.     bptr++;
  437.       if (*bptr == ':')
  438.     bptr++;
  439.     }
  440.   return (0);
  441. }
  442.  
  443. /* tgetnum() */
  444.  
  445. int
  446. tgetnum (id)
  447.      char *id;
  448. {
  449.   register unsigned char *eptr;
  450.   int rval;
  451.  
  452. #ifdef TIOCGWINSZ
  453.   if (rval = (!strncmp (id, "li", 2) ? 1 : (!strncmp (id, "co", 2) ? -1 : 0)))
  454.     {
  455.       struct winsize w[1];
  456.  
  457.       ioctl (2, TIOCGWINSZ, w);
  458.       return ((rval > 0) ? w->ws_row : w->ws_col);
  459.     }
  460. #endif
  461.  
  462.   if (!(eptr = t_tgetid (id)))
  463.     return (-1);
  464.  
  465.   if (*e