added base64 en-/decoder and keypacker
[NextIRCd.git] / src / tools.c
1 /* tools.c - NextIRCd
2  * Copyright (C) 2012-2013  Philipp Kreil (pk910)
3  * 
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  * 
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  * 
14  * You should have received a copy of the GNU General Public License 
15  * along with this program. If not, see <http://www.gnu.org/licenses/>. 
16  */
17
18 #include <stdlib.h>
19 #include <ctype.h>
20 #include "tools.h"
21
22 int stricmp (const char *s1, const char *s2) {
23     return stricmplen(s1, s2, -1);
24 }
25
26 int stricmplen(const char *s1, const char *s2, int len) {
27     if (s1 == NULL) 
28         return (s2 == NULL ? 0 : -(*s2));
29     if (s2 == NULL) 
30         return *s1;
31     char c1, c2;
32     int i = 0;
33     while ((c1 = tolower(*s1)) == (c2 = tolower(*s2))) {
34         if (*s1 == '\0') 
35             break;
36         i++;
37         s1++; 
38         s2++;
39         if(len != -1 && i == len) break;
40     }
41     return c1 - c2;
42 }
43
44 /* copied from IRCU 2.10.12 match.c */
45 /*
46  * Compare if a given string (name) matches the given
47  * mask (which can contain wild cards: '*' - match any
48  * number of chars, '?' - match any single character.
49  *
50  * return  0, if match
51  *         1, if no match
52  *
53  *  Originally by Douglas A Lewis (dalewis@acsu.buffalo.edu)
54  *  Rewritten by Timothy Vogelsang (netski), net@astrolink.org
55  */
56 int match(const char *mask, const char *name)
57 {
58   const char *m = mask, *n = name;
59   const char *m_tmp = mask, *n_tmp = name;
60   int star_p;
61
62   for (;;) switch (*m) {
63   case '\0':
64     if (!*n)
65       return 0;
66   backtrack:
67     if (m_tmp == mask)
68       return 1;
69     m = m_tmp;
70     n = ++n_tmp;
71     if (*n == '\0')
72       return 1;
73     break;
74   case '\\':
75     m++;
76     /* allow escaping to force capitalization */
77     if (*m++ != *n++)
78       goto backtrack;
79     break;
80   case '*': case '?':
81     for (star_p = 0; ; m++) {
82       if (*m == '*')
83         star_p = 1;
84       else if (*m == '?') {
85         if (!*n++)
86           goto backtrack;
87       } else break;
88     }
89     if (star_p) {
90       if (!*m)
91         return 0;
92       else if (*m == '\\') {
93         m_tmp = ++m;
94         if (!*m)
95           return 1;
96         for (n_tmp = n; *n && *n != *m; n++) ;
97       } else {
98         m_tmp = m;
99         for (n_tmp = n; *n && tolower(*n) != tolower(*m); n++) ;
100       }
101     }
102     /* and fall through */
103   default:
104     if (!*n)
105       return *m != '\0';
106     if (tolower(*m) != tolower(*n))
107       goto backtrack;
108     m++;
109     n++;
110     break;
111   }
112 }