ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/libio/string/match.c
Revision: 364
Committed: Sun Jan 8 15:39:24 2006 UTC (20 years, 7 months ago) by michael
Content type: text/x-csrc
File size: 20564 byte(s)
Log Message:
- Entirely changed the way of ban match processing to be more cleaner.
  It also should nicely speed up matching of pure ip (may include cidr mask)
  bans.
- Removed match_cidr() which is now not longed needed
- Add back some prototypes to res.h to fix compile errors

File Contents

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

Properties

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