X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fpath-concat.c;h=abafd31ee7b4346353875ee20ce18d1f222a95ff;hb=refs%2Ftags%2FFILEUTILS-3_16x;hp=54509125cacc3ca92f066349e6ee406bd0b63ad7;hpb=0b6856f5bd84404dca8658e34435197f5fc5faac;p=gnulib.git diff --git a/lib/path-concat.c b/lib/path-concat.c index 54509125c..abafd31ee 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 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1998 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 @@ -17,12 +17,21 @@ /* Written by Jim Meyering. */ -#ifdef HAVE_CONFIG_H -#include +#if HAVE_CONFIG_H +# include #endif +#ifndef HAVE_MEMPCPY +# define mempcpy(D, S, N) ((void *) ((char *) memcpy (D, S, N) + (N))) +#endif + +#include +#if HAVE_STRING_H +# include +#endif +#include + char *malloc (); -char *stpcpy (); /* Concatenate two pathname components, DIR and BASE, in newly-allocated storage and return the result. Return 0 if out of memory. Add a slash @@ -40,22 +49,24 @@ path_concat (dir, base, base_in_result) { char *p; char *p_concat; + size_t base_len = strlen (base); + size_t dir_len = strlen (dir); - p_concat = malloc (strlen (dir) + strlen (base) + 2); + p_concat = malloc (dir_len + base_len + 2); if (!p_concat) return 0; - p = stpcpy (p_concat, dir); + p = mempcpy (p_concat, dir, dir_len); if (*(p - 1) == '/' && *base == '/') --p; else if (*(p - 1) != '/' && *base != '/') - p = stpcpy (p, "/"); + *p++ = '/'; if (base_in_result) *base_in_result = p; - stpcpy (p, base); + memcpy (p, base, base_len + 1); return p_concat; }