X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fpath-concat.c;h=622d5d73b6aca55086d665c076328e1e16035669;hb=bf133a41bf9dfb387f5ae52876f0d1380d53928b;hp=fe70f757b0d3e63f1490b8487bcbf3cc0dcc8784;hpb=17addc5bbc18001d2ea1409bbf129243a75e1487;p=gnulib.git diff --git a/lib/path-concat.c b/lib/path-concat.c index fe70f757b..622d5d73b 100644 --- a/lib/path-concat.c +++ b/lib/path-concat.c @@ -1,5 +1,5 @@ /* path-concat.c -- concatenate two arbitrary pathnames - Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,21 +26,36 @@ #endif #include + #if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif # include +#else +# if HAVE_STRINGS_H +# include +# endif +#endif +#if HAVE_STDLIB_H +# include +#endif +#if HAVE_UNISTD_H +# include #endif -#include +#ifndef HAVE_DECL_MALLOC +"this configure-time declaration test was not run" +#endif +#if !HAVE_DECL_MALLOC char *malloc (); - -#ifndef DIRECTORY_SEPARATOR -# define DIRECTORY_SEPARATOR '/' #endif -#ifndef ISSLASH -# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR) +#ifndef strdup +char *strdup (); #endif +#include "dirname.h" #include "xalloc.h" #include "path-concat.h" @@ -62,8 +77,8 @@ path_concat (const char *dir, const char *base, char **base_in_result) { char *p; char *p_concat; - size_t base_len; - size_t dir_len; + size_t baselen; + size_t dirlen; if (!dir) { @@ -74,24 +89,28 @@ path_concat (const char *dir, const char *base, char **base_in_result) } /* DIR is not empty. */ - base_len = strlen (base); - dir_len = strlen (dir); + baselen = base_len (base); + dirlen = strlen (dir); - p_concat = malloc (dir_len + base_len + 2); + p_concat = malloc (dirlen + baselen + 2); if (!p_concat) return 0; - p = mempcpy (p_concat, dir, dir_len); + p = mempcpy (p_concat, dir, dirlen); - if (ISSLASH (*(p - 1)) && ISSLASH(*base)) - --p; - else if (!ISSLASH (*(p - 1)) && !ISSLASH(*base)) - *p++ = DIRECTORY_SEPARATOR; + if (FILESYSTEM_PREFIX_LEN (dir) < dirlen) + { + if (ISSLASH (*(p - 1)) && ISSLASH (*base)) + --p; + else if (!ISSLASH (*(p - 1)) && !ISSLASH (*base)) + *p++ = DIRECTORY_SEPARATOR; + } if (base_in_result) *base_in_result = p; - memcpy (p, base, base_len + 1); + memcpy (p, base, baselen); + p[baselen] = '\0'; return p_concat; }