X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Ffilenamecat.c;h=ef46de209a5b4e039e7d5403e5590c1e76824a88;hb=b792aeb401b00124b3c27c9f1d850d3312e7b849;hp=f56697a6d2d84f3b27e6caf084b3d6ebcdce6657;hpb=359c0a71713e606f440d40f55a43c77349df2aaa;p=gnulib.git diff --git a/lib/filenamecat.c b/lib/filenamecat.c index f56697a6d..ef46de209 100644 --- a/lib/filenamecat.c +++ b/lib/filenamecat.c @@ -1,12 +1,11 @@ /* Concatenate two arbitrary file names. - Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free - Software Foundation, Inc. + Copyright (C) 1996-2007 Free Software Foundation, Inc. - This program is free software; you can redistribute it and/or modify + 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 - the Free Software Foundation; either version 2, or (at your option) - any later version. + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -14,18 +13,16 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ /* Written by Jim Meyering. */ -#if HAVE_CONFIG_H -# include -#endif +#include /* Specification. */ #include "filenamecat.h" +#include #include #include "dirname.h" @@ -59,12 +56,12 @@ longest_relative_suffix (char const *f) 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. */ + Return NULL if malloc fails. */ char * -file_name_concat (char const *dir, char const *abase, char **base_in_result) +mfile_name_concat (char const *dir, char const *abase, char **base_in_result) { - char const *dirbase = base_name (dir); + char const *dirbase = last_component (dir); size_t dirbaselen = base_len (dirbase); size_t dirlen = dirbase - dir + dirbaselen; size_t needs_separator = (dirbaselen && ! ISSLASH (dirbase[dirbaselen - 1])); @@ -72,9 +69,12 @@ file_name_concat (char const *dir, char const *abase, char **base_in_result) char const *base = longest_relative_suffix (abase); size_t baselen = strlen (base); - char *p_concat = xmalloc (dirlen + needs_separator + baselen + 1); + char *p_concat = malloc (dirlen + needs_separator + baselen + 1); char *p; + if (p_concat == NULL) + return NULL; + p = mempcpy (p_concat, dir, dirlen); *p = DIRECTORY_SEPARATOR; p += needs_separator; @@ -88,39 +88,15 @@ file_name_concat (char const *dir, char const *abase, char **base_in_result) return p_concat; } -#ifdef TEST_FILE_NAME_CONCAT -# include -# include -int -main () +/* Just like mfile_name_concat, above, except, rather than + returning NULL upon malloc failure, here, we report the + "memory exhausted" condition and exit. */ + +char * +file_name_concat (char const *dir, char const *abase, char **base_in_result) { - 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 = file_name_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); + char *p = mfile_name_concat (dir, abase, base_in_result); + if (p == NULL) + xalloc_die (); + return p; } -#endif