You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

277 lines
10 KiB

/* ctype.h: ANSI 'C' (X3J11 Oct 88) library header, section 4.3 */
/* Copyright (C) Codemist Ltd. 1988-1993. */
/* Copyright 1991-1993 ARM Limited. All rights reserved. */
/* version 0.03 */
/*
* RCS $Revision: 179217 $
* Checkin $Date: 2013-03-12 14:03:19 +0000 (Tue, 12 Mar 2013) $
* Revising $Author: agrant $
*/
/*
* ctype.h declares several functions useful for testing and mapping
* characters. In all cases the argument is an int, the value of which shall
* be representable as an unsigned char or shall equal the value of the
* macro EOF. If the argument has any other value, the behaviour is undefined.
*/
#ifndef __ctype_h
#define __ctype_h
#define __ARMCLIB_VERSION 5050106
#define _ARMABI __declspec(__nothrow)
#define _ARMABI_PURE __declspec(__nothrow) __attribute__((const))
#ifdef __cplusplus
#define _ARMABI_INLINE_DEF inline
#elif defined(__GNUC__) || (defined(__STDC_VERSION__) && 199901L <= __STDC_VERSION__)
#define _ARMABI_INLINE_DEF static inline
#elif defined(_USE_STATIC_INLINE)
#define _ARMABI_INLINE_DEF static __inline
#else
#define _ARMABI_INLINE_DEF __inline
#endif
#ifndef __CTYPE_DECLS
#define __CTYPE_DECLS
#undef __CLIBNS
#ifdef __cplusplus
namespace std {
#define __CLIBNS std::
extern "C" {
#else
#define __CLIBNS
#endif /* __cplusplus */
/* AEABI portable ctype flag bits */
#define _ABI_A 1 /* alphabetic */
#define _ABI_X 2 /* A-F, a-f and 0-9 */
#define _ABI_P 4 /* punctuation */
#define _ABI_B 8 /* blank */
#define _ABI_S 16 /* white space */
#define _ABI_L 32 /* lower case letter */
#define _ABI_U 64 /* upper case letter */
#define _ABI_C 128 /* control chars */
/* ARM internal ctype flag bits */
/* N.B. - keep in step with <ctype.c> */
/*
* __ARM_CT_A (alphabetic) is required because characters in some locales
* (e.g. Japanese) can be alphabetic but neither uppercase nor
* lowercase. Unfortunately there wasn't a bit free for this, so
* instead we've defined __ARM_CT_A as __ARM_CT_N+__ARM_CT_X (on the grounds that this
* was a previously unused combination). Hence some of the ctype
* predicates below are slightly less than obvious in
* implementation.
*/
#define __ARM_CT_S 1 /* whitespace */
#define __ARM_CT_P 2 /* punctuation */
#define __ARM_CT_B 4 /* blank */
#define __ARM_CT_L 8 /* lower case letter */
#define __ARM_CT_U 16 /* upper case letter */
#define __ARM_CT_N 32 /* (decimal) digit */
#define __ARM_CT_C 64 /* control chars */
#define __ARM_CT_X 128 /* A-F and a-f */
#define __ARM_CT_A (__ARM_CT_N+__ARM_CT_X) /* alphabetic */
#if _AEABI_PORTABILITY_LEVEL != 0 && !defined _AEABI_PORTABLE
#define _AEABI_PORTABLE
#endif
#if _AEABI_PORTABILITY_LEVEL != 0 || (!defined _AEABI_PORTABILITY_LEVEL && __DEFAULT_AEABI_PORTABILITY_LEVEL != 0)
extern int (isalnum)(int /*c*/);
extern int (isalpha)(int /*c*/);
extern int (isblank)(int /*c*/);
extern int (iscntrl)(int /*c*/);
extern int (isdigit)(int /*c*/);
extern int (isgraph)(int /*c*/);
extern int (islower)(int /*c*/);
extern int (isprint)(int /*c*/);
extern int (ispunct)(int /*c*/);
extern int (isspace)(int /*c*/);
extern int (isupper)(int /*c*/);
extern int (isxdigit)(int /*c*/);
/* Mandatory character attribute arrays indexed from 0 to 256 */
extern unsigned char const __aeabi_ctype_table_C[257]; /* "C" locale */
extern unsigned char const __aeabi_ctype_table_[257]; /* default locale */
/* The default locale might be the C locale */
/* Optional character attribute arrays indexed from 0 to 256. */
/* These do not have to be provided by every execution environment */
/* but, if provided, shall be provided with these names and meaning. */
extern unsigned char const __aeabi_ctype_table_ISO8859_1[257];
extern unsigned char const __aeabi_ctype_table_SJIS[257];
extern unsigned char const __aeabi_ctype_table_BIG5[257];
extern unsigned char const __aeabi_ctype_table_UTF8[257];
#ifdef _AEABI_LC_CTYPE
# define _AEABI_CTYPE_TABLE(_X) __aeabi_ctype_table_ ## _X
# define _AEABI_CTYPE(_X) _AEABI_CTYPE_TABLE(_X)
# define __aeabi_ctype_table _AEABI_CTYPE(_AEABI_LC_CTYPE)
#else
# define __aeabi_ctype_table __aeabi_ctype_table_
#endif
#define isspace(x) ((__CLIBNS __aeabi_ctype_table+1)[(x)] & _ABI_S)
#define isalpha(x) ((__CLIBNS __aeabi_ctype_table+1)[(x)] & _ABI_A)
#define isalnum(x) ((__CLIBNS __aeabi_ctype_table+1)[(x)] << 30) /* test for _ABI_A and _ABI_X */
#define isprint(x) ((__CLIBNS __aeabi_ctype_table+1)[(x)] << 28) /* test for _ABI_A, _ABI_X, _ABI_P and _ABI_B */
#define isupper(x) ((__CLIBNS __aeabi_ctype_table+1)[(x)] & _ABI_U)
#define islower(x) ((__CLIBNS __aeabi_ctype_table+1)[(x)] & _ABI_L)
#define isxdigit(x) ((__CLIBNS __aeabi_ctype_table+1)[(x)] & _ABI_X)
#define isgraph(x) ((__CLIBNS __aeabi_ctype_table+1)[(x)] << 29) /* test for _ABI_A, _ABI_X and _ABI_P */
#define iscntrl(x) ((__CLIBNS __aeabi_ctype_table+1)[(x)] & _ABI_C)
#define ispunct(x) ((__CLIBNS __aeabi_ctype_table+1)[(x)] & _ABI_P)
#define isdigit(c) (((unsigned)(c) - '0') < 10)
#else /* __AEABI_PORTABILITY_LEVEL */
extern _ARMABI_PURE unsigned char **__rt_ctype_table(void);
#define __arm_ctype (*__CLIBNS __rt_ctype_table())
#ifdef __cplusplus
inline int isalnum(int __c) { return (__arm_ctype[__c] & (__ARM_CT_U+__ARM_CT_L+__ARM_CT_N)); }
#else
#define isalnum(c) (__arm_ctype[c] & (__ARM_CT_U+__ARM_CT_L+__ARM_CT_N))
extern int (isalnum)(int /*c*/);
#endif
/* non-0 iff c is alphabetic or numeric */
#ifdef __cplusplus
inline int isalpha(int __c) { return (__arm_ctype[__c] & (__ARM_CT_U+__ARM_CT_L+__ARM_CT_X)); }
#else
#define isalpha(c) (__arm_ctype[c] & (__ARM_CT_U+__ARM_CT_L+__ARM_CT_X))
extern int (isalpha)(int /*c*/);
#endif
/* non-0 iff c is alphabetic */
#ifdef __cplusplus
inline int iscntrl(int __c) { return (__arm_ctype[__c] & __ARM_CT_C); }
#else
#define iscntrl(c) (__arm_ctype[c] & __ARM_CT_C)
extern int (iscntrl)(int /*c*/);
#endif
/* non-0 iff c is a control character - in the "C" locale */
/* this means (c < ' ') || (c > '~') */
/* isdigit must test for the presence of _only_ __ARM_CT_N, not just __ARM_CT_N at all. */
#ifdef __cplusplus
inline int isdigit(int __c) { return (__arm_ctype[__c] == __ARM_CT_N); }
#else
#define isdigit(c) (__arm_ctype[c] == __ARM_CT_N)
extern int (isdigit)(int /*c*/);
#endif
/* non-0 iff c is a decimal digit */
extern int (isblank)(int /*c*/);
/* non-0 iff c is ' ', '\t' or some other locale-specific, */
/* word-separating character (there are no others in "C" */
/* locale) */
#ifdef __cplusplus
inline int isgraph(int __c) {return(__arm_ctype[__c] & (__ARM_CT_L+__ARM_CT_U+__ARM_CT_N+__ARM_CT_X+__ARM_CT_P));}
#else
#define isgraph(c) (__arm_ctype[c]&(__ARM_CT_L+__ARM_CT_U+__ARM_CT_N+__ARM_CT_X+__ARM_CT_P))
extern int (isgraph)(int /*c*/);
#endif
/* non-0 iff c is any printing character other than ' ' */
#ifdef __cplusplus
inline int islower(int __c) { return (__arm_ctype[__c] & __ARM_CT_L); }
#else
#define islower(c) (__arm_ctype[c] & __ARM_CT_L)
extern int (islower)(int /*c*/);
#endif
/* non-0 iff c is a lower-case letter */
#ifdef __cplusplus
inline int isprint(int __c) { return (__arm_ctype[__c] & (__ARM_CT_L+__ARM_CT_U+__ARM_CT_N+__ARM_CT_P+__ARM_CT_B)); }
#else
#define isprint(c) (__arm_ctype[c] & (__ARM_CT_L+__ARM_CT_U+__ARM_CT_N+__ARM_CT_P+__ARM_CT_B))
extern int (isprint)(int /*c*/);
#endif
/* non-0 iff c is a printing character - in the "C" locale */
/* this means 0x20 (space) -> 0x7E (tilde) */
#ifdef __cplusplus
inline int ispunct(int __c) { return (__arm_ctype[__c] & __ARM_CT_P); }
#else
#define ispunct(c) (__arm_ctype[c] & __ARM_CT_P)
extern int (ispunct)(int /*c*/);
#endif
/* non-0 iff c is a non-space, non-alpha-numeric, printing character */
#ifdef __cplusplus
inline int isspace(int __c) { return (__arm_ctype[__c] & __ARM_CT_S); }
#else
#define isspace(c) (__arm_ctype[c] & __ARM_CT_S)
extern int (isspace)(int /*c*/);
#endif
/* non-0 iff c is a white-space char: ' ', '\f', '\n', '\r', '\t', '\v'. */
#ifdef __cplusplus
inline int isupper(int __c) { return (__arm_ctype[__c] & __ARM_CT_U); }
#else
#define isupper(c) (__arm_ctype[c] & __ARM_CT_U)
extern int (isupper)(int /*c*/);
#endif
/* non-0 iff c is an upper-case letter */
/* isxdigit must test for the presence of __ARM_CT_N or __ARM_CT_X but not both. */
/* This helper function avoids needing to evaluate c twice. */
_ARMABI_INLINE_DEF int __isxdigit_helper(int __t) { return (__t ^ (__t << 2)); }
#ifdef __cplusplus
inline int isxdigit(int __c){return __isxdigit_helper(__arm_ctype[__c]) & __ARM_CT_X;}
#else
#define isxdigit(c) (__isxdigit_helper(__arm_ctype[c]) & __ARM_CT_X)
extern int (isxdigit)(int /*c*/);
#endif
/* non-0 iff c is a digit, in 'a'..'f', or in 'A'..'F' */
#endif /* __AEABI_PORTABILITY_LEVEL */
extern int tolower(int /*c*/);
/* if c is an upper-case letter then return the corresponding */
/* lower-case letter, otherwise return c. */
extern int toupper(int /*c*/);
/* if c is an lower-case letter then return the corresponding */
/* upper-case letter, otherwise return c. */
#ifdef __cplusplus
} /* extern "C" */
} /* namespace std */
#endif /* __cplusplus */
#endif /* __CTYPE_DECLS */
#ifdef __cplusplus
#ifndef __CTYPE_NO_EXPORTS
using ::std::isalnum;
using ::std::isalpha;
using ::std::iscntrl;
using ::std::isdigit;
using ::std::isblank;
using ::std::isgraph;
using ::std::islower;
using ::std::isprint;
using ::std::ispunct;
using ::std::isspace;
using ::std::isupper;
using ::std::isxdigit;
using ::std::tolower;
using ::std::toupper;
#endif /* __CTYPE_NO_EXPORTS */
#endif /* __cplusplus */
#endif
/* end of ctype.h */