Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.sbin/sysinst Add a new helper function to show messages ...



details:   https://anonhg.NetBSD.org/src/rev/cf75df28809d
branches:  trunk
changeset: 445864:cf75df28809d
user:      martin <martin%NetBSD.org@localhost>
date:      Thu Nov 15 10:23:32 2018 +0000

description:
Add a new helper function to show messages with positional parameters

diffstat:

 usr.sbin/sysinst/defs.h |   3 +-
 usr.sbin/sysinst/util.c |  80 ++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 81 insertions(+), 2 deletions(-)

diffs (115 lines):

diff -r 530cb416eae2 -r cf75df28809d usr.sbin/sysinst/defs.h
--- a/usr.sbin/sysinst/defs.h   Thu Nov 15 10:06:06 2018 +0000
+++ b/usr.sbin/sysinst/defs.h   Thu Nov 15 10:23:32 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: defs.h,v 1.25 2018/11/14 02:30:00 martin Exp $ */
+/*     $NetBSD: defs.h,v 1.26 2018/11/15 10:23:32 martin Exp $ */
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -553,6 +553,7 @@
 void   restore_etc(void);
 
 /* from util.c */
+void   msg_display_subst(const char *, size_t, ...);
 int    ask_yesno(const char *);
 int    ask_noyes(const char *);
 int    dir_exists_p(const char *);
diff -r 530cb416eae2 -r cf75df28809d usr.sbin/sysinst/util.c
--- a/usr.sbin/sysinst/util.c   Thu Nov 15 10:06:06 2018 +0000
+++ b/usr.sbin/sysinst/util.c   Thu Nov 15 10:23:32 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: util.c,v 1.16 2018/11/11 10:06:09 martin Exp $ */
+/*     $NetBSD: util.c,v 1.17 2018/11/15 10:23:32 martin Exp $ */
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -34,6 +34,8 @@
 
 /* util.c -- routines that don't really fit anywhere else... */
 
+#include <assert.h>
+#include <inttypes.h>
 #include <stdio.h>
 #include <stdarg.h>
 #include <string.h>
@@ -1792,3 +1794,79 @@
        return use_tgz_for_set(set_name) ? dist_tgz_postfix : dist_postfix;
 }
 
+/*
+ * 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;
+       const char *src, *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;
+               size_t n;
+               int e;
+
+               /* $ 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 -= endp-p;
+                       p = endp-1;
+               }
+       }
+
+       out = malloc(len+1);
+       if (out == NULL) {
+               free(args);
+               return;
+       }
+
+       t = out;
+       for (last = src, p = strchr(src, '$'); p; p = strchr(p+1, '$')) {
+               char *endp = NULL;
+               size_t n;
+               int e;
+
+               /* $ followed by a correct numeric position? */
+               n = strtou(p+1, &endp, 10, 0, INT_MAX, &e);
+               if ((e == 0 || e == ENOTSUP) && n < argc) {
+                       size_t l = p-last;
+                       memcpy(t, last, l);
+                       t += l;
+                       strcpy(t, args[n]);
+                       t += strlen(args[n]);
+                       last = endp;
+               }
+       }
+       if (*last) {
+               strcpy(t, last);
+               t += strlen(last);
+       } else {
+               *t = 0;
+       }
+       assert((size_t)(t-out) == len);
+
+       msg_display(out);
+
+       free(out);
+       free(args);
+}
+



Home | Main Index | Thread Index | Old Index