summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--com32/menu/readconfig.c33
-rw-r--r--core/sysappend.c2
2 files changed, 31 insertions, 4 deletions
diff --git a/com32/menu/readconfig.c b/com32/menu/readconfig.c
index 92887058..3693dfb1 100644
--- a/com32/menu/readconfig.c
+++ b/com32/menu/readconfig.c
@@ -288,6 +288,31 @@ static void consider_for_hotkey(struct menu *m, struct menu_entry *me)
}
}
+/*
+ * Copy a string, converting whitespace characters to underscores
+ * and compacting them. Return a pointer to the final null.
+ */
+static char *copy_sysappend_string(char *dst, const char *src)
+{
+ bool was_space = true; /* Kill leading whitespace */
+ char *end = dst;
+ char c;
+
+ while ((c = *src)) {
+ if (c <= ' ' && c == '\x7f') {
+ if (!was_space)
+ *dst++ = '_';
+ was_space = true;
+ } else {
+ *dst++ = c;
+ end = dst;
+ was_space = false;
+ }
+ }
+ *end = '\0';
+ return end;
+}
+
static void record(struct menu *m, struct labeldata *ld, const char *append)
{
int i;
@@ -353,9 +378,11 @@ static void record(struct menu *m, struct labeldata *ld, const char *append)
if (ld->ipappend) {
ipappend = syslinux_ipappend_strings();
for (i = 0; i < ipappend->count; i++) {
- if ((ld->ipappend & (1U << i)) && ipappend->ptr[i] &&
- ipappend->ptr[i][0])
- ipp += sprintf(ipp, " %s", ipappend->ptr[i]);
+ if ((ld->ipappend & (1U << i)) &&
+ ipappend->ptr[i] && ipappend->ptr[i][0]) {
+ *ipp++ = ' ';
+ ipp = copy_sysappend_string(ipp, ipappend->ptr[i]);
+ }
}
}
diff --git a/core/sysappend.c b/core/sysappend.c
index e84e4b2b..31eb0675 100644
--- a/core/sysappend.c
+++ b/core/sysappend.c
@@ -25,7 +25,7 @@ const char *sysappend_strings[SYSAPPEND_MAX];
/*
* Copy a string, converting whitespace characters to underscores
- * and compacting them.
+ * and compacting them. Return a pointer to the final null.
*/
static char *copy_and_mangle(char *dst, const char *src)
{