]> jfr.im git - irc/quakenet/snircd.git/blame - include/ircd_chattr.h
forward port of asuka-check.patch to .12
[irc/quakenet/snircd.git] / include / ircd_chattr.h
CommitLineData
189935b1 1/*
2 * IRC - Internet Relay Chat, include/ircd_chattr.h
3 * Copyright (C) 1998 Andrea Cocito
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
20/** @file
21 * @brief Character attribute definitions and arrays.
22 * @version $Id: ircd_chattr.h,v 1.3 2004/10/05 02:10:00 entrope Exp $
23 *
24 * This character set code is adapted from Nemesi's Tools Library,
25 * which gives us the prefix NTL_ on these macros.
26 */
27
28#ifndef INCLUDED_ircd_chattr_h
29#define INCLUDED_ircd_chattr_h
30#ifndef INCLUDED_limits_h
31#include <limits.h>
32#define INCLUDED_limits_h
33#endif
34#ifndef INCLUDED_sys_types_h
35#include <sys/types.h>
36#define INCLUDED_sys_types_h
37#endif
38
39/*
40 * Character attribute macros
41 */
42#define NTL_ALNUM 0x0001 /**< (NTL_ALPHA | NTL_DIGIT) */
43#define NTL_ALPHA 0x0002 /**< (NTL_LOWER | NTL_UPPER) */
44#define NTL_CNTRL 0x0004 /**< \\000 - \\037 == 0x00 - 0x1F */
45#define NTL_DIGIT 0x0008 /**< 0123456789 */
46#define NTL_GRAPH 0x0010 /**< (NTL_ALNUM | NTL_PUNCT) */
47#define NTL_LOWER 0x0020 /**< abcdefghijklmnopqrstuvwxyz{|}~ */
48#define NTL_PRINT 0x0040 /**< (NTL_GRAPH | ' ') */
49#define NTL_PUNCT 0x0080 /**< !"#$%&'()*+,-./:;<=>?\@_` */
50#define NTL_SPACE 0x0100 /**< \\011\\012\\013\\014\\015\\040 */
51#define NTL_UPPER 0x0200 /**< ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^ */
52#define NTL_IRCCH 0x0400 /**< Channel's names charset */
53#define NTL_IRCCL 0x0800 /**< Force toLower() in ch-name */
54#define NTL_IRCNK 0x1000 /**< Nick names charset, aka isvalid() */
55#define NTL_IRCUI 0x2000 /**< UserIDs charset, IRCHN plus tilde */
56#define NTL_IRCHN 0x4000 /**< Hostnames charset (weak, RFC 1033) */
57#define NTL_IRCIP 0x8000 /**< Numeric IPs charset (DIGIT and .) */
58#define NTL_EOL 0x10000 /**< \\r\\n */
59#define NTL_KTIME 0x20000 /**< Valid character for a k:line time */
60#define NTL_CHPFX 0x40000 /**< channel prefix char # & + */
61#define NTL_IRCIP6 0x80000 /**< Numeric IPv6 character (hex or colon) */
62
63/*
64 * Tables used for translation and classification macros
65 */
66/** Array mapping characters to RFC 1459 lower-case versions.
67 * Yes, the variable name lies about the encoding.
68 */
69extern const char ToLowerTab_8859_1[];
70/** Array mapping characters to RFC 1459 upper-case versions.
71 * Yes, the variable name lies about the encoding.
72 */
73extern const char ToUpperTab_8859_1[];
74/** Array mapping characters to attribute bitmasks. */
75extern const unsigned int IRCD_CharAttrTab[];
76
77/*
78 * Translation macros for channel name case translation
79 * NOTE: Channel names are supposed to be lower case insensitive for
80 * ISO 8859-1 character sets.
81 */
82/** Convert a character to its lower-case equivalent. */
83#define ToLower(c) (ToLowerTab_8859_1[(c) - CHAR_MIN])
84/** Convert a character to its upper-case equivalent. */
85#define ToUpper(c) (ToUpperTab_8859_1[(c) - CHAR_MIN])
86
87/*
88 * Character classification macros
89 * NOTE: The IsUpper and IsLower macros do not apply to the complete
90 * ISO 8859-1 character set, unlike the ToUpper and ToLower macros above.
91 * IsUpper and IsLower only apply for comparisons of the US ASCII subset.
92 */
93/** Test whether a character is alphanumeric. */
94#define IsAlnum(c) (IRCD_CharAttrTab[(c) - CHAR_MIN] & NTL_ALNUM)
95/** Test whether a character is alphabetic. */
96#define IsAlpha(c) (IRCD_CharAttrTab[(c) - CHAR_MIN] & NTL_ALPHA)
97/** Test whether a character is a digit. */
98#define IsDigit(c) (IRCD_CharAttrTab[(c) - CHAR_MIN] & NTL_DIGIT)
99/** Test whether a character is lower case. */
100#define IsLower(c) (IRCD_CharAttrTab[(c) - CHAR_MIN] & NTL_LOWER)
101/** Test whether a character is whitespace. */
102#define IsSpace(c) (IRCD_CharAttrTab[(c) - CHAR_MIN] & NTL_SPACE)
103/** Test whether a character is upper case. */
104#define IsUpper(c) (IRCD_CharAttrTab[(c) - CHAR_MIN] & NTL_UPPER)
105/** Test whether a character is a control character. */
106#define IsCntrl(c) (IRCD_CharAttrTab[(c) - CHAR_MIN] & NTL_CNTRL)
107
108/** Test whether a character is valid in a channel name. */
109#define IsChannelChar(c) (IRCD_CharAttrTab[(c) - CHAR_MIN] & NTL_IRCCH)
110/** Test whether a character is a lower-case channel name character. */
111#define IsChannelLower(c) (IRCD_CharAttrTab[(c) - CHAR_MIN] & NTL_IRCCL)
112/** Test whether a character is a channel prefix. */
113#define IsChannelPrefix(c) (IRCD_CharAttrTab[(c) - CHAR_MIN] & NTL_CHPFX)
114/** Test whether a character is valid in a nickname. */
115#define IsNickChar(c) (IRCD_CharAttrTab[(c) - CHAR_MIN] & NTL_IRCNK)
116/** Test whether a character is valid in a userid. */
117#define IsUserChar(c) (IRCD_CharAttrTab[(c) - CHAR_MIN] & NTL_IRCUI)
118/** Test whether a character is valid in a hostname. */
119#define IsHostChar(c) (IRCD_CharAttrTab[(c) - CHAR_MIN] & NTL_IRCHN)
120/** Test whether a character is valid in an IPv4 address. */
121#define IsIPChar(c) (IRCD_CharAttrTab[(c) - CHAR_MIN] & NTL_IRCIP)
122/** Test whether a character is valid in an IPv6 address. */
123#define IsIP6Char(c) (IRCD_CharAttrTab[(c) - CHAR_MIN] & NTL_IRCIP6)
124/** Test whether a character is an end-of-line character. */
125#define IsEol(c) (IRCD_CharAttrTab[(c) - CHAR_MIN] & NTL_EOL)
126/** Test whether a character is valid in a K: line expiration string. */
127#define IsKTimeChar(c) (IRCD_CharAttrTab[(c) - CHAR_MIN] & NTL_KTIME)
128
129
130#endif /* INCLUDED_ircd_chattr_h */