mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-13 06:13:02 +00:00
uniqstr: avoid need for VLAs
C11 no longer requires support for variable-length arrays, and VS2015 does not have them. Redo UNIQSTR_CONCAT to use a method that is simpler and better anyway. * src/uniqstr.c (uniqstr_vsprintf): Remove; no longer needed. * src/uniqstr.h (UNIQSTR_GEN_FORMAT, UNIQSTR_GEN_FORMAT_): * src/uniqstr.c (uniqstr_concat): New function. * src/uniqstr.h (UNIQSTR_CONCAT): Use it instead of using uniqstr_vsprintf.
This commit is contained in:
@@ -56,19 +56,36 @@ uniqstr_new (char const *str)
|
||||
}
|
||||
|
||||
uniqstr
|
||||
uniqstr_vsprintf (char const *format, ...)
|
||||
uniqstr_concat (int nargs, ...)
|
||||
{
|
||||
va_list args;
|
||||
size_t length;
|
||||
va_start (args, format);
|
||||
length = vsnprintf (NULL, 0, format, args);
|
||||
|
||||
va_start (args, nargs);
|
||||
size_t reslen = 0;
|
||||
for (int i = 0; i < nargs; i++)
|
||||
reslen += strlen (va_arg (args, char const *));
|
||||
va_end (args);
|
||||
|
||||
char res[length + 1];
|
||||
va_start (args, format);
|
||||
vsprintf (res, format, args);
|
||||
char *str = xmalloc (reslen + 1);
|
||||
char *p = str;
|
||||
|
||||
va_start (args, nargs);
|
||||
for (int i = 0; i < nargs; i++)
|
||||
{
|
||||
char const *arg = va_arg (args, char const *);
|
||||
size_t arglen = strlen (arg);
|
||||
memcpy (p, arg, arglen);
|
||||
p += arglen;
|
||||
}
|
||||
va_end (args);
|
||||
return uniqstr_new (res);
|
||||
|
||||
*p = '\0';
|
||||
uniqstr res = hash_insert (uniqstrs_table, str);
|
||||
if (!res)
|
||||
xalloc_die ();
|
||||
if (res != str)
|
||||
free (str);
|
||||
return res;
|
||||
}
|
||||
|
||||
/*------------------------------.
|
||||
|
||||
Reference in New Issue
Block a user