summaryrefslogtreecommitdiff
path: root/libiberty
diff options
context:
space:
mode:
authorKaveh R. Ghazi <ghazi@caip.rutgers.edu>2001-09-17 22:15:10 +0000
committerKaveh Ghazi <ghazi@gcc.gnu.org>2001-09-17 22:15:10 +0000
commitc793eea7abb23067e67179546acfea0db28af1ae (patch)
tree8936428e9b92c8d4e4a9fb0979885f8a76664f19 /libiberty
parent63fb6fc7f8e0b16439a3fc9db8554450861a2643 (diff)
downloadgcc-c793eea7abb23067e67179546acfea0db28af1ae.tar.gz
libiberty.h (concat_length, [...]): New.
include: * libiberty.h (concat_length, concat_copy, concat_copy2, libiberty_concat_ptr, ACONCAT): New. libiberty: * concat.c (vconcat_length, vconcat_copy, concat_length, concat_copy, concat_copy2): New functions. (concat): Use vconcat_length/vconcat_copy. gcc: * gcc.c (find_file): Use ACONCAT in lieu of alloca/strcpy/strcat. From-SVN: r45664
Diffstat (limited to 'libiberty')
-rw-r--r--libiberty/ChangeLog4
-rw-r--r--libiberty/concat.c98
2 files changed, 83 insertions, 19 deletions
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index 970dc98ad58..b68c4c5b812 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -1,5 +1,9 @@
2001-09-17 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+ * concat.c (vconcat_length, vconcat_copy, concat_length,
+ concat_copy, concat_copy2): New functions.
+ (concat): Use vconcat_length/vconcat_copy.
+
* alloca.c (libiberty_optr, libiberty_nptr, libiberty_len):
Define.
diff --git a/libiberty/concat.c b/libiberty/concat.c
index 2e31e833f4d..feed0df819b 100644
--- a/libiberty/concat.c
+++ b/libiberty/concat.c
@@ -74,38 +74,98 @@ NOTES
# endif
# endif
-char *
-concat VPARAMS ((const char *first, ...))
+static inline unsigned long vconcat_length PARAMS ((const char *, va_list));
+static inline unsigned long
+vconcat_length (first, args)
+ const char *first;
+ va_list args;
{
- register size_t length;
- register char *newstr;
- register char *end;
- register const char *arg;
+ unsigned long length = 0;
+ const char *arg;
- /* First compute the size of the result and get sufficient memory. */
- VA_OPEN (args, first);
- VA_FIXEDARG (args, const char *, first);
-
- length = 0;
for (arg = first; arg ; arg = va_arg (args, const char *))
length += strlen (arg);
- VA_CLOSE (args);
-
- newstr = (char *) xmalloc (length + 1);
+ return length;
+}
- /* Now copy the individual pieces to the result string. */
- VA_OPEN (args, first);
- VA_FIXEDARG (args, const char *, first);
+static inline char *vconcat_copy PARAMS ((char *, const char *, va_list));
+static inline char *
+vconcat_copy (dst, first, args)
+ char *dst;
+ const char *first;
+ va_list args;
+{
+ char *end = dst;
+ const char *arg;
- end = newstr;
for (arg = first; arg ; arg = va_arg (args, const char *))
{
- length = strlen (arg);
+ unsigned long length = strlen (arg);
memcpy (end, arg, length);
end += length;
}
*end = '\000';
+
+ return dst;
+}
+
+unsigned long
+concat_length VPARAMS ((const char *first, ...))
+{
+ unsigned long length;
+
+ VA_OPEN (args, first);
+ VA_FIXEDARG (args, const char *, first);
+ length = vconcat_length (first, args);
+ VA_CLOSE (args);
+
+ return length;
+}
+
+char *
+concat_copy VPARAMS ((char *dst, const char *first, ...))
+{
+ char *save_dst;
+
+ VA_OPEN (args, first);
+ VA_FIXEDARG (args, char *, dst);
+ VA_FIXEDARG (args, const char *, first);
+ vconcat_copy (dst, first, args);
+ save_dst = dst; /* With K&R C, dst goes out of scope here. */
+ VA_CLOSE (args);
+
+ return save_dst;
+}
+
+char *libiberty_concat_ptr;
+
+char *
+concat_copy2 VPARAMS ((const char *first, ...))
+{
+ VA_OPEN (args, first);
+ VA_FIXEDARG (args, const char *, first);
+ vconcat_copy (libiberty_concat_ptr, first, args);
+ VA_CLOSE (args);
+
+ return libiberty_concat_ptr;
+}
+
+char *
+concat VPARAMS ((const char *first, ...))
+{
+ char *newstr;
+
+ /* First compute the size of the result and get sufficient memory. */
+ VA_OPEN (args, first);
+ 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, const char *, first);
+ vconcat_copy (newstr, first, args);
VA_CLOSE (args);
return newstr;