ascii.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. // Fast, compact and locale-independent tools for ASCII-characters processing
  2. //
  3. // Platform: ISO C++ 98/11
  4. // $Id$
  5. //
  6. // (c) __vic 2016
  7. #ifndef __VIC_ASCII_H
  8. #define __VIC_ASCII_H
  9. #include<__vic/defs.h>
  10. namespace __vic { namespace ascii {
  11. //----------------------------------------------------------------------------
  12. __VIC_CONSTEXPR_FUNC bool isdigit(char c)
  13. {
  14. return '0' <= c && c <= '9';
  15. }
  16. //----------------------------------------------------------------------------
  17. __VIC_CONSTEXPR_FUNC bool isxdigit(char c)
  18. {
  19. return isdigit(c) || ('A' <= c && c <= 'F') || ('a' <= c && c <= 'f');
  20. }
  21. //----------------------------------------------------------------------------
  22. __VIC_CONSTEXPR_FUNC bool islower(char c)
  23. {
  24. return 'a' <= c && c <= 'z';
  25. }
  26. //----------------------------------------------------------------------------
  27. __VIC_CONSTEXPR_FUNC bool isupper(char c)
  28. {
  29. return 'A' <= c && c <= 'Z';
  30. }
  31. //----------------------------------------------------------------------------
  32. __VIC_CONSTEXPR_FUNC bool isalpha(char c)
  33. {
  34. return islower(c) || isupper(c);
  35. }
  36. //----------------------------------------------------------------------------
  37. __VIC_CONSTEXPR_FUNC bool isalnum(char c)
  38. {
  39. return isalpha(c) || isdigit(c);
  40. }
  41. //----------------------------------------------------------------------------
  42. __VIC_CONSTEXPR_FUNC bool isspace(char c)
  43. {
  44. return c == ' ' || ('\t' <= c && c <= '\r');
  45. }
  46. //----------------------------------------------------------------------------
  47. __VIC_CONSTEXPR_FUNC bool isblank(char c)
  48. {
  49. return c == ' ' || c == '\t';
  50. }
  51. //----------------------------------------------------------------------------
  52. __VIC_CONSTEXPR_FUNC bool isprint(char c)
  53. {
  54. return ' ' <= c && c <= '~'; // isgraph(c) || c == ' '
  55. }
  56. //----------------------------------------------------------------------------
  57. __VIC_CONSTEXPR_FUNC bool isgraph(char c)
  58. {
  59. return '!' <= c && c <= '~';
  60. }
  61. //----------------------------------------------------------------------------
  62. __VIC_CONSTEXPR_FUNC bool ispunct(char c)
  63. {
  64. return ('!' <= c && c <= '/') ||
  65. (':' <= c && c <= '@') ||
  66. ('[' <= c && c <= '`') ||
  67. ('{' <= c && c <= '~') ;
  68. }
  69. //----------------------------------------------------------------------------
  70. __VIC_CONSTEXPR_FUNC bool iscntrl(char c)
  71. {
  72. return (0 <= c && c <= '\x1F') || c == '\x7F';
  73. }
  74. //----------------------------------------------------------------------------
  75. __VIC_CONSTEXPR_FUNC bool (isascii)(char c)
  76. {
  77. return static_cast<unsigned char>(c) < 0x7FU;
  78. }
  79. //----------------------------------------------------------------------------
  80. //----------------------------------------------------------------------------
  81. __VIC_CONSTEXPR_FUNC char todigit(int n)
  82. {
  83. // assert(0 <= n && n <= 9);
  84. return n + '0';
  85. }
  86. //----------------------------------------------------------------------------
  87. // Convert digit to integer number
  88. // Returns -1 if !isdigit(ch)
  89. __VIC_CONSTEXPR_FUNC int digit_to_number(char ch)
  90. {
  91. return '0' <= ch && ch <= '9' ? ch - '0' : -1;
  92. }
  93. //----------------------------------------------------------------------------
  94. __VIC_CONSTEXPR_FUNC char toxdigit_upper(int n)
  95. {
  96. // assert(0 <= n && n <= 15);
  97. return n < 10 ? n + '0' : n - 10 + 'A';
  98. }
  99. //----------------------------------------------------------------------------
  100. __VIC_CONSTEXPR_FUNC char toxdigit_lower(int n)
  101. {
  102. // assert(0 <= n && n <= 15);
  103. return n < 10 ? n + '0' : n - 10 + 'a';
  104. }
  105. //----------------------------------------------------------------------------
  106. // Convert HEX-digit to integer number
  107. // Returns -1 if !isxdigit(ch)
  108. __VIC_CONSTEXPR_FUNC int xdigit_to_number(char ch)
  109. {
  110. return '0' <= ch && ch <= '9' ? ch - '0' :
  111. 'A' <= ch && ch <= 'F' ? ch - 'A' + 10 :
  112. 'a' <= ch && ch <= 'f' ? ch - 'a' + 10 :
  113. -1; // Not a hex digit
  114. }
  115. //----------------------------------------------------------------------------
  116. //----------------------------------------------------------------------------
  117. // Precondition: isupper(upper)
  118. __VIC_CONSTEXPR_FUNC char upper_to_lower(char upper)
  119. {
  120. // Set the 5-th bit
  121. return upper | (1 << 5); // or: upper - ('a' - 'A')
  122. }
  123. //----------------------------------------------------------------------------
  124. // Precondition: islower(lower)
  125. __VIC_CONSTEXPR_FUNC char lower_to_upper(char lower)
  126. {
  127. // Clear the 5-th bit
  128. return lower & ~(1 << 5); // or: lower + ('a' - 'A')
  129. }
  130. //----------------------------------------------------------------------------
  131. __VIC_CONSTEXPR_FUNC char tolower(char c)
  132. {
  133. return isupper(c) ? upper_to_lower(c) : c;
  134. }
  135. //----------------------------------------------------------------------------
  136. __VIC_CONSTEXPR_FUNC char toupper(char c)
  137. {
  138. return islower(c) ? lower_to_upper(c) : c;
  139. }
  140. //----------------------------------------------------------------------------
  141. __VIC_CONSTEXPR_FUNC bool equal_icase(char ch1, char ch2)
  142. {
  143. return tolower(ch1) == tolower(ch2);
  144. }
  145. //----------------------------------------------------------------------------
  146. }} // namespace
  147. #endif // header guard