You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

ascii.h 9.4 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. //
  2. // Copyright 2017 The Abseil Authors.
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. //
  8. // https://www.apache.org/licenses/LICENSE-2.0
  9. //
  10. // Unless required by applicable law or agreed to in writing, software
  11. // distributed under the License is distributed on an "AS IS" BASIS,
  12. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. // See the License for the specific language governing permissions and
  14. // limitations under the License.
  15. //
  16. // -----------------------------------------------------------------------------
  17. // File: ascii.h
  18. // -----------------------------------------------------------------------------
  19. //
  20. // This package contains functions operating on characters and strings
  21. // restricted to standard ASCII. These include character classification
  22. // functions analogous to those found in the ANSI C Standard Library <ctype.h>
  23. // header file.
  24. //
  25. // C++ implementations provide <ctype.h> functionality based on their
  26. // C environment locale. In general, reliance on such a locale is not ideal, as
  27. // the locale standard is problematic (and may not return invariant information
  28. // for the same character set, for example). These `ascii_*()` functions are
  29. // hard-wired for standard ASCII, much faster, and guaranteed to behave
  30. // consistently. They will never be overloaded, nor will their function
  31. // signature change.
  32. //
  33. // `ascii_isalnum()`, `ascii_isalpha()`, `ascii_isascii()`, `ascii_isblank()`,
  34. // `ascii_iscntrl()`, `ascii_isdigit()`, `ascii_isgraph()`, `ascii_islower()`,
  35. // `ascii_isprint()`, `ascii_ispunct()`, `ascii_isspace()`, `ascii_isupper()`,
  36. // `ascii_isxdigit()`
  37. // Analogous to the <ctype.h> functions with similar names, these
  38. // functions take an unsigned char and return a bool, based on whether the
  39. // character matches the condition specified.
  40. //
  41. // If the input character has a numerical value greater than 127, these
  42. // functions return `false`.
  43. //
  44. // `ascii_tolower()`, `ascii_toupper()`
  45. // Analogous to the <ctype.h> functions with similar names, these functions
  46. // take an unsigned char and return a char.
  47. //
  48. // If the input character is not an ASCII {lower,upper}-case letter (including
  49. // numerical values greater than 127) then the functions return the same value
  50. // as the input character.
  51. #ifndef ABSL_STRINGS_ASCII_H_
  52. #define ABSL_STRINGS_ASCII_H_
  53. #include <algorithm>
  54. #include <string>
  55. #include "absl/base/attributes.h"
  56. #include "absl/base/config.h"
  57. #include "absl/strings/string_view.h"
  58. namespace absl
  59. {
  60. ABSL_NAMESPACE_BEGIN
  61. namespace ascii_internal
  62. {
  63. // Declaration for an array of bitfields holding character information.
  64. ABSL_DLL extern const unsigned char kPropertyBits[256];
  65. // Declaration for the array of characters to upper-case characters.
  66. ABSL_DLL extern const char kToUpper[256];
  67. // Declaration for the array of characters to lower-case characters.
  68. ABSL_DLL extern const char kToLower[256];
  69. } // namespace ascii_internal
  70. // ascii_isalpha()
  71. //
  72. // Determines whether the given character is an alphabetic character.
  73. inline bool ascii_isalpha(unsigned char c)
  74. {
  75. return (ascii_internal::kPropertyBits[c] & 0x01) != 0;
  76. }
  77. // ascii_isalnum()
  78. //
  79. // Determines whether the given character is an alphanumeric character.
  80. inline bool ascii_isalnum(unsigned char c)
  81. {
  82. return (ascii_internal::kPropertyBits[c] & 0x04) != 0;
  83. }
  84. // ascii_isspace()
  85. //
  86. // Determines whether the given character is a whitespace character (space,
  87. // tab, vertical tab, formfeed, linefeed, or carriage return).
  88. inline bool ascii_isspace(unsigned char c)
  89. {
  90. return (ascii_internal::kPropertyBits[c] & 0x08) != 0;
  91. }
  92. // ascii_ispunct()
  93. //
  94. // Determines whether the given character is a punctuation character.
  95. inline bool ascii_ispunct(unsigned char c)
  96. {
  97. return (ascii_internal::kPropertyBits[c] & 0x10) != 0;
  98. }
  99. // ascii_isblank()
  100. //
  101. // Determines whether the given character is a blank character (tab or space).
  102. inline bool ascii_isblank(unsigned char c)
  103. {
  104. return (ascii_internal::kPropertyBits[c] & 0x20) != 0;
  105. }
  106. // ascii_iscntrl()
  107. //
  108. // Determines whether the given character is a control character.
  109. inline bool ascii_iscntrl(unsigned char c)
  110. {
  111. return (ascii_internal::kPropertyBits[c] & 0x40) != 0;
  112. }
  113. // ascii_isxdigit()
  114. //
  115. // Determines whether the given character can be represented as a hexadecimal
  116. // digit character (i.e. {0-9} or {A-F}).
  117. inline bool ascii_isxdigit(unsigned char c)
  118. {
  119. return (ascii_internal::kPropertyBits[c] & 0x80) != 0;
  120. }
  121. // ascii_isdigit()
  122. //
  123. // Determines whether the given character can be represented as a decimal
  124. // digit character (i.e. {0-9}).
  125. inline bool ascii_isdigit(unsigned char c)
  126. {
  127. return c >= '0' && c <= '9';
  128. }
  129. // ascii_isprint()
  130. //
  131. // Determines whether the given character is printable, including spaces.
  132. inline bool ascii_isprint(unsigned char c)
  133. {
  134. return c >= 32 && c < 127;
  135. }
  136. // ascii_isgraph()
  137. //
  138. // Determines whether the given character has a graphical representation.
  139. inline bool ascii_isgraph(unsigned char c)
  140. {
  141. return c > 32 && c < 127;
  142. }
  143. // ascii_isupper()
  144. //
  145. // Determines whether the given character is uppercase.
  146. inline bool ascii_isupper(unsigned char c)
  147. {
  148. return c >= 'A' && c <= 'Z';
  149. }
  150. // ascii_islower()
  151. //
  152. // Determines whether the given character is lowercase.
  153. inline bool ascii_islower(unsigned char c)
  154. {
  155. return c >= 'a' && c <= 'z';
  156. }
  157. // ascii_isascii()
  158. //
  159. // Determines whether the given character is ASCII.
  160. inline bool ascii_isascii(unsigned char c)
  161. {
  162. return c < 128;
  163. }
  164. // ascii_tolower()
  165. //
  166. // Returns an ASCII character, converting to lowercase if uppercase is
  167. // passed. Note that character values > 127 are simply returned.
  168. inline char ascii_tolower(unsigned char c)
  169. {
  170. return ascii_internal::kToLower[c];
  171. }
  172. // Converts the characters in `s` to lowercase, changing the contents of `s`.
  173. void AsciiStrToLower(std::string* s);
  174. // Creates a lowercase string from a given absl::string_view.
  175. ABSL_MUST_USE_RESULT inline std::string AsciiStrToLower(absl::string_view s)
  176. {
  177. std::string result(s);
  178. absl::AsciiStrToLower(&result);
  179. return result;
  180. }
  181. // ascii_toupper()
  182. //
  183. // Returns the ASCII character, converting to upper-case if lower-case is
  184. // passed. Note that characters values > 127 are simply returned.
  185. inline char ascii_toupper(unsigned char c)
  186. {
  187. return ascii_internal::kToUpper[c];
  188. }
  189. // Converts the characters in `s` to uppercase, changing the contents of `s`.
  190. void AsciiStrToUpper(std::string* s);
  191. // Creates an uppercase string from a given absl::string_view.
  192. ABSL_MUST_USE_RESULT inline std::string AsciiStrToUpper(absl::string_view s)
  193. {
  194. std::string result(s);
  195. absl::AsciiStrToUpper(&result);
  196. return result;
  197. }
  198. // Returns absl::string_view with whitespace stripped from the beginning of the
  199. // given string_view.
  200. ABSL_MUST_USE_RESULT inline absl::string_view StripLeadingAsciiWhitespace(
  201. absl::string_view str
  202. )
  203. {
  204. auto it = std::find_if_not(str.begin(), str.end(), absl::ascii_isspace);
  205. return str.substr(static_cast<size_t>(it - str.begin()));
  206. }
  207. // Strips in place whitespace from the beginning of the given string.
  208. inline void StripLeadingAsciiWhitespace(std::string* str)
  209. {
  210. auto it = std::find_if_not(str->begin(), str->end(), absl::ascii_isspace);
  211. str->erase(str->begin(), it);
  212. }
  213. // Returns absl::string_view with whitespace stripped from the end of the given
  214. // string_view.
  215. ABSL_MUST_USE_RESULT inline absl::string_view StripTrailingAsciiWhitespace(
  216. absl::string_view str
  217. )
  218. {
  219. auto it = std::find_if_not(str.rbegin(), str.rend(), absl::ascii_isspace);
  220. return str.substr(0, static_cast<size_t>(str.rend() - it));
  221. }
  222. // Strips in place whitespace from the end of the given string
  223. inline void StripTrailingAsciiWhitespace(std::string* str)
  224. {
  225. auto it = std::find_if_not(str->rbegin(), str->rend(), absl::ascii_isspace);
  226. str->erase(static_cast<size_t>(str->rend() - it));
  227. }
  228. // Returns absl::string_view with whitespace stripped from both ends of the
  229. // given string_view.
  230. ABSL_MUST_USE_RESULT inline absl::string_view StripAsciiWhitespace(
  231. absl::string_view str
  232. )
  233. {
  234. return StripTrailingAsciiWhitespace(StripLeadingAsciiWhitespace(str));
  235. }
  236. // Strips in place whitespace from both ends of the given string
  237. inline void StripAsciiWhitespace(std::string* str)
  238. {
  239. StripTrailingAsciiWhitespace(str);
  240. StripLeadingAsciiWhitespace(str);
  241. }
  242. // Removes leading, trailing, and consecutive internal whitespace.
  243. void RemoveExtraAsciiWhitespace(std::string*);
  244. ABSL_NAMESPACE_END
  245. } // namespace absl
  246. #endif // ABSL_STRINGS_ASCII_H_