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