From fe32d83182dd651bbdaee9a8b6a54c6e3ad9ad2e Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Wed, 8 Aug 2007 06:43:35 +0000 Subject: [PATCH] New function: mfile_name_concat. * lib/filenamecat.c (mfile_name_concat): New function, just like file_name_concat, but return NULL upon failure rather than exiting with a diagnostic. * lib/filenamecat.h: Declare it. --- ChangeLog | 8 ++++++++ lib/filenamecat.c | 26 +++++++++++++++++++++----- lib/filenamecat.h | 5 ++++- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0fb640e03..2f091d416 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2007-08-08 Jim Meyering + + New function: mfile_name_concat. + * lib/filenamecat.c (mfile_name_concat): New function, just like + file_name_concat, but return NULL upon failure rather than exiting + with a diagnostic. + * lib/filenamecat.h: Declare it. + 2007-08-07 Bruno Haible * m4/inttypes.m4 (gl_INTTYPES_H): Use GL_TRIGGER_STDC_LIMIT_MACROS diff --git a/lib/filenamecat.c b/lib/filenamecat.c index bccffb25d..beac5c185 100644 --- a/lib/filenamecat.c +++ b/lib/filenamecat.c @@ -1,7 +1,6 @@ /* Concatenate two arbitrary file names. - Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1996-2007 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 @@ -24,6 +23,7 @@ /* Specification. */ #include "filenamecat.h" +#include #include #include "dirname.h" @@ -57,10 +57,10 @@ 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 = last_component (dir); size_t dirbaselen = base_len (dirbase); @@ -70,9 +70,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; @@ -86,6 +89,19 @@ file_name_concat (char const *dir, char const *abase, char **base_in_result) return p_concat; } +/* 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) +{ + char *p = mfile_name_concat (dir, abase, base_in_result); + if (p == NULL) + xalloc_die (); + return p; +} + #ifdef TEST_FILE_NAME_CONCAT # include # include diff --git a/lib/filenamecat.h b/lib/filenamecat.h index c943b67d7..28f8c3fb3 100644 --- a/lib/filenamecat.h +++ b/lib/filenamecat.h @@ -1,6 +1,6 @@ /* Concatenate two arbitrary file names. - Copyright (C) 1996, 1997, 2003, 2005 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 2003, 2005, 2007 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 @@ -20,3 +20,6 @@ char *file_name_concat (char const *dir, char const *base, char **base_in_result); + +char *mfile_name_concat (char const *dir, char const *base, + char **base_in_result); -- 2.11.0