]> granicus.if.org Git - sudo/commitdiff
Add lbuf_append_quoted() which takes a set of characters which
authorTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 22 Aug 2007 22:31:07 +0000 (22:31 +0000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 22 Aug 2007 22:31:07 +0000 (22:31 +0000)
should be quoted with a backslash when displayed.

lbuf.c
lbuf.h

diff --git a/lbuf.c b/lbuf.c
index 4266e070a338fbc1505209553eb3a869fddbc175..76d6d5fc20844fdff4e4f33b108094fded23beb8 100644 (file)
--- a/lbuf.c
+++ b/lbuf.c
@@ -92,6 +92,68 @@ lbuf_destroy(lbuf)
     lbuf->buf = NULL;
 }
 
+/*
+ * Append strings to the buffer, expanding it as needed.
+ */
+void
+#ifdef __STDC__
+lbuf_append_quoted(struct lbuf *lbuf, const char *set, ...)
+#else
+lbuf_appen_quotedd(lbuf, va_alist)
+       struct lbuf *lbuf;
+       const char *set;
+       va_dcl
+#endif
+{
+    va_list ap;
+    int len = 0;
+    char *cp, *s;
+
+#ifdef __STDC__
+    va_start(ap, set);
+#else
+    va_start(ap);
+#endif
+    while ((s = va_arg(ap, char *)) != NULL) {
+       len += strlen(s);
+       for (cp = s; (cp = strpbrk(cp, set)) != NULL; cp++)
+           len++;
+    }
+    va_end(ap);
+
+    /* Expand buffer as needed. */
+    if (lbuf->len + len >= lbuf->size) {
+       do {
+           lbuf->size += 256;
+       } while (lbuf->len + len >= lbuf->size);
+       lbuf->buf = erealloc(lbuf->buf, lbuf->size);
+    }
+
+#ifdef __STDC__
+    va_start(ap, set);
+#else
+    va_start(ap);
+#endif
+    /* Append each string. */
+    while ((s = va_arg(ap, char *)) != NULL) {
+       while ((cp = strpbrk(s, set)) != NULL) {
+           len = (int)(cp - s);
+           memcpy(lbuf->buf + lbuf->len, s, len);
+           lbuf->len += len;
+           lbuf->buf[lbuf->len++] = '\\';
+           lbuf->buf[lbuf->len++] = *cp;
+           s = cp + 1;
+       }
+       if (*s != '\0') {
+           len = strlen(s);
+           memcpy(lbuf->buf + lbuf->len, s, len);
+           lbuf->len += len;
+       }
+    }
+    lbuf->buf[lbuf->len] = '\0';
+    va_end(ap);
+}
+
 /*
  * Append strings to the buffer, expanding it as needed.
  */
diff --git a/lbuf.h b/lbuf.h
index a9e1a05e7e1cdce0dfe32a8c2ffaea1ff93ef864..26dceac0b6b7d50fd5fe22542f17f26de20fea3c 100644 (file)
--- a/lbuf.h
+++ b/lbuf.h
@@ -35,6 +35,7 @@ struct lbuf {
 void lbuf_init         __P((struct lbuf *, char *, int, int));
 void lbuf_destroy      __P((struct lbuf *));
 void lbuf_append       __P((struct lbuf *, ...));
+void lbuf_append_quoted        __P((struct lbuf *, const char *, ...));
 void lbuf_print                __P((struct lbuf *));
 
 #endif /* _SUDO_LBUF_H */