summaryrefslogtreecommitdiffstats
path: root/lib/libmytinfo/tgoto.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libmytinfo/tgoto.c')
-rw-r--r--lib/libmytinfo/tgoto.c148
1 files changed, 148 insertions, 0 deletions
diff --git a/lib/libmytinfo/tgoto.c b/lib/libmytinfo/tgoto.c
new file mode 100644
index 0000000..1bc735b
--- /dev/null
+++ b/lib/libmytinfo/tgoto.c
@@ -0,0 +1,148 @@
+/*
+ * 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 <term.h>
+
+#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
OpenPOWER on IntegriCloud