/* * tgoto.c * * By Ross Ridge * Public Domain * 92/02/01 07:30:33 * * A few kludged attempts to worry outputing ^D's and NL's... * My advice is to get a decent terminal. * */ #include "defs.h" #include #ifdef USE_SCCS_IDS static const char SCCSid[] = "@(#) mytinfo tgoto.c 3.2 92/02/01 public domain, By Ross Ridge"; #endif #ifdef USE_LITOUT_KLUDGE /* * This kludge works by telling tputs to switch the tty driver to * "literal output" when printing the string so we don't have worry * about newlines and EOTs. The problem is that ioctls used to * switch modes might flush buffers and cause other problems. */ char * tgoto(str, x, y) char *str; int x,y; { register char *sp; static char buf[MAX_LINE] = {'\\', '@'}; sp = str = tparm(str, y, x); while (*sp != '\0') { if (*sp == '\004' || *sp == '\n') { strncpy(buf + 2, str, MAX_LINE - 2); buf[MAX_LINE - 2] = '\0'; return buf; } sp++; } return sp; } #else #ifdef USE_UPBC_KLUDGE #ifdef USE_EXTERN_UPBC extern char *BC, *UP; #else #define BC cursor_left #define UP cursor_right #endif #ifdef __GNUC__ __inline__ #endif static int checkit(s) register char *s; { while(*s != '\0') { if (*s == '\004' || *s == '\n') return 1; s++; } return 0; } /* * Major kludge, basically we just change the parmeters until we get * a string that doesn't contain a newline or EOT. */ char * tgoto(str, x, y) char *str; int x,y; { static char buf[MAX_LINE]; register char *orig, *s; int l; orig = tparm(str, y, x); if (!checkit(orig)) return orig; s = tparm(str, y + 1, x); if (!checkit(s)) { if (BC == NULL) return s; l = strlen(s); strncpy(buf, s, MAX_LINE - 1); if (l < MAX_LINE - 1) strncpy(buf + l, BC, MAX_LINE - 1 - l); return s; } s = tparm(str, y, x + 1); if (!checkit(s)) { if (UP == NULL) return s; l = strlen(s); strncpy(buf, s, MAX_LINE - 1); if (l < MAX_LINE - 1) strncpy(buf + l, UP, MAX_LINE - 1 - l); return s; } s = tparm(str, y + 1, x + 1); if (!checkit(s)) { if (UP == NULL || BC == NULL) return s; l = strlen(s); strncpy(buf, s, MAX_LINE - 1); if (l < MAX_LINE - 1) strncpy(buf + l, UP, MAX_LINE - 1 - l); l += strlen(UP); if (l < MAX_LINE - 1) strncpy(buf + l, BC, MAX_LINE - 1 - l); return s; } return orig; } #else /* the simple tgoto, don't worry about any of this newline/EOT crap */ char * tgoto(str, x, y) char *str; int x,y; { return tparm(str, y, x); } #endif #endif