Print this page
2964 need POSIX 2008 locale object support
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Approved by: TBD

@@ -25,10 +25,13 @@
 
 /*
  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
+/*
+ * Copyright 2013 Garrett D'Amore <garrett@damore.org>
+ */
 
 /*
  * An application should not include this header directly.  Instead it
  * should be included only through the inclusion of other Sun headers.
  *

@@ -41,12 +44,10 @@
  */
 
 #ifndef _ISO_CTYPE_ISO_H
 #define _ISO_CTYPE_ISO_H
 
-#pragma ident   "%Z%%M% %I%     %E% SMI"
-
 #include <sys/feature_tests.h>
 
 #ifdef  __cplusplus
 extern "C" {
 #endif

@@ -71,15 +72,28 @@
 #define _ISGRAPH        0x00002000
 #define _ISALPHA        0x00004000
 #define _ISPRINT        0x00008000
 #define _ISALNUM        (_ISALPHA | _ISDIGIT)
 
+extern unsigned char    __ctype[];
+extern unsigned int     *__ctype_mask;
+extern int              *__trans_upper;
+extern int              *__trans_lower;
 
 #if defined(__STDC__)
 
-#if __cplusplus < 199711L  /* Use inline functions instead for ANSI C++ */
+#if __cplusplus >= 199711L
+namespace std {
+#endif
 
+/*
+ * These used to be macros, which while more efficient, precludes operation
+ * with thread specific locales.  The old macros will still work, but new
+ * code compiles to use functions.  This is specifically permitted by the
+ * various standards.  Only _tolower and _toupper were required to be
+ * delivered in macro form.
+ */
 extern int isalnum(int);
 extern int isalpha(int);
 extern int iscntrl(int);
 extern int isdigit(int);
 extern int isgraph(int);

@@ -87,114 +101,37 @@
 extern int isprint(int);
 extern int ispunct(int);
 extern int isspace(int);
 extern int isupper(int);
 extern int isxdigit(int);
-
-#endif /* __cplusplus < 199711L */
-
-#if __cplusplus >= 199711L
-namespace std {
+#if defined(_XPG6) || defined(_STDC_C99) || !defined(_STRICT_SYMBOLS)
+extern int isblank(int);
 #endif
 
 extern int tolower(int);
 extern int toupper(int);
 
 #if __cplusplus >= 199711L
 } /* end of namespace std */
 #endif
 
-extern unsigned char    __ctype[];
-extern unsigned int     *__ctype_mask;
-extern int              *__trans_upper;
-extern int              *__trans_lower;
-
-#if !defined(__lint)
-
-#if __cplusplus >= 199711L
-namespace std {
-
-#if defined(__XPG4_CHAR_CLASS__) || defined(_XPG4)
-
-inline int isalpha(int c) { return (__ctype_mask[c] & _ISALPHA); }
-inline int isupper(int c) { return (__ctype_mask[c] & _ISUPPER); }
-inline int islower(int c) { return (__ctype_mask[c] & _ISLOWER); }
-inline int isdigit(int c) { return (__ctype_mask[c] & _ISDIGIT); }
-inline int isxdigit(int c) { return (__ctype_mask[c] & _ISXDIGIT); }
-inline int isalnum(int c) { return (__ctype_mask[c] & _ISALNUM); }
-inline int isspace(int c) { return (__ctype_mask[c] & _ISSPACE); }
-inline int ispunct(int c) { return (__ctype_mask[c] & _ISPUNCT); }
-inline int isprint(int c) { return (__ctype_mask[c] & _ISPRINT); }
-inline int isgraph(int c) { return (__ctype_mask[c] & _ISGRAPH); }
-inline int iscntrl(int c) { return (__ctype_mask[c] & _ISCNTRL); }
-#else
-inline int isalpha(int c) { return ((__ctype + 1)[c] & (_U | _L)); }
-inline int isupper(int c) { return ((__ctype + 1)[c] & _U); }
-inline int islower(int c) { return ((__ctype + 1)[c] & _L); }
-inline int isdigit(int c) { return ((__ctype + 1)[c] & _N); }
-inline int isxdigit(int c) { return ((__ctype + 1)[c] & _X); }
-inline int isalnum(int c) { return ((__ctype + 1)[c] & (_U | _L | _N)); }
-inline int isspace(int c) { return ((__ctype + 1)[c] & _S); }
-inline int ispunct(int c) { return ((__ctype + 1)[c] & _P); }
-inline int isprint(int c) {
-        return ((__ctype + 1)[c] & (_P | _U | _L | _N | _B)); }
-inline int isgraph(int c) { return ((__ctype + 1)[c] & (_P | _U | _L | _N)); }
-inline int iscntrl(int c) { return ((__ctype + 1)[c] & _C); }
-#endif  /* defined(__XPG4_CHAR_CLASS__) || defined(_XPG4) */
-
-} /* end of namespace std */
-
-#else /* __cplusplus >= 199711L */
-
-#if defined(__XPG4_CHAR_CLASS__) || defined(_XPG4)
-#define isalpha(c)      (__ctype_mask[(int)(c)] & _ISALPHA)
-#define isupper(c)      (__ctype_mask[(int)(c)] & _ISUPPER)
-#define islower(c)      (__ctype_mask[(int)(c)] & _ISLOWER)
-#define isdigit(c)      (__ctype_mask[(int)(c)] & _ISDIGIT)
-#define isxdigit(c)     (__ctype_mask[(int)(c)] & _ISXDIGIT)
-#define isalnum(c)      (__ctype_mask[(int)(c)] & _ISALNUM)
-#define isspace(c)      (__ctype_mask[(int)(c)] & _ISSPACE)
-#define ispunct(c)      (__ctype_mask[(int)(c)] & _ISPUNCT)
-#define isprint(c)      (__ctype_mask[(int)(c)] & _ISPRINT)
-#define isgraph(c)      (__ctype_mask[(int)(c)] & _ISGRAPH)
-#define iscntrl(c)      (__ctype_mask[(int)(c)] & _ISCNTRL)
-#else
-#define isalpha(c)      ((__ctype + 1)[(int)(c)] & (_U | _L))
-#define isupper(c)      ((__ctype + 1)[(int)(c)] & _U)
-#define islower(c)      ((__ctype + 1)[(int)(c)] & _L)
-#define isdigit(c)      ((__ctype + 1)[(int)(c)] & _N)
-#define isxdigit(c)     ((__ctype + 1)[(int)(c)] & _X)
-#define isalnum(c)      ((__ctype + 1)[(int)(c)] & (_U | _L | _N))
-#define isspace(c)      ((__ctype + 1)[(int)(c)] & _S)
-#define ispunct(c)      ((__ctype + 1)[(int)(c)] & _P)
-#define isprint(c)      ((__ctype + 1)[(int)(c)] & (_P | _U | _L | _N | _B))
-#define isgraph(c)      ((__ctype + 1)[(int)(c)] & (_P | _U | _L | _N))
-#define iscntrl(c)      ((__ctype + 1)[(int)(c)] & _C)
-
-#endif  /* defined(__XPG4_CHAR_CLASS__) || defined(_XPG4) */
-
-#endif  /* __cplusplus >= 199711L */
-
-#endif  /* !defined(__lint) */
-
 #else   /* defined(__STDC__) */
 
-extern unsigned char    _ctype[];
-
 #if !defined(__lint)
 
-#define isalpha(c)      ((_ctype + 1)[(int)(c)] & (_U | _L))
-#define isupper(c)      ((_ctype + 1)[(int)(c)] & _U)
-#define islower(c)      ((_ctype + 1)[(int)(c)] & _L)
-#define isdigit(c)      ((_ctype + 1)[(int)(c)] & _N)
-#define isxdigit(c)     ((_ctype + 1)[(int)(c)] & _X)
-#define isalnum(c)      ((_ctype + 1)[(int)(c)] & (_U | _L | _N))
-#define isspace(c)      ((_ctype + 1)[(int)(c)] & _S)
-#define ispunct(c)      ((_ctype + 1)[(int)(c)] & _P)
-#define isprint(c)      ((_ctype + 1)[(int)(c)] & (_P | _U | _L | _N | _B))
-#define isgraph(c)      ((_ctype + 1)[(int)(c)] & (_P | _U | _L | _N))
-#define iscntrl(c)      ((_ctype + 1)[(int)(c)] & _C)
+extern int isalpha();
+extern int isupper();
+extern int islower();
+extern int isdigit();
+extern int isxdigit();
+extern int isalnum();
+extern int isspace();
+extern int ispunct();
+extern int isprint();
+extern int isgraph();
+extern int iscntrl();
+extern int isblank();
 
 #endif  /* !defined(__lint) */
 
 #endif  /* defined(__STDC__) */