ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/match.c
Revision: 1652
Committed: Tue Nov 13 20:28:53 2012 UTC (13 years, 8 months ago) by michael
Content type: text/x-csrc
File size: 22173 byte(s)
Log Message:
- changed match() polarity. match() now returns 0 on match and 1 on non-match
  This cleans up several places where function pointers of different matching
  functions like irccmp/strcmp/match are passed to other functions.
- added improved collapse() to match.c

File Contents

# User Rev Content
1 adx 30 /************************************************************************
2     * IRC - Internet Relay Chat, src/match.c
3     * Copyright (C) 1990 Jarkko Oikarinen
4     *
5     * This program is free software; you can redistribute it and/or modify
6     * it under the terms of the GNU General Public License as published by
7     * the Free Software Foundation; either version 1, or (at your option)
8     * any later version.
9     *
10     * This program is distributed in the hope that it will be useful,
11     * but WITHOUT ANY WARRANTY; without even the implied warranty of
12     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13     * GNU General Public License for more details.
14     *
15     * You should have received a copy of the GNU General Public License
16     * along with this program; if not, write to the Free Software
17     * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18     *
19 knight 31 * $Id$
20 adx 30 *
21     */
22    
23     #include "stdinc.h"
24     #include "irc_string.h"
25     #include "client.h"
26     #include "ircd.h"
27    
28     /* Fix "statement not reached" warnings on Sun WorkShop C */
29     #ifdef __SUNPRO_C
30     # pragma error_messages(off, E_STATEMENT_NOT_REACHED)
31     #endif
32    
33     /* match()
34     *
35     * Compare if a given string (name) matches the given
36     * mask (which can contain wild cards: '*' - match any
37     * number of chars, '?' - match any single character.
38     *
39     * return 1, if match
40     * 0, if no match
41     *
42     * Originally by Douglas A Lewis (dalewis@acsu.buffalo.edu)
43     */
44     int
45     match(const char *mask, const char *name)
46     {
47 michael 1298 const unsigned char *m = (const unsigned char *)mask;
48     const unsigned char *n = (const unsigned char *)name;
49     const unsigned char *ma = NULL;
50     const unsigned char *na = (const unsigned char *)name;
51 adx 30
52     assert(mask != NULL);
53     assert(name != NULL);
54    
55     while (1)
56     {
57     if (*m == '*')
58     {
59     while (*m == '*')
60     m++;
61     ma = m;
62     na = n;
63     }
64    
65     if (!*m)
66     {
67     if (!*n)
68 michael 1652 return 0;
69     if (!ma)
70 adx 30 return 1;
71 michael 1298 for (m--; (m > (const unsigned char *)mask) && (*m == '?'); m--)
72 adx 30 ;
73     if (*m == '*')
74 michael 1652 return 0;
75 adx 30 m = ma;
76     n = ++na;
77     }
78     else if (!*n)
79     {
80     while (*m == '*')
81     m++;
82 michael 1652 return *m != '\0';
83 adx 30 }
84    
85     if (ToLower(*m) != ToLower(*n) && *m != '?' && (*m != '#' || !IsDigit(*n)))
86     {
87     if (!ma)
88 michael 1652 return 1;
89 adx 30 m = ma;
90     n = ++na;
91     }
92     else
93     m++, n++;
94     }
95    
96 michael 1652 return 1;
97 adx 30 }
98    
99     /* match_esc()
100     *
101     * The match() function with support for escaping characters such
102     * as '*' and '?'
103     */
104     int
105     match_esc(const char *mask, const char *name)
106     {
107 michael 1298 const unsigned char *m = (const unsigned char *)mask;
108     const unsigned char *n = (const unsigned char *)name;
109 adx 30 const unsigned char *ma = NULL;
110 michael 1298 const unsigned char *na = (const unsigned char *)name;
111 adx 30
112     assert(mask != NULL);
113     assert(name != NULL);
114    
115     while (1)
116     {
117     if (*m == '*')
118     {
119     while (*m == '*')
120     m++;
121     ma = m;
122     na = n;
123     }
124    
125     if (!*m)
126     {
127     if (!*n)
128 michael 1652 return 0;
129     if (!ma)
130 adx 30 return 1;
131 michael 1298 for (m--; (m > (const unsigned char *)mask) && (*m == '?'); m--)
132 adx 30 ;
133     if (*m == '*')
134 michael 1652 return 0;
135 adx 30 m = ma;
136     n = ++na;
137     }
138     else if (!*n)
139     {
140     while (*m == '*')
141     m++;
142 michael 1652 return *m != '\0';
143 adx 30 }
144    
145     if (*m != '?' && (*m != '#' || IsDigit(*n)))
146     {
147     if (*m == '\\')
148     if (!*++m)
149 michael 1652 return 1;
150 adx 30 if (ToLower(*m) != ToLower(*n))
151     {
152     if (!ma)
153 michael 1652 return 1;
154 adx 30 m = ma;
155     n = ++na;
156     }
157     else
158     m++, n++;
159     }
160     else
161     m++, n++;
162     }
163    
164 michael 1652 return 1;
165 adx 30 }
166    
167     /* match_chan()
168     *
169     * The match_esc() function doing channel prefix auto-escape,
170     * ie. mask: #blah*blah is seen like \#blah*blah
171     */
172     int
173     match_chan(const char *mask, const char *name)
174     {
175 michael 484 if (*mask == '#')
176     {
177     if (*name != '#')
178     return 0;
179     ++name, ++mask;
180     }
181    
182 michael 1652 return match_esc(mask, name) == 0;
183 adx 30 }
184    
185 michael 1652 /*
186     * collapse()
187     * Collapse a pattern string into minimal components.
188     * This particular version is "in place", so that it changes the pattern
189     * which is to be reduced to a "minimal" size.
190 adx 30 *
191 michael 1652 * (C) Carlo Wood - 6 Oct 1998
192     * Speedup rewrite by Andrea Cocito, December 1998.
193     * Note that this new optimized algorithm can *only* work in place.
194 adx 30 */
195 michael 1652
196     /*! \brief Collapse a mask string to remove redundancies.
197     * Specifically, it replaces a sequence of '*' followed by additional
198     * '*' or '?' with the same number of '?'s as the input, followed by
199     * one '*'. This minimizes useless backtracking when matching later.
200     * \param mask Mask string to collapse.
201     * \return Pointer to the start of the string.
202     */
203 adx 30 char *
204 michael 1652 collapse(char *mask)
205 adx 30 {
206 michael 1652 int star = 0;
207     char *m = mask;
208     char *b = NULL;
209 adx 30
210 michael 1652 if (m)
211 adx 30 {
212 michael 1652 do
213     {
214     if ((*m == '*') && ((m[1] == '*') || (m[1] == '?')))
215     {
216     b = m;
217 adx 30
218 michael 1652 do
219     {
220     if (*m == '*')
221     star = 1;
222     else
223     {
224     if (star && (*m != '?'))
225     {
226     *b++ = '*';
227     star = 0;
228     }
229 adx 30
230 michael 1652 *b++ = *m;
231 adx 30
232 michael 1652 if ((*m == '\\') && ((m[1] == '*') || (m[1] == '?')))
233     *b++ = *++m;
234     }
235     } while (*m++);
236 adx 30
237 michael 1652 break;
238     }
239     else
240     {
241     if ((*m == '\\') && ((m[1] == '*') || (m[1] == '?')))
242     m++;
243     }
244     } while (*m++);
245 adx 30 }
246    
247 michael 1652 return mask;
248 adx 30 }
249    
250     /*
251     * irccmp - case insensitive comparison of two 0 terminated strings.
252     *
253     * returns 0, if s1 equal to s2
254     * 1, if not
255     */
256     int
257     irccmp(const char *s1, const char *s2)
258     {
259 michael 1298 const unsigned char *str1 = (const unsigned char *)s1;
260     const unsigned char *str2 = (const unsigned char *)s2;
261 adx 30
262     assert(s1 != NULL);
263     assert(s2 != NULL);
264    
265 michael 1530 for (; ToUpper(*str1) == ToUpper(*str2); ++str1, ++str2)
266 adx 30 if (*str1 == '\0')
267     return 0;
268 michael 1298
269 adx 30 return 1;
270     }
271    
272     int
273 michael 1350 ircncmp(const char *s1, const char *s2, size_t n)
274 adx 30 {
275 michael 1350 const unsigned char *str1 = (const unsigned char *)s1;
276     const unsigned char *str2 = (const unsigned char *)s2;
277 adx 30
278     assert(s1 != NULL);
279     assert(s2 != NULL);
280 michael 1530 assert(n > 0);
281 adx 30
282 michael 1350 if (n == 0)
283     return 0;
284    
285 michael 1530 for (; ToUpper(*str1) == ToUpper(*str2); ++str1, ++str2)
286     if (--n == 0 || *str1 == '\0')
287 adx 30 return 0;
288 michael 1350
289     return 1;
290 adx 30 }
291    
292     const unsigned char ToLowerTab[] = {
293     0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa,
294     0xb, 0xc, 0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14,
295     0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
296     0x1e, 0x1f,
297     ' ', '!', '"', '#', '$', '%', '&', 0x27, '(', ')',
298     '*', '+', ',', '-', '.', '/',
299     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
300     ':', ';', '<', '=', '>', '?',
301     '@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
302     'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
303     't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
304     '_',
305     '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
306     'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
307     't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
308     0x7f,
309     0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
310     0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
311     0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
312     0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
313     0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9,
314     0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
315     0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9,
316     0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
317     0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9,
318     0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
319     0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
320     0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
321     0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
322     0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
323     0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
324     0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
325     };
326    
327     const unsigned char ToUpperTab[] = {
328     0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa,
329     0xb, 0xc, 0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14,
330     0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
331     0x1e, 0x1f,
332     ' ', '!', '"', '#', '$', '%', '&', 0x27, '(', ')',
333     '*', '+', ',', '-', '.', '/',
334     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
335     ':', ';', '<', '=', '>', '?',
336     '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
337     'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
338     'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^',
339     0x5f,
340     '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
341     'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
342     'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^',
343     0x7f,
344     0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
345     0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
346     0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
347     0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
348     0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9,
349     0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
350     0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9,
351     0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
352     0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9,
353     0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
354     0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
355     0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
356     0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
357     0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
358     0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
359     0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
360     };
361    
362     /*
363     * CharAttrs table
364     *
365     * NOTE: RFC 1459 sez: anything but a ^G, comma, or space is allowed
366     * for channel names
367     */
368     const unsigned int CharAttrs[] = {
369     /* 0 */ CNTRL_C,
370 db 633 /* 1 */ CNTRL_C|CHAN_C|VCHAN_C|NONEOS_C,
371 db 635 /* 2 */ CNTRL_C|CHAN_C|NONEOS_C,
372     /* 3 */ CNTRL_C|CHAN_C|NONEOS_C,
373 db 633 /* 4 */ CNTRL_C|CHAN_C|VCHAN_C|NONEOS_C,
374     /* 5 */ CNTRL_C|CHAN_C|VCHAN_C|NONEOS_C,
375     /* 6 */ CNTRL_C|CHAN_C|VCHAN_C|NONEOS_C,
376 adx 30 /* 7 BEL */ CNTRL_C|NONEOS_C,
377 db 633 /* 8 \b */ CNTRL_C|CHAN_C|VCHAN_C|NONEOS_C,
378     /* 9 \t */ CNTRL_C|SPACE_C|CHAN_C|VCHAN_C|NONEOS_C,
379     /* 10 \n */ CNTRL_C|SPACE_C|CHAN_C|VCHAN_C|NONEOS_C|EOL_C,
380     /* 11 \v */ CNTRL_C|SPACE_C|CHAN_C|VCHAN_C|NONEOS_C,
381     /* 12 \f */ CNTRL_C|SPACE_C|CHAN_C|VCHAN_C|NONEOS_C,
382     /* 13 \r */ CNTRL_C|SPACE_C|CHAN_C|VCHAN_C|NONEOS_C|EOL_C,
383     /* 14 */ CNTRL_C|CHAN_C|VCHAN_C|NONEOS_C,
384 adx 637 /* 15 */ CNTRL_C|CHAN_C|NONEOS_C,
385 db 633 /* 16 */ CNTRL_C|CHAN_C|VCHAN_C|NONEOS_C,
386     /* 17 */ CNTRL_C|CHAN_C|VCHAN_C|NONEOS_C,
387     /* 18 */ CNTRL_C|CHAN_C|VCHAN_C|NONEOS_C,
388     /* 19 */ CNTRL_C|CHAN_C|VCHAN_C|NONEOS_C,
389     /* 20 */ CNTRL_C|CHAN_C|VCHAN_C|NONEOS_C,
390     /* 21 */ CNTRL_C|CHAN_C|VCHAN_C|NONEOS_C,
391 db 635 /* 22 */ CNTRL_C|CHAN_C|NONEOS_C,
392 db 633 /* 23 */ CNTRL_C|CHAN_C|VCHAN_C|NONEOS_C,
393     /* 24 */ CNTRL_C|CHAN_C|VCHAN_C|NONEOS_C,
394     /* 25 */ CNTRL_C|CHAN_C|VCHAN_C|NONEOS_C,
395     /* 26 */ CNTRL_C|CHAN_C|VCHAN_C|NONEOS_C,
396     /* 27 */ CNTRL_C|CHAN_C|VCHAN_C|NONEOS_C,
397     /* 28 */ CNTRL_C|CHAN_C|VCHAN_C|NONEOS_C,
398 michael 1424 /* 29 */ CNTRL_C|CHAN_C|NONEOS_C,
399 db 633 /* 30 */ CNTRL_C|CHAN_C|VCHAN_C|NONEOS_C,
400 db 635 /* 31 */ CNTRL_C|CHAN_C|NONEOS_C,
401 adx 30 /* SP */ PRINT_C|SPACE_C,
402 db 633 /* ! */ PRINT_C|KWILD_C|CHAN_C|VCHAN_C|NONEOS_C,
403     /* " */ PRINT_C|CHAN_C|VCHAN_C|NONEOS_C,
404     /* # */ PRINT_C|KWILD_C|MWILD_C|CHANPFX_C|CHAN_C|VCHAN_C|NONEOS_C,
405     /* $ */ PRINT_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C,
406     /* % */ PRINT_C|CHAN_C|VCHAN_C|NONEOS_C,
407 michael 1474 /* & */ PRINT_C|CHAN_C|VCHAN_C|NONEOS_C,
408 db 633 /* ' */ PRINT_C|CHAN_C|VCHAN_C|NONEOS_C,
409     /* ( */ PRINT_C|CHAN_C|VCHAN_C|NONEOS_C,
410     /* ) */ PRINT_C|CHAN_C|VCHAN_C|NONEOS_C,
411     /* * */ PRINT_C|KWILD_C|MWILD_C|CHAN_C|VCHAN_C|NONEOS_C|SERV_C,
412     /* + */ PRINT_C|CHAN_C|VCHAN_C|NONEOS_C,
413 adx 30 /* , */ PRINT_C|NONEOS_C,
414 db 633 /* - */ PRINT_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
415     /* . */ PRINT_C|KWILD_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C|SERV_C,
416     /* / */ PRINT_C|CHAN_C|VCHAN_C|NONEOS_C,
417     /* 0 */ PRINT_C|DIGIT_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
418     /* 1 */ PRINT_C|DIGIT_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
419     /* 2 */ PRINT_C|DIGIT_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
420     /* 3 */ PRINT_C|DIGIT_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
421     /* 4 */ PRINT_C|DIGIT_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
422     /* 5 */ PRINT_C|DIGIT_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
423     /* 6 */ PRINT_C|DIGIT_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
424     /* 7 */ PRINT_C|DIGIT_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
425     /* 8 */ PRINT_C|DIGIT_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
426     /* 9 */ PRINT_C|DIGIT_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
427     /* : */ PRINT_C|KWILD_C|CHAN_C|VCHAN_C|NONEOS_C|HOST_C,
428     /* ; */ PRINT_C|CHAN_C|VCHAN_C|NONEOS_C,
429     /* < */ PRINT_C|CHAN_C|VCHAN_C|NONEOS_C,
430     /* = */ PRINT_C|CHAN_C|VCHAN_C|NONEOS_C,
431     /* > */ PRINT_C|CHAN_C|VCHAN_C|NONEOS_C,
432     /* ? */ PRINT_C|KWILD_C|MWILD_C|CHAN_C|VCHAN_C|NONEOS_C,
433     /* @ */ PRINT_C|KWILD_C|CHAN_C|VCHAN_C|NONEOS_C,
434     /* A */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
435     /* B */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
436     /* C */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
437     /* D */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
438     /* E */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
439     /* F */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
440     /* G */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
441     /* H */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
442     /* I */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
443     /* J */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
444     /* K */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
445     /* L */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
446     /* M */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
447     /* N */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
448     /* O */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
449     /* P */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
450     /* Q */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
451     /* R */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
452     /* S */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
453     /* T */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
454     /* U */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
455     /* V */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
456     /* W */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
457     /* X */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
458     /* Y */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
459     /* Z */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
460     /* [ */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C,
461     /* \ */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C,
462     /* ] */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C,
463     /* ^ */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C,
464     /* _ */ PRINT_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C,
465     /* ` */ PRINT_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C,
466     /* a */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
467     /* b */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
468     /* c */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
469     /* d */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
470     /* e */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
471     /* f */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
472     /* g */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
473     /* h */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
474     /* i */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
475     /* j */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
476     /* k */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
477     /* l */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
478     /* m */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
479     /* n */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
480     /* o */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
481     /* p */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
482     /* q */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
483     /* r */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
484     /* s */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
485     /* t */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
486     /* u */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
487     /* v */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
488     /* w */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
489     /* x */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
490     /* y */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
491     /* z */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C|HOST_C,
492     /* { */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C,
493     /* | */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C,
494     /* } */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C,
495     /* ~ */ PRINT_C|ALPHA_C|CHAN_C|VCHAN_C|NONEOS_C|USER_C,
496     /* del */ CHAN_C|VCHAN_C|NONEOS_C,
497     /* 0x80 */ CHAN_C|VCHAN_C|NONEOS_C,
498     /* 0x81 */ CHAN_C|VCHAN_C|NONEOS_C,
499     /* 0x82 */ CHAN_C|VCHAN_C|NONEOS_C,
500     /* 0x83 */ CHAN_C|VCHAN_C|NONEOS_C,
501     /* 0x84 */ CHAN_C|VCHAN_C|NONEOS_C,
502     /* 0x85 */ CHAN_C|VCHAN_C|NONEOS_C,
503     /* 0x86 */ CHAN_C|VCHAN_C|NONEOS_C,
504     /* 0x87 */ CHAN_C|VCHAN_C|NONEOS_C,
505     /* 0x88 */ CHAN_C|VCHAN_C|NONEOS_C,
506     /* 0x89 */ CHAN_C|VCHAN_C|NONEOS_C,
507     /* 0x8A */ CHAN_C|VCHAN_C|NONEOS_C,
508     /* 0x8B */ CHAN_C|VCHAN_C|NONEOS_C,
509     /* 0x8C */ CHAN_C|VCHAN_C|NONEOS_C,
510     /* 0x8D */ CHAN_C|VCHAN_C|NONEOS_C,
511     /* 0x8E */ CHAN_C|VCHAN_C|NONEOS_C,
512     /* 0x8F */ CHAN_C|VCHAN_C|NONEOS_C,
513     /* 0x90 */ CHAN_C|VCHAN_C|NONEOS_C,
514     /* 0x91 */ CHAN_C|VCHAN_C|NONEOS_C,
515     /* 0x92 */ CHAN_C|VCHAN_C|NONEOS_C,
516     /* 0x93 */ CHAN_C|VCHAN_C|NONEOS_C,
517     /* 0x94 */ CHAN_C|VCHAN_C|NONEOS_C,
518     /* 0x95 */ CHAN_C|VCHAN_C|NONEOS_C,
519     /* 0x96 */ CHAN_C|VCHAN_C|NONEOS_C,
520     /* 0x97 */ CHAN_C|VCHAN_C|NONEOS_C,
521     /* 0x98 */ CHAN_C|VCHAN_C|NONEOS_C,
522     /* 0x99 */ CHAN_C|VCHAN_C|NONEOS_C,
523     /* 0x9A */ CHAN_C|VCHAN_C|NONEOS_C,
524     /* 0x9B */ CHAN_C|VCHAN_C|NONEOS_C,
525     /* 0x9C */ CHAN_C|VCHAN_C|NONEOS_C,
526     /* 0x9D */ CHAN_C|VCHAN_C|NONEOS_C,
527     /* 0x9E */ CHAN_C|VCHAN_C|NONEOS_C,
528     /* 0x9F */ CHAN_C|VCHAN_C|NONEOS_C,
529 db 635 /* 0xA0 */ CHAN_C|NONEOS_C,
530 db 633 /* 0xA1 */ CHAN_C|VCHAN_C|NONEOS_C,
531     /* 0xA2 */ CHAN_C|VCHAN_C|NONEOS_C,
532     /* 0xA3 */ CHAN_C|VCHAN_C|NONEOS_C,
533     /* 0xA4 */ CHAN_C|VCHAN_C|NONEOS_C,
534     /* 0xA5 */ CHAN_C|VCHAN_C|NONEOS_C,
535     /* 0xA6 */ CHAN_C|VCHAN_C|NONEOS_C,
536     /* 0xA7 */ CHAN_C|VCHAN_C|NONEOS_C,
537     /* 0xA8 */ CHAN_C|VCHAN_C|NONEOS_C,
538     /* 0xA9 */ CHAN_C|VCHAN_C|NONEOS_C,
539     /* 0xAA */ CHAN_C|VCHAN_C|NONEOS_C,
540     /* 0xAB */ CHAN_C|VCHAN_C|NONEOS_C,
541     /* 0xAC */ CHAN_C|VCHAN_C|NONEOS_C,
542     /* 0xAD */ CHAN_C|VCHAN_C|NONEOS_C,
543     /* 0xAE */ CHAN_C|VCHAN_C|NONEOS_C,
544     /* 0xAF */ CHAN_C|VCHAN_C|NONEOS_C,
545     /* 0xB0 */ CHAN_C|VCHAN_C|NONEOS_C,
546     /* 0xB1 */ CHAN_C|VCHAN_C|NONEOS_C,
547     /* 0xB2 */ CHAN_C|VCHAN_C|NONEOS_C,
548     /* 0xB3 */ CHAN_C|VCHAN_C|NONEOS_C,
549     /* 0xB4 */ CHAN_C|VCHAN_C|NONEOS_C,
550     /* 0xB5 */ CHAN_C|VCHAN_C|NONEOS_C,
551     /* 0xB6 */ CHAN_C|VCHAN_C|NONEOS_C,
552     /* 0xB7 */ CHAN_C|VCHAN_C|NONEOS_C,
553     /* 0xB8 */ CHAN_C|VCHAN_C|NONEOS_C,
554     /* 0xB9 */ CHAN_C|VCHAN_C|NONEOS_C,
555     /* 0xBA */ CHAN_C|VCHAN_C|NONEOS_C,
556     /* 0xBB */ CHAN_C|VCHAN_C|NONEOS_C,
557     /* 0xBC */ CHAN_C|VCHAN_C|NONEOS_C,
558     /* 0xBD */ CHAN_C|VCHAN_C|NONEOS_C,
559     /* 0xBE */ CHAN_C|VCHAN_C|NONEOS_C,
560     /* 0xBF */ CHAN_C|VCHAN_C|NONEOS_C,
561     /* 0xC0 */ CHAN_C|VCHAN_C|NONEOS_C,
562     /* 0xC1 */ CHAN_C|VCHAN_C|NONEOS_C,
563     /* 0xC2 */ CHAN_C|VCHAN_C|NONEOS_C,
564     /* 0xC3 */ CHAN_C|VCHAN_C|NONEOS_C,
565     /* 0xC4 */ CHAN_C|VCHAN_C|NONEOS_C,
566     /* 0xC5 */ CHAN_C|VCHAN_C|NONEOS_C,
567     /* 0xC6 */ CHAN_C|VCHAN_C|NONEOS_C,
568     /* 0xC7 */ CHAN_C|VCHAN_C|NONEOS_C,
569     /* 0xC8 */ CHAN_C|VCHAN_C|NONEOS_C,
570     /* 0xC9 */ CHAN_C|VCHAN_C|NONEOS_C,
571     /* 0xCA */ CHAN_C|VCHAN_C|NONEOS_C,
572     /* 0xCB */ CHAN_C|VCHAN_C|NONEOS_C,
573     /* 0xCC */ CHAN_C|VCHAN_C|NONEOS_C,
574     /* 0xCD */ CHAN_C|VCHAN_C|NONEOS_C,
575     /* 0xCE */ CHAN_C|VCHAN_C|NONEOS_C,
576     /* 0xCF */ CHAN_C|VCHAN_C|NONEOS_C,
577     /* 0xD0 */ CHAN_C|VCHAN_C|NONEOS_C,
578     /* 0xD1 */ CHAN_C|VCHAN_C|NONEOS_C,
579     /* 0xD2 */ CHAN_C|VCHAN_C|NONEOS_C,
580     /* 0xD3 */ CHAN_C|VCHAN_C|NONEOS_C,
581     /* 0xD4 */ CHAN_C|VCHAN_C|NONEOS_C,
582     /* 0xD5 */ CHAN_C|VCHAN_C|NONEOS_C,
583     /* 0xD6 */ CHAN_C|VCHAN_C|NONEOS_C,
584     /* 0xD7 */ CHAN_C|VCHAN_C|NONEOS_C,
585     /* 0xD8 */ CHAN_C|VCHAN_C|NONEOS_C,
586     /* 0xD9 */ CHAN_C|VCHAN_C|NONEOS_C,
587     /* 0xDA */ CHAN_C|VCHAN_C|NONEOS_C,
588     /* 0xDB */ CHAN_C|VCHAN_C|NONEOS_C,
589     /* 0xDC */ CHAN_C|VCHAN_C|NONEOS_C,
590     /* 0xDD */ CHAN_C|VCHAN_C|NONEOS_C,
591     /* 0xDE */ CHAN_C|VCHAN_C|NONEOS_C,
592     /* 0xDF */ CHAN_C|VCHAN_C|NONEOS_C,
593     /* 0xE0 */ CHAN_C|VCHAN_C|NONEOS_C,
594     /* 0xE1 */ CHAN_C|VCHAN_C|NONEOS_C,
595     /* 0xE2 */ CHAN_C|VCHAN_C|NONEOS_C,
596     /* 0xE3 */ CHAN_C|VCHAN_C|NONEOS_C,
597     /* 0xE4 */ CHAN_C|VCHAN_C|NONEOS_C,
598     /* 0xE5 */ CHAN_C|VCHAN_C|NONEOS_C,
599     /* 0xE6 */ CHAN_C|VCHAN_C|NONEOS_C,
600     /* 0xE7 */ CHAN_C|VCHAN_C|NONEOS_C,
601     /* 0xE8 */ CHAN_C|VCHAN_C|NONEOS_C,
602     /* 0xE9 */ CHAN_C|VCHAN_C|NONEOS_C,
603     /* 0xEA */ CHAN_C|VCHAN_C|NONEOS_C,
604     /* 0xEB */ CHAN_C|VCHAN_C|NONEOS_C,
605     /* 0xEC */ CHAN_C|VCHAN_C|NONEOS_C,
606     /* 0xED */ CHAN_C|VCHAN_C|NONEOS_C,
607     /* 0xEE */ CHAN_C|VCHAN_C|NONEOS_C,
608     /* 0xEF */ CHAN_C|VCHAN_C|NONEOS_C,
609     /* 0xF0 */ CHAN_C|VCHAN_C|NONEOS_C,
610     /* 0xF1 */ CHAN_C|VCHAN_C|NONEOS_C,
611     /* 0xF2 */ CHAN_C|VCHAN_C|NONEOS_C,
612     /* 0xF3 */ CHAN_C|VCHAN_C|NONEOS_C,
613     /* 0xF4 */ CHAN_C|VCHAN_C|NONEOS_C,
614     /* 0xF5 */ CHAN_C|VCHAN_C|NONEOS_C,
615     /* 0xF6 */ CHAN_C|VCHAN_C|NONEOS_C,
616     /* 0xF7 */ CHAN_C|VCHAN_C|NONEOS_C,
617     /* 0xF8 */ CHAN_C|VCHAN_C|NONEOS_C,
618     /* 0xF9 */ CHAN_C|VCHAN_C|NONEOS_C,
619     /* 0xFA */ CHAN_C|VCHAN_C|NONEOS_C,
620     /* 0xFB */ CHAN_C|VCHAN_C|NONEOS_C,
621     /* 0xFC */ CHAN_C|VCHAN_C|NONEOS_C,
622     /* 0xFD */ CHAN_C|VCHAN_C|NONEOS_C,
623     /* 0xFE */ CHAN_C|VCHAN_C|NONEOS_C,
624     /* 0xFF */ CHAN_C|VCHAN_C|NONEOS_C
625 adx 30 };

Properties

Name Value
svn:eol-style native
svn:keywords Id Revision