Module Name: src
Committed By: martin
Date: Mon Nov 19 17:17:43 UTC 2018
Modified Files:
src/usr.sbin/sysinst: defs.h util.c
Log Message:
Split positional argument string expansion from msg display, we can make
good use of it elsewhere too.
To generate a diff of this commit:
cvs rdiff -u -r1.26 -r1.27 src/usr.sbin/sysinst/defs.h
cvs rdiff -u -r1.17 -r1.18 src/usr.sbin/sysinst/util.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.sbin/sysinst/defs.h
diff -u src/usr.sbin/sysinst/defs.h:1.26 src/usr.sbin/sysinst/defs.h:1.27
--- src/usr.sbin/sysinst/defs.h:1.26 Thu Nov 15 10:23:32 2018
+++ src/usr.sbin/sysinst/defs.h Mon Nov 19 17:17:43 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: defs.h,v 1.26 2018/11/15 10:23:32 martin Exp $ */
+/* $NetBSD: defs.h,v 1.27 2018/11/19 17:17:43 martin Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@@ -553,6 +553,7 @@ void do_reinstall_sets(void);
void restore_etc(void);
/* from util.c */
+char* str_arg_subst(const char *, size_t, const char **);
void msg_display_subst(const char *, size_t, ...);
int ask_yesno(const char *);
int ask_noyes(const char *);
Index: src/usr.sbin/sysinst/util.c
diff -u src/usr.sbin/sysinst/util.c:1.17 src/usr.sbin/sysinst/util.c:1.18
--- src/usr.sbin/sysinst/util.c:1.17 Thu Nov 15 10:23:32 2018
+++ src/usr.sbin/sysinst/util.c Mon Nov 19 17:17:43 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: util.c,v 1.17 2018/11/15 10:23:32 martin Exp $ */
+/* $NetBSD: util.c,v 1.18 2018/11/19 17:17:43 martin Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@@ -1795,29 +1795,17 @@ set_postfix(const char *set_name)
}
/*
- * Replace positional arguments (encoded as $0 .. $N) in the
- * message by the strings passed as ...
+ * Replace positional arguments (encoded as $0 .. $N) in the string
+ * passed by the contents of the passed argument array.
+ * Caller must free() the result string.
*/
-void
-msg_display_subst(const char *master, size_t argc, ...)
+char*
+str_arg_subst(const char *src, size_t argc, const char **argv)
{
- va_list ap;
- const char **args, **arg;
- const char *src, *p, *last;
+ const char *p, *last;
char *out, *t;
size_t len;
- args = malloc(sizeof(const char *)*argc);
- if (args == NULL)
- return;
-
- arg = args;
- va_start(ap, argc);
- for (size_t i = 0; i < argc; i++)
- *arg++ = va_arg(ap, const char*);
- va_end(ap);
-
- src = msg_string(master);
len = strlen(src);
for (p = strchr(src, '$'); p; p = strchr(p+1, '$')) {
char *endp = NULL;
@@ -1827,17 +1815,15 @@ msg_display_subst(const char *master, si
/* $ followed by a correct numeric position? */
n = strtou(p+1, &endp, 10, 0, INT_MAX, &e);
if ((e == 0 || e == ENOTSUP) && n < argc) {
- len += strlen(args[n]);
+ len += strlen(argv[n]);
len -= endp-p;
p = endp-1;
}
}
out = malloc(len+1);
- if (out == NULL) {
- free(args);
- return;
- }
+ if (out == NULL)
+ return NULL;
t = out;
for (last = src, p = strchr(src, '$'); p; p = strchr(p+1, '$')) {
@@ -1851,8 +1837,8 @@ msg_display_subst(const char *master, si
size_t l = p-last;
memcpy(t, last, l);
t += l;
- strcpy(t, args[n]);
- t += strlen(args[n]);
+ strcpy(t, argv[n]);
+ t += strlen(argv[n]);
last = endp;
}
}
@@ -1864,9 +1850,35 @@ msg_display_subst(const char *master, si
}
assert((size_t)(t-out) == len);
- msg_display(out);
+ return out;
+}
+
+/*
+ * Replace positional arguments (encoded as $0 .. $N) in the
+ * message by the strings passed as ...
+ */
+void
+msg_display_subst(const char *master, size_t argc, ...)
+{
+ va_list ap;
+ const char **args, **arg;
+ char *out;
+
+ args = malloc(sizeof(const char *)*argc);
+ if (args == NULL)
+ return;
+
+ arg = args;
+ va_start(ap, argc);
+ for (size_t i = 0; i < argc; i++)
+ *arg++ = va_arg(ap, const char*);
+ va_end(ap);
- free(out);
+ out = str_arg_subst(msg_string(master), argc, args);
+ if (out != NULL) {
+ msg_display(out);
+ free(out);
+ }
free(args);
}