/* * Copyright (c) 2018-2020, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include __BEGIN_DECLS #ifndef EOF # define EOF (-1) #endif /* Do what newlib does to appease GCC's --with-newlib option. */ #define _U 01 #define _L 02 #define _N 04 #define _S 010 #define _P 020 #define _C 040 #define _X 0100 #define _B 0200 /** * newlib has a 257 byte _ctype_ array to enable compiler tricks to catch * people passing char instead of int. We don't engage in those tricks, * but still claim to be newlib to the toolchains */ extern char const _ctype_[1 + 256] __attribute__((visibility("default"))); static inline int __inline_isalnum(int c) { return _ctype_[(unsigned char)(c) + 1] & (_U | _L | _N); } static inline int __inline_isalpha(int c) { return _ctype_[(unsigned char)(c) + 1] & (_U | _L); } static inline int __inline_isascii(int c) { return (unsigned)c <= 127; } static inline int __inline_iscntrl(int c) { return _ctype_[(unsigned char)(c) + 1] & (_C); } static inline int __inline_isdigit(int c) { return _ctype_[(unsigned char)(c) + 1] & (_N); } static inline int __inline_isxdigit(int c) { return _ctype_[(unsigned char)(c) + 1] & (_N | _X); } static inline int __inline_isspace(int c) { return _ctype_[(unsigned char)(c) + 1] & (_S); } static inline int __inline_ispunct(int c) { return _ctype_[(unsigned char)(c) + 1] & (_P); } static inline int __inline_isprint(int c) { return _ctype_[(unsigned char)(c) + 1] & (_P | _U | _L | _N | _B); } static inline int __inline_isgraph(int c) { return _ctype_[(unsigned char)(c) + 1] & (_P | _U | _L | _N); } static inline int __inline_islower(int c) { return _ctype_[(unsigned char)(c) + 1] & (_L); } static inline int __inline_isupper(int c) { return _ctype_[(unsigned char)(c) + 1] & (_U); } static inline int __inline_isblank(int c) { return _ctype_[(unsigned char)(c) + 1] & (_B) || (c == '\t'); } static inline int __inline_toascii(int c) { return c & 127; } static inline int __inline_tolower(int c) { if (c >= 'A' && c <= 'Z') return c | 0x20; return c; } static inline int __inline_toupper(int c) { if (c >= 'a' && c <= 'z') return c & ~0x20; return c; } #ifdef __cplusplus extern "C" { #endif int isalnum(int c); int isalpha(int c); int isascii(int c); int iscntrl(int c); int isdigit(int c); int isxdigit(int c); int isspace(int c); int ispunct(int c); int isprint(int c); int isgraph(int c); int islower(int c); int isupper(int c); int isblank(int c); int toascii(int c); int tolower(int c); int toupper(int c); #ifdef __cplusplus } #endif #define isalnum __inline_isalnum #define isalpha __inline_isalpha #define isascii __inline_isascii #define iscntrl __inline_iscntrl #define isdigit __inline_isdigit #define isxdigit __inline_isxdigit #define isspace __inline_isspace #define ispunct __inline_ispunct #define isprint __inline_isprint #define isgraph __inline_isgraph #define islower __inline_islower #define isupper __inline_isupper #define isblank __inline_isblank #define toascii __inline_toascii #define tolower __inline_tolower #define toupper __inline_toupper __END_DECLS