diff options
author | DJ Delorie <dj@redhat.com> | 2001-09-17 23:11:04 +0000 |
---|---|---|
committer | DJ Delorie <dj@redhat.com> | 2001-09-17 23:11:04 +0000 |
commit | 54c2024269888296cec6c81cd15caf2dec71bb84 (patch) | |
tree | 3cb14374f0cf07150204a558c4b24955e578c85f /libiberty/concat.c | |
parent | 739d0d99b33332323e03c11f9fc03a5c499199c6 (diff) | |
download | gdb-54c2024269888296cec6c81cd15caf2dec71bb84.zip gdb-54c2024269888296cec6c81cd15caf2dec71bb84.tar.gz gdb-54c2024269888296cec6c81cd15caf2dec71bb84.tar.bz2 |
merge from gcc
Diffstat (limited to 'libiberty/concat.c')
-rw-r--r-- | libiberty/concat.c | 98 |
1 files changed, 79 insertions, 19 deletions
diff --git a/libiberty/concat.c b/libiberty/concat.c index 2e31e83..feed0df 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; |