added HandleInfoHandler.c with lookup_authname()
[NeonServV5.git] / tools.c
1 #include "tools.h"
2
3 /* copied from IRCU 2.10.12 match.c */
4 /*
5  * Compare if a given string (name) matches the given
6  * mask (which can contain wild cards: '*' - match any
7  * number of chars, '?' - match any single character.
8  *
9  * return  0, if match
10  *         1, if no match
11  *
12  *  Originally by Douglas A Lewis (dalewis@acsu.buffalo.edu)
13  *  Rewritten by Timothy Vogelsang (netski), net@astrolink.org
14  */
15 int match(const char *mask, const char *name)
16 {
17   const char *m = mask, *n = name;
18   const char *m_tmp = mask, *n_tmp = name;
19   int star_p;
20
21   for (;;) switch (*m) {
22   case '\0':
23     if (!*n)
24       return 0;
25   backtrack:
26     if (m_tmp == mask)
27       return 1;
28     m = m_tmp;
29     n = ++n_tmp;
30     if (*n == '\0')
31       return 1;
32     break;
33   case '\\':
34     m++;
35     /* allow escaping to force capitalization */
36     if (*m++ != *n++)
37       goto backtrack;
38     break;
39   case '*': case '?':
40     for (star_p = 0; ; m++) {
41       if (*m == '*')
42         star_p = 1;
43       else if (*m == '?') {
44         if (!*n++)
45           goto backtrack;
46       } else break;
47     }
48     if (star_p) {
49       if (!*m)
50         return 0;
51       else if (*m == '\\') {
52         m_tmp = ++m;
53         if (!*m)
54           return 1;
55         for (n_tmp = n; *n && *n != *m; n++) ;
56       } else {
57         m_tmp = m;
58         for (n_tmp = n; *n && ToLower(*n) != ToLower(*m); n++) ;
59       }
60     }
61     /* and fall through */
62   default:
63     if (!*n)
64       return *m != '\0';
65     if (ToLower(*m) != ToLower(*n))
66       goto backtrack;
67     m++;
68     n++;
69     break;
70   }
71 }