diff options
Diffstat (limited to 'lib/libmytinfo/tcapconv.c')
-rw-r--r-- | lib/libmytinfo/tcapconv.c | 194 |
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); + } + } +} |