summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2005-01-25 09:07:49 +0000
committerJim Meyering <jim@meyering.net>2005-01-25 09:07:49 +0000
commit748946e773ead94cd238edcc480be1fe41a3b148 (patch)
treeb4e368f644fccfacc024340fb96b7fd73465ef0e /lib
parent14c329a60c9024ffdd1d31bda25f1ad8dba080bb (diff)
downloadcoreutils-748946e773ead94cd238edcc480be1fe41a3b148.tar.xz
(path_concat): Set *BASE_IN_RESULT
properly when ABASE is an absolute file name. Correct the description of this function. Include <assert.h>. Add an assertion and a test driver. This fixes a bug introduced on 2004-07-02.
Diffstat (limited to 'lib')
-rw-r--r--lib/path-concat.c46
1 files changed, 43 insertions, 3 deletions
diff --git a/lib/path-concat.c b/lib/path-concat.c
index 02e92af01..06b040e76 100644
--- a/lib/path-concat.c
+++ b/lib/path-concat.c
@@ -1,6 +1,6 @@
/* path-concat.c -- concatenate two arbitrary pathnames
- Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free
+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free
Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
@@ -22,6 +22,7 @@
#if HAVE_CONFIG_H
# include <config.h>
#endif
+# include <assert.h>
/* Specification. */
#include "path-concat.h"
@@ -54,7 +55,7 @@ longest_relative_suffix (char const *f)
Arrange for a directory separator if necessary between DIR and BASE
in the result, removing any redundant separators.
In any case, if BASE_IN_RESULT is non-NULL, set
- *BASE_IN_RESULT to point to the copy of BASE in the returned
+ *BASE_IN_RESULT to point to the copy of ABASE in the returned
concatenation.
Report an error if memory is exhausted. */
@@ -78,10 +79,49 @@ path_concat (char const *dir, char const *abase, char **base_in_result)
p += needs_separator;
if (base_in_result)
- *base_in_result = p;
+ *base_in_result = p - IS_ABSOLUTE_FILE_NAME (abase);
p = mempcpy (p, base, baselen);
*p = '\0';
+ assert (!base_in_result
+ || strcmp (*base_in_result, abase) == 0);
+
return p_concat;
}
+
+#ifdef TEST_PATH_CONCAT
+#include <stdlib.h>
+#include <stdio.h>
+int
+main ()
+{
+ static char const *const tests[][3] =
+ {
+ {"a", "b", "a/b"},
+ {"a/", "b", "a/b"},
+ {"a/", "/b", "a/b"},
+ {"a", "/b", "a/b"},
+
+ {"/", "b", "/b"},
+ {"/", "/b", "/b"},
+ {"/", "/", "/"},
+ {"a", "/", "a/"}, /* this might deserve a diagnostic */
+ {"/a", "/", "/a/"}, /* this might deserve a diagnostic */
+ };
+ size_t i;
+ bool fail = false;
+ for (i = 0; i < sizeof tests / sizeof tests[0]; i++)
+ {
+ char *base_in_result;
+ char const *const *t = tests[i];
+ char *res = path_concat (t[0], t[1], &base_in_result);
+ if (strcmp (res, t[2]) != 0)
+ {
+ printf ("got %s, expected %s\n", res, t[2]);
+ fail = true;
+ }
+ }
+ exit (fail ? EXIT_FAILURE : EXIT_SUCCESS);
+}
+#endif