From 99ee3a8f13fc032cce1b964cdbc37a567a944428 Mon Sep 17 00:00:00 2001 From: DJ Delorie Date: Mon, 24 Sep 2001 23:37:52 +0000 Subject: [PATCH] merge from gcc --- include/ChangeLog | 4 ++++ include/libiberty.h | 9 +++++++++ libiberty/ChangeLog | 4 ++++ libiberty/concat.c | 25 +++++++++++++++++++++++++ 4 files changed, 42 insertions(+) diff --git a/include/ChangeLog b/include/ChangeLog index 157dbff4db3..99bd9320278 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,7 @@ +2001-09-24 Kaveh R. Ghazi + + * libiberty.h (reconcat): New function. + 2001-09-18 Kaveh R. Ghazi * libiberty.h (concat, concat_length, concat_copy, concat_copy2, diff --git a/include/libiberty.h b/include/libiberty.h index a54e3adf05e..315d3106c4b 100644 --- a/include/libiberty.h +++ b/include/libiberty.h @@ -91,6 +91,15 @@ extern const char *lbasename PARAMS ((const char *)); extern char *concat PARAMS ((const char *, ...)) ATTRIBUTE_MALLOC; +/* Concatenate an arbitrary number of strings. You must pass NULL as + the last argument of this function, to terminate the list of + strings. Allocates memory using xmalloc. The first argument is + not one of the strings to be concatenated, but if not NULL is a + pointer to be freed after the new string is created, similar to the + way xrealloc works. */ + +extern char *reconcat PARAMS ((char *, const char *, ...)) ATTRIBUTE_MALLOC; + /* Determine the length of concatenating an arbitrary number of strings. You must pass NULL as the last argument of this function, to terminate the list of strings. */ diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index d9dc3dcb8b3..22bf58cfad8 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,7 @@ +2001-09-24 Kaveh R. Ghazi + + * concat.c (reconcat): New function. + 2001-09-17 Kaveh R. Ghazi * concat.c (vconcat_length, vconcat_copy, concat_length, diff --git a/libiberty/concat.c b/libiberty/concat.c index feed0df819b..136e8be866e 100644 --- a/libiberty/concat.c +++ b/libiberty/concat.c @@ -171,6 +171,31 @@ concat VPARAMS ((const char *first, ...)) return newstr; } +char * +reconcat VPARAMS ((char *optr, const char *first, ...)) +{ + char *newstr; + + /* First compute the size of the result and get sufficient memory. */ + VA_OPEN (args, first); + VA_FIXEDARG (args, char *, optr); + VA_FIXEDARG (args, const char *, first); + newstr = (char *) xmalloc (vconcat_length (first, args) + 1); + VA_CLOSE (args); + + /* Now copy the individual pieces to the result string. */ + VA_OPEN (args, first); + VA_FIXEDARG (args, char *, optr); + VA_FIXEDARG (args, const char *, first); + vconcat_copy (newstr, first, args); + VA_CLOSE (args); + + if (optr) + free (optr); + + return newstr; +} + #ifdef MAIN #define NULLP (char *)0 -- 2.30.2