OSDN Git Service

Patch from Robert Millan for kfreebsd-gnu/knetbsd-gnu.
[pf3gnuchains/gcc-fork.git] / libiberty / concat.c
index 136e8be..98b20e1 100644 (file)
@@ -21,24 +21,14 @@ Boston, MA 02111-1307, USA.  */
 
 /*
 
 
 /*
 
-NAME
+@deftypefn Extension char* concat (const char *@var{s1}, const char *@var{s2}, @dots{}, @code{NULL})
 
 
-       concat -- concatenate a variable number of strings
+Concatenate zero or more of strings and return the result in freshly
+@code{xmalloc}ed memory.  Returns @code{NULL} if insufficient memory is
+available.  The argument list is terminated by the first @code{NULL}
+pointer encountered.  Pointers to empty strings are ignored.
 
 
-SYNOPSIS
-
-       #include <varargs.h>
-
-       char *concat (s1, s2, s3, ..., NULL)
-
-DESCRIPTION
-
-       Concatenate a variable number of strings and return the result
-       in freshly malloc'd memory.
-
-       Returns NULL if insufficient memory is available.  The argument
-       list is terminated by the first NULL pointer encountered.  Pointers
-       to empty strings are ignored.
+@end deftypefn
 
 NOTES
 
 
 NOTES
 
@@ -50,6 +40,7 @@ NOTES
        deal with low memory situations itself, it should supply an xmalloc
        that just directly invokes malloc and blindly returns whatever
        malloc returns.
        deal with low memory situations itself, it should supply an xmalloc
        that just directly invokes malloc and blindly returns whatever
        malloc returns.
+
 */
 
 
 */
 
 
@@ -74,6 +65,10 @@ NOTES
 #  endif
 # endif
 
 #  endif
 # endif
 
+#if HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
 static inline unsigned long vconcat_length PARAMS ((const char *, va_list));
 static inline unsigned long
 vconcat_length (first, args)
 static inline unsigned long vconcat_length PARAMS ((const char *, va_list));
 static inline unsigned long
 vconcat_length (first, args)
@@ -110,6 +105,8 @@ vconcat_copy (dst, first, args)
   return dst;
 }
 
   return dst;
 }
 
+/* @undocumented concat_length */
+
 unsigned long
 concat_length VPARAMS ((const char *first, ...))
 {
 unsigned long
 concat_length VPARAMS ((const char *first, ...))
 {
@@ -123,6 +120,8 @@ concat_length VPARAMS ((const char *first, ...))
   return length;
 }
 
   return length;
 }
 
+/* @undocumented concat_copy */
+
 char *
 concat_copy VPARAMS ((char *dst, const char *first, ...))
 {
 char *
 concat_copy VPARAMS ((char *dst, const char *first, ...))
 {
@@ -140,6 +139,8 @@ concat_copy VPARAMS ((char *dst, const char *first, ...))
 
 char *libiberty_concat_ptr;
 
 
 char *libiberty_concat_ptr;
 
+/* @undocumented concat_copy2 */
+
 char *
 concat_copy2 VPARAMS ((const char *first, ...))
 {
 char *
 concat_copy2 VPARAMS ((const char *first, ...))
 {
@@ -171,6 +172,23 @@ concat VPARAMS ((const char *first, ...))
   return newstr;
 }
 
   return newstr;
 }
 
+/*
+
+@deftypefn Extension char* reconcat (char *@var{optr}, const char *@var{s1}, @dots{}, @code{NULL})
+
+Same as @code{concat}, except that if @var{optr} is not @code{NULL} it
+is freed after the string is created.  This is intended to be useful
+when you're extending an existing string or building up a string in a
+loop:
+
+@example
+  str = reconcat (str, "pre-", str, NULL);
+@end example
+
+@end deftypefn
+
+*/
+
 char *
 reconcat VPARAMS ((char *optr, const char *first, ...))
 {
 char *
 reconcat VPARAMS ((char *optr, const char *first, ...))
 {
@@ -188,10 +206,9 @@ reconcat VPARAMS ((char *optr, const char *first, ...))
   VA_FIXEDARG (args, char *, optr);
   VA_FIXEDARG (args, const char *, first);
   vconcat_copy (newstr, first, args);
   VA_FIXEDARG (args, char *, optr);
   VA_FIXEDARG (args, const char *, first);
   vconcat_copy (newstr, first, args);
-  VA_CLOSE (args);
-
-  if (optr)
+  if (optr) /* Done before VA_CLOSE so optr stays in scope for K&R C.  */
     free (optr);
     free (optr);
+  VA_CLOSE (args);
 
   return newstr;
 }
 
   return newstr;
 }