plugin: convert plugin_fd_add() to method
[ncmpc-debian.git] / src / util / CharUtil.hxx
1 /*
2  * Copyright (C) 2011-2017 Max Kellermann <max.kellermann@gmail.com>
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * - Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *
11  * - Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the
14  * distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
19  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
20  * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
25  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
27  * OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #ifndef CHAR_UTIL_HXX
31 #define CHAR_UTIL_HXX
32
33 #ifdef _UNICODE
34 #include "WCharUtil.hxx"
35 #endif
36
37 constexpr
38 static inline bool
39 IsASCII(const unsigned char ch)
40 {
41         return ch < 0x80;
42 }
43
44 constexpr
45 static inline bool
46 IsASCII(const char ch)
47 {
48         return IsASCII((unsigned char)ch);
49 }
50
51 constexpr
52 static inline bool
53 IsWhitespaceOrNull(const char ch)
54 {
55         return (unsigned char)ch <= 0x20;
56 }
57
58 constexpr
59 static inline bool
60 IsWhitespaceNotNull(const char ch)
61 {
62         return ch > 0 && ch <= 0x20;
63 }
64
65 /**
66  * Is the given character whitespace?  This calls the faster one of
67  * IsWhitespaceOrNull() or IsWhitespaceNotNull().  Use this if you
68  * want the fastest implementation, and you don't care if a null byte
69  * matches.
70  */
71 constexpr
72 static inline bool
73 IsWhitespaceFast(const char ch)
74 {
75         return IsWhitespaceOrNull(ch);
76 }
77
78 constexpr
79 static inline bool
80 IsPrintableASCII(char ch)
81 {
82         return (signed char)ch >= 0x20;
83 }
84
85 constexpr
86 static inline bool
87 IsDigitASCII(char ch)
88 {
89         return ch >= '0' && ch <= '9';
90 }
91
92 constexpr
93 static inline bool
94 IsUpperAlphaASCII(char ch)
95 {
96         return ch >= 'A' && ch <= 'Z';
97 }
98
99 constexpr
100 static inline bool
101 IsLowerAlphaASCII(char ch)
102 {
103         return ch >= 'a' && ch <= 'z';
104 }
105
106 constexpr
107 static inline bool
108 IsAlphaASCII(char ch)
109 {
110         return IsUpperAlphaASCII(ch) || IsLowerAlphaASCII(ch);
111 }
112
113 constexpr
114 static inline bool
115 IsAlphaNumericASCII(char ch)
116 {
117         return IsAlphaASCII(ch) || IsDigitASCII(ch);
118 }
119
120 /**
121  * Convert the specified ASCII character (0x00..0x7f) to upper case.
122  * Unlike toupper(), it ignores the system locale.
123  */
124 constexpr
125 static inline char
126 ToUpperASCII(char ch)
127 {
128         return ch >= 'a' && ch <= 'z'
129                 ? (ch - ('a' - 'A'))
130                 : ch;
131 }
132
133 /**
134  * Convert the specified ASCII character (0x00..0x7f) to lower case.
135  * Unlike tolower(), it ignores the system locale.
136  */
137 constexpr
138 static inline char
139 ToLowerASCII(char ch)
140 {
141         return ch >= 'A' && ch <= 'Z'
142                 ? (ch + ('a' - 'A'))
143                 : ch;
144 }
145
146 #endif