diff options
author | Paul Smith <psmith@gnu.org> | 2004-09-21 12:07:12 +0000 |
---|---|---|
committer | Paul Smith <psmith@gnu.org> | 2004-09-21 12:07:12 +0000 |
commit | 704c60cec021d75164c8a7c34bcd667e45f184e3 (patch) | |
tree | f910a966cede38013d111434ecf8e08e6547acd3 | |
parent | 9714e501fb356adb043c77a3180a7f8c16c1484d (diff) | |
download | gunmake-704c60cec021d75164c8a7c34bcd667e45f184e3.tar.gz |
Remove sindex() and replace with strstr().
Windows: allow users to set SHELL to cmd.exe and have it behave as if no
UNIX shell were found.
-rw-r--r-- | ChangeLog | 20 | ||||
-rw-r--r-- | commands.c | 12 | ||||
-rw-r--r-- | function.c | 15 | ||||
-rw-r--r-- | main.c | 24 | ||||
-rw-r--r-- | make.h | 2 | ||||
-rw-r--r-- | misc.c | 28 | ||||
-rw-r--r-- | tests/ChangeLog | 9 |
7 files changed, 61 insertions, 49 deletions
@@ -1,3 +1,23 @@ +2004-09-21 Paul D. Smith <psmith@gnu.org> + + * misc.c: Removed the sindex() function. All instances of this + function were trivially replaceable by the standard strstr() + function, and that function will always have better (or certainly + no worse) performance than the very simple-minded algorithm + sindex() used. This can matter with complex makefiles. + * make.h: Remove the prototype for sindex(). + * function.c (subst_expand): Convert sindex() call to strstr(). + This means we no longer need to track the TLEN value so remove that. + (func_findstring): Convert sindex() to strstr(). + * commands.c (chop_commands): Convert sindex() calls to strstr(). + Suggested by: Markus Mauhart <qwe123@chello.at>. + + * main.c (find_and_set_default_shell) [WINDOWS32]: Implement the + idea behind Savannah Patch #3144 from david.baird@homemail.com. + If SHELL is set to CMD.EXE then assume it's batch-mode and + non-unixy. I wrote the code differently from the patch, though, + to make it safer. + 2004-09-20 Paul D. Smith <psmith@gnu.org> * expand.c (variable_expand_string): Modify to invoke @@ -346,13 +346,11 @@ chop_commands (struct commands *cmds) flags |= COMMANDS_NOERROR; break; } - if (!(flags & COMMANDS_RECURSE)) - { - unsigned int len = strlen (p); - if (sindex (p, len, "$(MAKE)", 7) != 0 - || sindex (p, len, "${MAKE}", 7) != 0) - flags |= COMMANDS_RECURSE; - } + + /* If no explicit '+' was given, look for MAKE variable references. */ + if (!(flags & COMMANDS_RECURSE) + && (strstr (p, "$(MAKE)") != 0 || strstr (p, "${MAKE}") != 0)) + flags |= COMMANDS_RECURSE; cmds->lines_flags[idx] = flags; cmds->any_recurse |= flags & COMMANDS_RECURSE; @@ -79,13 +79,12 @@ subst_expand (char *o, char *text, char *subst, char *replace, unsigned int slen, unsigned int rlen, int by_word) { char *t = text; - unsigned int tlen = strlen (text); char *p; if (slen == 0 && !by_word) { /* The first occurrence of "" in any string is its end. */ - o = variable_buffer_output (o, t, tlen); + o = variable_buffer_output (o, t, strlen (t)); if (rlen > 0) o = variable_buffer_output (o, replace, rlen); return o; @@ -99,11 +98,11 @@ subst_expand (char *o, char *text, char *subst, char *replace, p = end_of_token (next_token (t)); else { - p = sindex (t, tlen, subst, slen); + p = strstr (t, subst); if (p == 0) { /* No more matches. Output everything left on the end. */ - o = variable_buffer_output (o, t, tlen); + o = variable_buffer_output (o, t, strlen (t)); return o; } } @@ -124,10 +123,9 @@ subst_expand (char *o, char *text, char *subst, char *replace, /* Output the replacement string. */ o = variable_buffer_output (o, replace, rlen); - /* Advance T past the string to be replaced; adjust tlen. */ + /* Advance T past the string to be replaced. */ { char *nt = p + slen; - tlen -= nt - t; t = nt; } } while (*t != '\0'); @@ -786,9 +784,8 @@ static char* func_findstring (char *o, char **argv, const char *funcname UNUSED) { /* Find the first occurrence of the first string in the second. */ - int i = strlen (argv[0]); - if (sindex (argv[1], 0, argv[0], i) != 0) - o = variable_buffer_output (o, argv[0], i); + if (strstr (argv[1], argv[0]) != 0) + o = variable_buffer_output (o, argv[0], strlen (argv[0])); return o; } @@ -699,7 +699,8 @@ int find_and_set_default_shell (char *token) { int sh_found = 0; - char* search_token; + char *search_token; + char *tokend; PATH_VAR(sh_path); extern char *default_shell; @@ -708,8 +709,25 @@ find_and_set_default_shell (char *token) else search_token = token; - if (!no_default_sh_exe && - (token == NULL || !strcmp(search_token, default_shell))) { + + /* If the user explicitly requests the DOS cmd shell, obey that request. + However, make sure that's what they really want by requiring the value + of SHELL either equal, or have a final path element of, "cmd" or + "cmd.exe" case-insensitive. */ + tokend = search_token + strlen (search_token) - 3; + if (((tokend == search_token + || (tokend > search_token + && (tokend[-1] == '/' || tokend[-1] == '\\'))) + && strcmpi (tokend, "cmd")) + || ((tokend - 4 == search_token + || (tokend - 4 > search_token + && (tokend[-5] == '/' || tokend[-5] == '\\'))) + && strcmpi (tokend - 4, "cmd.exe"))) { + batch_mode_shell = 1; + unixy_shell = 0; + sh_found = 0; + } else if (!no_default_sh_exe && + (token == NULL || !strcmp (search_token, default_shell))) { /* no new information, path already set or known */ sh_found = 1; } else if (file_exists_p(search_token)) { @@ -423,8 +423,6 @@ extern char *next_token PARAMS ((const char *)); extern char *end_of_token PARAMS ((char *)); extern void collapse_continuations PARAMS ((char *)); extern void remove_comments PARAMS((char *)); -extern char *sindex PARAMS ((const char *, unsigned int, \ - const char *, unsigned int)); extern char *lindex PARAMS ((const char *, const char *, int)); extern int alpha_compare PARAMS ((const void *, const void *)); extern void print_spaces PARAMS ((unsigned int)); @@ -412,34 +412,6 @@ savestring (const char *str, unsigned int length) return out; } -/* Search string BIG (length BLEN) for an occurrence of - string SMALL (length SLEN). Return a pointer to the - beginning of the first occurrence, or return nil if none found. */ - -char * -sindex (const char *big, unsigned int blen, - const char *small, unsigned int slen) -{ - if (!blen) - blen = strlen (big); - if (!slen) - slen = strlen (small); - - if (slen && blen >= slen) - { - register unsigned int b; - - /* Quit when there's not enough room left for the small string. */ - --slen; - blen -= slen; - - for (b = 0; b < blen; ++b, ++big) - if (*big == *small && strneq (big + 1, small + 1, slen)) - return (char *)big; - } - - return 0; -} /* Limited INDEX: Search through the string STRING, which ends at LIMIT, for the character C. diff --git a/tests/ChangeLog b/tests/ChangeLog index eec2ef1..ba6b59e 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,12 @@ +2004-09-21 Paul D. Smith <psmith@gnu.org> + + * run_make_tests.pl (run_make_test): Enhance to allow the make + string to be undef: in that case it reuses the previous make + string. Allows multiple tests on the same makefile. + + * scripts/variables/flavors: Add some tests for prefix characters + interacting with define/endef variables. + 2004-09-20 Paul D. Smith <psmith@gnu.org> * scripts/functions/substitution: Rewrite to use run_make_test() |