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
--);;
264 if(*m
== '*' && (m
> (const unsigned char *)mask
))
274 * XXX - shouldn't need to spin here, the mask should have been
275 * collapsed before match is called
285 match1
= *m
== 's' ? *n
== ' ' : ToLower(*m
) == ToLower(*n
);
289 match1
= IsLetter(*n
);
291 match1
= IsDigit(*n
);
293 match1
= ToLower(*m
) == ToLower(*n
);
312 int comp_with_mask(void *addr
, void *dest
, u_int mask
)
314 if (memcmp(addr
, dest
, mask
/ 8) == 0)
317 int m
= ((-1) << (8 - (mask
% 8)));
318 if (mask
% 8 == 0 || (((u_char
*) addr
)[n
] & m
) == (((u_char
*) dest
)[n
] & m
))
326 int comp_with_mask_sock(struct sockaddr
*addr
, struct sockaddr
*dest
, u_int mask
)
331 if (addr
->sa_family
== AF_INET
)
333 iaddr
= &((struct sockaddr_in
*)addr
)->sin_addr
;
334 idest
= &((struct sockaddr_in
*)dest
)->sin_addr
;
339 iaddr
= &((struct sockaddr_in6
*)addr
)->sin6_addr
;
340 idest
= &((struct sockaddr_in6
*)dest
)->sin6_addr
;
345 return (comp_with_mask(iaddr
, idest
, mask
));
351 * Input - cidr ip mask, address
353 int match_ips(const char *s1
, const char *s2
)
355 struct rb_sockaddr_storage ipaddr
, maskaddr
;
357 char address
[HOSTLEN
+ 1];
359 void *ipptr
, *maskptr
;
365 len
= strrchr(mask
, '/');
376 if (strchr(mask
, ':') && strchr(address
, ':'))
382 ipptr
= &((struct sockaddr_in6
*)&ipaddr
)->sin6_addr
;
383 maskptr
= &((struct sockaddr_in6
*)&maskaddr
)->sin6_addr
;
387 if (!strchr(mask
, ':') && !strchr(address
, ':'))
393 ipptr
= &((struct sockaddr_in
*)&ipaddr
)->sin_addr
;
394 maskptr
= &((struct sockaddr_in
*)&maskaddr
)->sin_addr
;
399 rb_inet_pton(aftype
, address
, ipptr
);
400 rb_inet_pton(aftype
, mask
, maskptr
);
401 if (comp_with_mask(ipptr
, maskptr
, cidrlen
))
409 * Input - mask, address
410 * Ouput - 1 = Matched 0 = Did not match
413 int match_cidr(const char *s1
, const char *s2
)
415 struct rb_sockaddr_storage ipaddr
, maskaddr
;
417 char address
[NICKLEN
+ USERLEN
+ HOSTLEN
+ 6];
421 void *ipptr
, *maskptr
;
427 ipmask
= strrchr(mask
, '@');
433 ip
= strrchr(address
, '@');
439 len
= strrchr(ipmask
, '/');
450 if (strchr(ip
, ':') && strchr(ipmask
, ':'))
456 ipptr
= &((struct sockaddr_in6
*)&ipaddr
)->sin6_addr
;
457 maskptr
= &((struct sockaddr_in6
*)&maskaddr
)->sin6_addr
;
461 if (!strchr(ip
, ':') && !strchr(ipmask
, ':'))
467 ipptr
= &((struct sockaddr_in
*)&ipaddr
)->sin_addr
;
468 maskptr
= &((struct sockaddr_in
*)&maskaddr
)->sin_addr
;
473 rb_inet_pton(aftype
, ip
, ipptr
);
474 rb_inet_pton(aftype
, ipmask
, maskptr
);
475 if (comp_with_mask(ipptr
, maskptr
, cidrlen
) && match(mask
, address
))
483 * collapses a string containing multiple *'s.
485 char *collapse(char *pattern
)
487 char *p
= pattern
, *po
= pattern
;
515 * The collapse() function with support for escaping characters
517 char *collapse_esc(char *pattern
)
519 char *p
= pattern
, *po
= pattern
;
528 if (!(f
& 2) && c
== '*')
534 else if (!(f
& 2) && c
== '\\')
550 * irccmp - case insensitive comparison of two 0 terminated strings.
552 * returns 0, if s1 equal to s2
553 * <0, if s1 lexicographically less than s2
554 * >0, if s1 lexicographically greater than s2
556 int irccmp(const char *s1
, const char *s2
)
558 const unsigned char *str1
= (const unsigned char *)s1
;
559 const unsigned char *str2
= (const unsigned char *)s2
;
562 s_assert(s1
!= NULL
);
563 s_assert(s2
!= NULL
);
565 while ((res
= ToUpper(*str1
) - ToUpper(*str2
)) == 0)
575 int ircncmp(const char *s1
, const char *s2
, int n
)
577 const unsigned char *str1
= (const unsigned char *)s1
;
578 const unsigned char *str2
= (const unsigned char *)s2
;
580 s_assert(s1
!= NULL
);
581 s_assert(s2
!= NULL
);
583 while ((res
= ToUpper(*str1
) - ToUpper(*str2
)) == 0)
588 if (n
== 0 || (*str1
== '\0' && *str2
== '\0'))
594 const unsigned char ToLowerTab
[] = {
595 0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa,
596 0xb, 0xc, 0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14,
597 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
599 ' ', '!', '"', '#', '$', '%', '&', 0x27, '(', ')',
600 '*', '+', ',', '-', '.', '/',
601 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
602 ':', ';', '<', '=', '>', '?',
603 '@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
604 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
605 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
607 '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
608 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
609 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
611 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
612 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
613 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
614 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
615 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9,
616 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
617 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9,
618 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
619 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9,
620 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
621 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
622 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
623 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
624 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
625 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
626 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
629 const unsigned char ToUpperTab
[] = {
630 0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa,
631 0xb, 0xc, 0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14,
632 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
634 ' ', '!', '"', '#', '$', '%', '&', 0x27, '(', ')',
635 '*', '+', ',', '-', '.', '/',
636 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
637 ':', ';', '<', '=', '>', '?',
638 '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
639 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
640 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^',
642 '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
643 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
644 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^',
646 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
647 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
648 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
649 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
650 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9,
651 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
652 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9,
653 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
654 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9,
655 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
656 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
657 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
658 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
659 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
660 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
661 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
667 * NOTE: RFC 1459 sez: anything but a ^G, comma, or space is allowed
670 const unsigned int CharAttrs
[] = {
672 /* 1 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
673 /* 2 */ CNTRL_C
| CHAN_C
| FCHAN_C
| NONEOS_C
,
674 /* 3 */ CNTRL_C
| CHAN_C
| FCHAN_C
| NONEOS_C
,
675 /* 4 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
676 /* 5 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
677 /* 6 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
678 /* 7 BEL */ CNTRL_C
| NONEOS_C
,
679 /* 8 \b */ CNTRL_C
| CHAN_C
| NONEOS_C
,
680 /* 9 \t */ CNTRL_C
| SPACE_C
| CHAN_C
| NONEOS_C
,
681 /* 10 \n */ CNTRL_C
| SPACE_C
| CHAN_C
| NONEOS_C
| EOL_C
,
682 /* 11 \v */ CNTRL_C
| SPACE_C
| CHAN_C
| NONEOS_C
,
683 /* 12 \f */ CNTRL_C
| SPACE_C
| CHAN_C
| NONEOS_C
,
684 /* 13 \r */ CNTRL_C
| SPACE_C
| CHAN_C
| NONEOS_C
| EOL_C
,
685 /* 14 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
686 /* 15 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
687 /* 16 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
688 /* 17 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
689 /* 18 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
690 /* 19 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
691 /* 20 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
692 /* 21 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
693 /* 22 */ CNTRL_C
| CHAN_C
| FCHAN_C
| NONEOS_C
,
694 /* 23 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
695 /* 24 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
696 /* 25 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
697 /* 26 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
698 /* 27 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
699 /* 28 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
700 /* 29 */ CNTRL_C
| CHAN_C
| FCHAN_C
| NONEOS_C
,
701 /* 30 */ CNTRL_C
| CHAN_C
| NONEOS_C
,
702 /* 31 */ CNTRL_C
| CHAN_C
| FCHAN_C
| NONEOS_C
,
703 /* SP */ PRINT_C
| SPACE_C
,
704 /* ! */ PRINT_C
| KWILD_C
| CHAN_C
| NONEOS_C
,
705 /* " */ PRINT_C
| CHAN_C
| NONEOS_C
,
706 /* # */ PRINT_C
| MWILD_C
| CHANPFX_C
| CHAN_C
| NONEOS_C
,
707 /* $ */ PRINT_C
| CHAN_C
| NONEOS_C
,
708 /* % */ PRINT_C
| CHAN_C
| NONEOS_C
,
709 /* & */ PRINT_C
| CHANPFX_C
| CHAN_C
| NONEOS_C
,
710 /* ' */ PRINT_C
| CHAN_C
| NONEOS_C
,
711 /* ( */ PRINT_C
| CHAN_C
| NONEOS_C
,
712 /* ) */ PRINT_C
| CHAN_C
| NONEOS_C
,
713 /* * */ PRINT_C
| KWILD_C
| MWILD_C
| CHAN_C
| NONEOS_C
,
714 /* + */ PRINT_C
| CHAN_C
| NONEOS_C
,
715 /* , */ PRINT_C
| NONEOS_C
,
716 /* - */ PRINT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
717 /* . */ PRINT_C
| KWILD_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
| SERV_C
,
718 /* / */ PRINT_C
| CHAN_C
| NONEOS_C
| HOST_C
,
719 /* 0 */ PRINT_C
| DIGIT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
720 /* 1 */ PRINT_C
| DIGIT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
721 /* 2 */ PRINT_C
| DIGIT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
722 /* 3 */ PRINT_C
| DIGIT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
723 /* 4 */ PRINT_C
| DIGIT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
724 /* 5 */ PRINT_C
| DIGIT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
725 /* 6 */ PRINT_C
| DIGIT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
726 /* 7 */ PRINT_C
| DIGIT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
727 /* 8 */ PRINT_C
| DIGIT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
728 /* 9 */ PRINT_C
| DIGIT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
729 /* : */ PRINT_C
| CHAN_C
| NONEOS_C
| HOST_C
,
730 /* ; */ PRINT_C
| CHAN_C
| NONEOS_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
| KWILD_C
| MWILD_C
| CHAN_C
| NONEOS_C
,
735 /* @ */ PRINT_C
| KWILD_C
| MWILD_C
| CHAN_C
| NONEOS_C
,
736 /* A */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
737 /* B */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
738 /* C */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
739 /* D */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
740 /* E */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
741 /* F */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
742 /* G */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
743 /* H */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
744 /* I */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
745 /* J */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
746 /* K */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
747 /* L */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
748 /* M */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
749 /* N */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
750 /* O */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
751 /* P */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
752 /* Q */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
753 /* R */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
754 /* S */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
755 /* T */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
756 /* U */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
757 /* V */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
758 /* W */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
759 /* X */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
760 /* Y */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
761 /* Z */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
762 /* [ */ PRINT_C
| ALPHA_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_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
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
,
767 /* ` */ PRINT_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
,
768 /* a */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
769 /* b */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
770 /* c */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
771 /* d */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
772 /* e */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
773 /* f */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
774 /* g */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
775 /* h */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
776 /* i */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
777 /* j */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
778 /* k */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
779 /* l */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
780 /* m */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
781 /* n */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
782 /* o */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
783 /* p */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
784 /* q */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
785 /* r */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
786 /* s */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
787 /* t */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
788 /* u */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
789 /* v */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
790 /* w */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
791 /* x */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
792 /* y */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
793 /* z */ PRINT_C
| ALPHA_C
| LET_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_C
| HOST_C
,
794 /* { */ PRINT_C
| ALPHA_C
| NICK_C
| CHAN_C
| NONEOS_C
| USER_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
| CHAN_C
| NONEOS_C
| USER_C
,
798 /* del */ CHAN_C
| NONEOS_C
,
799 /* 0x80 */ CHAN_C
| NONEOS_C
,
800 /* 0x81 */ CHAN_C
| NONEOS_C
,
801 /* 0x82 */ CHAN_C
| NONEOS_C
,
802 /* 0x83 */ CHAN_C
| NONEOS_C
,
803 /* 0x84 */ CHAN_C
| NONEOS_C
,
804 /* 0x85 */ CHAN_C
| NONEOS_C
,
805 /* 0x86 */ CHAN_C
| NONEOS_C
,
806 /* 0x87 */ CHAN_C
| NONEOS_C
,
807 /* 0x88 */ CHAN_C
| NONEOS_C
,
808 /* 0x89 */ CHAN_C
| NONEOS_C
,
809 /* 0x8A */ CHAN_C
| NONEOS_C
,
810 /* 0x8B */ CHAN_C
| NONEOS_C
,
811 /* 0x8C */ CHAN_C
| NONEOS_C
,
812 /* 0x8D */ CHAN_C
| NONEOS_C
,
813 /* 0x8E */ CHAN_C
| NONEOS_C
,
814 /* 0x8F */ CHAN_C
| NONEOS_C
,
815 /* 0x90 */ CHAN_C
| NONEOS_C
,
816 /* 0x91 */ CHAN_C
| NONEOS_C
,
817 /* 0x92 */ CHAN_C
| NONEOS_C
,
818 /* 0x93 */ CHAN_C
| NONEOS_C
,
819 /* 0x94 */ CHAN_C
| NONEOS_C
,
820 /* 0x95 */ CHAN_C
| NONEOS_C
,
821 /* 0x96 */ CHAN_C
| NONEOS_C
,
822 /* 0x97 */ CHAN_C
| NONEOS_C
,
823 /* 0x98 */ CHAN_C
| NONEOS_C
,
824 /* 0x99 */ CHAN_C
| NONEOS_C
,
825 /* 0x9A */ CHAN_C
| NONEOS_C
,
826 /* 0x9B */ CHAN_C
| NONEOS_C
,
827 /* 0x9C */ CHAN_C
| NONEOS_C
,
828 /* 0x9D */ CHAN_C
| NONEOS_C
,
829 /* 0x9E */ CHAN_C
| NONEOS_C
,
830 /* 0x9F */ CHAN_C
| NONEOS_C
,
831 /* 0xA0 */ CHAN_C
| FCHAN_C
| NONEOS_C
,
832 /* 0xA1 */ CHAN_C
| NONEOS_C
,
833 /* 0xA2 */ CHAN_C
| NONEOS_C
,
834 /* 0xA3 */ CHAN_C
| NONEOS_C
,
835 /* 0xA4 */ CHAN_C
| NONEOS_C
,
836 /* 0xA5 */ CHAN_C
| NONEOS_C
,
837 /* 0xA6 */ CHAN_C
| NONEOS_C
,
838 /* 0xA7 */ CHAN_C
| NONEOS_C
,
839 /* 0xA8 */ CHAN_C
| NONEOS_C
,
840 /* 0xA9 */ CHAN_C
| NONEOS_C
,
841 /* 0xAA */ CHAN_C
| NONEOS_C
,
842 /* 0xAB */ CHAN_C
| NONEOS_C
,
843 /* 0xAC */ CHAN_C
| NONEOS_C
,
844 /* 0xAD */ CHAN_C
| NONEOS_C
,
845 /* 0xAE */ CHAN_C
| NONEOS_C
,
846 /* 0xAF */ CHAN_C
| NONEOS_C
,
847 /* 0xB0 */ CHAN_C
| NONEOS_C
,
848 /* 0xB1 */ CHAN_C
| NONEOS_C
,
849 /* 0xB2 */ CHAN_C
| NONEOS_C
,
850 /* 0xB3 */ CHAN_C
| NONEOS_C
,
851 /* 0xB4 */ CHAN_C
| NONEOS_C
,
852 /* 0xB5 */ CHAN_C
| NONEOS_C
,
853 /* 0xB6 */ CHAN_C
| NONEOS_C
,
854 /* 0xB7 */ CHAN_C
| NONEOS_C
,
855 /* 0xB8 */ CHAN_C
| NONEOS_C
,
856 /* 0xB9 */ CHAN_C
| NONEOS_C
,
857 /* 0xBA */ CHAN_C
| NONEOS_C
,
858 /* 0xBB */ CHAN_C
| NONEOS_C
,
859 /* 0xBC */ CHAN_C
| NONEOS_C
,
860 /* 0xBD */ CHAN_C
| NONEOS_C
,
861 /* 0xBE */ CHAN_C
| NONEOS_C
,
862 /* 0xBF */ CHAN_C
| NONEOS_C
,
863 /* 0xC0 */ CHAN_C
| NONEOS_C
,
864 /* 0xC1 */ CHAN_C
| NONEOS_C
,
865 /* 0xC2 */ CHAN_C
| NONEOS_C
,
866 /* 0xC3 */ CHAN_C
| NONEOS_C
,
867 /* 0xC4 */ CHAN_C
| NONEOS_C
,
868 /* 0xC5 */ CHAN_C
| NONEOS_C
,
869 /* 0xC6 */ CHAN_C
| NONEOS_C
,
870 /* 0xC7 */ CHAN_C
| NONEOS_C
,
871 /* 0xC8 */ CHAN_C
| NONEOS_C
,
872 /* 0xC9 */ CHAN_C
| NONEOS_C
,
873 /* 0xCA */ CHAN_C
| NONEOS_C
,
874 /* 0xCB */ CHAN_C
| NONEOS_C
,
875 /* 0xCC */ CHAN_C
| NONEOS_C
,
876 /* 0xCD */ CHAN_C
| NONEOS_C
,
877 /* 0xCE */ CHAN_C
| NONEOS_C
,
878 /* 0xCF */ CHAN_C
| NONEOS_C
,
879 /* 0xD0 */ CHAN_C
| NONEOS_C
,
880 /* 0xD1 */ CHAN_C
| NONEOS_C
,
881 /* 0xD2 */ CHAN_C
| NONEOS_C
,
882 /* 0xD3 */ CHAN_C
| NONEOS_C
,
883 /* 0xD4 */ CHAN_C
| NONEOS_C
,
884 /* 0xD5 */ CHAN_C
| NONEOS_C
,
885 /* 0xD6 */ CHAN_C
| NONEOS_C
,
886 /* 0xD7 */ CHAN_C
| NONEOS_C
,
887 /* 0xD8 */ CHAN_C
| NONEOS_C
,
888 /* 0xD9 */ CHAN_C
| NONEOS_C
,
889 /* 0xDA */ CHAN_C
| NONEOS_C
,
890 /* 0xDB */ CHAN_C
| NONEOS_C
,
891 /* 0xDC */ CHAN_C
| NONEOS_C
,
892 /* 0xDD */ CHAN_C
| NONEOS_C
,
893 /* 0xDE */ CHAN_C
| NONEOS_C
,
894 /* 0xDF */ CHAN_C
| NONEOS_C
,
895 /* 0xE0 */ CHAN_C
| NONEOS_C
,
896 /* 0xE1 */ CHAN_C
| NONEOS_C
,
897 /* 0xE2 */ CHAN_C
| NONEOS_C
,
898 /* 0xE3 */ CHAN_C
| NONEOS_C
,
899 /* 0xE4 */ CHAN_C
| NONEOS_C
,
900 /* 0xE5 */ CHAN_C
| NONEOS_C
,
901 /* 0xE6 */ CHAN_C
| NONEOS_C
,
902 /* 0xE7 */ CHAN_C
| NONEOS_C
,
903 /* 0xE8 */ CHAN_C
| NONEOS_C
,
904 /* 0xE9 */ CHAN_C
| NONEOS_C
,
905 /* 0xEA */ CHAN_C
| NONEOS_C
,
906 /* 0xEB */ CHAN_C
| NONEOS_C
,
907 /* 0xEC */ CHAN_C
| NONEOS_C
,
908 /* 0xED */ CHAN_C
| NONEOS_C
,
909 /* 0xEE */ CHAN_C
| NONEOS_C
,
910 /* 0xEF */ CHAN_C
| NONEOS_C
,
911 /* 0xF0 */ CHAN_C
| NONEOS_C
,
912 /* 0xF1 */ CHAN_C
| NONEOS_C
,
913 /* 0xF2 */ CHAN_C
| NONEOS_C
,
914 /* 0xF3 */ CHAN_C
| NONEOS_C
,
915 /* 0xF4 */ CHAN_C
| NONEOS_C
,
916 /* 0xF5 */ CHAN_C
| NONEOS_C
,
917 /* 0xF6 */ CHAN_C
| NONEOS_C
,
918 /* 0xF7 */ CHAN_C
| NONEOS_C
,
919 /* 0xF8 */ CHAN_C
| NONEOS_C
,
920 /* 0xF9 */ CHAN_C
| NONEOS_C
,
921 /* 0xFA */ CHAN_C
| NONEOS_C
,
922 /* 0xFB */ CHAN_C
| NONEOS_C
,
923 /* 0xFC */ CHAN_C
| NONEOS_C
,
924 /* 0xFD */ CHAN_C
| NONEOS_C
,
925 /* 0xFE */ CHAN_C
| NONEOS_C
,
926 /* 0xFF */ CHAN_C
| NONEOS_C