home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume26 / mytinfo / part01 / gettbin.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-12-26  |  2.5 KB  |  128 lines

  1. /*
  2.  * gettbin.c
  3.  *
  4.  * By Ross Ridge
  5.  * Public Domain
  6.  * 92/02/01 07:29:59
  7.  *
  8.  * Get a terminfo binary entry
  9.  *
  10.  */
  11.  
  12. #include "defs.h"
  13. #include "term.h"
  14.  
  15. #ifdef USE_SCCS_IDS
  16. static const char SCCSid[] = "@(#) mytinfo gettbin.c 3.2 92/02/01 public domain, By Ross Ridge";
  17. #endif
  18.  
  19. extern int _boolorder[], _numorder[], _strorder[];
  20.  
  21. #ifdef TRUE_BYTE_ORDERING 
  22. /* 8 bit char, 16 bit short, lsb first, twos complement */
  23. #define convshort(s) (*(short *)(s))
  24.  
  25. #else
  26.  
  27. #ifdef TWOS_COPLEMENT 
  28. /* 8 bit char, 16 bit short, lsb last, twos complement */
  29. #define convshort(s) ((short)(((s[0] & 0377) << 8) | (s[1] & 0377)))
  30.  
  31. #else
  32.  
  33. /* anything else... */
  34.  
  35. static short
  36. convshort(s)
  37. char *s; {
  38.     register int a,b;
  39.  
  40.     a = (int) s[0] & 0377;
  41.     b = (int) s[1] & 0377;
  42.  
  43.     if (a == 0377 && b == 0377)
  44.         return -1;
  45.     if (a == 0376 && b == 0377)
  46.         return -2;
  47.  
  48.     return a + b * 256;
  49. }
  50. #endif
  51. #endif
  52.  
  53. int
  54. _gettbin(buf, cur)
  55. char *buf;
  56. TERMINAL *cur; {
  57.     register char *s;
  58.     int i;
  59.     int sz_names, sz_bools, sz_nums, sz_offs, sz_strs;
  60.     int n_bools, n_nums, n_strs;
  61.     char *strtbl;
  62.  
  63.     buf[MAX_BUF-1] = '\0';
  64.     s = buf;
  65.  
  66.     if (convshort(s) != 0432)
  67.         return 1;
  68.     sz_names = convshort(s + 2);
  69.     sz_bools = convshort(s + 4);
  70.     n_nums = convshort(s + 6);
  71.     n_strs = convshort(s + 8);
  72.     sz_strs = convshort(s + 10);
  73.  
  74.     n_bools = sz_bools;
  75.     sz_nums = n_nums * 2;
  76.     sz_offs = n_strs * 2;
  77.  
  78.     if ((sz_names + sz_bools) & 1)
  79.         sz_bools++;
  80.  
  81.     if (12 + sz_names + sz_bools + sz_nums + sz_offs + sz_strs >= MAX_BUF)
  82.         return 1;
  83.  
  84.     s += 12;
  85.     if ((cur->name_all = _addstr(s)) == NULL)
  86.         return 1;
  87.     s += sz_names;
  88.     while(--s >= buf + 12) {
  89.         if (*s == '|') {
  90.             if ((cur->name_long = _addstr(s + 1)) == NULL)
  91.                 return 1;
  92.             break;
  93.         }
  94.     }
  95.  
  96.     s = buf + 12 + sz_names;
  97.     for(i = 0; i < n_bools && _boolorder[i] != -1; i++, s++) {
  98.         if (cur->bools[_boolorder[i]] == -1 && *s == 1)
  99.             cur->bools[_boolorder[i]] = 1;
  100.     }
  101.  
  102.     s = buf + 12 + sz_names + sz_bools;
  103.     for(i = 0; i < n_nums && _numorder[i] != -1; i++, s += 2) {
  104.         if (convshort(s) == -2) 
  105.             cur->nums[_numorder[i]] = -1;
  106.         else if (cur->nums[_numorder[i]] == -2 && convshort(s) != -1)
  107.             cur->nums[_numorder[i]] = convshort(s);
  108.     }
  109.  
  110.     s = buf + 12 + sz_names + sz_bools + sz_nums;
  111.     strtbl = s + sz_offs;
  112.     for(i = 0; i < n_strs && _strorder[i] != -1; i++, s += 2) {
  113.         if (convshort(s) == -2)
  114.             cur->strs[_strorder[i]] = NULL;
  115.         else if (cur->strs[_strorder[i]] == (char *) -1
  116.              && convshort(s) != -1) {
  117. #ifdef DEBUG
  118.             printf("$%s ", strnames[_strorder[i]]);
  119. #endif
  120.             if ((cur->strs[_strorder[i]]
  121.                  = _addstr(strtbl + convshort(s))) == NULL)
  122.                 return 1;
  123.         } 
  124.     }
  125.  
  126.     return 0;
  127. }
  128.