summaryrefslogtreecommitdiff
path: root/subversion/include/svn_ctype.h
blob: 126355292c605a8e20cf9520f5b8fb9627e0f9d1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
/**
 * @copyright
 * ====================================================================
 *    Licensed to the Apache Software Foundation (ASF) under one
 *    or more contributor license agreements.  See the NOTICE file
 *    distributed with this work for additional information
 *    regarding copyright ownership.  The ASF licenses this file
 *    to you under the Apache License, Version 2.0 (the
 *    "License"); you may not use this file except in compliance
 *    with the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing,
 *    software distributed under the License is distributed on an
 *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *    KIND, either express or implied.  See the License for the
 *    specific language governing permissions and limitations
 *    under the License.
 * ====================================================================
 * @endcopyright
 *
 * @file svn_ctype.h
 * @brief Character classification routines
 * @since New in 1.2.
 */


#ifndef SVN_CTYPE_H
#define SVN_CTYPE_H

#include <apr.h>


#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */


/** Table of flags for character classification. */
extern const apr_uint32_t *const svn_ctype_table;


/** Check if @a c is in the character class described by @a flags.
 * The @a flags is a bitwise-or combination of @c SVN_CTYPE_*
 * constants. Uses #svn_ctype_table.
 */
#define svn_ctype_test(c, flags) \
  (0 != (svn_ctype_table[(unsigned char)(c)] & (flags)))


/**
 * @defgroup ctype_basic Basic character classification - 7-bit ASCII only
 * @{
 */

/* Basic character classes */
#define SVN_CTYPE_CNTRL    0x0001 /**< Control character */
#define SVN_CTYPE_SPACE    0x0002 /**< Whitespace */
#define SVN_CTYPE_DIGIT    0x0004 /**< Decimal digit */
#define SVN_CTYPE_UPPER    0x0008 /**< Uppercase letter */
#define SVN_CTYPE_LOWER    0x0010 /**< Lowercase letter */
#define SVN_CTYPE_PUNCT    0x0020 /**< Punctuation mark */
#define SVN_CTYPE_XALPHA   0x0040 /**< Hexadecimal digits A to F */
#define SVN_CTYPE_ASCII    0x0080 /**< ASCII subset*/

/* Derived character classes */
/** ASCII letter */
#define SVN_CTYPE_ALPHA    (SVN_CTYPE_LOWER | SVN_CTYPE_UPPER)
/** ASCII letter or decimal digit */
#define SVN_CTYPE_ALNUM    (SVN_CTYPE_ALPHA | SVN_CTYPE_DIGIT)
/** ASCII hexadecimal digit */
#define SVN_CTYPE_XDIGIT   (SVN_CTYPE_DIGIT | SVN_CTYPE_XALPHA)
/** Printable ASCII except space */
#define SVN_CTYPE_GRAPH    (SVN_CTYPE_PUNCT | SVN_CTYPE_ALNUM)
/** All printable ASCII */
#define SVN_CTYPE_PRINT    (SVN_CTYPE_GRAPH | SVN_CTYPE_SPACE)


/** Check if @a c is an ASCII control character. */
#define svn_ctype_iscntrl(c)  svn_ctype_test((c), SVN_CTYPE_CNTRL)

/** Check if @a c is an ASCII whitespace character. */
#define svn_ctype_isspace(c)  svn_ctype_test((c), SVN_CTYPE_SPACE)

/** Check if @a c is an ASCII digit. */
#define svn_ctype_isdigit(c)  svn_ctype_test((c), SVN_CTYPE_DIGIT)

/** Check if @a c is an ASCII uppercase letter. */
#define svn_ctype_isupper(c)  svn_ctype_test((c), SVN_CTYPE_UPPER)

/** Check if @a c is an ASCII lowercase letter. */
#define svn_ctype_islower(c)  svn_ctype_test((c), SVN_CTYPE_LOWER)

/** Check if @a c is an ASCII punctuation mark. */
#define svn_ctype_ispunct(c)  svn_ctype_test((c), SVN_CTYPE_PUNCT)

/** Check if @a c is an ASCII character. */
#define svn_ctype_isascii(c)  svn_ctype_test((c), SVN_CTYPE_ASCII)

/** Check if @a c is an ASCII letter. */
#define svn_ctype_isalpha(c)  svn_ctype_test((c), SVN_CTYPE_ALPHA)

/** Check if @a c is an ASCII letter or decimal digit. */
#define svn_ctype_isalnum(c)  svn_ctype_test((c), SVN_CTYPE_ALNUM)

/** Check if @a c is an ASCII hexadecimal digit. */
#define svn_ctype_isxdigit(c) svn_ctype_test((c), SVN_CTYPE_XDIGIT)

/** Check if @a c is an ASCII graphical (visible printable) character. */
#define svn_ctype_isgraph(c)  svn_ctype_test((c), SVN_CTYPE_GRAPH)

/** Check if @a c is an ASCII printable character. */
#define svn_ctype_isprint(c)  svn_ctype_test((c), SVN_CTYPE_PRINT)

/** @} */

/**
 * @defgroup ctype_extra Extended character classification
 * @{
 */

/* Basic extended character classes */
#define SVN_CTYPE_UTF8LEAD 0x0100 /**< UTF-8 multibyte lead byte */
#define SVN_CTYPE_UTF8CONT 0x0200 /**< UTF-8 multibyte non-lead byte */
/* ### TBD
#define SVN_CTYPE_XMLNAME  0x0400
#define SVN_CTYPE_URISAFE  0x0800
*/

/* Derived extended character classes */
/** Part of a UTF-8 multibyte character. */
#define SVN_CTYPE_UTF8MBC  (SVN_CTYPE_UTF8LEAD | SVN_CTYPE_UTF8CONT)
/** All valid UTF-8 bytes. */
#define SVN_CTYPE_UTF8     (SVN_CTYPE_ASCII | SVN_CTYPE_UTF8MBC)

/** Check if @a c is a UTF-8 multibyte lead byte. */
#define svn_ctype_isutf8lead(c) svn_ctype_test((c), SVN_CTYPE_UTF8LEAD)

/** Check if @a c is a UTF-8 multibyte continuation (non-lead) byte. */
#define svn_ctype_isutf8cont(c) svn_ctype_test((c), SVN_CTYLE_UTF8CONT)

/** Check if @a c is part of a UTF-8 multibyte character. */
#define svn_ctype_isutf8mbc(c)  svn_ctype_test((c), SVN_CTYPE_UTF8MBC)

/** Check if @a c is valid in UTF-8. */
#define svn_ctype_isutf8(c)     svn_ctype_test((c), SVN_CTYPE_UTF8)

/** @} */

/**
 * @defgroup ctype_ascii ASCII character value constants
 * @{
 */

#define SVN_CTYPE_ASCII_MINUS            45 /**< ASCII value of '-' */
#define SVN_CTYPE_ASCII_DOT              46 /**< ASCII value of '.' */
#define SVN_CTYPE_ASCII_COLON            58 /**< ASCII value of ':' */
#define SVN_CTYPE_ASCII_UNDERSCORE       95 /**< ASCII value of '_' */
#define SVN_CTYPE_ASCII_TAB               9 /**< ASCII value of a tab */
#define SVN_CTYPE_ASCII_LINEFEED         10 /**< ASCII value of a line feed */
#define SVN_CTYPE_ASCII_CARRIAGERETURN   13
  /**< ASCII value of a carriage return */
#define SVN_CTYPE_ASCII_DELETE          127
  /**< ASCII value of a delete character */


/** @} */

/**
 * @defgroup ctype_case ASCII-subset case folding
 * @{
 */

/**
 * Compare two characters @a a and @a b, treating case-equivalent
 * unaccented Latin (ASCII subset) letters as equal.
 *
 * Returns in integer greater than, equal to, or less than 0,
 * according to whether @a a is considered greater than, equal to,
 * or less than @a b.
 *
 * @since New in 1.5.
 */
int
svn_ctype_casecmp(int a,
                  int b);


/** @} */

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* SVN_CTYPE_H */