1 /*
2  * SPDX-FileCopyrightText: 2015-2015 CSSlayer <wengxt@gmail.com>
3  *
4  * SPDX-License-Identifier: LGPL-2.1-or-later
5  *
6  */
7 #ifndef _FCITX_UTILS_CHARUTILS_H_
8 #define _FCITX_UTILS_CHARUTILS_H_
9 
10 #include <limits>
11 
12 /// \addtogroup FcitxUtils
13 /// \{
14 /// \file
15 /// \brief Local independent API to detect character type.
16 
17 namespace fcitx::charutils {
18 /// \brief ascii only is lower
islower(char c)19 static constexpr inline bool islower(char c) { return c >= 'a' && c <= 'z'; }
20 
21 /// \brief ascii only is upper
isupper(char c)22 static constexpr inline bool isupper(char c) { return c >= 'A' && c <= 'Z'; }
23 
24 /// \brief ascii only to lower
tolower(char c)25 static constexpr inline char tolower(char c) {
26     return isupper(c) ? static_cast<char>(c - 'A' + 'a') : c;
27 }
28 
29 /// \brief ascii only to upper
toupper(char c)30 static constexpr inline char toupper(char c) {
31     return islower(c) ? static_cast<char>(c - 'a' + 'A') : c;
32 }
33 
34 /// \brief ascii only is space
isspace(char c)35 static constexpr inline bool isspace(char c) {
36     return c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v' ||
37            c == ' ';
38 }
39 
40 /// \brief ascii only is digit
isdigit(char c)41 static constexpr inline bool isdigit(char c) { return c >= '0' && c <= '9'; }
42 
isprint(char c)43 static constexpr inline bool isprint(char c) {
44     constexpr char minPrint = 0x1f;
45     return c >= minPrint && c < std::numeric_limits<signed char>::max();
46 }
47 
toHex(int c)48 static constexpr inline char toHex(int c) {
49     constexpr char hex[] = "0123456789abcdef";
50     return hex[c & (sizeof(hex) - 1)];
51 }
52 
53 /**
54  * Return integer value for hex char
55  *
56  * @param c input char
57  * @return return integer for hex, if not hex, return -1
58  * @since 5.0.5
59  */
fromHex(char c)60 static constexpr inline int fromHex(char c) {
61     if (isdigit(c)) {
62         return c - '0';
63     }
64 
65     c = tolower(c);
66     if ((c >= 'a') && (c <= 'f')) {
67         return c - 'a' + 10;
68     }
69     return -1;
70 }
71 
isxdigit(char c)72 static constexpr inline bool isxdigit(char c) {
73     return isdigit(c) || ((c >= 'a') && (c <= 'f')) ||
74            ((c >= 'A') && (c <= 'F'));
75 }
76 
77 } // namespace fcitx::charutils
78 
79 #endif // _FCITX_UTILS_CHARUTILS_H_
80