- case '\0':
- if (!*n)
- return 1;
- backtrack:
- if (m_tmp == mask)
- return 0;
- m = m_tmp;
- n = ++n_tmp;
- break;
- case '\\':
- m++;
- /* allow escaping to force capitalization */
- if (*m++ != *n++)
- goto backtrack;
- break;
- case '*':
- case '?':
- for (star_p = 0;; m++)
- {
- if (*m == '*')
- star_p = 1;
- else if (*m == '?')
- {
- if (!*n++)
- goto backtrack;
- }
- else
- break;
- }
- if (star_p)
- {
- if (!*m)
- return 1;
- else if (*m == '\\')
- {
- m_tmp = ++m;
- if (!*m)
- return 0;
- for (n_tmp = n; *n && *n != *m; n++);
- }
- else if (*m == '#')
- {
- m_tmp = m;
- for (n_tmp = n; *n && !IsDigit(*n); n++);
- }
- else if (*m == '@')
- {
- m_tmp = m;
- for (n_tmp = n; *n && !IsLetter(*n); n++);
- }
- else
- {
- m_tmp = m;
- for (n_tmp = n; *n && ToLower(*n) != ToLower(*m); n++);
- }
- }
- /* and fall through */
- default:
- if (!*n)
- return (*m != '\0' ? 0 : 1);
- if (*m == '#')
- {
- if (!IsDigit(*n))
- goto backtrack;
- }
- else if (*m == '@')
- {
- if (!IsLetter(*n))
- goto backtrack;
- }
- else if (ToLower(*m) != ToLower(*n))
- goto backtrack;
- m++;
- n++;
- break;
+ m++;
+ quote = 1;
+ continue;
+ }
+ if(!quote && *m == '*')
+ {
+ /*
+ * XXX - shouldn't need to spin here, the mask should have been
+ * collapsed before match is called
+ */
+ while(*m == '*')
+ m++;
+
+ wild = 1;
+ ma = m;
+ na = n;
+
+ if(*m == '\\')
+ {
+ m++;
+ /* This means it is an invalid mask -A1kmm. */
+ if(!*m)
+ return 0;
+ quote++;
+ continue;
+ }
+ }
+
+ if(!*m)
+ {
+ if(!*n)
+ return 1;
+ if(quote)
+ return 0;
+ for(m--; (m > (const unsigned char *)mask) && (*m == '?'); m--);;
+
+ if(*m == '*' && (m > (const unsigned char *)mask))
+ return 1;
+ if(!wild)
+ return 0;
+ m = ma;
+ n = ++na;
+ }
+ else if(!*n)
+ {
+ /*
+ * XXX - shouldn't need to spin here, the mask should have been
+ * collapsed before match is called
+ */
+ if(quote)
+ return 0;
+ while(*m == '*')
+ m++;
+ return (*m == 0);
+ }
+
+ if(quote)
+ match1 = *m == 's' ? *n == ' ' : ToLower(*m) == ToLower(*n);
+ else if(*m == '?')
+ match1 = 1;
+ else if(*m == '@')
+ match1 = IsLetter(*n);
+ else if(*m == '#')
+ match1 = IsDigit(*n);
+ else
+ match1 = ToLower(*m) == ToLower(*n);
+ if(match1)
+ {
+ if(*m)
+ m++;
+ if(*n)
+ n++;
+ }
+ else
+ {
+ if(!wild)
+ return 0;
+ m = ma;
+ n = ++na;