/* * gettbin.c * * By Ross Ridge * Public Domain * 92/02/01 07:29:59 * * Get a terminfo binary entry * */ #include "defs.h" #include #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; }