wctype.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. /*
  2. * Copyright (c) 2021, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/Format.h>
  7. #include <string.h>
  8. #include <wctype.h>
  9. enum {
  10. WCTYPE_INVALID = 0,
  11. WCTYPE_ALNUM,
  12. WCTYPE_ALPHA,
  13. WCTYPE_BLANK,
  14. WCTYPE_CNTRL,
  15. WCTYPE_DIGIT,
  16. WCTYPE_GRAPH,
  17. WCTYPE_LOWER,
  18. WCTYPE_PRINT,
  19. WCTYPE_PUNCT,
  20. WCTYPE_SPACE,
  21. WCTYPE_UPPER,
  22. WCTYPE_XDIGIT,
  23. };
  24. enum {
  25. WCTRANS_INVALID = 0,
  26. WCTRANS_TOLOWER,
  27. WCTRANS_TOUPPER,
  28. };
  29. extern "C" {
  30. int iswalnum(wint_t wc)
  31. {
  32. return __inline_isalnum(wc);
  33. }
  34. int iswalpha(wint_t wc)
  35. {
  36. return __inline_isalpha(wc);
  37. }
  38. int iswcntrl(wint_t wc)
  39. {
  40. return __inline_iscntrl(wc);
  41. }
  42. int iswdigit(wint_t wc)
  43. {
  44. return __inline_isdigit(wc);
  45. }
  46. int iswxdigit(wint_t wc)
  47. {
  48. return __inline_isxdigit(wc);
  49. }
  50. int iswspace(wint_t wc)
  51. {
  52. return __inline_isspace(wc);
  53. }
  54. int iswpunct(wint_t wc)
  55. {
  56. return __inline_ispunct(wc);
  57. }
  58. int iswprint(wint_t wc)
  59. {
  60. return __inline_isprint(wc);
  61. }
  62. int iswgraph(wint_t wc)
  63. {
  64. return __inline_isgraph(wc);
  65. }
  66. int iswlower(wint_t wc)
  67. {
  68. return __inline_islower(wc);
  69. }
  70. int iswupper(wint_t wc)
  71. {
  72. return __inline_isupper(wc);
  73. }
  74. int iswblank(wint_t wc)
  75. {
  76. return __inline_isblank(wc);
  77. }
  78. int iswctype(wint_t wc, wctype_t charclass)
  79. {
  80. switch (charclass) {
  81. case WCTYPE_ALNUM:
  82. return iswalnum(wc);
  83. case WCTYPE_ALPHA:
  84. return iswalpha(wc);
  85. case WCTYPE_BLANK:
  86. return iswblank(wc);
  87. case WCTYPE_CNTRL:
  88. return iswcntrl(wc);
  89. case WCTYPE_DIGIT:
  90. return iswdigit(wc);
  91. case WCTYPE_GRAPH:
  92. return iswgraph(wc);
  93. case WCTYPE_LOWER:
  94. return iswlower(wc);
  95. case WCTYPE_PRINT:
  96. return iswprint(wc);
  97. case WCTYPE_PUNCT:
  98. return iswpunct(wc);
  99. case WCTYPE_SPACE:
  100. return iswspace(wc);
  101. case WCTYPE_UPPER:
  102. return iswupper(wc);
  103. case WCTYPE_XDIGIT:
  104. return iswxdigit(wc);
  105. default:
  106. return 0;
  107. }
  108. }
  109. wctype_t wctype(char const* property)
  110. {
  111. if (strcmp(property, "alnum") == 0)
  112. return WCTYPE_ALNUM;
  113. if (strcmp(property, "alpha") == 0)
  114. return WCTYPE_ALPHA;
  115. if (strcmp(property, "blank") == 0)
  116. return WCTYPE_BLANK;
  117. if (strcmp(property, "cntrl") == 0)
  118. return WCTYPE_CNTRL;
  119. if (strcmp(property, "digit") == 0)
  120. return WCTYPE_DIGIT;
  121. if (strcmp(property, "graph") == 0)
  122. return WCTYPE_GRAPH;
  123. if (strcmp(property, "lower") == 0)
  124. return WCTYPE_LOWER;
  125. if (strcmp(property, "print") == 0)
  126. return WCTYPE_PRINT;
  127. if (strcmp(property, "punct") == 0)
  128. return WCTYPE_PUNCT;
  129. if (strcmp(property, "space") == 0)
  130. return WCTYPE_SPACE;
  131. if (strcmp(property, "upper") == 0)
  132. return WCTYPE_UPPER;
  133. if (strcmp(property, "xdigit") == 0)
  134. return WCTYPE_XDIGIT;
  135. return WCTYPE_INVALID;
  136. }
  137. wint_t towlower(wint_t wc)
  138. {
  139. return __inline_tolower(wc);
  140. }
  141. wint_t towupper(wint_t wc)
  142. {
  143. return __inline_toupper(wc);
  144. }
  145. wint_t towctrans(wint_t wc, wctrans_t desc)
  146. {
  147. switch (desc) {
  148. case WCTRANS_TOLOWER:
  149. return towlower(wc);
  150. case WCTRANS_TOUPPER:
  151. return towupper(wc);
  152. default:
  153. return wc;
  154. }
  155. }
  156. wctrans_t wctrans(char const* charclass)
  157. {
  158. if (strcmp(charclass, "tolower") == 0)
  159. return WCTRANS_TOLOWER;
  160. if (strcmp(charclass, "toupper") == 0)
  161. return WCTRANS_TOUPPER;
  162. return WCTRANS_INVALID;
  163. }
  164. }