ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/match.c
Revision: 1350
Committed: Thu Apr 12 21:03:48 2012 UTC (13 years, 4 months ago) by michael
Content type: text/x-csrc
Original Path: ircd-hybrid-8/src/match.c
File size: 22009 byte(s)
Log Message:
- fix odd behaviour of ircncmp with 'n' being 0, plus
  performance improvements.

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

Properties

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