summaryrefslogtreecommitdiffstats
path: root/lib/libmytinfo/gettbin.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libmytinfo/gettbin.c')
-rw-r--r--lib/libmytinfo/gettbin.c127
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..202f4cb
--- /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;
+}
OpenPOWER on IntegriCloud