diff options
author | Ulrich Drepper <drepper@redhat.com> | 2001-03-15 20:04:25 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2001-03-15 20:04:25 +0000 |
commit | 821a6bb4360ae232140ba230724642fed9db613c (patch) | |
tree | 05147bc80d5444d6bf92ae8d043af817208f11f6 /posix/fnmatch_loop.c | |
parent | 955994e1313ab81c1db2a456b5fdf7cacb016366 (diff) | |
download | glibc-821a6bb4360ae232140ba230724642fed9db613c.tar.gz glibc-821a6bb4360ae232140ba230724642fed9db613c.tar.xz glibc-821a6bb4360ae232140ba230724642fed9db613c.zip |
Update.
* posix/tst-fnmatch.input: Add test case for FNM_PERIOD handling with FNM_EXTMATCH. * posix/fnmatch_loop.c: Optimize handling of ?() and @(). * posix/fnmatch.c: Define STRLEN and STRCAT appropriately. * posix/Versions [libc] (GLIBC_2.2.3): Add fnmatch. * posix/fnmatch.c: Define with new default version GLIBC_2.2.3 to avoid running binaries with libc versions without FNM_EXTMATCH support. * include/wchar.h: Add prototype for __wcscat. * wcsmbs/wcscat.c: Define __wcscat and make wcscat weak alias.
Diffstat (limited to 'posix/fnmatch_loop.c')
-rw-r--r-- | posix/fnmatch_loop.c | 39 |
1 files changed, 18 insertions, 21 deletions
diff --git a/posix/fnmatch_loop.c b/posix/fnmatch_loop.c index e9c7af2b7e..940073412e 100644 --- a/posix/fnmatch_loop.c +++ b/posix/fnmatch_loop.c @@ -1011,6 +1011,7 @@ EXT (INT opt, const CHAR *pattern, const CHAR *string, const CHAR *string_end, CHAR str[0]; } *list = NULL; struct patternlist **lastp = &list; + size_t pattern_len = STRLEN (pattern); const CHAR *p; const CHAR *rs; @@ -1049,9 +1050,14 @@ EXT (INT opt, const CHAR *pattern, const CHAR *string, const CHAR *string_end, { /* This means we found the end of the pattern. */ #define NEW_PATTERN \ - struct patternlist *newp = alloca (sizeof (struct patternlist) \ - + ((p - startp + 1) \ - * sizeof (CHAR))); \ + struct patternlist *newp; \ + \ + if (opt == L('?') || opt == L('@')) \ + newp = alloca (sizeof (struct patternlist) \ + + (pattern_len * sizeof (CHAR))); \ + else \ + newp = alloca (sizeof (struct patternlist) \ + + ((p - startp + 1) * sizeof (CHAR))); \ *((CHAR *) MEMPCPY (newp->str, startp, p - startp)) = L('\0'); \ newp->next = NULL; \ *lastp = newp; \ @@ -1117,24 +1123,15 @@ EXT (INT opt, const CHAR *pattern, const CHAR *string, const CHAR *string_end, case L('@'): do - { - for (rs = string; rs <= string_end; ++rs) - /* First match the prefix with the current pattern with the - current pattern. */ - if (FCT (list->str, string, rs, no_leading_period, - flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD) == 0 - /* This was successful. Now match the rest of the strings - with the rest of the pattern. */ - && (FCT (p, rs, string_end, - rs == string - ? no_leading_period - : (rs[-1] == '/' && NO_LEADING_PERIOD (flags) - ? 1 : 0), - flags & FNM_FILE_NAME - ? flags : flags & ~FNM_PERIOD) == 0)) - /* It worked. Signal success. */ - return 0; - } + /* I cannot believe it but `strcat' is actually acceptable + here. Match the entire string with the prefix from the + pattern list and the rest of the pattern following the + pattern list. */ + if (FCT (STRCAT (list->str, p), string, string_end, + no_leading_period, + flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD) == 0) + /* It worked. Signal success. */ + return 0; while ((list = list->next) != NULL); /* None of the patterns lead to a match. */ |