summaryrefslogtreecommitdiffstats
path: root/lib/libmytinfo/tcapconv.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libmytinfo/tcapconv.c')
-rw-r--r--lib/libmytinfo/tcapconv.c194
1 files changed, 194 insertions, 0 deletions
diff --git a/lib/libmytinfo/tcapconv.c b/lib/libmytinfo/tcapconv.c
new file mode 100644
index 0000000..6a28b11
--- /dev/null
+++ b/lib/libmytinfo/tcapconv.c
@@ -0,0 +1,194 @@
+/*
+ * tcapconv.c
+ *
+ * By Ross Ridge
+ * Public Domain
+ * 92/02/01 07:30:20
+ *
+ */
+
+#include "defs.h"
+#define SINGLE
+#include <term.h>
+
+#ifdef USE_SCCS_IDS
+static const char SCCSid[] = "@(#) mytinfo tcapconv.c 3.2 92/02/01 public domain, By Ross Ridge";
+#endif
+
+extern char **_sstrcodes[], **_sstrnames[];
+
+static char *C_CR = "\r";
+static char *C_LF = "\n";
+static char *C_BS = "\b";
+/* static char *C_FF = "\f"; */
+static char *C_HT = "\t";
+/* static char *C_VT = "\013"; */
+/* static char *C_NL = "\r\n"; */
+
+#define DEF(s) ((s) != (char *) -1 && (s) != NULL)
+#define NOTSET(s) ((s) == (char *) -1)
+
+/*
+ * This routine fills in caps that either had defaults under termcap or
+ * can be manufactured from obsolete termcap capabilities.
+ */
+
+void
+_tcapdefault() {
+ char buf[MAX_LINE * 2 + 2];
+ int set_scroll_forward_to_lf;
+
+ if (NOTSET(carriage_return)) {
+ if (carriage_return_delay > 0) {
+ sprintf(buf, "%s$<%d>", C_CR, carriage_return_delay);
+ carriage_return = _addstr(buf);
+ } else
+ carriage_return = _addstr(C_CR);
+ }
+ if (NOTSET(cursor_left)) {
+ if (backspace_delay > 0) {
+ sprintf(buf, "%s$<%d>", C_BS, backspace_delay);
+ cursor_left = _addstr(buf);
+ } else if (backspaces_with_bs == 1)
+ cursor_left = _addstr(C_BS);
+ else if (DEF(backspace_if_not_bs))
+ cursor_left = _addstr(backspace_if_not_bs);
+ }
+/* vi doesn't use "do", but it does seems to use nl (or '\n') instead */
+ if (NOTSET(cursor_down)) {
+ if (DEF(linefeed_if_not_lf))
+ cursor_down = _addstr(linefeed_if_not_lf);
+ else if (linefeed_is_newline != 1) {
+ if (new_line_delay > 0) {
+ sprintf(buf, "%s$<%d>", C_LF, new_line_delay);
+ cursor_down = _addstr(buf);
+ } else
+ cursor_down = _addstr(C_LF);
+ }
+ }
+ set_scroll_forward_to_lf = 0;
+ if (NOTSET(scroll_forward) && crt_without_scrolling != 1) {
+ set_scroll_forward_to_lf = 1;
+ if (DEF(linefeed_if_not_lf))
+ scroll_forward = _addstr(linefeed_if_not_lf);
+ else if (linefeed_is_newline != 1) {
+ if (new_line_delay > 0) {
+ sprintf(buf, "%s$<%d>", C_LF, new_line_delay);
+ scroll_forward = _addstr(buf);
+ } else
+ scroll_forward = _addstr(C_LF);
+ }
+ }
+ if (NOTSET(newline)) {
+ if (linefeed_is_newline == 1) {
+ if (new_line_delay > 0) {
+ sprintf(buf, "%s$<%d>", C_LF, new_line_delay);
+ newline = _addstr(buf);
+ } else
+ newline = _addstr(C_LF);
+ } else if (DEF(carriage_return) && carriage_return_delay <= 0) {
+ if (set_scroll_forward_to_lf) {
+ strncpy(buf, carriage_return, MAX_LINE-2);
+ buf[MAX_LINE-1] = '\0';
+ strncat(buf, scroll_forward, MAX_LINE-strlen(buf)-1);
+ } else if (DEF(linefeed_if_not_lf)) {
+ strncpy(buf, carriage_return, MAX_LINE-2);
+ buf[MAX_LINE-1] = '\0';
+ strncat(buf, linefeed_if_not_lf, MAX_LINE-strlen(buf)-1);
+ }
+ else if (new_line_delay > 0)
+ sprintf(buf, "%s%s$<%d>", carriage_return, C_LF, new_line_delay);
+ else {
+ strncpy(buf, carriage_return, MAX_LINE-2);
+ buf[MAX_LINE-1] = '\0';
+ strncat(buf, C_LF, MAX_LINE-strlen(buf)-1);
+ }
+ buf[MAX_LINE-1] = '\0';
+ newline = _addstr(buf);
+ }
+ }
+
+/*
+ * We wait until know to decide if we've got a working cr because even
+ * one that doesn't work can be used for newline. Unfortunately the
+ * space allocated for it is wasted.
+ */
+ if (return_does_clr_eol == 1 || no_correctly_working_cr == 1)
+ carriage_return = NULL;
+
+/*
+ * supposedly most termcap entries have ta now and '\t' is no longer a
+ * default, but it doesn't seem to be true...
+ */
+ if (NOTSET(tab)) {
+ if (horizontal_tab_delay > 0) {
+ sprintf(buf, "%s$<%d>", C_HT, horizontal_tab_delay);
+ tab = _addstr(buf);
+ } else
+ tab = _addstr(C_HT);
+ }
+#if 0
+/* probably not needed and might confuse some programmes */
+ if (NOTSET(form_feed)) {
+ if (form_feed_delay > 0) {
+ sprintf(buf, "%s$<%d>", C_FF, form_feed_delay);
+ form_feed = _addstr(buf);
+ } else
+ form_feed = _addstr(C_FF);
+ }
+#endif
+ if (init_tabs == -1 && has_hardware_tabs == 1)
+ init_tabs = 8;
+
+ if (NOTSET(key_backspace))
+ key_backspace = _addstr(C_BS);
+ if (NOTSET(key_left))
+ key_left = _addstr(C_BS);
+ if (NOTSET(key_down))
+ key_down = _addstr(C_LF);
+}
+
+void
+_tcapconv() {
+ char buf[MAX_LINE+1];
+
+ if (GNU_tab_width > 0 && init_tabs == -1)
+ init_tabs = GNU_tab_width;
+
+ if (GNU_has_meta_key == 1 && has_meta_key == -1)
+ has_meta_key = 1;
+
+/*
+ * this is some what a kludge, but should work unless someone breaks
+ * conventions.
+ */
+ if (DEF(other_non_function_keys)) {
+ register char *s;
+ static char *o;
+ static char name[MAX_NAME] = "k";
+ char *str;
+ int ind;
+
+ s = strcpy(buf, other_non_function_keys);
+ while(*s != '\0') {
+ o = s;
+ while(*s != ',' && *s != '\0')
+ s++;
+ if (*s != '\0')
+ *s++ = '\0';
+ ind = _findstrcode(o);
+ if (ind == -1)
+ continue;
+ str = _term_buf.strs[ind];
+ if (!DEF(str))
+ continue;
+ strncpy(name + 1, strnames[ind], MAX_NAME - 2);
+ ind = _findstrname(name);
+ if (ind == -1)
+ continue;
+ if (!NOTSET(_term_buf.strs[ind]))
+ continue;
+ _term_buf.strs[ind] = _addstr(str);
+ }
+ }
+}
OpenPOWER on IntegriCloud