diff options
Diffstat (limited to 'lib/libmytinfo/gettbin.c')
-rw-r--r-- | lib/libmytinfo/gettbin.c | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/lib/libmytinfo/gettbin.c b/lib/libmytinfo/gettbin.c new file mode 100644 index 0000000..678a7d8 --- /dev/null +++ b/lib/libmytinfo/gettbin.c @@ -0,0 +1,127 @@ +/* + * gettbin.c + * + * By Ross Ridge + * Public Domain + * 92/02/01 07:29:59 + * + * Get a terminfo binary entry + * + */ + +#include "defs.h" +#include <term.h> + +#ifdef USE_SCCS_IDS +static const char SCCSid[] = "@(#) mytinfo gettbin.c 3.2 92/02/01 public domain, By Ross Ridge"; +#endif + +extern int _boolorder[], _numorder[], _strorder[]; + +#ifdef TRUE_BYTE_ORDERING +/* 8 bit char, 16 bit short, lsb first, twos complement */ +#define convshort(s) (*(short *)(s)) + +#else + +#ifdef TWOS_COPLEMENT +/* 8 bit char, 16 bit short, lsb last, twos complement */ +#define convshort(s) ((short)(((s[0] & 0377) << 8) | (s[1] & 0377))) + +#else + +/* anything else... */ + +static short +convshort(s) +char *s; { + register int a,b; + + a = (int) s[0] & 0377; + b = (int) s[1] & 0377; + + if (a == 0377 && b == 0377) + return -1; + if (a == 0376 && b == 0377) + return -2; + + return a + b * 256; +} +#endif +#endif + +int +_gettbin(buf, cur) +char *buf; +TERMINAL *cur; { + register char *s; + int i; + int sz_names, sz_bools, sz_nums, sz_offs, sz_strs; + int n_bools, n_nums, n_strs; + char *strtbl; + + buf[MAX_BUF-1] = '\0'; + s = buf; + + if (convshort(s) != 0432) + return 1; + sz_names = convshort(s + 2); + sz_bools = convshort(s + 4); + n_nums = convshort(s + 6); + n_strs = convshort(s + 8); + sz_strs = convshort(s + 10); + + n_bools = sz_bools; + sz_nums = n_nums * 2; + sz_offs = n_strs * 2; + + if ((sz_names + sz_bools) & 1) + sz_bools++; + + if (12 + sz_names + sz_bools + sz_nums + sz_offs + sz_strs >= MAX_BUF) + return 1; + + s += 12; + if ((cur->name_all = _addstr(s)) == NULL) + return 1; + s += sz_names; + while(--s >= buf + 12) { + if (*s == '|') { + if ((cur->name_long = _addstr(s + 1)) == NULL) + return 1; + break; + } + } + + s = buf + 12 + sz_names; + for(i = 0; i < n_bools && _boolorder[i] != -1; i++, s++) { + if (cur->bools[_boolorder[i]] == -1 && *s == 1) + cur->bools[_boolorder[i]] = 1; + } + + s = buf + 12 + sz_names + sz_bools; + for(i = 0; i < n_nums && _numorder[i] != -1; i++, s += 2) { + if (convshort(s) == -2) + cur->nums[_numorder[i]] = -1; + else if (cur->nums[_numorder[i]] == -2 && convshort(s) != -1) + cur->nums[_numorder[i]] = convshort(s); + } + + s = buf + 12 + sz_names + sz_bools + sz_nums; + strtbl = s + sz_offs; + for(i = 0; i < n_strs && _strorder[i] != -1; i++, s += 2) { + if (convshort(s) == -2) + cur->strs[_strorder[i]] = NULL; + else if (cur->strs[_strorder[i]] == (char *) -1 + && convshort(s) != -1) { +#ifdef DEBUG + printf("$%s ", strnames[_strorder[i]]); +#endif + if ((cur->strs[_strorder[i]] + = _addstr(strtbl + convshort(s))) == NULL) + return 1; + } + } + + return 0; +} |