X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fpath-concat.c;h=db96debad6dc1028e84de12707acd26582a8ae70;hb=0df2580e13bb5523b7f5569e9bec1fda9c812677;hp=e6f44d3e88f43e3cbc6eaba7bac2291723f1ed10;hpb=c57b0256714cb35dcef48b8bc41814ce326d8127;p=gnulib.git diff --git a/lib/path-concat.c b/lib/path-concat.c index e6f44d3e8..db96debad 100644 --- a/lib/path-concat.c +++ b/lib/path-concat.c @@ -1,5 +1,7 @@ /* path-concat.c -- concatenate two arbitrary pathnames - Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. + + Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 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 @@ -21,54 +23,24 @@ # include #endif +/* Specification. */ +#include "path-concat.h" + #ifndef HAVE_MEMPCPY # define mempcpy(D, S, N) ((void *) ((char *) memcpy (D, S, N) + (N))) #endif #include +#include +#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 -#ifndef HAVE_DECL_MALLOC -"this configure-time declaration test was not run" -#endif -#if !HAVE_DECL_MALLOC -char *malloc (); -#endif - -#ifndef strdup -char *strdup (); -#endif - -#ifndef DIRECTORY_SEPARATOR -# define DIRECTORY_SEPARATOR '/' -#endif - -#ifndef FILESYSTEM_PREFIX_LEN -# define FILESYSTEM_PREFIX_LEN(Filename) 0 -#endif - -#ifndef ISSLASH -# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR) -#endif - +#include "strdup.h" +#include "dirname.h" #include "xalloc.h" -#include "path-concat.h" /* Concatenate two pathname components, DIR and BASE, in newly-allocated storage and return the result. Return 0 if out of @@ -88,8 +60,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) { @@ -100,16 +72,16 @@ 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 (dir_len > FILESYSTEM_PREFIX_LEN (dir)) + if (FILESYSTEM_PREFIX_LEN (dir) < dirlen) { if (ISSLASH (*(p - 1)) && ISSLASH (*base)) --p; @@ -120,7 +92,8 @@ path_concat (const char *dir, const char *base, char **base_in_result) if (base_in_result) *base_in_result = p; - memcpy (p, base, base_len + 1); + memcpy (p, base, baselen); + p[baselen] = '\0'; return p_concat; } @@ -131,7 +104,7 @@ char * xpath_concat (const char *dir, const char *base, char **base_in_result) { char *res = path_concat (dir, base, base_in_result); - if (res) - return res; - xalloc_die (); + if (! res) + xalloc_die (); + return res; }