From e58fe232ef1630414daa21da3ddc3464f90c4e17 Mon Sep 17 00:00:00 2001 From: Chris Larson Date: Fri, 5 Nov 2010 10:45:06 -0400 Subject: termcap: add 2.0.8 with gentoo patchset No one should really be using this, but what the heck. Signed-off-by: Chris Larson --- .../termcap-2.0.8/006_all_termcap-fix-tc.patch | 131 +++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 recipes/termcap/termcap-2.0.8/006_all_termcap-fix-tc.patch (limited to 'recipes/termcap/termcap-2.0.8/006_all_termcap-fix-tc.patch') diff --git a/recipes/termcap/termcap-2.0.8/006_all_termcap-fix-tc.patch b/recipes/termcap/termcap-2.0.8/006_all_termcap-fix-tc.patch new file mode 100644 index 0000000000..ce61286d3a --- /dev/null +++ b/recipes/termcap/termcap-2.0.8/006_all_termcap-fix-tc.patch @@ -0,0 +1,131 @@ +--- termcap-2.0.8-clean/termcap.c ++++ termcap-2.0.8/termcap.c +@@ -26,6 +26,9 @@ + #include + #include + ++/* 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; -- cgit 1.2.3-korg