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); }