VirtualBox

source: vbox/trunk/include/iprt/ctype.h@ 39246

Last change on this file since 39246 was 39246, checked in by vboxsync, 13 years ago

iprt/ctype.h: Corrected bugs and adding a complete testcase.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.0 KB
Line 
1/** @file
2 * IPRT - Simple character type classiciation and conversion.
3 */
4
5/*
6 * Copyright (C) 2006-2007 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___iprt_ctype_h
27#define ___iprt_ctype_h
28
29#include <iprt/types.h>
30
31/** @name C locale predicates and conversions.
32 *
33 * For most practical purposes, this can safely be used when parsing UTF-8
34 * strings. Just keep in mind that we only deal with the first 127 chars and
35 * that full correctness is only archived using the non-existing RTLocIs* API.
36 *
37 * @remarks Use the marcros, not the inlined functions.
38 *
39 * @remarks ASSUMES the source code includes the basic ASCII chars. This is a
40 * general IPRT assumption.
41 * @{ */
42#define RT_C_IS_BLANK(ch) RTLocCIsBlank((ch))
43#define RT_C_IS_ALNUM(ch) RTLocCIsAlNum((ch))
44#define RT_C_IS_ALPHA(ch) RTLocCIsAlpha((ch))
45#define RT_C_IS_CNTRL(ch) RTLocCIsCntrl((ch))
46#define RT_C_IS_DIGIT(ch) RTLocCIsDigit((ch))
47#define RT_C_IS_LOWER(ch) RTLocCIsLower((ch))
48#define RT_C_IS_GRAPH(ch) RTLocCIsGraph((ch))
49#define RT_C_IS_ODIGIT(ch) RTLocCIsODigit((ch))
50#define RT_C_IS_PRINT(ch) RTLocCIsPrint((ch))
51#define RT_C_IS_PUNCT(ch) RTLocCIsPunct((ch))
52#define RT_C_IS_SPACE(ch) RTLocCIsSpace((ch))
53#define RT_C_IS_UPPER(ch) RTLocCIsUpper((ch))
54#define RT_C_IS_XDIGIT(ch) RTLocCIsXDigit((ch))
55
56#define RT_C_TO_LOWER(ch) RTLocCToLower((ch))
57#define RT_C_TO_UPPER(ch) RTLocCToUpper((ch))
58
59/**
60 * Checks for a blank character.
61 *
62 * @returns true / false.
63 * @param ch The character to test.
64 */
65DECL_FORCE_INLINE(bool) RTLocCIsBlank(int ch)
66{
67 return ch == 0x20 /* space */
68 || ch == 0x09; /* horizontal tab */
69}
70
71/**
72 * Checks for a control character.
73 *
74 * @returns true / false.
75 * @param ch The character to test.
76 */
77DECL_FORCE_INLINE(bool) RTLocCIsCntrl(int ch)
78{
79 return (unsigned)ch < 32U /* 0..2f */
80 || ch == 0x7f;
81}
82
83/**
84 * Checks for a decimal digit.
85 *
86 * @returns true / false.
87 * @param ch The character to test.
88 */
89DECL_FORCE_INLINE(bool) RTLocCIsDigit(int ch)
90{
91 return (unsigned)ch - 0x30 < 10U; /* 30..39 */
92}
93
94/**
95 * Checks for a lower case character.
96 *
97 * @returns true / false.
98 * @param ch The character to test.
99 */
100DECL_FORCE_INLINE(bool) RTLocCIsLower(int ch)
101{
102 return (unsigned)ch - 0x61U < 26U; /* 61..7a */
103}
104
105/**
106 * Checks for an octal digit.
107 *
108 * @returns true / false.
109 * @param ch The character to test.
110 */
111DECL_FORCE_INLINE(bool) RTLocCIsODigit(int ch)
112{
113 return (unsigned)ch - 0x30 < 8U; /* 30..37 */
114}
115
116/**
117 * Checks for a printable character (whitespace included).
118 *
119 * @returns true / false.
120 * @param ch The character to test.
121 */
122DECL_FORCE_INLINE(bool) RTLocCIsPrint(int ch)
123{
124 return (unsigned)ch - 0x20U < 95U; /* 20..7e */
125}
126
127/**
128 * Checks for punctuation (?).
129 *
130 * @returns true / false.
131 * @param ch The character to test.
132 */
133DECL_FORCE_INLINE(bool) RTLocCIsPunct(int ch)
134{
135 return (unsigned)ch - 0x21U < 15U /* 21..2f */
136 || (unsigned)ch - 0x2aU < 6U /* 2a..2f */
137 || (unsigned)ch - 0x3aU < 7U /* 3a..40 */
138 || (unsigned)ch - 0x5bU < 6U /* 5a..60 */
139 || (unsigned)ch - 0x7bU < 4U /* 7b..7e */;
140}
141
142/**
143 * Checks for a white-space character.
144 *
145 * @returns true / false.
146 * @param ch The character to test.
147 */
148DECL_FORCE_INLINE(bool) RTLocCIsSpace(int ch)
149{
150 return ch == 0x20 /* 20 (space) */
151 || (unsigned)ch - 0x09U < 5U; /* 09..0d */
152}
153
154/**
155 * Checks for an upper case character.
156 *
157 * @returns true / false.
158 * @param ch The character to test.
159 */
160DECL_FORCE_INLINE(bool) RTLocCIsUpper(int ch)
161{
162 return (unsigned)ch - 0x41 < 26U; /* 41..5a */
163}
164
165/**
166 * Checks for a hexadecimal digit.
167 *
168 * @returns true / false.
169 * @param ch The character to test.
170 */
171DECL_FORCE_INLINE(bool) RTLocCIsXDigit(int ch)
172{
173 return (unsigned)ch - 0x30 < 10U /* 30..39 (0-9) */
174 || (unsigned)ch - 0x41 < 6 /* 41..46 (A-F) */
175 || (unsigned)ch - 0x61 < 6; /* 61..66 (a-f) */
176}
177
178/**
179 * Checks for an alphabetic character.
180 *
181 * @returns true / false.
182 * @param ch The character to test.
183 */
184DECL_FORCE_INLINE(bool) RTLocCIsAlpha(int ch)
185{
186 return RTLocCIsLower(ch) || RTLocCIsUpper(ch);
187}
188
189/**
190 * Checks for an alphanumerical character.
191 *
192 * @returns true / false.
193 * @param ch The character to test.
194 */
195DECL_FORCE_INLINE(bool) RTLocCIsAlNum(int ch)
196{
197 return RTLocCIsDigit(ch) || RTLocCIsAlpha(ch);
198}
199
200/**
201 * Checks for a printable character whitespace excluded.
202 *
203 * @returns true / false.
204 * @param ch The character to test.
205 */
206DECL_FORCE_INLINE(bool) RTLocCIsGraph(int ch)
207{
208 return RTLocCIsPrint(ch) && !RTLocCIsBlank(ch);
209}
210
211
212/**
213 * Converts the character to lower case if applictable.
214 *
215 * @returns lower cased character or ch.
216 * @param ch The character to test.
217 */
218DECL_FORCE_INLINE(int) RTLocCToLower(int ch)
219{
220 return RTLocCIsUpper(ch) ? (ch) + 0x20 : (ch);
221}
222
223/**
224 * Converts the character to upper case if applictable.
225 *
226 * @returns upper cased character or ch.
227 * @param ch The character to test.
228 */
229DECL_FORCE_INLINE(int) RTLocCToUpper(int ch)
230{
231 return RTLocCIsLower(ch) ? (ch) - 0x20 : (ch);
232}
233
234
235/** @} */
236
237#endif
238
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette