diff options
author | ghazi <ghazi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-09-24 22:38:22 +0000 |
---|---|---|
committer | ghazi <ghazi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-09-24 22:38:22 +0000 |
commit | 0be2ebc785cd4b366423534d0bfdce0499483e80 (patch) | |
tree | 7ec3b888341991cdf8a157f5d87a6dea617363e5 | |
parent | 347e5e07ef4db24f295a4513b381bbb943ddf9f4 (diff) | |
download | gcc-0be2ebc785cd4b366423534d0bfdce0499483e80.tar.gz |
include:
* libiberty.h (reconcat): New function.
libiberty:
* concat.c (reconcat): New function.
gcc:
* c-aux-info.c (affix_data_type): Use ATTRIBUTE_MALLOC. Avoid
leak by passing malloc'ed pointer to reconcat, not concat.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45789 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/c-aux-info.c | 5 | ||||
-rw-r--r-- | include/ChangeLog | 4 | ||||
-rw-r--r-- | include/libiberty.h | 9 | ||||
-rw-r--r-- | libiberty/ChangeLog | 4 | ||||
-rw-r--r-- | libiberty/concat.c | 25 |
6 files changed, 50 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b5c46950ebd..66792a3df58 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2001-09-24 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> + + * c-aux-info.c (affix_data_type): Use ATTRIBUTE_MALLOC. Avoid + leak by passing malloc'ed pointer to reconcat, not concat. + 2001-09-24 DJ Delorie <dj@redhat.com> * varasm.c (array_size_for_constructor): Handle STRING_CSTs also. diff --git a/gcc/c-aux-info.c b/gcc/c-aux-info.c index c9daa1d96a1..67ecae6cea1 100644 --- a/gcc/c-aux-info.c +++ b/gcc/c-aux-info.c @@ -39,7 +39,7 @@ typedef enum formals_style_enum formals_style; static const char *data_type; -static char *affix_data_type PARAMS ((const char *)); +static char *affix_data_type PARAMS ((const char *)) ATTRIBUTE_MALLOC; static const char *gen_formal_list_for_type PARAMS ((tree, formals_style)); static int deserves_ellipsis PARAMS ((tree)); static const char *gen_formal_list_for_func_def PARAMS ((tree, formals_style)); @@ -96,7 +96,8 @@ affix_data_type (param) *p = '\0'; qualifiers_then_data_type = concat (type_or_decl, data_type, NULL); *p = saved; - return concat (qualifiers_then_data_type, " ", p, NULL); + return reconcat (qualifiers_then_data_type, + qualifiers_then_data_type, " ", p, NULL); } /* Given a tree node which represents some "function type", generate the diff --git a/include/ChangeLog b/include/ChangeLog index c94394e2510..b44671a39d0 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,7 @@ +2001-09-24 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> + + * libiberty.h (reconcat): New function. + 2001-09-18 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> * 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 b68c4c5b812..1c641169f30 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,7 @@ +2001-09-24 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> + + * concat.c (reconcat): New function. + 2001-09-17 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> * 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 |