Revert "Simplify auto_load_expand_dir_vars and remove substitute_path_component"

This reverts commit 02601231fd.

This commit was a refactoring to remove an xrealloc and simplify
utils.[ch].  However, it has a flaw -- it mishandles a substitution
like "$datadir/subdir".

I am backing out the patch in the interests of fixing the regression
before GDB 14.  It can be reinstated (with modifications) later if we
like.

Regression tested on x86-64 Fedora 36.
This commit is contained in:
Tom Tromey
2023-07-14 09:35:03 -06:00
parent 40e76c4db1
commit 23e46b680f
5 changed files with 121 additions and 21 deletions

View File

@@ -3346,6 +3346,51 @@ parse_pid_to_attach (const char *args)
return pid;
}
/* Substitute all occurrences of string FROM by string TO in *STRINGP. *STRINGP
must come from xrealloc-compatible allocator and it may be updated. FROM
needs to be delimited by IS_DIR_SEPARATOR or DIRNAME_SEPARATOR (or be
located at the start or end of *STRINGP. */
void
substitute_path_component (char **stringp, const char *from, const char *to)
{
char *string = *stringp, *s;
const size_t from_len = strlen (from);
const size_t to_len = strlen (to);
for (s = string;;)
{
s = strstr (s, from);
if (s == NULL)
break;
if ((s == string || IS_DIR_SEPARATOR (s[-1])
|| s[-1] == DIRNAME_SEPARATOR)
&& (s[from_len] == '\0' || IS_DIR_SEPARATOR (s[from_len])
|| s[from_len] == DIRNAME_SEPARATOR))
{
char *string_new;
string_new
= (char *) xrealloc (string, (strlen (string) + to_len + 1));
/* Relocate the current S pointer. */
s = s - string + string_new;
string = string_new;
/* Replace from by to. */
memmove (&s[to_len], &s[from_len], strlen (&s[from_len]) + 1);
memcpy (s, to, to_len);
s += to_len;
}
else
s++;
}
*stringp = string;
}
#ifdef HAVE_WAITPID
#ifdef SIGALRM