c-ctype.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. /* Character handling in C locale.
  2. Copyright 2000-2003, 2006, 2009-2013 Free Software Foundation, Inc.
  3. This program is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU Lesser General Public License as published by
  5. the Free Software Foundation; either version 2 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU Lesser General Public License for more details.
  11. You should have received a copy of the GNU Lesser General Public License
  12. along with this program; if not, see <http://www.gnu.org/licenses/>. */
  13. #include <config.h>
  14. /* Specification. */
  15. #define NO_C_CTYPE_MACROS
  16. #include "c-ctype.h"
  17. /* The function isascii is not locale dependent. Its use in EBCDIC is
  18. questionable. */
  19. bool
  20. c_isascii (int c)
  21. {
  22. return (c >= 0x00 && c <= 0x7f);
  23. }
  24. bool
  25. c_isalnum (int c)
  26. {
  27. #if C_CTYPE_CONSECUTIVE_DIGITS \
  28. && C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
  29. #if C_CTYPE_ASCII
  30. return ((c >= '0' && c <= '9')
  31. || ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'Z'));
  32. #else
  33. return ((c >= '0' && c <= '9')
  34. || (c >= 'A' && c <= 'Z')
  35. || (c >= 'a' && c <= 'z'));
  36. #endif
  37. #else
  38. switch (c)
  39. {
  40. case '0': case '1': case '2': case '3': case '4': case '5':
  41. case '6': case '7': case '8': case '9':
  42. case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
  43. case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
  44. case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
  45. case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
  46. case 'Y': case 'Z':
  47. case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
  48. case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
  49. case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
  50. case 's': case 't': case 'u': case 'v': case 'w': case 'x':
  51. case 'y': case 'z':
  52. return 1;
  53. default:
  54. return 0;
  55. }
  56. #endif
  57. }
  58. bool
  59. c_isalpha (int c)
  60. {
  61. #if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
  62. #if C_CTYPE_ASCII
  63. return ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'Z');
  64. #else
  65. return ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'));
  66. #endif
  67. #else
  68. switch (c)
  69. {
  70. case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
  71. case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
  72. case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
  73. case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
  74. case 'Y': case 'Z':
  75. case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
  76. case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
  77. case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
  78. case 's': case 't': case 'u': case 'v': case 'w': case 'x':
  79. case 'y': case 'z':
  80. return 1;
  81. default:
  82. return 0;
  83. }
  84. #endif
  85. }
  86. bool
  87. c_isblank (int c)
  88. {
  89. return (c == ' ' || c == '\t');
  90. }
  91. bool
  92. c_iscntrl (int c)
  93. {
  94. #if C_CTYPE_ASCII
  95. return ((c & ~0x1f) == 0 || c == 0x7f);
  96. #else
  97. switch (c)
  98. {
  99. case ' ': case '!': case '"': case '#': case '$': case '%':
  100. case '&': case '\'': case '(': case ')': case '*': case '+':
  101. case ',': case '-': case '.': case '/':
  102. case '0': case '1': case '2': case '3': case '4': case '5':
  103. case '6': case '7': case '8': case '9':
  104. case ':': case ';': case '<': case '=': case '>': case '?':
  105. case '@':
  106. case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
  107. case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
  108. case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
  109. case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
  110. case 'Y': case 'Z':
  111. case '[': case '\\': case ']': case '^': case '_': case '`':
  112. case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
  113. case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
  114. case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
  115. case 's': case 't': case 'u': case 'v': case 'w': case 'x':
  116. case 'y': case 'z':
  117. case '{': case '|': case '}': case '~':
  118. return 0;
  119. default:
  120. return 1;
  121. }
  122. #endif
  123. }
  124. bool
  125. c_isdigit (int c)
  126. {
  127. #if C_CTYPE_CONSECUTIVE_DIGITS
  128. return (c >= '0' && c <= '9');
  129. #else
  130. switch (c)
  131. {
  132. case '0': case '1': case '2': case '3': case '4': case '5':
  133. case '6': case '7': case '8': case '9':
  134. return 1;
  135. default:
  136. return 0;
  137. }
  138. #endif
  139. }
  140. bool
  141. c_islower (int c)
  142. {
  143. #if C_CTYPE_CONSECUTIVE_LOWERCASE
  144. return (c >= 'a' && c <= 'z');
  145. #else
  146. switch (c)
  147. {
  148. case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
  149. case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
  150. case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
  151. case 's': case 't': case 'u': case 'v': case 'w': case 'x':
  152. case 'y': case 'z':
  153. return 1;
  154. default:
  155. return 0;
  156. }
  157. #endif
  158. }
  159. bool
  160. c_isgraph (int c)
  161. {
  162. #if C_CTYPE_ASCII
  163. return (c >= '!' && c <= '~');
  164. #else
  165. switch (c)
  166. {
  167. case '!': case '"': case '#': case '$': case '%': case '&':
  168. case '\'': case '(': case ')': case '*': case '+': case ',':
  169. case '-': case '.': case '/':
  170. case '0': case '1': case '2': case '3': case '4': case '5':
  171. case '6': case '7': case '8': case '9':
  172. case ':': case ';': case '<': case '=': case '>': case '?':
  173. case '@':
  174. case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
  175. case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
  176. case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
  177. case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
  178. case 'Y': case 'Z':
  179. case '[': case '\\': case ']': case '^': case '_': case '`':
  180. case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
  181. case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
  182. case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
  183. case 's': case 't': case 'u': case 'v': case 'w': case 'x':
  184. case 'y': case 'z':
  185. case '{': case '|': case '}': case '~':
  186. return 1;
  187. default:
  188. return 0;
  189. }
  190. #endif
  191. }
  192. bool
  193. c_isprint (int c)
  194. {
  195. #if C_CTYPE_ASCII
  196. return (c >= ' ' && c <= '~');
  197. #else
  198. switch (c)
  199. {
  200. case ' ': case '!': case '"': case '#': case '$': case '%':
  201. case '&': case '\'': case '(': case ')': case '*': case '+':
  202. case ',': case '-': case '.': case '/':
  203. case '0': case '1': case '2': case '3': case '4': case '5':
  204. case '6': case '7': case '8': case '9':
  205. case ':': case ';': case '<': case '=': case '>': case '?':
  206. case '@':
  207. case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
  208. case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
  209. case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
  210. case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
  211. case 'Y': case 'Z':
  212. case '[': case '\\': case ']': case '^': case '_': case '`':
  213. case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
  214. case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
  215. case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
  216. case 's': case 't': case 'u': case 'v': case 'w': case 'x':
  217. case 'y': case 'z':
  218. case '{': case '|': case '}': case '~':
  219. return 1;
  220. default:
  221. return 0;
  222. }
  223. #endif
  224. }
  225. bool
  226. c_ispunct (int c)
  227. {
  228. #if C_CTYPE_ASCII
  229. return ((c >= '!' && c <= '~')
  230. && !((c >= '0' && c <= '9')
  231. || ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'Z')));
  232. #else
  233. switch (c)
  234. {
  235. case '!': case '"': case '#': case '$': case '%': case '&':
  236. case '\'': case '(': case ')': case '*': case '+': case ',':
  237. case '-': case '.': case '/':
  238. case ':': case ';': case '<': case '=': case '>': case '?':
  239. case '@':
  240. case '[': case '\\': case ']': case '^': case '_': case '`':
  241. case '{': case '|': case '}': case '~':
  242. return 1;
  243. default:
  244. return 0;
  245. }
  246. #endif
  247. }
  248. bool
  249. c_isspace (int c)
  250. {
  251. return (c == ' ' || c == '\t'
  252. || c == '\n' || c == '\v' || c == '\f' || c == '\r');
  253. }
  254. bool
  255. c_isupper (int c)
  256. {
  257. #if C_CTYPE_CONSECUTIVE_UPPERCASE
  258. return (c >= 'A' && c <= 'Z');
  259. #else
  260. switch (c)
  261. {
  262. case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
  263. case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
  264. case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
  265. case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
  266. case 'Y': case 'Z':
  267. return 1;
  268. default:
  269. return 0;
  270. }
  271. #endif
  272. }
  273. bool
  274. c_isxdigit (int c)
  275. {
  276. #if C_CTYPE_CONSECUTIVE_DIGITS \
  277. && C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
  278. #if C_CTYPE_ASCII
  279. return ((c >= '0' && c <= '9')
  280. || ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'F'));
  281. #else
  282. return ((c >= '0' && c <= '9')
  283. || (c >= 'A' && c <= 'F')
  284. || (c >= 'a' && c <= 'f'));
  285. #endif
  286. #else
  287. switch (c)
  288. {
  289. case '0': case '1': case '2': case '3': case '4': case '5':
  290. case '6': case '7': case '8': case '9':
  291. case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
  292. case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
  293. return 1;
  294. default:
  295. return 0;
  296. }
  297. #endif
  298. }
  299. int
  300. c_tolower (int c)
  301. {
  302. #if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
  303. return (c >= 'A' && c <= 'Z' ? c - 'A' + 'a' : c);
  304. #else
  305. switch (c)
  306. {
  307. case 'A': return 'a';
  308. case 'B': return 'b';
  309. case 'C': return 'c';
  310. case 'D': return 'd';
  311. case 'E': return 'e';
  312. case 'F': return 'f';
  313. case 'G': return 'g';
  314. case 'H': return 'h';
  315. case 'I': return 'i';
  316. case 'J': return 'j';
  317. case 'K': return 'k';
  318. case 'L': return 'l';
  319. case 'M': return 'm';
  320. case 'N': return 'n';
  321. case 'O': return 'o';
  322. case 'P': return 'p';
  323. case 'Q': return 'q';
  324. case 'R': return 'r';
  325. case 'S': return 's';
  326. case 'T': return 't';
  327. case 'U': return 'u';
  328. case 'V': return 'v';
  329. case 'W': return 'w';
  330. case 'X': return 'x';
  331. case 'Y': return 'y';
  332. case 'Z': return 'z';
  333. default: return c;
  334. }
  335. #endif
  336. }
  337. int
  338. c_toupper (int c)
  339. {
  340. #if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE
  341. return (c >= 'a' && c <= 'z' ? c - 'a' + 'A' : c);
  342. #else
  343. switch (c)
  344. {
  345. case 'a': return 'A';
  346. case 'b': return 'B';
  347. case 'c': return 'C';
  348. case 'd': return 'D';
  349. case 'e': return 'E';
  350. case 'f': return 'F';
  351. case 'g': return 'G';
  352. case 'h': return 'H';
  353. case 'i': return 'I';
  354. case 'j': return 'J';
  355. case 'k': return 'K';
  356. case 'l': return 'L';
  357. case 'm': return 'M';
  358. case 'n': return 'N';
  359. case 'o': return 'O';
  360. case 'p': return 'P';
  361. case 'q': return 'Q';
  362. case 'r': return 'R';
  363. case 's': return 'S';
  364. case 't': return 'T';
  365. case 'u': return 'U';
  366. case 'v': return 'V';
  367. case 'w': return 'W';
  368. case 'x': return 'X';
  369. case 'y': return 'Y';
  370. case 'z': return 'Z';
  371. default: return c;
  372. }
  373. #endif
  374. }