Module Name:    src
Committed By:   roy
Date:           Sun Mar 29 18:54:58 UTC 2020

Modified Files:
        src/lib/libterminfo: compile.c term_private.h

Log Message:
terminfo: allow _ti_getname to convert from and to any version


To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.21 src/lib/libterminfo/compile.c
cvs rdiff -u -r1.16 -r1.17 src/lib/libterminfo/term_private.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libterminfo/compile.c
diff -u src/lib/libterminfo/compile.c:1.20 src/lib/libterminfo/compile.c:1.21
--- src/lib/libterminfo/compile.c:1.20	Sat Mar 28 15:45:56 2020
+++ src/lib/libterminfo/compile.c	Sun Mar 29 18:54:57 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: compile.c,v 1.20 2020/03/28 15:45:56 christos Exp $ */
+/* $NetBSD: compile.c,v 1.21 2020/03/29 18:54:57 roy Exp $ */
 
 /*
  * Copyright (c) 2009, 2010, 2011, 2020 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: compile.c,v 1.20 2020/03/28 15:45:56 christos Exp $");
+__RCSID("$NetBSD: compile.c,v 1.21 2020/03/29 18:54:57 roy Exp $");
 
 #if !HAVE_NBTOOL_CONFIG_H || HAVE_SYS_ENDIAN_H
 #include <sys/endian.h>
@@ -155,18 +155,34 @@ _ti_find_extra(TIC *tic, TBUF *tbuf, con
 char *
 _ti_getname(int rtype, const char *orig)
 {
+	const char *delim;
 	char *name;
+	const char *verstr;
+	size_t diff, vlen;
 
-	if (rtype == TERMINFO_RTYPE) {
-		/* , and | are the two print characters now allowed
-		 * in terminfo aliases or long descriptions.
-		 * As | is generally used to delimit aliases inside the
-		 * description, we use a comma. */
-		if (asprintf(&name, "%s,v3", orig) < 0)
-			name = NULL;
-	} else {
-		name = strdup(orig);
+	switch (rtype) {
+	case TERMINFO_RTYPE:
+		verstr = TERMINFO_VDELIMSTR "v3";
+		break;
+	case TERMINFO_RTYPE_O1:
+		verstr = "";
+		break;
+	default:
+		errno = EINVAL;
+		return NULL;
 	}
+
+	delim = orig;
+	while (*delim != '\0' && *delim != TERMINFO_VDELIM)
+		delim++;
+	diff = delim - orig;
+	vlen = strlen(verstr);
+	name = malloc(diff + vlen + 1);
+	if (name == NULL)
+		return NULL;
+
+	memcpy(name, orig, diff);
+	memcpy(name + diff, verstr, vlen + 1);
 	return name;
 }
 

Index: src/lib/libterminfo/term_private.h
diff -u src/lib/libterminfo/term_private.h:1.16 src/lib/libterminfo/term_private.h:1.17
--- src/lib/libterminfo/term_private.h:1.16	Sun Mar 29 18:32:45 2020
+++ src/lib/libterminfo/term_private.h	Sun Mar 29 18:54:57 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: term_private.h,v 1.16 2020/03/29 18:32:45 roy Exp $ */
+/* $NetBSD: term_private.h,v 1.17 2020/03/29 18:54:57 roy Exp $ */
 
 /*
  * Copyright (c) 2009, 2010, 2013, 2020 The NetBSD Foundation, Inc.
@@ -79,6 +79,13 @@
 #define TERMINFO_ALIAS		2
 #define TERMINFO_RTYPE		3
 
+/* , and | are the two print characters now allowed
+ * in terminfo aliases or long descriptions.
+ * As | is generally used to delimit aliases inside the
+ * description, we use a comma. */
+#define TERMINFO_VDELIM		','
+#define TERMINFO_VDELIMSTR	","
+
 /* We use the same ncurses tic macros so that our data is identical
  * when a caller uses the long name macros to access te terminfo data
  * directly. */

Reply via email to