ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/libio/string/match.c
Revision: 372
Committed: Sat Jan 14 12:42:28 2006 UTC (20 years, 7 months ago) by michael
Content type: text/x-csrc
File size: 20204 byte(s)
Log Message:
- optimized ircncmp()

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     int
192 michael 290 has_wildcards(const char *s)
193     {
194 michael 292 const unsigned char *p = (const unsigned char *)s;
195 michael 290
196 michael 292 for (; *p != '\0'; ++p)
197     {
198     if (*p == '\\')
199     {
200     if (*++p == '\0')
201     return 0;
202     }
203     else if (IsMWildChar(*p))
204 michael 290 return 1;
205 michael 292 }
206 michael 290
207     return 0;
208     }
209    
210 adx 59 /* collapse()
211     *
212     * collapses a string containing multiple *'s.
213     */
214     char *
215     collapse(char *pattern)
216     {
217     char *p = pattern, *po = pattern;
218     char c;
219    
220     if (p == NULL)
221     return NULL;
222    
223     while ((c = *p++))
224     {
225     if (c != '*')
226     *po++ = c;
227     else if (*p != '*')
228     *po++ = '*';
229     }
230    
231     *po = 0;
232    
233     return pattern;
234     }
235    
236     /* collapse_esc()
237     *
238     * The collapse() function with support for escaping characters
239     */
240     char *
241     collapse_esc(char *pattern)
242     {
243     char *p = pattern, *po = pattern;
244     char c;
245    
246     if (p == NULL)
247     return NULL;
248    
249     while ((c = *p++))
250     {
251     if (c != '*')
252     {
253     *po++ = c;
254     if (c == '\\' && *p)
255     *po++ = *p++;
256     }
257     else if (*p != '*')
258     *po++ = '*';
259     }
260    
261     *po = 0;
262    
263     return pattern;
264     }
265    
266     /*
267     * irccmp - case insensitive comparison of two 0 terminated strings.
268     *
269     * returns 0, if s1 equal to s2
270     * 1, if not
271     */
272     int
273     irccmp(const char *s1, const char *s2)
274     {
275 michael 372 const unsigned char *str1 = (const unsigned char *)s1;
276     const unsigned char *str2 = (const unsigned char *)s2;
277 adx 59
278     assert(s1 != NULL);
279     assert(s2 != NULL);
280    
281     while (ToUpper(*str1) == ToUpper(*str2))
282     {
283     if (*str1 == '\0')
284     return 0;
285     str1++;
286     str2++;
287     }
288    
289     return 1;
290     }
291    
292     int
293     ircncmp(const char* s1, const char *s2, size_t n)
294     {
295 michael 372 const unsigned char *str1 = (const unsigned char *)s1;
296     const unsigned char *str2 = (const unsigned char *)s2;
297 adx 59
298     assert(s1 != NULL);
299     assert(s2 != NULL);
300 michael 372 assert(n > 0);
301 adx 59
302 michael 372 while (ToUpper(*str1) == ToUpper(*str2))
303 adx 59 {
304 michael 372 if (--n == 0 || *str1 == '\0')
305 adx 59 return 0;
306 michael 372 ++str1;
307     ++str2;
308 adx 59 }
309 michael 372
310     return 1;
311 adx 59 }
312    
313     const unsigned char ToLowerTab[] = {
314     0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa,
315     0xb, 0xc, 0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14,
316     0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
317     0x1e, 0x1f,
318     ' ', '!', '"', '#', '$', '%', '&', 0x27, '(', ')',
319     '*', '+', ',', '-', '.', '/',
320     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
321     ':', ';', '<', '=', '>', '?',
322     '@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
323     'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
324     't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
325     '_',
326     '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
327     'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
328     't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
329     0x7f,
330     0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
331     0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
332     0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
333     0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
334     0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9,
335     0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
336     0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9,
337     0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
338     0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9,
339     0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
340     0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
341     0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
342     0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
343     0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
344     0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
345     0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
346     };
347    
348     const unsigned char ToUpperTab[] = {
349     0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa,
350     0xb, 0xc, 0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14,
351     0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
352     0x1e, 0x1f,
353     ' ', '!', '"', '#', '$', '%', '&', 0x27, '(', ')',
354     '*', '+', ',', '-', '.', '/',
355     '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
356     ':', ';', '<', '=', '>', '?',
357     '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
358     'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
359     'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^',
360     0x5f,
361     '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
362     'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
363     'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^',
364     0x7f,
365     0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
366     0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
367     0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
368     0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
369     0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9,
370     0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
371     0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9,
372     0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
373     0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9,
374     0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
375     0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
376     0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
377     0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
378     0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
379     0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
380     0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
381     };
382    
383     /*
384     * CharAttrs table
385     *
386     * NOTE: RFC 1459 sez: anything but a ^G, comma, or space is allowed
387     * for channel names
388     */
389     const unsigned int CharAttrs[] = {
390     /* 0 */ CNTRL_C,
391     /* 1 */ CNTRL_C|CHAN_C|NONEOS_C,
392     /* 2 */ CNTRL_C|CHAN_C|NONEOS_C,
393     /* 3 */ CNTRL_C|CHAN_C|NONEOS_C,
394     /* 4 */ CNTRL_C|CHAN_C|NONEOS_C,
395     /* 5 */ CNTRL_C|CHAN_C|NONEOS_C,
396     /* 6 */ CNTRL_C|CHAN_C|NONEOS_C,
397     /* 7 BEL */ CNTRL_C|NONEOS_C,
398     /* 8 \b */ CNTRL_C|CHAN_C|NONEOS_C,
399     /* 9 \t */ CNTRL_C|SPACE_C|CHAN_C|NONEOS_C,
400     /* 10 \n */ CNTRL_C|SPACE_C|CHAN_C|NONEOS_C|EOL_C,
401     /* 11 \v */ CNTRL_C|SPACE_C|CHAN_C|NONEOS_C,
402     /* 12 \f */ CNTRL_C|SPACE_C|CHAN_C|NONEOS_C,
403     /* 13 \r */ CNTRL_C|SPACE_C|CHAN_C|NONEOS_C|EOL_C,
404     /* 14 */ CNTRL_C|CHAN_C|NONEOS_C,
405     /* 15 */ CNTRL_C|CHAN_C|NONEOS_C,
406     /* 16 */ CNTRL_C|CHAN_C|NONEOS_C,
407     /* 17 */ CNTRL_C|CHAN_C|NONEOS_C,
408     /* 18 */ CNTRL_C|CHAN_C|NONEOS_C,
409     /* 19 */ CNTRL_C|CHAN_C|NONEOS_C,
410     /* 20 */ CNTRL_C|CHAN_C|NONEOS_C,
411     /* 21 */ CNTRL_C|CHAN_C|NONEOS_C,
412     /* 22 */ CNTRL_C|CHAN_C|NONEOS_C,
413     /* 23 */ CNTRL_C|CHAN_C|NONEOS_C,
414     /* 24 */ CNTRL_C|CHAN_C|NONEOS_C,
415     /* 25 */ CNTRL_C|CHAN_C|NONEOS_C,
416     /* 26 */ CNTRL_C|CHAN_C|NONEOS_C,
417     /* 27 */ CNTRL_C|CHAN_C|NONEOS_C,
418     /* 28 */ CNTRL_C|CHAN_C|NONEOS_C,
419     /* 29 */ CNTRL_C|CHAN_C|NONEOS_C,
420     /* 30 */ CNTRL_C|CHAN_C|NONEOS_C,
421     /* 31 */ CNTRL_C|CHAN_C|NONEOS_C,
422     /* SP */ PRINT_C|SPACE_C,
423     /* ! */ PRINT_C|KWILD_C|CHAN_C|NONEOS_C,
424     /* " */ PRINT_C|CHAN_C|NONEOS_C,
425     /* # */ PRINT_C|KWILD_C|MWILD_C|CHANPFX_C|CHAN_C|NONEOS_C,
426     /* $ */ PRINT_C|CHAN_C|NONEOS_C|USER_C,
427     /* % */ PRINT_C|CHAN_C|NONEOS_C,
428     /* & */ PRINT_C|CHANPFX_C|CHAN_C|NONEOS_C,
429     /* ' */ PRINT_C|CHAN_C|NONEOS_C,
430     /* ( */ PRINT_C|CHAN_C|NONEOS_C,
431     /* ) */ PRINT_C|CHAN_C|NONEOS_C,
432     /* * */ PRINT_C|KWILD_C|MWILD_C|CHAN_C|NONEOS_C|SERV_C,
433     /* + */ PRINT_C|CHAN_C|NONEOS_C,
434     /* , */ PRINT_C|NONEOS_C,
435     /* - */ PRINT_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
436     /* . */ PRINT_C|KWILD_C|CHAN_C|NONEOS_C|USER_C|HOST_C|SERV_C,
437     /* / */ PRINT_C|CHAN_C|NONEOS_C,
438     /* 0 */ PRINT_C|DIGIT_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
439     /* 1 */ PRINT_C|DIGIT_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
440     /* 2 */ PRINT_C|DIGIT_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
441     /* 3 */ PRINT_C|DIGIT_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
442     /* 4 */ PRINT_C|DIGIT_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
443     /* 5 */ PRINT_C|DIGIT_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
444     /* 6 */ PRINT_C|DIGIT_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
445     /* 7 */ PRINT_C|DIGIT_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
446     /* 8 */ PRINT_C|DIGIT_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
447     /* 9 */ PRINT_C|DIGIT_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
448     /* : */ PRINT_C|KWILD_C|CHAN_C|NONEOS_C|HOST_C,
449     /* ; */ PRINT_C|CHAN_C|NONEOS_C,
450     /* < */ PRINT_C|CHAN_C|NONEOS_C,
451     /* = */ PRINT_C|CHAN_C|NONEOS_C,
452     /* > */ PRINT_C|CHAN_C|NONEOS_C,
453     /* ? */ PRINT_C|KWILD_C|MWILD_C|CHAN_C|NONEOS_C,
454     /* @ */ PRINT_C|KWILD_C|CHAN_C|NONEOS_C,
455     /* A */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
456     /* B */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
457     /* C */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
458     /* D */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
459     /* E */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
460     /* F */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
461     /* G */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
462     /* H */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
463     /* I */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
464     /* J */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
465     /* K */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
466     /* L */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
467     /* M */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
468     /* N */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
469     /* O */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
470     /* P */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
471     /* Q */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
472     /* R */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
473     /* S */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
474     /* T */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
475     /* U */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
476     /* V */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
477     /* W */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
478     /* X */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
479     /* Y */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
480     /* Z */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
481     /* [ */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C,
482     /* \ */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C,
483     /* ] */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C,
484     /* ^ */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C,
485     /* _ */ PRINT_C|NICK_C|CHAN_C|NONEOS_C|USER_C,
486     /* ` */ PRINT_C|NICK_C|CHAN_C|NONEOS_C|USER_C,
487     /* a */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
488     /* b */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
489     /* c */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
490     /* d */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
491     /* e */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
492     /* f */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
493     /* g */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
494     /* h */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
495     /* i */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
496     /* j */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
497     /* k */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
498     /* l */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
499     /* m */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
500     /* n */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
501     /* o */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
502     /* p */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
503     /* q */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
504     /* r */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
505     /* s */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
506     /* t */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
507     /* u */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
508     /* v */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
509     /* w */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
510     /* x */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
511     /* y */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
512     /* z */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C|HOST_C,
513     /* { */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C,
514     /* | */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C,
515     /* } */ PRINT_C|ALPHA_C|NICK_C|CHAN_C|NONEOS_C|USER_C,
516     /* ~ */ PRINT_C|ALPHA_C|CHAN_C|NONEOS_C|USER_C,
517     /* del */ CHAN_C|NONEOS_C,
518     /* 0x80 */ CHAN_C|NONEOS_C,
519     /* 0x81 */ CHAN_C|NONEOS_C,
520     /* 0x82 */ CHAN_C|NONEOS_C,
521     /* 0x83 */ CHAN_C|NONEOS_C,
522     /* 0x84 */ CHAN_C|NONEOS_C,
523     /* 0x85 */ CHAN_C|NONEOS_C,
524     /* 0x86 */ CHAN_C|NONEOS_C,
525     /* 0x87 */ CHAN_C|NONEOS_C,
526     /* 0x88 */ CHAN_C|NONEOS_C,
527     /* 0x89 */ CHAN_C|NONEOS_C,
528     /* 0x8A */ CHAN_C|NONEOS_C,
529     /* 0x8B */ CHAN_C|NONEOS_C,
530     /* 0x8C */ CHAN_C|NONEOS_C,
531     /* 0x8D */ CHAN_C|NONEOS_C,
532     /* 0x8E */ CHAN_C|NONEOS_C,
533     /* 0x8F */ CHAN_C|NONEOS_C,
534     /* 0x90 */ CHAN_C|NONEOS_C,
535     /* 0x91 */ CHAN_C|NONEOS_C,
536     /* 0x92 */ CHAN_C|NONEOS_C,
537     /* 0x93 */ CHAN_C|NONEOS_C,
538     /* 0x94 */ CHAN_C|NONEOS_C,
539     /* 0x95 */ CHAN_C|NONEOS_C,
540     /* 0x96 */ CHAN_C|NONEOS_C,
541     /* 0x97 */ CHAN_C|NONEOS_C,
542     /* 0x98 */ CHAN_C|NONEOS_C,
543     /* 0x99 */ CHAN_C|NONEOS_C,
544     /* 0x9A */ CHAN_C|NONEOS_C,
545     /* 0x9B */ CHAN_C|NONEOS_C,
546     /* 0x9C */ CHAN_C|NONEOS_C,
547     /* 0x9D */ CHAN_C|NONEOS_C,
548     /* 0x9E */ CHAN_C|NONEOS_C,
549     /* 0x9F */ CHAN_C|NONEOS_C,
550     /* 0xA0 */ CHAN_C|NONEOS_C,
551     /* 0xA1 */ CHAN_C|NONEOS_C,
552     /* 0xA2 */ CHAN_C|NONEOS_C,
553     /* 0xA3 */ CHAN_C|NONEOS_C,
554     /* 0xA4 */ CHAN_C|NONEOS_C,
555     /* 0xA5 */ CHAN_C|NONEOS_C,
556     /* 0xA6 */ CHAN_C|NONEOS_C,
557     /* 0xA7 */ CHAN_C|NONEOS_C,
558     /* 0xA8 */ CHAN_C|NONEOS_C,
559     /* 0xA9 */ CHAN_C|NONEOS_C,
560     /* 0xAA */ CHAN_C|NONEOS_C,
561     /* 0xAB */ CHAN_C|NONEOS_C,
562     /* 0xAC */ CHAN_C|NONEOS_C,
563     /* 0xAD */ CHAN_C|NONEOS_C,
564     /* 0xAE */ CHAN_C|NONEOS_C,
565     /* 0xAF */ CHAN_C|NONEOS_C,
566     /* 0xB0 */ CHAN_C|NONEOS_C,
567     /* 0xB1 */ CHAN_C|NONEOS_C,
568     /* 0xB2 */ CHAN_C|NONEOS_C,
569     /* 0xB3 */ CHAN_C|NONEOS_C,
570     /* 0xB4 */ CHAN_C|NONEOS_C,
571     /* 0xB5 */ CHAN_C|NONEOS_C,
572     /* 0xB6 */ CHAN_C|NONEOS_C,
573     /* 0xB7 */ CHAN_C|NONEOS_C,
574     /* 0xB8 */ CHAN_C|NONEOS_C,
575     /* 0xB9 */ CHAN_C|NONEOS_C,
576     /* 0xBA */ CHAN_C|NONEOS_C,
577     /* 0xBB */ CHAN_C|NONEOS_C,
578     /* 0xBC */ CHAN_C|NONEOS_C,
579     /* 0xBD */ CHAN_C|NONEOS_C,
580     /* 0xBE */ CHAN_C|NONEOS_C,
581     /* 0xBF */ CHAN_C|NONEOS_C,
582     /* 0xC0 */ CHAN_C|NONEOS_C,
583     /* 0xC1 */ CHAN_C|NONEOS_C,
584     /* 0xC2 */ CHAN_C|NONEOS_C,
585     /* 0xC3 */ CHAN_C|NONEOS_C,
586     /* 0xC4 */ CHAN_C|NONEOS_C,
587     /* 0xC5 */ CHAN_C|NONEOS_C,
588     /* 0xC6 */ CHAN_C|NONEOS_C,
589     /* 0xC7 */ CHAN_C|NONEOS_C,
590     /* 0xC8 */ CHAN_C|NONEOS_C,
591     /* 0xC9 */ CHAN_C|NONEOS_C,
592     /* 0xCA */ CHAN_C|NONEOS_C,
593     /* 0xCB */ CHAN_C|NONEOS_C,
594     /* 0xCC */ CHAN_C|NONEOS_C,
595     /* 0xCD */ CHAN_C|NONEOS_C,
596     /* 0xCE */ CHAN_C|NONEOS_C,
597     /* 0xCF */ CHAN_C|NONEOS_C,
598     /* 0xD0 */ CHAN_C|NONEOS_C,
599     /* 0xD1 */ CHAN_C|NONEOS_C,
600     /* 0xD2 */ CHAN_C|NONEOS_C,
601     /* 0xD3 */ CHAN_C|NONEOS_C,
602     /* 0xD4 */ CHAN_C|NONEOS_C,
603     /* 0xD5 */ CHAN_C|NONEOS_C,
604     /* 0xD6 */ CHAN_C|NONEOS_C,
605     /* 0xD7 */ CHAN_C|NONEOS_C,
606     /* 0xD8 */ CHAN_C|NONEOS_C,
607     /* 0xD9 */ CHAN_C|NONEOS_C,
608     /* 0xDA */ CHAN_C|NONEOS_C,
609     /* 0xDB */ CHAN_C|NONEOS_C,
610     /* 0xDC */ CHAN_C|NONEOS_C,
611     /* 0xDD */ CHAN_C|NONEOS_C,
612     /* 0xDE */ CHAN_C|NONEOS_C,
613     /* 0xDF */ CHAN_C|NONEOS_C,
614     /* 0xE0 */ CHAN_C|NONEOS_C,
615     /* 0xE1 */ CHAN_C|NONEOS_C,
616     /* 0xE2 */ CHAN_C|NONEOS_C,
617     /* 0xE3 */ CHAN_C|NONEOS_C,
618     /* 0xE4 */ CHAN_C|NONEOS_C,
619     /* 0xE5 */ CHAN_C|NONEOS_C,
620     /* 0xE6 */ CHAN_C|NONEOS_C,
621     /* 0xE7 */ CHAN_C|NONEOS_C,
622     /* 0xE8 */ CHAN_C|NONEOS_C,
623     /* 0xE9 */ CHAN_C|NONEOS_C,
624     /* 0xEA */ CHAN_C|NONEOS_C,
625     /* 0xEB */ CHAN_C|NONEOS_C,
626     /* 0xEC */ CHAN_C|NONEOS_C,
627     /* 0xED */ CHAN_C|NONEOS_C,
628     /* 0xEE */ CHAN_C|NONEOS_C,
629     /* 0xEF */ CHAN_C|NONEOS_C,
630     /* 0xF0 */ CHAN_C|NONEOS_C,
631     /* 0xF1 */ CHAN_C|NONEOS_C,
632     /* 0xF2 */ CHAN_C|NONEOS_C,
633     /* 0xF3 */ CHAN_C|NONEOS_C,
634     /* 0xF4 */ CHAN_C|NONEOS_C,
635     /* 0xF5 */ CHAN_C|NONEOS_C,
636     /* 0xF6 */ CHAN_C|NONEOS_C,
637     /* 0xF7 */ CHAN_C|NONEOS_C,
638     /* 0xF8 */ CHAN_C|NONEOS_C,
639     /* 0xF9 */ CHAN_C|NONEOS_C,
640     /* 0xFA */ CHAN_C|NONEOS_C,
641     /* 0xFB */ CHAN_C|NONEOS_C,
642     /* 0xFC */ CHAN_C|NONEOS_C,
643     /* 0xFD */ CHAN_C|NONEOS_C,
644     /* 0xFE */ CHAN_C|NONEOS_C,
645     /* 0xFF */ CHAN_C|NONEOS_C
646     };

Properties

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