aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/c-aux-info.c5
-rw-r--r--include/ChangeLog4
-rw-r--r--include/libiberty.h9
-rw-r--r--libiberty/ChangeLog4
-rw-r--r--libiberty/concat.c25
6 files changed, 50 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b5c4695..66792a3 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 c9daa1d..67ecae6 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 c94394e..b44671a 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 a54e3ad..315d310 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 b68c4c5..1c64116 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 feed0df..136e8be 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