diff options
author | Kaveh R. Ghazi <ghazi@caip.rutgers.edu> | 2001-09-17 22:15:10 +0000 |
---|---|---|
committer | Kaveh Ghazi <ghazi@gcc.gnu.org> | 2001-09-17 22:15:10 +0000 |
commit | c793eea7abb23067e67179546acfea0db28af1ae (patch) | |
tree | 8936428e9b92c8d4e4a9fb0979885f8a76664f19 /libiberty | |
parent | 63fb6fc7f8e0b16439a3fc9db8554450861a2643 (diff) | |
download | gcc-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/ChangeLog | 4 | ||||
-rw-r--r-- | libiberty/concat.c | 98 |
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; |