File termcap-2.0.8-fix-tc.patch of Package termcap
diff -urN termcap-2.0.8-clean/termcap.c termcap-2.0.8/termcap.c
--- termcap-2.0.8-clean/termcap.c Thu Oct 1 01:35:05 1998
+++ termcap-2.0.8/termcap.c Thu Oct 1 01:38:30 1998
@@ -26,6 +26,9 @@
#include <termios.h>
#include <termcap.h>
+/* Maximum terminal type includes (tc=) */
+#define MAX_TERMS 16
+
/* Escape sequences we know about. */
static char *escapes = "E\033r\rn\nb\bt\tf\f\\\\";
@@ -71,6 +74,28 @@
return(x);
}
+/* Add a copy of a string to the end of a list */
+static int add_to_list(char **list, char *s, int max_entries)
+{
+ int i;
+ int done = 0;
+
+ if (! list)
+ return(0);
+
+ for(i = 0; i < max_entries; i++)
+ if (list[i] == NULL) {
+ list[i] = strsave (s);
+ list[i + 1] = NULL;
+ done = 1;
+ break;
+ } else if (strcmp (s, list[i]) == 0) {
+ done = 1;
+ break;
+ }
+ return(done);
+}
+
/*
* Try to shrink a capability.
*/
@@ -120,12 +145,11 @@
}
/* Build a linked list with capabilities. */
-static char *build_list(struct tc_ent **listp, char *buf)
+static void build_list(struct tc_ent **listp, char *buf, char **term_list)
{
struct tc_ent *i, *last = NULL, *list = *listp;
char *s, *sp, *bp;
int len;
- char *tc_next = NULL;
/* Skip name field. */
for(sp = buf; *sp && *sp != ':'; sp++)
@@ -148,8 +172,8 @@
if (*bp == 0 || *bp == ':' || *bp == '.') continue;
/* Is this the "tc" capability? */
- if (!tc_next && strncmp(bp, "tc=", 3) == 0) {
- tc_next = strsave(bp + 3);
+ if (strncmp(bp, "tc=", 3) == 0) {
+ add_to_list(term_list, bp + 3, MAX_TERMS);
continue;
}
@@ -184,7 +208,6 @@
}
/* Done. */
*listp = list;
- return(tc_next);
}
/* Add OR change a capability (hardcoded for li# and co#) */
@@ -337,9 +360,9 @@
char *desc = NULL;
char *tc_file = "/etc/termcap";
struct tc_ent *l = NULL;
- int first = 1;
- int loop = 0;
+ int index;
int tc_set = 0;
+ char *term_list[MAX_TERMS + 1];
*tcp = NULL;
@@ -358,8 +381,7 @@
#endif
/* Just read the TERMCAP variable. */
sp = strsave(tc);
- tc = build_list(&l, sp);
- if (tc) free(tc);
+ build_list(&l, sp, NULL);
*tcp = l;
return(sp);
}
@@ -386,24 +408,21 @@
if (fp == NULL)
return(NULL);
- while(term) {
- if (++loop > 16) {
- write(2, "tgetent: loop detected, check your termcap\n", 43);
- break;
- }
+ desc = term;
+ term_list[0] = term;
+ term_list[1] = NULL;
+ for(index = 0; (index < MAX_TERMS) && term_list[index]; index++) {
#if DEBUG
- printf("LOOKUP: term %s\n", term);
+ printf("LOOKUP: term %s\n", term_list[index]);
#endif
- sp = get_one_entry(fp, term);
+ sp = get_one_entry(fp, term_list[index]);
if (sp == NULL) break;
- term = build_list(&l, sp);
- if (first)
- desc = sp;
- else
- free(sp);
- first = 0;
+ build_list(&l, sp, term_list);
}
fclose(fp);
+
+ for(index = 1; term_list[index] != NULL; index++)
+ free (term_list[index]);
/* Done. */
*tcp = l;