Commit c793eea7 by Kaveh R. Ghazi Committed by Kaveh Ghazi

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
parent 63fb6fc7
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> 2001-09-17 Joseph S. Myers <jsm28@cam.ac.uk>
* dostage2, dostage3, listing, make-l2.com, makefile.vms, * dostage2, dostage3, listing, make-l2.com, makefile.vms,
......
...@@ -5419,12 +5419,7 @@ find_file (name) ...@@ -5419,12 +5419,7 @@ find_file (name)
/* Try multilib_dir if it is defined. */ /* Try multilib_dir if it is defined. */
if (multilib_dir != NULL) if (multilib_dir != NULL)
{ {
char *try; const char *const try = ACONCAT ((multilib_dir, dir_separator_str, name, NULL));
try = (char *) alloca (strlen (multilib_dir) + strlen (name) + 2);
strcpy (try, multilib_dir);
strcat (try, dir_separator_str);
strcat (try, name);
newname = find_a_file (&startfile_prefixes, try, R_OK); newname = find_a_file (&startfile_prefixes, try, R_OK);
......
2001-09-17 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 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.h (ASTRDUP): New macro.
libiberty_optr, libiberty_nptr, libiberty_len): Declare. libiberty_optr, libiberty_nptr, libiberty_len): Declare.
......
...@@ -90,6 +90,33 @@ extern const char *lbasename PARAMS ((const char *)); ...@@ -90,6 +90,33 @@ extern const char *lbasename PARAMS ((const char *));
extern char *concat PARAMS ((const char *, ...)) ATTRIBUTE_MALLOC; 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. */ /* Check whether two file descriptors refer to the same file. */
extern int fdmatch PARAMS ((int fd1, int fd2)); extern int fdmatch PARAMS ((int fd1, int fd2));
......
2001-09-17 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 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): * alloca.c (libiberty_optr, libiberty_nptr, libiberty_len):
Define. Define.
......
...@@ -74,38 +74,98 @@ NOTES ...@@ -74,38 +74,98 @@ NOTES
# endif # endif
# endif # endif
char * static inline unsigned long vconcat_length PARAMS ((const char *, va_list));
concat VPARAMS ((const char *first, ...)) static inline unsigned long
vconcat_length (first, args)
const char *first;
va_list args;
{ {
register size_t length; unsigned long length = 0;
register char *newstr; const char *arg;
register char *end;
register 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 *)) for (arg = first; arg ; arg = va_arg (args, const char *))
length += strlen (arg); length += strlen (arg);
VA_CLOSE (args); return length;
}
newstr = (char *) xmalloc (length + 1);
/* Now copy the individual pieces to the result string. */ static inline char *vconcat_copy PARAMS ((char *, const char *, va_list));
VA_OPEN (args, first); static inline char *
VA_FIXEDARG (args, const char *, first); 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 *)) for (arg = first; arg ; arg = va_arg (args, const char *))
{ {
length = strlen (arg); unsigned long length = strlen (arg);
memcpy (end, arg, length); memcpy (end, arg, length);
end += length; end += length;
} }
*end = '\000'; *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); VA_CLOSE (args);
return newstr; return newstr;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment