While parsing makefiles get_next_mword() was treating VTAB as a word
character rather than a word separator. However, when using
find_next_token(), for example in patsubst_expand_pat(), we treated
VTAB as a word separator causing multiple words to appear where we
didn't expect them.
* src/makeint.h (END_OF_TOKEN): Change from a loop to a boolean check.
* src/misc.c (end_of_token): Move the loop here.
* src/read.c (get_next_mword): Skip whitespace, not just blank, to
find the start of the word and use END_OF_TOKEN() to decide when the
current word is finished.
#define ISBLANK(c) STOP_SET((c),MAP_BLANK)
#define ISSPACE(c) STOP_SET((c),MAP_SPACE)
+#define END_OF_TOKEN(c) STOP_SET((c),MAP_SPACE|MAP_NUL)
#define NEXT_TOKEN(s) while (ISSPACE (*(s))) ++(s)
-#define END_OF_TOKEN(s) while (! STOP_SET (*(s), MAP_SPACE|MAP_NUL)) ++(s)
/* We can't run setrlimit when using posix_spawn. */
#if defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETRLIMIT) && defined(HAVE_SETRLIMIT) && !defined(USE_POSIX_SPAWN)
char *
end_of_token (const char *s)
{
- END_OF_TOKEN (s);
+ while (! END_OF_TOKEN (*s))
+ ++s;
return (char *)s;
}
char c;
/* Skip any leading whitespace. */
- while (ISBLANK (*p))
+ while (ISSPACE (*p))
++p;
beg = p;
char closeparen;
int count;
+ if (END_OF_TOKEN (c))
+ goto done_word;
+
switch (c)
{
- case '\0':
- case ' ':
- case '\t':
case '=':
goto done_word;