OSDN Git Service

include:
authorghazi <ghazi@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 17 Sep 2001 22:15:10 +0000 (22:15 +0000)
committerghazi <ghazi@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 17 Sep 2001 22:15:10 +0000 (22:15 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45664 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/gcc.c
include/ChangeLog
include/libiberty.h
libiberty/ChangeLog
libiberty/concat.c

index c66d0d9..1e8d4f0 100644 (file)
@@ -1,3 +1,7 @@
+2001-09-17  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
+
+       * gcc.c (find_file): Use ACONCAT in lieu of alloca/strcpy/strcat.
+
 2001-09-17  Joseph S. Myers  <jsm28@cam.ac.uk>
 
        * dostage2, dostage3, listing, make-l2.com, makefile.vms,
index 55188cf..ad692eb 100644 (file)
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -5419,12 +5419,7 @@ find_file (name)
   /* Try multilib_dir if it is defined.  */
   if (multilib_dir != NULL)
     {
-      char *try;
-
-      try = (char *) alloca (strlen (multilib_dir) + strlen (name) + 2);
-      strcpy (try, multilib_dir);
-      strcat (try, dir_separator_str);
-      strcat (try, name);
+      const char *const try = ACONCAT ((multilib_dir, dir_separator_str, name, NULL));
 
       newname = find_a_file (&startfile_prefixes, try, R_OK);
 
index d745a28..a20b8b8 100644 (file)
@@ -1,5 +1,8 @@
 2001-09-17  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
+       * libiberty.h (concat_length, concat_copy, concat_copy2,
+       libiberty_concat_ptr, ACONCAT): New.
+
        * libiberty.h (ASTRDUP): New macro.
        libiberty_optr, libiberty_nptr, libiberty_len): Declare.
 
index 7220ec0..43f1b7d 100644 (file)
@@ -90,6 +90,33 @@ extern const char *lbasename PARAMS ((const char *));
 
 extern char *concat PARAMS ((const char *, ...)) ATTRIBUTE_MALLOC;
 
+/* Determine the length of concatenating an arbitrary number of
+   strings, up to (char *) NULL.  */
+
+extern unsigned long concat_length PARAMS ((const char *, ...));
+
+/* Concatenate an arbitrary number of strings into a SUPPLIED area of
+   memory, up to (char *) NULL.  The supplied memory is assumed to be
+   large enough.  */
+
+extern char *concat_copy PARAMS ((char *, const char *, ...));
+
+/* Concatenate an arbitrary number of strings into a GLOBAL area of
+   memory, up to (char *) NULL.  The supplied memory is assumed to be
+   large enough.  */
+
+extern char *concat_copy2 PARAMS ((const char *, ...));
+
+/* This is the global area used by concat_copy2.  */
+
+extern char *libiberty_concat_ptr;
+
+/* Concatenate an arbitrary number of strings, up to (char *) NULL.
+   Allocates memory using alloca.  Arguments are evaluated twice!.  */
+#define ACONCAT(ACONCAT_PARAMS) \
+  (libiberty_concat_ptr = alloca (concat_length ACONCAT_PARAMS + 1), \
+   concat_copy2 ACONCAT_PARAMS)
+
 /* Check whether two file descriptors refer to the same file.  */
 
 extern int fdmatch PARAMS ((int fd1, int fd2));
index 970dc98..b68c4c5 100644 (file)
@@ -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.
 
index 2e31e83..feed0df 100644 (file)
@@ -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;