1cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project/*
2cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * ctype.h
3cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project *
4cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * This assumes ISO 8859-1, being a reasonable superset of ASCII.
5cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project */
6cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
7cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#ifndef _CTYPE_H
8cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#define _CTYPE_H
9cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
10cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#include <klibc/extern.h>
11cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
12cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#ifndef __CTYPE_NO_INLINE
13cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project# define __ctype_inline static __inline__
14cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#else
15cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project# define __ctype_inline
16cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project#endif
17cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
18cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project/*
19cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * This relies on the following definitions:
20e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin *
21cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * cntrl = !print
224a0748be283a8c9efa02243c3e1716c49443a87cDima Zavin * alpha = upper|lower
23cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project * graph = punct|alpha|digit
24e81531e91ecae92aff471dbff9cbeb0f95ff4a80Dima Zavin * blank = '\t' || ' ' (per POSIX requirement)
25cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project */
26cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Projectenum {
27cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    __ctype_upper = (1 << 0),
283e480fa067136253ae05faaba77f814f42cd56f0Jean-Michel Trivi    __ctype_lower = (1 << 1),
293e480fa067136253ae05faaba77f814f42cd56f0Jean-Michel Trivi    __ctype_digit = (1 << 2),
30cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    __ctype_xdigit = (1 << 3),
31cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    __ctype_space = (1 << 4),
32cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    __ctype_print = (1 << 5),
33cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    __ctype_punct = (1 << 6),
34cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    __ctype_cntrl = (1 << 7),
35cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project};
36cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
373e480fa067136253ae05faaba77f814f42cd56f0Jean-Michel Triviextern const unsigned char __ctypes[];
38cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
39cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project__ctype_inline int isalnum(int __c)
403e480fa067136253ae05faaba77f814f42cd56f0Jean-Michel Trivi{
413e480fa067136253ae05faaba77f814f42cd56f0Jean-Michel Trivi    return __ctypes[__c + 1] & (__ctype_upper | __ctype_lower | __ctype_digit);
42cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project}
43cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
44cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project__ctype_inline int isalpha(int __c)
45dbfad0ce83535cea0940e04660bdfab5b6c867a4Eric Laurent{
46dbfad0ce83535cea0940e04660bdfab5b6c867a4Eric Laurent    return __ctypes[__c + 1] & (__ctype_upper | __ctype_lower);
473e480fa067136253ae05faaba77f814f42cd56f0Jean-Michel Trivi}
48cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
49617c80a82e5620b2f16348e4bd3d7fc3b76e9021John Grossman__ctype_inline int isascii(int __c)
503e480fa067136253ae05faaba77f814f42cd56f0Jean-Michel Trivi{
51cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    return !(__c & ~0x7f);
52cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project}
53cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
54cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project__ctype_inline int isblank(int __c)
553e480fa067136253ae05faaba77f814f42cd56f0Jean-Michel Trivi{
563e480fa067136253ae05faaba77f814f42cd56f0Jean-Michel Trivi    return (__c == '\t') || (__c == ' ');
573e480fa067136253ae05faaba77f814f42cd56f0Jean-Michel Trivi}
583e480fa067136253ae05faaba77f814f42cd56f0Jean-Michel Trivi
593e480fa067136253ae05faaba77f814f42cd56f0Jean-Michel Trivi__ctype_inline int iscntrl(int __c)
603e480fa067136253ae05faaba77f814f42cd56f0Jean-Michel Trivi{
613e480fa067136253ae05faaba77f814f42cd56f0Jean-Michel Trivi    return __ctypes[__c + 1] & __ctype_cntrl;
62cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project}
63cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project
64cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project__ctype_inline int isdigit(int __c)
65cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project{
66cc490161f6af9e4a6842ee827e4bfc43bc4509d5The Android Open Source Project    return ((unsigned)__c - '0') <= 9;
67}
68
69__ctype_inline int isgraph(int __c)
70{
71    return __ctypes[__c + 1] &
72	(__ctype_upper | __ctype_lower | __ctype_digit | __ctype_punct);
73}
74
75__ctype_inline int islower(int __c)
76{
77    return __ctypes[__c + 1] & __ctype_lower;
78}
79
80__ctype_inline int isprint(int __c)
81{
82    return __ctypes[__c + 1] & __ctype_print;
83}
84
85__ctype_inline int ispunct(int __c)
86{
87    return __ctypes[__c + 1] & __ctype_punct;
88}
89
90__ctype_inline int isspace(int __c)
91{
92    return __ctypes[__c + 1] & __ctype_space;
93}
94
95__ctype_inline int isupper(int __c)
96{
97    return __ctypes[__c + 1] & __ctype_upper;
98}
99
100__ctype_inline int isxdigit(int __c)
101{
102    return __ctypes[__c + 1] & __ctype_xdigit;
103}
104
105/* Note: this is decimal, not hex, to avoid accidental promotion to unsigned */
106#define _toupper(__c) ((__c) & ~32)
107#define _tolower(__c) ((__c) | 32)
108
109__ctype_inline int toupper(int __c)
110{
111    return islower(__c) ? _toupper(__c) : __c;
112}
113
114__ctype_inline int tolower(int __c)
115{
116    return isupper(__c) ? _tolower(__c) : __c;
117}
118
119__extern char *skipspace(const char *p);
120__extern void chrreplace(char *source, char old, char new);
121
122#endif /* _CTYPE_H */
123