LCOV - code coverage report
Current view: top level - source/lib - regex.cpp (source / functions) Hit Total Coverage
Test: 0 A.D. test coverage report Lines: 22 23 95.7 %
Date: 2023-01-19 00:18:29 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /* Copyright (C) 2020 Wildfire Games.
       2             :  *
       3             :  * Permission is hereby granted, free of charge, to any person obtaining
       4             :  * a copy of this software and associated documentation files (the
       5             :  * "Software"), to deal in the Software without restriction, including
       6             :  * without limitation the rights to use, copy, modify, merge, publish,
       7             :  * distribute, sublicense, and/or sell copies of the Software, and to
       8             :  * permit persons to whom the Software is furnished to do so, subject to
       9             :  * the following conditions:
      10             :  *
      11             :  * The above copyright notice and this permission notice shall be included
      12             :  * in all copies or substantial portions of the Software.
      13             :  *
      14             :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
      15             :  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
      16             :  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
      17             :  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
      18             :  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
      19             :  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
      20             :  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
      21             :  */
      22             : 
      23             : // minimal regex implementation
      24             : 
      25             : #include "precompiled.h"
      26             : 
      27             : #include <cwctype>
      28             : 
      29        1907 : int match_wildcard(const wchar_t* s, const wchar_t* w)
      30             : {
      31        1907 :     if(!w)
      32           1 :         return 1;
      33             : 
      34             :     // saved position in both strings, used to expand '*':
      35             :     // s2 is advanced until match.
      36             :     // initially 0 - we abort on mismatch before the first '*'.
      37        1906 :     const wchar_t* s2 = 0;
      38        1906 :     const wchar_t* w2 = 0;
      39             : 
      40       55506 :     while(*s)
      41             :     {
      42       26806 :         const wchar_t wc = *w;
      43       26806 :         if(wc == '*')
      44             :         {
      45             :             // wildcard string ended with * => match.
      46        1899 :             if(*++w == '\0')
      47           4 :                 return 1;
      48             : 
      49        1895 :             w2 = w;
      50        1895 :             s2 = s+1;
      51             :         }
      52             :         // match one character
      53       24907 :         else if(towupper(wc) == towupper(*s) || wc == '?')
      54             :         {
      55        6220 :             w++;
      56        6220 :             s++;
      57             :         }
      58             :         // mismatched character
      59             :         else
      60             :         {
      61             :             // no '*' found yet => mismatch.
      62       18687 :             if(!s2)
      63           2 :                 return 0;
      64             : 
      65             :             // resume at previous position+1
      66       18685 :             w = w2;
      67       18685 :             s = s2++;
      68             :         }
      69             :     }
      70             : 
      71             :     // strip trailing * in wildcard string
      72        1900 :     while(*w == '*')
      73           0 :         w++;
      74             : 
      75        1900 :     return (*w == '\0');
      76           3 : }

Generated by: LCOV version 1.13