1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright 2013 Garrett D'Amore <garrett@damore.org>
* Copyright 2017 Nexenta Systems, Inc.
*/
/*
* This file contains the implementation of various functional forms
* of the ctype tests, specifically the required by ISO C. These are defined
* in the "C" (POSIX) locale.
*/
#include "lint.h"
#include <ctype.h>
#include <locale.h>
#include "localeimpl.h"
#include "_ctype.h"
#include "lctype.h"
/*
* As far as we know, *every* encoding we support is a strict superset of ASCII,
* so we can make things faster by trying ASCII first. Next check if argument
* can be represented as unsigned char, and that locale is not multibyte - every
* multibyte encoding we support has non-ASCII code points undefined. Finally,
* lookup the result in locale specific table.
*/
#define ISTYPE_L(c, mask, loc) \
(isascii(c) ? (__ctype_mask[c] & (mask)) : \
((unsigned)c > 255 || loc->ctype->lc_max_mblen > 1) ? 0 : \
(loc->ctype->lc_ctype_mask[c] & mask))
#define ISTYPE(c, mask) ISTYPE_L(c, mask, uselocale(NULL))
#define DEFN_ISTYPE(type, mask) \
int \
is##type##_l(int c, locale_t l) \
{ \
return (ISTYPE_L(c, mask, l)); \
} \
\
int \
is##type(int c) \
{ \
return (ISTYPE(c, mask)); \
}
/*
* We are supplying functional forms, so make sure to suppress any macros
* we might have imported.
*/
#undef isblank
#undef isupper
#undef islower
#undef isdigit
#undef isxdigit
#undef isalpha
#undef isalnum
#undef isspace
#undef iscntrl
#undef isgraph
#undef ispunct
#undef isprint
DEFN_ISTYPE(blank, _ISBLANK)
DEFN_ISTYPE(upper, _ISUPPER)
DEFN_ISTYPE(lower, _ISLOWER)
DEFN_ISTYPE(digit, _ISDIGIT)
DEFN_ISTYPE(xdigit, _ISXDIGIT)
DEFN_ISTYPE(alpha, _ISALPHA)
DEFN_ISTYPE(alnum, _ISALNUM)
DEFN_ISTYPE(space, _ISSPACE)
DEFN_ISTYPE(cntrl, _ISCNTRL)
DEFN_ISTYPE(graph, _ISGRAPH)
DEFN_ISTYPE(punct, _ISPUNCT)
DEFN_ISTYPE(print, _ISPRINT)
|