Added most of ctype.h (missing toupper & tolower)

This commit is contained in:
2024-10-19 15:11:54 +02:00
parent 77e16e9605
commit 3c20633acb
2 changed files with 164 additions and 0 deletions
+115
View File
@@ -0,0 +1,115 @@
#include <ctype.h>
const unsigned char _CTYPE_TABLE[256] = {
// Control characters (ASCII 0-31)
_CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, // 0-7
_CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, // 8-15
_CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, // 16-23
_CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, _CNTRL_MASK, // 24-31
// Space (ASCII 32)
_SPACE_MASK | _PRINT_MASK,
// Punctuation (ASCII 33-47)
_PUNCT_MASK | _PRINT_MASK, // '!' (ASCII 33)
_PUNCT_MASK | _PRINT_MASK, // '"' (ASCII 34)
_PUNCT_MASK | _PRINT_MASK, // '#' (ASCII 35)
_PUNCT_MASK | _PRINT_MASK, // '$' (ASCII 36)
_PUNCT_MASK | _PRINT_MASK, // '%' (ASCII 37)
_PUNCT_MASK | _PRINT_MASK, // '&' (ASCII 38)
_PUNCT_MASK | _PRINT_MASK, // '\'' (ASCII 39)
_PUNCT_MASK | _PRINT_MASK, // '(' (ASCII 40)
_PUNCT_MASK | _PRINT_MASK, // ')' (ASCII 41)
_PUNCT_MASK | _PRINT_MASK, // '*' (ASCII 42)
_PUNCT_MASK | _PRINT_MASK, // '+' (ASCII 43)
_PUNCT_MASK | _PRINT_MASK, // ',' (ASCII 44)
_PUNCT_MASK | _PRINT_MASK, // '-' (ASCII 45)
_PUNCT_MASK | _PRINT_MASK, // '.' (ASCII 46)
_PUNCT_MASK | _PRINT_MASK, // '/' (ASCII 47)
// Digits (ASCII 48-57)
_DIGIT_MASK | _PRINT_MASK, // '0' (ASCII 48)
_DIGIT_MASK | _PRINT_MASK, // '1' (ASCII 49)
_DIGIT_MASK | _PRINT_MASK, // '2' (ASCII 50)
_DIGIT_MASK | _PRINT_MASK, // '3' (ASCII 51)
_DIGIT_MASK | _PRINT_MASK, // '4' (ASCII 52)
_DIGIT_MASK | _PRINT_MASK, // '5' (ASCII 53)
_DIGIT_MASK | _PRINT_MASK, // '6' (ASCII 54)
_DIGIT_MASK | _PRINT_MASK, // '7' (ASCII 55)
_DIGIT_MASK | _PRINT_MASK, // '8' (ASCII 56)
_DIGIT_MASK | _PRINT_MASK, // '9' (ASCII 57)
// Punctuation (ASCII 58-64)
_PUNCT_MASK | _PRINT_MASK, // ':' (ASCII 58)
_PUNCT_MASK | _PRINT_MASK, // ';' (ASCII 59)
_PUNCT_MASK | _PRINT_MASK, // '<' (ASCII 60)
_PUNCT_MASK | _PRINT_MASK, // '=' (ASCII 61)
_PUNCT_MASK | _PRINT_MASK, // '>' (ASCII 62)
_PUNCT_MASK | _PRINT_MASK, // '?' (ASCII 63)
_PUNCT_MASK | _PRINT_MASK, // '@' (ASCII 64)
// Upperchase letters (ASCII 65-90)
_ALPHA_MASK | _PRINT_MASK, // 'A' (ASCII 65)
_ALPHA_MASK | _PRINT_MASK, // 'B' (ASCII 66)
_ALPHA_MASK | _PRINT_MASK, // 'C' (ASCII 67)
_ALPHA_MASK | _PRINT_MASK, // 'D' (ASCII 68)
_ALPHA_MASK | _PRINT_MASK, // 'E' (ASCII 69)
_ALPHA_MASK | _PRINT_MASK, // 'F' (ASCII 70)
_ALPHA_MASK | _PRINT_MASK, // 'G' (ASCII 71)
_ALPHA_MASK | _PRINT_MASK, // 'H' (ASCII 72)
_ALPHA_MASK | _PRINT_MASK, // 'I' (ASCII 73)
_ALPHA_MASK | _PRINT_MASK, // 'J' (ASCII 74)
_ALPHA_MASK | _PRINT_MASK, // 'K' (ASCII 75)
_ALPHA_MASK | _PRINT_MASK, // 'L' (ASCII 76)
_ALPHA_MASK | _PRINT_MASK, // 'M' (ASCII 77)
_ALPHA_MASK | _PRINT_MASK, // 'N' (ASCII 78)
_ALPHA_MASK | _PRINT_MASK, // 'O' (ASCII 79)
_ALPHA_MASK | _PRINT_MASK, // 'P' (ASCII 80)
_ALPHA_MASK | _PRINT_MASK, // 'Q' (ASCII 81)
_ALPHA_MASK | _PRINT_MASK, // 'R' (ASCII 82)
_ALPHA_MASK | _PRINT_MASK, // 'S' (ASCII 83)
_ALPHA_MASK | _PRINT_MASK, // 'T' (ASCII 84)
_ALPHA_MASK | _PRINT_MASK, // 'U' (ASCII 85)
_ALPHA_MASK | _PRINT_MASK, // 'V' (ASCII 86)
_ALPHA_MASK | _PRINT_MASK, // 'W' (ASCII 87)
_ALPHA_MASK | _PRINT_MASK, // 'X' (ASCII 88)
_ALPHA_MASK | _PRINT_MASK, // 'Y' (ASCII 89)
_ALPHA_MASK | _PRINT_MASK, // 'Z' (ASCII 90)
// Punctuation (ASCII 91-96)
_PUNCT_MASK | _PRINT_MASK, // '[' (ASCII 91)
_PUNCT_MASK | _PRINT_MASK, // '\' (ASCII 92)
_PUNCT_MASK | _PRINT_MASK, // ']' (ASCII 93)
_PUNCT_MASK | _PRINT_MASK, // '^' (ASCII 94)
_PUNCT_MASK | _PRINT_MASK, // '_' (ASCII 95)
_PUNCT_MASK | _PRINT_MASK, // '`' (ASCII 96)
// Lowercase letters (ASCII 97-122)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'a' (ASCII 97)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'b' (ASCII 98)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'c' (ASCII 99)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'd' (ASCII 100)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'e' (ASCII 101)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'f' (ASCII 102)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'g' (ASCII 103)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'h' (ASCII 104)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'i' (ASCII 105)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'j' (ASCII 106)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'k' (ASCII 107)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'l' (ASCII 108)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'm' (ASCII 109)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'n' (ASCII 110)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'o' (ASCII 111)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'p' (ASCII 112)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'q' (ASCII 113)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'r' (ASCII 114)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 's' (ASCII 115)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 't' (ASCII 116)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'u' (ASCII 117)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'v' (ASCII 118)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'w' (ASCII 119)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'x' (ASCII 120)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'y' (ASCII 121)
_ALPHA_MASK | _LOWER_MASK | _PRINT_MASK, // 'z' (ASCII 122)
// Punctuation (ASCII 123-126
_PUNCT_MASK | _PRINT_MASK, // '{' (ASCII 123)
_PUNCT_MASK | _PRINT_MASK, // '|' (ASCII 124)
_PUNCT_MASK | _PRINT_MASK, // '}' (ASCII 125)
_PUNCT_MASK | _PRINT_MASK, // '~' (ASCII 126)
// Control character (ASCII 127)
_CNTRL_MASK // DEL (ASCII 127)
};
+49
View File
@@ -0,0 +1,49 @@
#ifndef _CTYPE_H
#define _CTYPE_H
/* Bitfield values
Property | Bit
------------|-----
Digit | 0
Letter | 1
Lowercase | 2
Punct | 3
Space | 4
Control | 5
Printable | 6
Hex digit | 7
*/
#define _DIGIT_MASK (1<<0)
#define _ALPHA_MASK (1<<1)
#define _LOWER_MASK (1<<2)
#define _PUNCT_MASK (1<<3)
#define _SPACE_MASK (1<<4)
#define _CNTRL_MASK (1<<5)
#define _PRINT_MASK (1<<6)
#define _HEXDG_MASK (1<<7)
// A table for the ASCII character set
extern const unsigned char _CTYPE_TABLE[256];
// Just a macro to make this easier
#define _CTYPE_CHECK(_c, _mask) (_CTYPE_TABLE[(unsigned char)(_c)] & (_mask))
#define isalnum(_c) (isalpha((_c)) || isdigit((_c))
#define isalpha(_c) _CTYPE_CHECK((_c), _ALPHA_MASK)
#define islower(_c) _CTYPE_CHECK((_c), _LOWER_MASK)
#define isupper(_c) (!islower((_c)) && isalpha((_c)))
#define isdigit(_c) _CTYPE_CHECK((_c), _DIGIT_MASK)
#define iscntrl(_c) _CTYPE_CHECK((_c), _CNTRL_MASK)
#define isgraph(_c) (!isblank((_c)))
#define isspace(_c) _CTYPE_CHECK((_c), _SPACE_MASK)
#define isblank(_c) (iscntrl((_c)) || isspace((_c)))
#define isprint(_c) _CTYPE_CHECK((_c), _PRINT_MASK)
#define ispunct(_c) _CTYPE_CHECK((_c), _PUNCT_MASK)
// Why is this one's name longer :((
#define isxdigit(_c) _CTYPE_CHECK((_c), _HEXDG_MASK);
// TODO:
// tolower()
// toupper()
#endif