diff --git a/src/builtin_functions.c b/src/builtin_functions.c index 861b5b137e155ec318a28b11bd6f1b94e5142578..20262c6737acd7265faeaa772c8e4cff7fdaf79b 100644 --- a/src/builtin_functions.c +++ b/src/builtin_functions.c @@ -5915,9 +5915,48 @@ static void f_parse_format(INT32 args) push_array(a); } +/* Common case: both strings are 8bit. */ +static int does_match_88( const unsigned char *s, int j, int sl, + const unsigned char *m, int i, int ml) +{ + for (; i<ml; i++) + { + switch (m[i]) + { + case '?': + if(j++>=sl) return 0; + break; + + case '*': + while(m[i] == '*' && i<ml ) + i++; + while( m[i] == '?' && i<ml && j<sl) + { + i++; + j++; + } + if (i==ml) return 1; + + for (;j<sl;j++) + { + if( s[j] == m[i] && + does_match_88(s,j,sl,m,i,ml)) + return 1; + } + return 0; + + default: + if(j>=sl || m[i] != s[j] ) + return 0; + j++; + } + } + return j==sl; +} + /* Check if the string s[0..len[ matches the glob m[0..mlen[ */ -static int does_match(struct pike_string *s,int j, +static int does_match_xx(struct pike_string *s,int j, struct pike_string *m,int i) { for (; i<m->len; i++) @@ -5933,7 +5972,7 @@ static int does_match(struct pike_string *s,int j, if (i==m->len) return 1; /* slut */ for (;j<s->len;j++) - if (does_match(s,j,m,i)) + if (does_match_xx(s,j,m,i)) return 1; return 0; @@ -5947,6 +5986,14 @@ static int does_match(struct pike_string *s,int j, return j==s->len; } +static int does_match(struct pike_string *s,int j, + struct pike_string *m,int i) +{ + if( s->size_shift + m->size_shift == 0 ) + return does_match_88(s->str, j, s->len, + m->str, i, m->len); + return does_match_xx( s,j,m,i ); +} /*! @decl int(0..1) glob(string glob, string str) *! @decl int(0..1) glob(array(string) glob, string str) *! @decl array(string) glob(string glob, array(string) str)