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

File Contents

# Content
1 /************************************************************************
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 * $Id$
20 *
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 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
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 for (m--; (m > (const unsigned char *)mask) && (*m == '?'); m--)
76 ;
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 return *m == 0;
91 }
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 const unsigned char *m = (const unsigned char *)mask;
116 const unsigned char *n = (const unsigned char *)name;
117 const unsigned char *ma = NULL;
118 const unsigned char *na = (const unsigned char *)name;
119
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 for (m--; (m > (const unsigned char *)mask) && (*m == '?'); m--)
144 ;
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 return *m == 0;
159 }
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 if (*mask == '#')
192 {
193 if (*name != '#')
194 return 0;
195 ++name, ++mask;
196 }
197
198 return match_esc(mask, name);
199 }
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 const unsigned char *str1 = (const unsigned char *)s1;
267 const unsigned char *str2 = (const unsigned char *)s2;
268
269 assert(s1 != NULL);
270 assert(s2 != NULL);
271
272 while (ToUpper(*str1) == ToUpper(*str2))
273 {
274 if (*str1 == '\0')
275 return 0;
276
277 ++str1;
278 ++str2;
279 }
280
281 return 1;
282 }
283
284 int
285 ircncmp(const char *s1, const char *s2, size_t n)
286 {
287 const unsigned char *str1 = (const unsigned char *)s1;
288 const unsigned char *str2 = (const unsigned char *)s2;
289
290 assert(s1 != NULL);
291 assert(s2 != NULL);
292
293 if (n == 0)
294 return 0;
295
296 while (ToUpper(*str1) == ToUpper(*str2))
297 {
298 if (*str1 == '\0')
299 return 0;
300
301 ++str1;
302 ++str2;
303 }
304
305 return 1;
306 }
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 /* 1 */ CNTRL_C|CHAN_C|VCHAN_C|NONEOS_C,
387 /* 2 */ CNTRL_C|CHAN_C|NONEOS_C,
388 /* 3 */ CNTRL_C|CHAN_C|NONEOS_C,
389 /* 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 /* 7 BEL */ CNTRL_C|NONEOS_C,
393 /* 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 /* 15 */ CNTRL_C|CHAN_C|NONEOS_C,
401 /* 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 /* 22 */ CNTRL_C|CHAN_C|NONEOS_C,
408 /* 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 /* 31 */ CNTRL_C|CHAN_C|NONEOS_C,
417 /* SP */ PRINT_C|SPACE_C,
418 /* ! */ 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 /* , */ PRINT_C|NONEOS_C,
430 /* - */ 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 /* 0xA0 */ CHAN_C|NONEOS_C,
546 /* 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 };

Properties

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