wctype.cpp 3.4 KB

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