summaryrefslogtreecommitdiffstats
path: root/lib/libmytinfo/addstr.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libmytinfo/addstr.c')
-rw-r--r--lib/libmytinfo/addstr.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/lib/libmytinfo/addstr.c b/lib/libmytinfo/addstr.c
new file mode 100644
index 0000000..d3d7444
--- /dev/null
+++ b/lib/libmytinfo/addstr.c
@@ -0,0 +1,88 @@
+/*
+ * addstr.c
+ *
+ * By Ross Ridge
+ * Public Domain
+ * 92/02/01 07:34:01
+ *
+ */
+
+#include "defs.h"
+#include <term.h>
+
+#include <ctype.h>
+
+#ifdef USE_SCCS_IDS
+static char const SCCSid[] = "@(#) mytinfo addstr.c 3.2 92/02/01 public domain, By Ross Ridge";
+#endif
+/*
+ * I think this routine could be improved, as it is now it searches a
+ * linked list of strbufs for one that has enough room left for the
+ * string. The only thing else I can think of doing would be to
+ * expand a buffer by realloc and then fix the string pointers if it
+ * moves.
+ */
+
+static struct strbuf *strbuf = NULL;
+
+struct strbuf *
+_endstr() {
+ register struct strbuf *p;
+
+ p = strbuf;
+ strbuf = NULL;
+ return p;
+}
+
+char *
+_addstr(s)
+register char *s; {
+ register struct strbuf *p;
+ register int l;
+
+ if (s == NULL) {
+ strbuf = NULL;
+ return NULL;
+ }
+
+ if (strbuf == NULL) {
+ strbuf = (struct strbuf *) malloc(sizeof(struct strbuf));
+ if (strbuf == NULL)
+ return NULL;
+ strbuf->len = 0;
+ strbuf->next = NULL;
+ }
+ l = strlen(s) + 1;
+ if (l > MAX_CHUNK)
+ return NULL;
+ p = strbuf;
+ while (l + p->len > MAX_CHUNK) {
+ if (p->next == NULL) {
+ p->next = (struct strbuf *)
+ malloc(sizeof(struct strbuf));
+ p = p->next;
+ if (p == NULL)
+ return NULL;
+ p->len = 0;
+ p->next = NULL;
+ break;
+ }
+ p = p->next;
+ }
+ s = strcpy(p->buf + p->len, s);
+ p->len += l;
+ return s;
+}
+
+void
+_del_strs(p)
+TERMINAL *p; {
+ struct strbuf *q;
+
+ q = p->strbuf;
+ while(q != NULL) {
+ p->strbuf = q->next;
+ free((anyptr) q);
+ q = p->strbuf;
+ }
+}
OpenPOWER on IntegriCloud