components/apr/patches/CVE-2011-0419.patch
author Petr Sumbera <petr.sumbera@oracle.com>
Mon, 15 Aug 2011 11:41:24 -0700
changeset 472 b4bf6ad34a2d
permissions -rw-r--r--
7049240 Problem with utility/apache
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
472
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     1
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     2
https://bugzilla.redhat.com/show_bug.cgi?id=703390
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     3
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     4
http://svn.apache.org/viewvc/apr/apr/branches/1.4.x/strings/apr_fnmatch.c?r1=731029&r2=1098902
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     5
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     6
--- strings/apr_fnmatch.c.fnmatch
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     7
+++ strings/apr_fnmatch.c
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     8
@@ -1,50 +1,58 @@
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
     9
-/*
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    10
- * Copyright (c) 1989, 1993, 1994
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    11
- *      The Regents of the University of California.  All rights reserved.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    12
+/* Licensed to the Apache Software Foundation (ASF) under one or more
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    13
+ * contributor license agreements. See the NOTICE file distributed with
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    14
+ * this work for additional information regarding copyright ownership.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    15
+ * The ASF licenses this file to You under the Apache License, Version 2.0
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    16
+ * (the "License"); you may not use this file except in compliance with
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    17
+ * the License. You may obtain a copy of the License at
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    18
  *
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    19
- * This code is derived from software contributed to Berkeley by
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    20
- * Guido van Rossum.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    21
+ * http://www.apache.org/licenses/LICENSE-2.0
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    22
  *
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    23
- * Redistribution and use in source and binary forms, with or without
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    24
- * modification, are permitted provided that the following conditions
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    25
- * are met:
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    26
- * 1. Redistributions of source code must retain the above copyright
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    27
- *    notice, this list of conditions and the following disclaimer.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    28
- * 2. Redistributions in binary form must reproduce the above copyright
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    29
- *    notice, this list of conditions and the following disclaimer in the
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    30
- *    documentation and/or other materials provided with the distribution.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    31
- * 3. All advertising materials mentioning features or use of this software
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    32
- *    must display the following acknowledgement:
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    33
- *      This product includes software developed by the University of
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    34
- *      California, Berkeley and its contributors.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    35
- * 4. Neither the name of the University nor the names of its contributors
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    36
- *    may be used to endorse or promote products derived from this software
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    37
- *    without specific prior written permission.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    38
+ * Unless required by applicable law or agreed to in writing, software
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    39
+ * distributed under the License is distributed on an "AS IS" BASIS,
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    40
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    41
+ * See the License for the specific language governing permissions and
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    42
+ * limitations under the License.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    43
+ */ 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    44
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    45
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    46
+/* Derived from The Open Group Base Specifications Issue 7, IEEE Std 1003.1-2008
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    47
+ * as described in;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    48
+ *   http://pubs.opengroup.org/onlinepubs/9699919799/functions/fnmatch.html
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    49
+ *
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    50
+ * Filename pattern matches defined in section 2.13, "Pattern Matching Notation"
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    51
+ * from chapter 2. "Shell Command Language"
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    52
+ *   http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    53
+ * where; 1. A bracket expression starting with an unquoted <circumflex> '^' 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    54
+ * character CONTINUES to specify a non-matching list; 2. an explicit <period> '.' 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    55
+ * in a bracket expression matching list, e.g. "[.abc]" does NOT match a leading 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    56
+ * <period> in a filename; 3. a <left-square-bracket> '[' which does not introduce
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    57
+ * a valid bracket expression is treated as an ordinary character; 4. a differing
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    58
+ * number of consecutive slashes within pattern and string will NOT match;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    59
+ * 5. a trailing '\' in FNM_ESCAPE mode is treated as an ordinary '\' character.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    60
+ *
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    61
+ * Bracket expansion defined in section 9.3.5, "RE Bracket Expression",
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    62
+ * from chapter 9, "Regular Expressions"
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    63
+ *   http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_05
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    64
+ * with no support for collating symbols, equivalence class expressions or 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    65
+ * character class expressions.  A partial range expression with a leading 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    66
+ * hyphen following a valid range expression will match only the ordinary
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    67
+ * <hyphen> and the ending character (e.g. "[a-m-z]" will match characters 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    68
+ * 'a' through 'm', a <hyphen> '-', or a 'z').
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    69
+ *
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    70
+ * NOTE: Only POSIX/C single byte locales are correctly supported at this time.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    71
+ * Notably, non-POSIX locales with FNM_CASEFOLD produce undefined results,
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    72
+ * particularly in ranges of mixed case (e.g. "[A-z]") or spanning alpha and
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    73
+ * nonalpha characters within a range.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    74
  *
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    75
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    76
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    77
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    78
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    79
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    80
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    81
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    82
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    83
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    84
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    85
- * SUCH DAMAGE.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    86
+ * XXX comments below indicate porting required for multi-byte character sets
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    87
+ * and non-POSIX locale collation orders; requires mbr* APIs to track shift
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    88
+ * state of pattern and string (rewinding pattern and string repeatedly).
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    89
+ *
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    90
+ * Certain parts of the code assume 0x00-0x3F are unique with any MBCS (e.g.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    91
+ * UTF-8, SHIFT-JIS, etc).  Any implementation allowing '\' as an alternate
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    92
+ * path delimiter must be aware that 0x5C is NOT unique within SHIFT-JIS.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    93
  */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    94
 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    95
-#if defined(LIBC_SCCS) && !defined(lint)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    96
-static char sccsid[] = "@(#)fnmatch.c	8.2 (Berkeley) 4/16/94";
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    97
-#endif /* LIBC_SCCS and not lint */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    98
-
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
    99
-/*
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   100
- * Function fnmatch() as specified in POSIX 1003.2-1992, section B.6.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   101
- * Compares a filename or pathname to a pattern.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   102
- */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   103
-#ifndef WIN32
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   104
-#include "apr_private.h"
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   105
-#endif
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   106
 #include "apr_file_info.h"
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   107
 #include "apr_fnmatch.h"
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   108
 #include "apr_tables.h"
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   109
@@ -55,196 +63,355 @@ static char sccsid[] = "@(#)fnmatch.c	8.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   110
 # include <ctype.h>
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   111
 #endif
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   112
 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   113
-#define	EOS	'\0'
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   114
-
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   115
-static const char *rangematch(const char *, int, int);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   116
 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   117
-APR_DECLARE(apr_status_t) apr_fnmatch(const char *pattern, const char *string, int flags)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   118
+/* Most MBCS/collation/case issues handled here.  Wildcard '*' is not handled.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   119
+ * EOS '\0' and the FNM_PATHNAME '/' delimiters are not advanced over, 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   120
+ * however the "\/" sequence is advanced to '/'.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   121
+ *
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   122
+ * Both pattern and string are **char to support pointer increment of arbitrary
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   123
+ * multibyte characters for the given locale, in a later iteration of this code
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   124
+ */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   125
+static APR_INLINE int fnmatch_ch(const char **pattern, const char **string, int flags)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   126
 {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   127
-    const char *stringstart;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   128
-    char c, test;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   129
+    const char * const mismatch = *pattern;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   130
+    const int nocase = !!(flags & APR_FNM_CASE_BLIND);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   131
+    const int escape = !(flags & APR_FNM_NOESCAPE);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   132
+    const int slash = !!(flags & APR_FNM_PATHNAME);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   133
+    int result = APR_FNM_NOMATCH;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   134
+    const char *startch;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   135
+    int negate;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   136
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   137
+    if (**pattern == '[')
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   138
+    {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   139
+        ++*pattern;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   140
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   141
+        /* Handle negation, either leading ! or ^ operators (never both) */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   142
+        negate = ((**pattern == '!') || (**pattern == '^'));
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   143
+        if (negate)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   144
+            ++*pattern;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   145
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   146
+        while (**pattern)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   147
+        {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   148
+            /* ']' is an ordinary character at the start of the range pattern */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   149
+            if ((**pattern == ']') && (*pattern > mismatch)) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   150
+                ++*pattern;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   151
+                /* XXX: Fix for MBCS character width */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   152
+                ++*string;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   153
+                return (result ^ negate);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   154
+            }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   155
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   156
+            if (escape && (**pattern == '\\')) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   157
+                ++*pattern;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   158
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   159
+                /* Patterns must be terminated with ']', not EOS */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   160
+                if (!**pattern)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   161
+                    break;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   162
+            }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   163
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   164
+            /* Patterns must be terminated with ']' not '/' */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   165
+            if (slash && (**pattern == '/'))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   166
+                break;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   167
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   168
+            /* Look at only well-formed range patterns; ']' is allowed only if escaped,
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   169
+             * while '/' is not allowed at all in FNM_PATHNAME mode.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   170
+             */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   171
+            /* XXX: Fix for locale/MBCS character width */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   172
+            if (((*pattern)[1] == '-') && (*pattern)[2] 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   173
+                    && ((escape && ((*pattern)[2] != '\\'))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   174
+                          ? (((*pattern)[2] != ']') && (!slash || ((*pattern)[2] != '/')))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   175
+                          : (((*pattern)[3]) && (!slash || ((*pattern)[3] != '/'))))) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   176
+                startch = *pattern;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   177
+                *pattern += (escape && ((*pattern)[2] == '\\')) ? 3 : 2;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   178
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   179
+                /* XXX: handle locale/MBCS comparison, advance by MBCS char width */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   180
+                if ((**string >= *startch) && (**string <= **pattern))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   181
+                    result = 0;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   182
+                else if (nocase && (isupper(**string) || isupper(*startch)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   183
+                                                      || isupper(**pattern))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   184
+                            && (tolower(**string) >= tolower(*startch)) 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   185
+                            && (tolower(**string) <= tolower(**pattern)))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   186
+                    result = 0;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   187
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   188
+                ++*pattern;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   189
+                continue;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   190
+            }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   191
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   192
+            /* XXX: handle locale/MBCS comparison, advance by MBCS char width */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   193
+            if ((**string == **pattern))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   194
+                result = 0;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   195
+            else if (nocase && (isupper(**string) || isupper(**pattern))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   196
+                            && (tolower(**string) == tolower(**pattern)))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   197
+                result = 0;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   198
 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   199
-    for (stringstart = string;;) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   200
-	switch (c = *pattern++) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   201
-	case EOS:
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   202
-	    return (*string == EOS ? APR_SUCCESS : APR_FNM_NOMATCH);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   203
-	case '?':
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   204
-	    if (*string == EOS) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   205
-		return (APR_FNM_NOMATCH);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   206
-	    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   207
-	    if (*string == '/' && (flags & APR_FNM_PATHNAME)) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   208
-		return (APR_FNM_NOMATCH);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   209
-	    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   210
-	    if (*string == '.' && (flags & APR_FNM_PERIOD) &&
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   211
-		(string == stringstart ||
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   212
-		 ((flags & APR_FNM_PATHNAME) && *(string - 1) == '/'))) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   213
-		return (APR_FNM_NOMATCH);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   214
-	    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   215
-	    ++string;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   216
-	    break;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   217
-	case '*':
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   218
-	    c = *pattern;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   219
-	    /* Collapse multiple stars. */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   220
-	    while (c == '*') {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   221
-		c = *++pattern;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   222
-	    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   223
-
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   224
-	    if (*string == '.' && (flags & APR_FNM_PERIOD) &&
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   225
-		(string == stringstart ||
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   226
-		 ((flags & APR_FNM_PATHNAME) && *(string - 1) == '/'))) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   227
-		return (APR_FNM_NOMATCH);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   228
-	    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   229
-
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   230
-	    /* Optimize for pattern with * at end or before /. */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   231
-	    if (c == EOS) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   232
-		if (flags & APR_FNM_PATHNAME) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   233
-		    return (strchr(string, '/') == NULL ? APR_SUCCESS : APR_FNM_NOMATCH);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   234
-		}
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   235
-		else {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   236
-		    return (APR_SUCCESS);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   237
-		}
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   238
-	    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   239
-	    else if (c == '/' && flags & APR_FNM_PATHNAME) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   240
-	        if ((string = strchr(string, '/')) == NULL) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   241
-		    return (APR_FNM_NOMATCH);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   242
-		}
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   243
-		break;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   244
-	    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   245
-
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   246
-	    /* General case, use recursion. */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   247
-	    while ((test = *string) != EOS) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   248
-	        if (!apr_fnmatch(pattern, string, flags & ~APR_FNM_PERIOD)) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   249
-		    return (APR_SUCCESS);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   250
-		}
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   251
-		if (test == '/' && flags & APR_FNM_PATHNAME) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   252
-		    break;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   253
-		}
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   254
-		++string;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   255
-	    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   256
-	    return (APR_FNM_NOMATCH);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   257
-	case '[':
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   258
-	    if (*string == EOS) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   259
-		return (APR_FNM_NOMATCH);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   260
-	    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   261
-	    if (*string == '/' && flags & APR_FNM_PATHNAME) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   262
-		return (APR_FNM_NOMATCH);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   263
-	    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   264
-	    if (*string == '.' && (flags & APR_FNM_PERIOD) &&
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   265
-		(string == stringstart ||
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   266
-		 ((flags & APR_FNM_PATHNAME) && *(string - 1) == '/'))) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   267
-	        return (APR_FNM_NOMATCH);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   268
-	    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   269
-	    if ((pattern = rangematch(pattern, *string, flags)) == NULL) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   270
-		return (APR_FNM_NOMATCH);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   271
-	    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   272
-	    ++string;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   273
-	    break;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   274
-	case '\\':
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   275
-	    if (!(flags & APR_FNM_NOESCAPE)) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   276
-		if ((c = *pattern++) == EOS) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   277
-		    c = '\\';
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   278
-		    --pattern;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   279
-		}
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   280
-	    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   281
-	    /* FALLTHROUGH */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   282
-	default:
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   283
-	    if (flags & APR_FNM_CASE_BLIND) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   284
-	        if (apr_tolower(c) != apr_tolower(*string)) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   285
-		    return (APR_FNM_NOMATCH);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   286
-		}
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   287
-	    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   288
-	    else if (c != *string) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   289
-	        return (APR_FNM_NOMATCH);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   290
-	    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   291
-	    string++;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   292
-	    break;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   293
-	}
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   294
-    /* NOTREACHED */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   295
+            ++*pattern;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   296
+        }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   297
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   298
+        /* NOT a properly balanced [expr] pattern; Rewind to test '[' literal */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   299
+        *pattern = mismatch;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   300
+        result = APR_FNM_NOMATCH;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   301
+    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   302
+    else if (**pattern == '?') {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   303
+        /* Optimize '?' match before unescaping **pattern */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   304
+        if (!**string || (slash && (**string == '/')))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   305
+            return APR_FNM_NOMATCH;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   306
+        result = 0;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   307
+        goto fnmatch_ch_success;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   308
     }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   309
+    else if (escape && (**pattern == '\\') && (*pattern)[1]) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   310
+        ++*pattern;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   311
+    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   312
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   313
+    /* XXX: handle locale/MBCS comparison, advance by the MBCS char width */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   314
+    if (**string == **pattern)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   315
+        result = 0;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   316
+    else if (nocase && (isupper(**string) || isupper(**pattern))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   317
+                    && (tolower(**string) == tolower(**pattern)))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   318
+        result = 0;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   319
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   320
+    /* Refuse to advance over trailing slash or nulls
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   321
+     */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   322
+    if (!**string || !**pattern || (slash && ((**string == '/') || (**pattern == '/'))))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   323
+        return result;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   324
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   325
+fnmatch_ch_success:
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   326
+    ++*pattern;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   327
+    ++*string;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   328
+    return result;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   329
 }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   330
 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   331
-static const char *rangematch(const char *pattern, int test, int flags)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   332
-{
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   333
-    int negate, ok;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   334
-    char c, c2;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   335
 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   336
-    /*
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   337
-     * A bracket expression starting with an unquoted circumflex
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   338
-     * character produces unspecified results (IEEE 1003.2-1992,
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   339
-     * 3.13.2).  This implementation treats it like '!', for
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   340
-     * consistency with the regular expression syntax.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   341
-     * J.T. Conklin ([email protected])
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   342
+APR_DECLARE(int) apr_fnmatch(const char *pattern, const char *string, int flags)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   343
+{
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   344
+    static const char dummystring[2] = {' ', 0};
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   345
+    const int escape = !(flags & APR_FNM_NOESCAPE);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   346
+    const int slash = !!(flags & APR_FNM_PATHNAME);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   347
+    const char *strendseg;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   348
+    const char *dummyptr;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   349
+    const char *matchptr;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   350
+    int wild;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   351
+    /* For '*' wild processing only; surpress 'used before initialization'
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   352
+     * warnings with dummy initialization values;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   353
      */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   354
-    if ((negate = (*pattern == '!' || *pattern == '^'))) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   355
-	++pattern;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   356
-    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   357
+    const char *strstartseg = NULL;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   358
+    const char *mismatch = NULL;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   359
+    int matchlen = 0;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   360
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   361
+    while (*pattern)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   362
+    {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   363
+        /* Match balanced slashes, starting a new segment pattern
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   364
+         */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   365
+        if (slash && escape && (*pattern == '\\') && (pattern[1] == '/'))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   366
+            ++pattern;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   367
+        if (slash && (*pattern == '/') && (*string == '/')) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   368
+            ++pattern;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   369
+            ++string;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   370
+        }            
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   371
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   372
+        /* At the beginning of each segment, validate leading period behavior.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   373
+         */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   374
+        if ((flags & APR_FNM_PERIOD) && (*string == '.'))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   375
+        {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   376
+            if (*pattern == '.')
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   377
+                ++pattern;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   378
+            else if (escape && (*pattern == '\\') && (pattern[1] == '.'))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   379
+                pattern += 2;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   380
+            else
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   381
+                return APR_FNM_NOMATCH;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   382
+            ++string;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   383
+        }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   384
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   385
+        /* Determine the end of string segment
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   386
+         *
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   387
+         * Presumes '/' character is unique, not composite in any MBCS encoding
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   388
+         */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   389
+        if (slash) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   390
+            strendseg = strchr(string, '/');
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   391
+            if (!strendseg)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   392
+                strendseg = strchr(string, '\0');
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   393
+        }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   394
+        else {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   395
+            strendseg = strchr(string, '\0');
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   396
+        }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   397
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   398
+        /* Allow pattern '*' to be consumed even with no remaining string to match
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   399
+         */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   400
+        while (*pattern && !(slash && ((*pattern == '/')
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   401
+                                       || (escape && (*pattern == '\\')
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   402
+                                                  && (pattern[1] == '/'))))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   403
+                        && ((string < strendseg)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   404
+                            || ((*pattern == '*') && (string == strendseg))))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   405
+        {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   406
+            /* Reduce groups of '*' and '?' to n '?' matches
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   407
+             * followed by one '*' test for simplicity
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   408
+             */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   409
+            for (wild = 0; ((*pattern == '*') || (*pattern == '?')); ++pattern)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   410
+            {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   411
+                if (*pattern == '*') {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   412
+                    wild = 1;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   413
+                }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   414
+                else if (string < strendseg) {  /* && (*pattern == '?') */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   415
+                    /* XXX: Advance 1 char for MBCS locale */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   416
+                    ++string;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   417
+                }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   418
+                else {  /* (string >= strendseg) && (*pattern == '?') */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   419
+                    return APR_FNM_NOMATCH;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   420
+                }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   421
+            }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   422
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   423
+            if (wild)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   424
+            {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   425
+                strstartseg = string;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   426
+                mismatch = pattern;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   427
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   428
+                /* Count fixed (non '*') char matches remaining in pattern
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   429
+                 * excluding '/' (or "\/") and '*'
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   430
+                 */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   431
+                for (matchptr = pattern, matchlen = 0; 1; ++matchlen)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   432
+                {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   433
+                    if ((*matchptr == '\0') 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   434
+                        || (slash && ((*matchptr == '/')
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   435
+                                      || (escape && (*matchptr == '\\')
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   436
+                                                 && (matchptr[1] == '/')))))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   437
+                    {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   438
+                        /* Compare precisely this many trailing string chars,
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   439
+                         * the resulting match needs no wildcard loop
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   440
+                         */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   441
+                        /* XXX: Adjust for MBCS */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   442
+                        if (string + matchlen > strendseg)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   443
+                            return APR_FNM_NOMATCH;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   444
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   445
+                        string = strendseg - matchlen;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   446
+                        wild = 0;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   447
+                        break;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   448
+                    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   449
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   450
+                    if (*matchptr == '*')
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   451
+                    {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   452
+                        /* Ensure at least this many trailing string chars remain
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   453
+                         * for the first comparison
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   454
+                         */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   455
+                        /* XXX: Adjust for MBCS */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   456
+                        if (string + matchlen > strendseg)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   457
+                            return APR_FNM_NOMATCH;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   458
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   459
+                        /* Begin first wild comparison at the current position */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   460
+                        break;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   461
+                    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   462
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   463
+                    /* Skip forward in pattern by a single character match
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   464
+                     * Use a dummy fnmatch_ch() test to count one "[range]" escape
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   465
+                     */ 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   466
+                    /* XXX: Adjust for MBCS */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   467
+                    if (escape && (*matchptr == '\\') && matchptr[1]) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   468
+                        matchptr += 2;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   469
+                    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   470
+                    else if (*matchptr == '[') {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   471
+                        dummyptr = dummystring;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   472
+                        fnmatch_ch(&matchptr, &dummyptr, flags);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   473
+                    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   474
+                    else {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   475
+                        ++matchptr;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   476
+                    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   477
+                }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   478
+            }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   479
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   480
+            /* Incrementally match string against the pattern
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   481
+             */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   482
+            while (*pattern && (string < strendseg))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   483
+            {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   484
+                /* Success; begin a new wild pattern search
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   485
+                 */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   486
+                if (*pattern == '*')
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   487
+                    break;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   488
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   489
+                if (slash && ((*string == '/') || (*pattern == '/')
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   490
+                                               || (escape && (*pattern == '\\')
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   491
+                                                   && (pattern[1] == '/'))))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   492
+                    break;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   493
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   494
+                /* Compare ch's (the pattern is advanced over "\/" to the '/',
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   495
+                 * but slashes will mismatch, and are not consumed)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   496
+                 */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   497
+                if (!fnmatch_ch(&pattern, &string, flags))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   498
+                    continue;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   499
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   500
+                /* Failed to match, loop against next char offset of string segment 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   501
+                 * until not enough string chars remain to match the fixed pattern
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   502
+                 */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   503
+                if (wild) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   504
+                    /* XXX: Advance 1 char for MBCS locale */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   505
+                    string = ++strstartseg;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   506
+                    if (string + matchlen > strendseg)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   507
+                        return APR_FNM_NOMATCH;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   508
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   509
+                    pattern = mismatch;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   510
+                    continue;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   511
+                }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   512
+                else
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   513
+                    return APR_FNM_NOMATCH;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   514
+            }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   515
+        }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   516
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   517
+        if (*string && (!slash || (*string != '/')))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   518
+            return APR_FNM_NOMATCH;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   519
 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   520
-    for (ok = 0; (c = *pattern++) != ']';) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   521
-        if (c == '\\' && !(flags & APR_FNM_NOESCAPE)) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   522
-	    c = *pattern++;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   523
-	}
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   524
-	if (c == EOS) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   525
-	    return (NULL);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   526
-	}
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   527
-	if (*pattern == '-' && (c2 = *(pattern + 1)) != EOS && c2 != ']') {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   528
-	    pattern += 2;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   529
-	    if (c2 == '\\' && !(flags & APR_FNM_NOESCAPE)) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   530
-		c2 = *pattern++;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   531
-	    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   532
-	    if (c2 == EOS) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   533
-		return (NULL);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   534
-	    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   535
-	    if ((c <= test && test <= c2)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   536
-		|| ((flags & APR_FNM_CASE_BLIND)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   537
-		    && ((apr_tolower(c) <= apr_tolower(test))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   538
-			&& (apr_tolower(test) <= apr_tolower(c2))))) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   539
-		ok = 1;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   540
-	    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   541
-	}
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   542
-	else if ((c == test)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   543
-		 || ((flags & APR_FNM_CASE_BLIND)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   544
-		     && (apr_tolower(c) == apr_tolower(test)))) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   545
-	    ok = 1;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   546
-	}
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   547
+        if (*pattern && (!slash || ((*pattern != '/')
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   548
+                                    && (!escape || (*pattern != '\\')
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   549
+                                                || (pattern[1] != '/')))))
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   550
+            return APR_FNM_NOMATCH;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   551
     }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   552
-    return (ok == negate ? NULL : pattern);
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   553
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   554
+    /* pattern is at EOS; if string is also, declare success
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   555
+     */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   556
+    if (!*string)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   557
+        return 0;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   558
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   559
+    /* pattern didn't match to the end of string */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   560
+    return APR_FNM_NOMATCH;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   561
 }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   562
 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   563
 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   564
-/* This function is an Apache addition */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   565
-/* return non-zero if pattern has any glob chars in it */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   566
+/* This function is an Apache addition
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   567
+ * return non-zero if pattern has any glob chars in it
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   568
+ * @bug Function does not distinguish for FNM_PATHNAME mode, which renders
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   569
+ * a false positive for test[/]this (which is not a range, but 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   570
+ * seperate test[ and ]this segments and no glob.)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   571
+ * @bug Function does not distinguish for non-FNM_ESCAPE mode.
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   572
+ * @bug Function does not parse []] correctly
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   573
+ * Solution may be to use fnmatch_ch() to walk the patterns?
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   574
+ */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   575
 APR_DECLARE(int) apr_fnmatch_test(const char *pattern)
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   576
 {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   577
     int nesting;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   578
 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   579
     nesting = 0;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   580
     while (*pattern) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   581
-	switch (*pattern) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   582
-	case '?':
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   583
-	case '*':
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   584
-	    return 1;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   585
-
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   586
-	case '\\':
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   587
-	    if (*++pattern == '\0') {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   588
-		return 0;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   589
-	    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   590
-	    break;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   591
-
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   592
-	case '[':	/* '[' is only a glob if it has a matching ']' */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   593
-	    ++nesting;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   594
-	    break;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   595
-
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   596
-	case ']':
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   597
-	    if (nesting) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   598
-		return 1;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   599
-	    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   600
-	    break;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   601
-	}
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   602
-	++pattern;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   603
-    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   604
+        switch (*pattern) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   605
+        case '?':
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   606
+        case '*':
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   607
+            return 1;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   608
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   609
+        case '\\':
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   610
+            if (*++pattern == '\0') {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   611
+                return 0;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   612
+            }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   613
+            break;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   614
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   615
+        case '[':         /* '[' is only a glob if it has a matching ']' */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   616
+            ++nesting;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   617
+            break;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   618
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   619
+        case ']':
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   620
+            if (nesting) {
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   621
+                return 1;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   622
+            }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   623
+            break;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   624
+        }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   625
+        ++pattern;    }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   626
     return 0;
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   627
 }
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   628
 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   629
+
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   630
 /* Find all files matching the specified pattern */
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   631
 APR_DECLARE(apr_status_t) apr_match_glob(const char *pattern, 
b4bf6ad34a2d 7049240 Problem with utility/apache
Petr Sumbera <petr.sumbera@oracle.com>
parents:
diff changeset
   632
                                          apr_array_header_t **result,