Mercurial > hg > octave-lyh > gnulib-hg
changeset 5717:820cf3225e00
* path-concat.c: Don't include assert.h.
(path_concat): Remove assertion that would have triggered
for ABASE starting with more than one slash.
Reported by Andreas Schwab.
* path-concat.c (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.
Andreas Schwab reported the resulting failure of cp --parents:
http://lists.gnu.org/archive/html/bug-coreutils/2005-01/msg00130.html
author | Paul Eggert <eggert@cs.ucla.edu> |
---|---|
date | Mon, 21 Mar 2005 20:49:01 +0000 |
parents | 4b111f223955 |
children | ada083643a28 |
files | lib/path-concat.c |
diffstat | 1 files changed, 43 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- 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 @@ -54,8 +54,10 @@ 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 - concatenation. + *BASE_IN_RESULT to point to the copy of ABASE in the returned + concatenation. However, if ABASE begins with more than one slash, + set *BASE_IN_RESULT to point to the sole corresponding slash that + is copied into the result buffer. Report an error if memory is exhausted. */ @@ -78,10 +80,47 @@ 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'; 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 */ + {"a", "//b", "a/b"}, + }; + 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