1 /************************************************************************
2 * IRC - Internet Relay Chat, src/match.c
3 * Copyright (C) 1990 Jarkko Oikarinen
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)
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.
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.
19 * $Id: match.c 3532 2007-07-14 13:32:18Z jilles $
30 * Compare if a given string (name) matches the given
31 * mask (which can contain wild cards: '*' - match any
32 * number of chars, '?' - match any single character.
37 * Originally by Douglas A Lewis (dalewis@acsu.buffalo.edu)
38 * Rewritten by Timothy Vogelsang (netski), net@astrolink.org
41 /** Check a string against a mask.
42 * This test checks using traditional IRC wildcards only: '*' means
43 * match zero or more characters of any type; '?' means match exactly
44 * one character of any type.
46 * @param[in] mask Wildcard-containing mask.
47 * @param[in] name String to check against \a mask.
48 * @return Zero if \a mask matches \a name, non-zero if no match.
50 int match(const char *mask
, const char *name
)
52 const char *m
= mask
, *n
= name
;
53 const char *m_tmp
= mask
, *n_tmp
= name
;
56 s_assert(mask
!= NULL
);
57 s_assert(name
!= NULL
);
74 for (star_p
= 0;; m
++)
93 for (n_tmp
= n
; *n
&& ToLower(*n
) != ToLower(*m
); n
++);
96 /* and fall through */
99 return (*m
!= '\0' ? 0 : 1);
100 if (ToLower(*m
) != ToLower(*n
))
109 /** Check a mask against a mask.
110 * This test checks using traditional IRC wildcards only: '*' means
111 * match zero or more characters of any type; '?' means match exactly
112 * one character of any type.
113 * The difference between mask_match() and match() is that in mask_match()
114 * a '?' in mask does not match a '*' in name.
116 * @param[in] mask Existing wildcard-containing mask.
117 * @param[in] name New wildcard-containing mask.
118 * @return 1 if \a name is equal to or more specific than \a mask, 0 otherwise.
120 int mask_match(const char *mask
, const char *name
)
122 const char *m
= mask
, *n
= name
;
123 const char *m_tmp
= mask
, *n_tmp
= name
;
126 s_assert(mask
!= NULL
);
127 s_assert(name
!= NULL
);
144 for (star_p
= 0;; m
++)
150 /* changed for mask_match() */
151 if (*n
== '*' || !*n
)
165 for (n_tmp
= n
; *n
&& ToLower(*n
) != ToLower(*m
); n
++);
168 /* and fall through */
171 return (*m
!= '\0' ? 0 : 1);
172 if (ToLower(*m
) != ToLower(*n
))
182 #define MATCH_MAX_CALLS 512 /* ACK! This dies when it's less that this
183 and we have long lines to parse */
184 /** Check a string against a mask.
185 * This test checks using extended wildcards: '*' means match zero
186 * or more characters of any type; '?' means match exactly one
187 * character of any type; '#' means match exactly one character that
188 * is a number; '@' means match exactly one character that is a
189 * letter; '\s' means match a space.
191 * This function supports escaping, so that a wildcard may be matched
194 * @param[in] mask Wildcard-containing mask.
195 * @param[in] name String to check against \a mask.
196 * @return Zero if \a mask matches \a name, non-zero if no match.
199 match_esc(const char *mask
, const char *name
)
201 const unsigned char *m
= (const unsigned char *)mask
;
202 const unsigned char *n
= (const unsigned char *)name
;
203 const unsigned char *ma
= (const unsigned char *)mask
;
204 const unsigned char *na
= (const unsigned char *)name
;
210 s_assert(mask
!= NULL
);
211 s_assert(name
!= NULL
);
216 /* if the mask is "*", it matches everything */
217 if((*m
== '*') && (*(m
+ 1) == '\0'))
220 while(calls
++ < MATCH_MAX_CALLS
)
226 if(*m
== '\\' && !quote
)
232 if(!quote
&& *m
== '*')
235 * XXX - shouldn't need to spin here, the mask should have been
236 * collapsed before match is called
248 /* This means it is an invalid mask -A1kmm. */
262 for(m
--; (m
> (const unsigned char *)mask
) && (*m
== '?'); m
--)
265 if(*m
== '*' && (m
> (const unsigned char *)mask
))
275 * XXX - shouldn't need to spin here, the mask should have been
276 * collapsed before match is called
286 match1
= *m
== 's' ? *n
== ' ' : ToLower(*m
) == ToLower(*n
);
290 match1
= IsLetter(*n
);
292 match1
= IsDigit(*n
);
294 match1
= ToLower(*m
) == ToLower(*n
);
313 int comp_with_mask(void *addr
, void *dest
, u_int mask
)
315 if (memcmp(addr
, dest
, mask
/ 8) == 0)
318 int m
= ((-1) << (8 - (mask
% 8)));
319 if (mask
% 8 == 0 || (((u_char
*) addr
)[n
] & m
) == (((u_char
*) dest
)[n
] & m
))
327 int comp_with_mask_sock(struct sockaddr
*addr
, struct sockaddr
*dest
, u_int mask
)
332 if (addr
->sa_family
== AF_INET
)
334 iaddr
= &((struct sockaddr_in
*)addr
)->sin_addr
;
335 idest
= &((struct sockaddr_in
*)dest
)->sin_addr
;
340 iaddr
= &((struct sockaddr_in6
*)addr
)->sin6_addr
;
341 idest
= &((struct sockaddr_in6
*)dest
)->sin6_addr
;
346 return (comp_with_mask(iaddr
, idest
, mask
));
352 * Input - cidr ip mask, address
354 int match_ips(const char *s1
, const char *s2
)
356 struct rb_sockaddr_storage ipaddr
, maskaddr
;
358 char address
[HOSTLEN
+ 1];
360 void *ipptr
, *maskptr
;
366 len
= strrchr(mask
, '/');
377 if (strchr(mask
, ':') && strchr(address
, ':'))
383 ipptr
= &((struct sockaddr_in6
*)&ipaddr
)->sin6_addr
;
384 maskptr
= &((struct sockaddr_in6
*)&maskaddr
)->sin6_addr
;
388 if (!strchr(mask
, ':') && !strchr(address
, ':'))
394 ipptr
= &((struct sockaddr_in
*)&ipaddr
)->sin_addr
;
395 maskptr
= &((struct sockaddr_in
*)&maskaddr
)->sin_addr
;
400 rb_inet_pton(aftype
, address
, ipptr
);
401 rb_inet_pton(aftype
, mask
, maskptr
);
402 if (comp_with_mask(ipptr
, maskptr
, cidrlen
))
410 * Input - mask, address
411 * Ouput - 1 = Matched 0 = Did not match
414 int match_cidr(const char *s1
, const char *s2
)
416 struct rb_sockaddr_storage ipaddr
, maskaddr
;
418 char address
[NICKLEN
+ USERLEN
+ HOSTLEN
+ 6];
422 void *ipptr
, *maskptr
;
428 ipmask
= strrchr(mask
, '@');
434 ip
= strrchr(address
, '@');
440 len
= strrchr(ipmask
, '/');
451 if (strchr(ip
, ':') && strchr(ipmask
, ':'))
457 ipptr
= &((struct sockaddr_in6
*)&ipaddr
)->sin6_addr
;
458 maskptr
= &((struct sockaddr_in6
*)&maskaddr
)->sin6_addr
;
462 if (!strchr(ip
, ':') && !strchr(ipmask
, ':'))
468 ipptr
= &((struct sockaddr_in
*)&ipaddr
)->sin_addr
;
469 maskptr
= &((struct sockaddr_in
*)&maskaddr
)->sin_addr
;
474 rb_inet_pton(aftype
, ip
, ipptr
);
475 rb_inet_pton(aftype
, ipmask
, maskptr
);
476 if (comp_with_mask(ipptr
, maskptr
, cidrlen
) && match(mask
, address
))
484 * collapses a string containing multiple *'s.
486 char *collapse(char *pattern
)
488 char *p
= pattern
, *po
= pattern
;
516 * The collapse() function with support for escaping characters
518 char *collapse_esc(char *pattern
)
520 char *p
= pattern
, *po
= pattern
;
529 if (!(f
& 2) && c
== '*')
535 else if (!(f
& 2) && c
== '\\')
551 * irccmp - case insensitive comparison of two 0 terminated strings.
553 * returns 0, if s1 equal to s2
554 * <0, if s1 lexicographically less than s2
555 * >0, if s1 lexicographically greater than s2
557 int irccmp(const char *s1
, const char *s2
)
559 const unsigned char *str1
= (const unsigned char *)s1
;
560 const unsigned char *str2
= (const unsigned char *)s2
;
563 s_assert(s1
!= NULL
);
564 s_assert(s2
!= NULL
);
566 while ((res
= ToUpper(*str1
) - ToUpper(*str2
)) == 0)
576 int ircncmp(const char *s1
, const char *s2
, int n
)
578 const unsigned char *str1
= (const unsigned char *)s1
;
579 const unsigned char *str2
= (const unsigned char *)s2
;
581 s_assert(s1
!= NULL
);
582 s_assert(s2
!= NULL
);
584 while ((res
= ToUpper(*str1
) - ToUpper(*str2
)) == 0)
589 if (n
== 0 || (*str1
== '\0' && *str2
== '\0'))
595 const unsigned char ToLowerTab
[] = {
596 0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa,
597 0xb, 0xc, 0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14,
598 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
600 ' ', '!', '"', '#', '$', '%', '&', 0x27, '(', ')',
601 '*', '+', ',', '-', '.', '/',
602 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
603 ':', ';', '<', '=', '>', '?',
604 '@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
605 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
606 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
608 '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
609 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
610 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
612 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
613 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
614 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
615 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
616 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9,
617 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
618 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9,
619 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
620 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9,
621 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
622 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
623 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
624 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
625 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
626 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
627 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
630 const unsigned char ToUpperTab
[] = {
631 0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa,
632 0xb, 0xc, 0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14,
633 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
635 ' ', '!', '"', '#', '$', '%', '&', 0x27, '(', ')',
636 '*', '+', ',', '-', '.', '/',
637 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
638 ':', ';', '<', '=', '>', '?',
639 '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
640 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
641 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^',
643 '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
644 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
645 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^',
647 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
648 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
649 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
650 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
651 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9,
652 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
653 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9,
654 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
655 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9,
656 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
657 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
658 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
659 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
660 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
661 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
662 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
668 * NOTE: RFC 1459 sez: anything but a ^G, comma, or space is allowed
671 const unsigned int CharAttrs
[] = {
673 /* 1 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
674 /* 2 */ CNTRL_C
| CHAN_C
| FCHAN_C
| NONEOS_C
,
675 /* 3 */ CNTRL_C
| CHAN_C
| FCHAN_C
| NONEOS_C
,
676 /* 4 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
677 /* 5 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
678 /* 6 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
679 /* 7 BEL */ CNTRL_C
| NONEOS_C
,
680 /* 8 \b */ CNTRL_C
| CHAN_C
| NONEOS_C
,
681 /* 9 \t */ CNTRL_C
| SPACE_C
| CHAN_C
| NONEOS_C
,
682 /* 10 \n */ CNTRL_C
| SPACE_C
| CHAN_C
| NONEOS_C
| EOL_C
,
683 /* 11 \v */ CNTRL_C
| SPACE_C
| CHAN_C
| NONEOS_C
,
684 /* 12 \f */ CNTRL_C
| SPACE_C
| CHAN_C
| NONEOS_C
,
685 /* 13 \r */ CNTRL_C
| SPACE_C
| CHAN_C
| NONEOS_C
| EOL_C
,
686 /* 14 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
687 /* 15 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
688 /* 16 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
689 /* 17 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
690 /* 18 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
691 /* 19 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
692 /* 20 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
693 /* 21 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
694 /* 22 */ CNTRL_C
| CHAN_C
| FCHAN_C
| NONEOS_C
,
695 /* 23 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
696 /* 24 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
697 /* 25 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
698 /* 26 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
699 /* 27 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
700 /* 28 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
701 /* 29 */ CNTRL_C
| CHAN_C
| FCHAN_C
| NONEOS_C
,
702 /* 30 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
703 /* 31 */ CNTRL_C
| CHAN_C
| FCHAN_C
| NONEOS_C
,
704 /* SP */ PRINT_C
| SPACE_C
,
705 /* ! */ PRINT_C
| KWILD_C
| CHAN_C
| NONEOS_C
,
706 /* " */ PRINT_C
| CHAN_C
| NONEOS_C
,
707 /* # */ PRINT_C
| MWILD_C
| CHANPFX_C
| CHAN_C
| NONEOS_C
,
708 /* $ */ PRINT_C
| CHAN_C
| NONEOS_C
,
709 /* % */ PRINT_C
| CHAN_C
| NONEOS_C
,
710 /* & */ PRINT_C
| CHANPFX_C
| CHAN_C
| NONEOS_C
,
711 /* ' */ PRINT_C
| CHAN_C
| NONEOS_C
,
712 /* ( */ PRINT_C
| CHAN_C
| NONEOS_C
,
713 /* ) */ PRINT_C
| CHAN_C
| NONEOS_C
,
714 /* * */ PRINT_C
| KWILD_C
| MWILD_C
| CHAN_C
| NONEOS_C
,
715 /* + */ PRINT_C
| CHAN_C
| NONEOS_C
,
716 /* , */ PRINT_C
| NONEOS_C
,
717 /* - */ PRINT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
718 /* . */ PRINT_C
| KWILD_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
| SERV_C
,
719 /* / */ PRINT_C
| CHAN_C
| NONEOS_C
| HOST_C
,
720 /* 0 */ PRINT_C
| DIGIT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
721 /* 1 */ PRINT_C
| DIGIT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
722 /* 2 */ PRINT_C
| DIGIT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
723 /* 3 */ PRINT_C
| DIGIT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
724 /* 4 */ PRINT_C
| DIGIT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
725 /* 5 */ PRINT_C
| DIGIT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
726 /* 6 */ PRINT_C
| DIGIT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
727 /* 7 */ PRINT_C
| DIGIT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
728 /* 8 */ PRINT_C
| DIGIT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
729 /* 9 */ PRINT_C
| DIGIT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
730 /* : */ PRINT_C
| CHAN_C
| NONEOS_C
| HOST_C
,
731 /* ; */ PRINT_C
| CHAN_C
| NONEOS_C
,
732 /* < */ PRINT_C
| CHAN_C
| NONEOS_C
,
733 /* = */ PRINT_C
| CHAN_C
| NONEOS_C
,
734 /* > */ PRINT_C
| CHAN_C
| NONEOS_C
,
735 /* ? */ PRINT_C
| KWILD_C
| MWILD_C
| CHAN_C
| NONEOS_C
,
736 /* @ */ PRINT_C
| KWILD_C
| MWILD_C
| CHAN_C
| NONEOS_C
,
737 /* A */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
738 /* B */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
739 /* C */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
740 /* D */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
741 /* E */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
742 /* F */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
743 /* G */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
744 /* H */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
745 /* I */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
746 /* J */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
747 /* K */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
748 /* L */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
749 /* M */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
750 /* N */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
751 /* O */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
752 /* P */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
753 /* Q */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
754 /* R */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
755 /* S */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
756 /* T */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
757 /* U */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
758 /* V */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
759 /* W */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
760 /* X */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
761 /* Y */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
762 /* Z */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
763 /* [ */ PRINT_C
| ALPHA_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
,
764 /* \ */ PRINT_C
| ALPHA_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
,
765 /* ] */ PRINT_C
| ALPHA_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
,
766 /* ^ */ PRINT_C
| ALPHA_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
,
767 /* _ */ PRINT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
,
768 /* ` */ PRINT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
,
769 /* a */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
770 /* b */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
771 /* c */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
772 /* d */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
773 /* e */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
774 /* f */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
775 /* g */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
776 /* h */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
777 /* i */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
778 /* j */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
779 /* k */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
780 /* l */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
781 /* m */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
782 /* n */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
783 /* o */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
784 /* p */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
785 /* q */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
786 /* r */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
787 /* s */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
788 /* t */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
789 /* u */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
790 /* v */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
791 /* w */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
792 /* x */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
793 /* y */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
794 /* z */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
795 /* { */ PRINT_C
| ALPHA_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
,
796 /* | */ PRINT_C
| ALPHA_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
,
797 /* } */ PRINT_C
| ALPHA_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
,
798 /* ~ */ PRINT_C
| ALPHA_C
| CHAN_C
| NONEOS_C
| USER_C
,
799 /* del */ CHAN_C
| NONEOS_C
,
800 /* 0x80 */ CHAN_C
| NONEOS_C
,
801 /* 0x81 */ CHAN_C
| NONEOS_C
,
802 /* 0x82 */ CHAN_C
| NONEOS_C
,
803 /* 0x83 */ CHAN_C
| NONEOS_C
,
804 /* 0x84 */ CHAN_C
| NONEOS_C
,
805 /* 0x85 */ CHAN_C
| NONEOS_C
,
806 /* 0x86 */ CHAN_C
| NONEOS_C
,
807 /* 0x87 */ CHAN_C
| NONEOS_C
,
808 /* 0x88 */ CHAN_C
| NONEOS_C
,
809 /* 0x89 */ CHAN_C
| NONEOS_C
,
810 /* 0x8A */ CHAN_C
| NONEOS_C
,
811 /* 0x8B */ CHAN_C
| NONEOS_C
,
812 /* 0x8C */ CHAN_C
| NONEOS_C
,
813 /* 0x8D */ CHAN_C
| NONEOS_C
,
814 /* 0x8E */ CHAN_C
| NONEOS_C
,
815 /* 0x8F */ CHAN_C
| NONEOS_C
,
816 /* 0x90 */ CHAN_C
| NONEOS_C
,
817 /* 0x91 */ CHAN_C
| NONEOS_C
,
818 /* 0x92 */ CHAN_C
| NONEOS_C
,
819 /* 0x93 */ CHAN_C
| NONEOS_C
,
820 /* 0x94 */ CHAN_C
| NONEOS_C
,
821 /* 0x95 */ CHAN_C
| NONEOS_C
,
822 /* 0x96 */ CHAN_C
| NONEOS_C
,
823 /* 0x97 */ CHAN_C
| NONEOS_C
,
824 /* 0x98 */ CHAN_C
| NONEOS_C
,
825 /* 0x99 */ CHAN_C
| NONEOS_C
,
826 /* 0x9A */ CHAN_C
| NONEOS_C
,
827 /* 0x9B */ CHAN_C
| NONEOS_C
,
828 /* 0x9C */ CHAN_C
| NONEOS_C
,
829 /* 0x9D */ CHAN_C
| NONEOS_C
,
830 /* 0x9E */ CHAN_C
| NONEOS_C
,
831 /* 0x9F */ CHAN_C
| NONEOS_C
,
832 /* 0xA0 */ CHAN_C
| FCHAN_C
| NONEOS_C
,
833 /* 0xA1 */ CHAN_C
| NONEOS_C
,
834 /* 0xA2 */ CHAN_C
| NONEOS_C
,
835 /* 0xA3 */ CHAN_C
| NONEOS_C
,
836 /* 0xA4 */ CHAN_C
| NONEOS_C
,
837 /* 0xA5 */ CHAN_C
| NONEOS_C
,
838 /* 0xA6 */ CHAN_C
| NONEOS_C
,
839 /* 0xA7 */ CHAN_C
| NONEOS_C
,
840 /* 0xA8 */ CHAN_C
| NONEOS_C
,
841 /* 0xA9 */ CHAN_C
| NONEOS_C
,
842 /* 0xAA */ CHAN_C
| NONEOS_C
,
843 /* 0xAB */ CHAN_C
| NONEOS_C
,
844 /* 0xAC */ CHAN_C
| NONEOS_C
,
845 /* 0xAD */ CHAN_C
| NONEOS_C
,
846 /* 0xAE */ CHAN_C
| NONEOS_C
,
847 /* 0xAF */ CHAN_C
| NONEOS_C
,
848 /* 0xB0 */ CHAN_C
| NONEOS_C
,
849 /* 0xB1 */ CHAN_C
| NONEOS_C
,
850 /* 0xB2 */ CHAN_C
| NONEOS_C
,
851 /* 0xB3 */ CHAN_C
| NONEOS_C
,
852 /* 0xB4 */ CHAN_C
| NONEOS_C
,
853 /* 0xB5 */ CHAN_C
| NONEOS_C
,
854 /* 0xB6 */ CHAN_C
| NONEOS_C
,
855 /* 0xB7 */ CHAN_C
| NONEOS_C
,
856 /* 0xB8 */ CHAN_C
| NONEOS_C
,
857 /* 0xB9 */ CHAN_C
| NONEOS_C
,
858 /* 0xBA */ CHAN_C
| NONEOS_C
,
859 /* 0xBB */ CHAN_C
| NONEOS_C
,
860 /* 0xBC */ CHAN_C
| NONEOS_C
,
861 /* 0xBD */ CHAN_C
| NONEOS_C
,
862 /* 0xBE */ CHAN_C
| NONEOS_C
,
863 /* 0xBF */ CHAN_C
| NONEOS_C
,
864 /* 0xC0 */ CHAN_C
| NONEOS_C
,
865 /* 0xC1 */ CHAN_C
| NONEOS_C
,
866 /* 0xC2 */ CHAN_C
| NONEOS_C
,
867 /* 0xC3 */ CHAN_C
| NONEOS_C
,
868 /* 0xC4 */ CHAN_C
| NONEOS_C
,
869 /* 0xC5 */ CHAN_C
| NONEOS_C
,
870 /* 0xC6 */ CHAN_C
| NONEOS_C
,
871 /* 0xC7 */ CHAN_C
| NONEOS_C
,
872 /* 0xC8 */ CHAN_C
| NONEOS_C
,
873 /* 0xC9 */ CHAN_C
| NONEOS_C
,
874 /* 0xCA */ CHAN_C
| NONEOS_C
,
875 /* 0xCB */ CHAN_C
| NONEOS_C
,
876 /* 0xCC */ CHAN_C
| NONEOS_C
,
877 /* 0xCD */ CHAN_C
| NONEOS_C
,
878 /* 0xCE */ CHAN_C
| NONEOS_C
,
879 /* 0xCF */ CHAN_C
| NONEOS_C
,
880 /* 0xD0 */ CHAN_C
| NONEOS_C
,
881 /* 0xD1 */ CHAN_C
| NONEOS_C
,
882 /* 0xD2 */ CHAN_C
| NONEOS_C
,
883 /* 0xD3 */ CHAN_C
| NONEOS_C
,
884 /* 0xD4 */ CHAN_C
| NONEOS_C
,
885 /* 0xD5 */ CHAN_C
| NONEOS_C
,
886 /* 0xD6 */ CHAN_C
| NONEOS_C
,
887 /* 0xD7 */ CHAN_C
| NONEOS_C
,
888 /* 0xD8 */ CHAN_C
| NONEOS_C
,
889 /* 0xD9 */ CHAN_C
| NONEOS_C
,
890 /* 0xDA */ CHAN_C
| NONEOS_C
,
891 /* 0xDB */ CHAN_C
| NONEOS_C
,
892 /* 0xDC */ CHAN_C
| NONEOS_C
,
893 /* 0xDD */ CHAN_C
| NONEOS_C
,
894 /* 0xDE */ CHAN_C
| NONEOS_C
,
895 /* 0xDF */ CHAN_C
| NONEOS_C
,
896 /* 0xE0 */ CHAN_C
| NONEOS_C
,
897 /* 0xE1 */ CHAN_C
| NONEOS_C
,
898 /* 0xE2 */ CHAN_C
| NONEOS_C
,
899 /* 0xE3 */ CHAN_C
| NONEOS_C
,
900 /* 0xE4 */ CHAN_C
| NONEOS_C
,
901 /* 0xE5 */ CHAN_C
| NONEOS_C
,
902 /* 0xE6 */ CHAN_C
| NONEOS_C
,
903 /* 0xE7 */ CHAN_C
| NONEOS_C
,
904 /* 0xE8 */ CHAN_C
| NONEOS_C
,
905 /* 0xE9 */ CHAN_C
| NONEOS_C
,
906 /* 0xEA */ CHAN_C
| NONEOS_C
,
907 /* 0xEB */ CHAN_C
| NONEOS_C
,
908 /* 0xEC */ CHAN_C
| NONEOS_C
,
909 /* 0xED */ CHAN_C
| NONEOS_C
,
910 /* 0xEE */ CHAN_C
| NONEOS_C
,
911 /* 0xEF */ CHAN_C
| NONEOS_C
,
912 /* 0xF0 */ CHAN_C
| NONEOS_C
,
913 /* 0xF1 */ CHAN_C
| NONEOS_C
,
914 /* 0xF2 */ CHAN_C
| NONEOS_C
,
915 /* 0xF3 */ CHAN_C
| NONEOS_C
,
916 /* 0xF4 */ CHAN_C
| NONEOS_C
,
917 /* 0xF5 */ CHAN_C
| NONEOS_C
,
918 /* 0xF6 */ CHAN_C
| NONEOS_C
,
919 /* 0xF7 */ CHAN_C
| NONEOS_C
,
920 /* 0xF8 */ CHAN_C
| NONEOS_C
,
921 /* 0xF9 */ CHAN_C
| NONEOS_C
,
922 /* 0xFA */ CHAN_C
| NONEOS_C
,
923 /* 0xFB */ CHAN_C
| NONEOS_C
,
924 /* 0xFC */ CHAN_C
| NONEOS_C
,
925 /* 0xFD */ CHAN_C
| NONEOS_C
,
926 /* 0xFE */ CHAN_C
| NONEOS_C
,
927 /* 0xFF */ CHAN_C
| NONEOS_C