summaryrefslogtreecommitdiff
path: root/util/concat.c
diff options
context:
space:
mode:
Diffstat (limited to 'util/concat.c')
-rw-r--r--util/concat.c75
1 files changed, 42 insertions, 33 deletions
diff --git a/util/concat.c b/util/concat.c
index 65ca04c..1d08e08 100644
--- a/util/concat.c
+++ b/util/concat.c
@@ -1,39 +1,42 @@
-/* $Id$
-**
-** Concatenate strings with dynamic memory allocation.
-**
-** Written by Russ Allbery <rra@stanford.edu>
-** This work is hereby placed in the public domain by its author.
-**
-** Usage:
-**
-** string = concat(string1, string2, ..., (char *) 0);
-** path = concatpath(base, name);
-**
-** Dynamically allocates (using xmalloc) sufficient memory to hold all of
-** the strings given and then concatenates them together into that
-** allocated memory, returning a pointer to it. Caller is responsible for
-** freeing. Assumes xmalloc is available. The last argument must be a
-** null pointer (to a char *, if you actually find a platform where it
-** matters).
-**
-** concatpath is similar, except that it only takes two arguments. If the
-** second argument begins with / or ./, a copy of it is returned;
-** otherwise, the first argument, a slash, and the second argument are
-** concatenated together and returned. This is useful for building file
-** names where names that aren't fully qualified are qualified with some
-** particular directory.
-*/
+/* $Id$
+ *
+ * Concatenate strings with dynamic memory allocation.
+ *
+ * Usage:
+ *
+ * string = concat(string1, string2, ..., (char *) 0);
+ * path = concatpath(base, name);
+ *
+ * Dynamically allocates (using xmalloc) sufficient memory to hold all of the
+ * strings given and then concatenates them together into that allocated
+ * memory, returning a pointer to it. Caller is responsible for freeing.
+ * Assumes xmalloc is available. The last argument must be a null pointer (to
+ * a char *, if you actually find a platform where it matters).
+ *
+ * concatpath is similar, except that it only takes two arguments. If the
+ * second argument begins with / or ./, a copy of it is returned; otherwise,
+ * the first argument, a slash, and the second argument are concatenated
+ * together and returned. This is useful for building file names where names
+ * that aren't fully qualified are qualified with some particular directory.
+ *
+ * Written by Russ Allbery <rra@stanford.edu>
+ * This work is hereby placed in the public domain by its author.
+ */
#include <config.h>
-#include <system.h>
+#include <portable/system.h>
#include <util/util.h>
/* Abbreviation for cleaner code. */
-#define VA_NEXT(var, type) ((var) = (type) va_arg(args, type))
+#define VA_NEXT(var, type) ((var) = (type) va_arg(args, type))
-/* ANSI C requires at least one named parameter. */
+
+/*
+ * Concatenate all of the arguments into a newly allocated string. ANSI C
+ * requires at least one named parameter, but it's not treated any different
+ * than the rest.
+ */
char *
concat(const char *first, ...)
{
@@ -49,10 +52,12 @@ concat(const char *first, ...)
va_end(args);
length++;
- /* Create the string. Doing the copy ourselves avoids useless string
- traversals of result, if using strcat, or string, if using strlen to
- increment a pointer into result, at the cost of losing the native
- optimization of strcat if any. */
+ /*
+ * Create the string. Doing the copy ourselves avoids useless string
+ * traversals of result, if using strcat, or string, if using strlen to
+ * increment a pointer into result, at the cost of losing the native
+ * optimization of strcat if any.
+ */
result = xmalloc(length);
p = result;
va_start(args, first);
@@ -66,6 +71,10 @@ concat(const char *first, ...)
}
+/*
+ * Concatenate name with base, unless name begins with / or ./. Return the
+ * new string in newly allocated memory.
+ */
char *
concatpath(const char *base, const char *name)
{