From b66ab87124dd4f0a74079e792f02a2b6baa20ac1 Mon Sep 17 00:00:00 2001 From: David Given Date: Mon, 16 Mar 2015 22:27:43 +0100 Subject: [PATCH] Replace table-based ctype implementation with a code-based one; slower, but smaller. --HG-- extra : source : 7b3fa3e9be82eda290589e21dda60ad78e1fcda0 --- Library/include/ctype.h | 64 ++++++++++++++------------------------ Library/libs/Makefile | 6 +++- Library/libs/Makefile.6502 | 6 +++- Library/libs/ctype.c | 58 ---------------------------------- Library/libs/isalnum.c | 6 ++++ Library/libs/isalpha.c | 7 +++++ Library/libs/isascii.c | 7 +++++ Library/libs/iscntrl.c | 7 +++++ Library/libs/isdigit.c | 8 +++++ Library/libs/isgraph.c | 7 +++++ Library/libs/islower.c | 7 +++++ Library/libs/isoctal.c | 8 +++++ Library/libs/ispunct.c | 7 +++++ Library/libs/isspace.c | 8 +++++ Library/libs/isupper.c | 7 +++++ Library/libs/isxdigit.c | 9 ++++++ Library/libs/toascii.c | 0 Library/libs/tolower.c | 9 ++++++ Library/libs/toupper.c | 9 ++++++ 19 files changed, 139 insertions(+), 101 deletions(-) delete mode 100644 Library/libs/ctype.c create mode 100644 Library/libs/isalnum.c create mode 100644 Library/libs/isalpha.c create mode 100644 Library/libs/isascii.c create mode 100644 Library/libs/iscntrl.c create mode 100644 Library/libs/isdigit.c create mode 100644 Library/libs/isgraph.c create mode 100644 Library/libs/islower.c create mode 100644 Library/libs/isoctal.c create mode 100644 Library/libs/ispunct.c create mode 100644 Library/libs/isspace.c create mode 100644 Library/libs/isupper.c create mode 100644 Library/libs/isxdigit.c create mode 100644 Library/libs/toascii.c create mode 100644 Library/libs/tolower.c create mode 100644 Library/libs/toupper.c diff --git a/Library/include/ctype.h b/Library/include/ctype.h index 204622cb..f217afeb 100644 --- a/Library/include/ctype.h +++ b/Library/include/ctype.h @@ -3,46 +3,28 @@ #ifndef __CTYPE_H #define __CTYPE_H -#include -extern unsigned char __ctype[]; - -#define __CT_c 0x01 /* control character */ -#define __CT_u 0x02 /* upper case */ -#define __CT_l 0x04 /* lower case */ -#define __CT_d 0x08 /* numeric digit */ -#define __CT_s 0x10 /* whitespace */ -#define __CT_p 0x20 /* punctuation */ -#define __CT_x 0x40 /* hexadecimal */ - -#define __CT_a (__CT_u|__CT_l) /* alpha */ - -/* always functions ! */ -extern int toupper __P((int)); -extern int tolower __P((int)); - -#define _toupper(c) (islower(c) ? (c)^0x20 : (c)) -#define _tolower(c) (isupper(c) ? (c)^0x20 : (c)) -#define __toupper(c) ((c)^0x20) -#define __tolower(c) ((c)^0x20) -#define toascii(c) ((c)&0x7F) - -#define _CTYPE(c) (__ctype[(unsigned char)(c)]) - -/* Note the '!!' is a cast to 'bool' and even BCC deletes it in an if() */ -#define isascii(c) (!((c)&~0x7F)) -#define isalnum(c) (!!(_CTYPE(c)&(__CT_a|__CT_d))) -#define isalpha(c) (!!(_CTYPE(c)&__CT_a)) -#define iscntrl(c) (!!(_CTYPE(c)&__CT_c)) -#define isdigit(c) (!!(_CTYPE(c)&__CT_d)) -#define isgraph(c) (! (_CTYPE(c)&(__CT_c|__CT_s))) -#define islower(c) (!!(_CTYPE(c)&__CT_l)) -#define isprint(c) (! (_CTYPE(c)&__CT_c)) -#define ispunct(c) (!!(_CTYPE(c)&__CT_p)) -#define isspace(c) (!!(_CTYPE(c)&__CT_s)) -#define isupper(c) (!!(_CTYPE(c)&__CT_u)) -#define isxdigit(c) (!!(_CTYPE(c)&__CT_x)) - -#define isdecimal(c) isdigit(c) -#define isoctal(c) ((c) >= '0' && (c) <= '7') +extern int toupper(int c); +extern int tolower(int c); + +#define toascii(c) ((c) & 0x7f) + +extern int isalnum(int c); +extern int isalpha(int c); +extern int isascii(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 ispunct(int c); +extern int isspace(int c); +extern int isupper(int c); +extern int isxdigit(int c); +extern int isoctal(int c); + +#define isdecimal isdigit +#define isprint(c) (!iscntrl(c)) +#define _tolower tolower +#define _toupper toupper #endif /* __CTYPE_H */ diff --git a/Library/libs/Makefile b/Library/libs/Makefile index 665ccfdf..758142e4 100644 --- a/Library/libs/Makefile +++ b/Library/libs/Makefile @@ -19,7 +19,7 @@ OBJ_ASM = $(SRC_ASM:.s=.rel) SRC_C = __argv.c abort.c asctime.c assert.c atexit.c SRC_C += bcmp.c bcopy.c bsearch.c bzero.c calloc.c cfree.c clock.c closedir.c SRC_C += clock_gettime.c clock_getres.c clock_settime.c -SRC_C += creat.c crypt.c ctime.c ctype.c difftime.c err.c errno.c error.c +SRC_C += creat.c crypt.c ctime.c difftime.c err.c errno.c error.c SRC_C += execl.c execv.c execvp.c exit.c SRC_C += fclose.c fflush.c fgetc.c fgetgrent.c fgetpwent.c SRC_C += fgetpos.c fgets.c fopen.c fprintf.c fputc.c fputs.c fread.c free.c @@ -41,6 +41,10 @@ SRC_C += strtod.c strtol.c system.c time.c tmpnam.c ttyname.c SRC_C += tzset.c ungetc.c utent.c utimes.c utsname.c SRC_C += vfprintf.c vprintf.c wait.c xitoa.c pathconf.c SRC_C += gethostname.c sysconf.c confstr.c memccpy.c getpass.c +# ctype +SRC_C += toupper.c tolower.c toascii.c isascii.c isalnum.c isalpha.c +SRC_C += iscntrl.c isdigit.c isgraph.c islower.c ispunct.c isspace.c +SRC_C += isupper.c isxdigit.c isoctal.c # tty layer SRC_C += tcgetattr.c tcsetattr.c tcdrain.c tcflow.c tcflush.c SRC_C += cfmakeraw.c cfspeed.c revoke.c diff --git a/Library/libs/Makefile.6502 b/Library/libs/Makefile.6502 index 34816938..0f94610f 100644 --- a/Library/libs/Makefile.6502 +++ b/Library/libs/Makefile.6502 @@ -33,7 +33,7 @@ OBJ_ASM = $(SRC_ASM:.s=.o) SRC_C = __argv.c abort.c asctime.c assert.c atexit.c atoi.c SRC_C += bcmp.c bcopy.c bsearch.c bzero.c calloc.c cfree.c clock.c closedir.c SRC_C += clock_gettime.c clock_getres.c clock_settime.c -SRC_C += creat.c crypt.c ctime.c ctype.c difftime.c err.c errno.c error.c +SRC_C += creat.c crypt.c ctime.c difftime.c err.c errno.c error.c SRC_C += execl.c execv.c execvp.c exit.c SRC_C += fclose.c fflush.c fgetc.c fgetgrent.c fgetpwent.c SRC_C += fgetpos.c fgets.c fopen.c fprintf.c fputc.c fputs.c fread.c free.c @@ -56,6 +56,10 @@ SRC_C += tzset.c ungetc.c utent.c utimes.c utsname.c SRC_C += vfprintf.c vprintf.c wait.c xitoa.c pathconf.c SRC_C += gethostname.c sysconf.c confstr.c memccpy.c getpass.c SRC_C += strtol.c +# ctype +SRC_C += toupper.c tolower.c toascii.c isascii.c isalnum.c isalpha.c +SRC_C += iscntrl.c isdigit.c isgraph.c islower.c ispunct.c isspace.c +SRC_C += isupper.c isxdigit.c isoctal.c # tty layer SRC_C += tcgetattr.c tcsetattr.c tcdrain.c tcflow.c tcflush.c SRC_C += cfmakeraw.c cfspeed.c revoke.c diff --git a/Library/libs/ctype.c b/Library/libs/ctype.c deleted file mode 100644 index 05efa469..00000000 --- a/Library/libs/ctype.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * CTYPE.C Character classification and conversion - */ -/* Copyright (C) 1995,1996 Robert de Bath - * This file is part of the Linux-8086 C library and is distributed - * under the GNU Library General Public License. - */ -#include -#include - -#undef toupper -#undef tolower - -unsigned char __ctype[256] = { __CT_c, __CT_c, __CT_c, __CT_c, /* 0x00..0x03 */ - __CT_c, __CT_c, __CT_c, __CT_c, /* 0x04..0x07 */ - __CT_c, __CT_c | __CT_s, __CT_c | __CT_s, __CT_c | __CT_s, /* 0x08..0x0B */ - __CT_c | __CT_s, __CT_c | __CT_s, __CT_c, __CT_c, /* 0x0C..0x0F */ - __CT_c, __CT_c, __CT_c, __CT_c, /* 0x10..0x13 */ - __CT_c, __CT_c, __CT_c, __CT_c, /* 0x14..0x17 */ - __CT_c, __CT_c, __CT_c, __CT_c, /* 0x18..0x1B */ - __CT_c, __CT_c, __CT_c, __CT_c, /* 0x1C..0x1F */ - __CT_s, __CT_p, __CT_p, __CT_p, /* 0x20..0x23 */ - __CT_p, __CT_p, __CT_p, __CT_p, /* 0x24..0x27 */ - __CT_p, __CT_p, __CT_p, __CT_p, /* 0x28..0x2B */ - __CT_p, __CT_p, __CT_p, __CT_p, /* 0x2C..0x2F */ - __CT_d | __CT_x, __CT_d | __CT_x, __CT_d | __CT_x, - __CT_d | __CT_x, /* 0x30..0x33 */ - __CT_d | __CT_x, __CT_d | __CT_x, __CT_d | __CT_x, - __CT_d | __CT_x, /* 0x34..0x37 */ - __CT_d | __CT_x, __CT_d | __CT_x, __CT_p, __CT_p, /* 0x38..0x3B */ - __CT_p, __CT_p, __CT_p, __CT_p, /* 0x3C..0x3F */ - __CT_p, __CT_u | __CT_x, __CT_u | __CT_x, __CT_u | __CT_x, /* 0x40..0x43 */ - __CT_u | __CT_x, __CT_u | __CT_x, __CT_u | __CT_x, __CT_u, /* 0x44..0x47 */ - __CT_u, __CT_u, __CT_u, __CT_u, /* 0x48..0x4B */ - __CT_u, __CT_u, __CT_u, __CT_u, /* 0x4C..0x4F */ - __CT_u, __CT_u, __CT_u, __CT_u, /* 0x50..0x53 */ - __CT_u, __CT_u, __CT_u, __CT_u, /* 0x54..0x57 */ - __CT_u, __CT_u, __CT_u, __CT_p, /* 0x58..0x5B */ - __CT_p, __CT_p, __CT_p, __CT_p, /* 0x5C..0x5F */ - __CT_p, __CT_l | __CT_x, __CT_l | __CT_x, __CT_l | __CT_x, /* 0x60..0x63 */ - __CT_l | __CT_x, __CT_l | __CT_x, __CT_l | __CT_x, __CT_l, /* 0x64..0x67 */ - __CT_l, __CT_l, __CT_l, __CT_l, /* 0x68..0x6B */ - __CT_l, __CT_l, __CT_l, __CT_l, /* 0x6C..0x6F */ - __CT_l, __CT_l, __CT_l, __CT_l, /* 0x70..0x73 */ - __CT_l, __CT_l, __CT_l, __CT_l, /* 0x74..0x77 */ - __CT_l, __CT_l, __CT_l, __CT_p, /* 0x78..0x7B */ - __CT_p, __CT_p, __CT_p, __CT_c /* 0x7C..0x7F */ -}; - -int toupper(int c) -{ - return (islower(c) ? (c ^ 0x20) : (c)); -} - -int tolower(int c) -{ - return (isupper(c) ? (c ^ 0x20) : (c)); -} diff --git a/Library/libs/isalnum.c b/Library/libs/isalnum.c new file mode 100644 index 00000000..e3d2cf0b --- /dev/null +++ b/Library/libs/isalnum.c @@ -0,0 +1,6 @@ +#include + +int isalnum(int c) +{ + return isalpha(c) || isdigit(c); +} diff --git a/Library/libs/isalpha.c b/Library/libs/isalpha.c new file mode 100644 index 00000000..0980d09b --- /dev/null +++ b/Library/libs/isalpha.c @@ -0,0 +1,7 @@ +#include + +int isalpha(int c) +{ + return isupper(c) || islower(c); +} + diff --git a/Library/libs/isascii.c b/Library/libs/isascii.c new file mode 100644 index 00000000..b4278f0c --- /dev/null +++ b/Library/libs/isascii.c @@ -0,0 +1,7 @@ +#include + +int isascii(int c) +{ + return (c >= 0) && (c <= 127); +} + diff --git a/Library/libs/iscntrl.c b/Library/libs/iscntrl.c new file mode 100644 index 00000000..4d770e98 --- /dev/null +++ b/Library/libs/iscntrl.c @@ -0,0 +1,7 @@ +#include + +int iscntrl(int c) +{ + char bc = c; + return ((bc >= 0) && (bc <= 31)) || (bc == 127); +} diff --git a/Library/libs/isdigit.c b/Library/libs/isdigit.c new file mode 100644 index 00000000..7a3a2a9d --- /dev/null +++ b/Library/libs/isdigit.c @@ -0,0 +1,8 @@ +#include + +int isdigit(int c) +{ + char bc = c; + return (bc >= '0') && (bc <= '9'); +} + diff --git a/Library/libs/isgraph.c b/Library/libs/isgraph.c new file mode 100644 index 00000000..d5660132 --- /dev/null +++ b/Library/libs/isgraph.c @@ -0,0 +1,7 @@ +#include + +int isgraph(int c) +{ + return !iscntrl(c) && !isspace(c); +} + diff --git a/Library/libs/islower.c b/Library/libs/islower.c new file mode 100644 index 00000000..b63fce04 --- /dev/null +++ b/Library/libs/islower.c @@ -0,0 +1,7 @@ +#include + +int islower(int c) +{ + char bc = c; + return (bc >= 'a') && (bc <= 'z'); +} diff --git a/Library/libs/isoctal.c b/Library/libs/isoctal.c new file mode 100644 index 00000000..3d69a064 --- /dev/null +++ b/Library/libs/isoctal.c @@ -0,0 +1,8 @@ +#include + +int isoctal(int c) +{ + char bc = c; + return (bc >= '0') && (bc <= '7'); +} + diff --git a/Library/libs/ispunct.c b/Library/libs/ispunct.c new file mode 100644 index 00000000..be72ef87 --- /dev/null +++ b/Library/libs/ispunct.c @@ -0,0 +1,7 @@ +#include + +int ispunct(int c) +{ + return !iscntrl(c) && !isalpha(c) && !isspace(c); +} + diff --git a/Library/libs/isspace.c b/Library/libs/isspace.c new file mode 100644 index 00000000..6cba2db5 --- /dev/null +++ b/Library/libs/isspace.c @@ -0,0 +1,8 @@ +#include +#include + +int isspace(int c) +{ + return !!strchr(" \t\n\r\f\v", c); +} + diff --git a/Library/libs/isupper.c b/Library/libs/isupper.c new file mode 100644 index 00000000..d2d3dd81 --- /dev/null +++ b/Library/libs/isupper.c @@ -0,0 +1,7 @@ +#include + +int isupper(int c) +{ + char bc = c; + return (bc >= 'A') && (bc <= 'Z'); +} diff --git a/Library/libs/isxdigit.c b/Library/libs/isxdigit.c new file mode 100644 index 00000000..3da08f32 --- /dev/null +++ b/Library/libs/isxdigit.c @@ -0,0 +1,9 @@ +#include + +int isxdigit(int c) +{ + char bc = c; + return isdigit(bc) + || ((bc >= 'a') && (bc <= 'f')) + || ((bc >= 'A') && (bc <= 'F')); +} diff --git a/Library/libs/toascii.c b/Library/libs/toascii.c new file mode 100644 index 00000000..e69de29b diff --git a/Library/libs/tolower.c b/Library/libs/tolower.c new file mode 100644 index 00000000..57a2bc7e --- /dev/null +++ b/Library/libs/tolower.c @@ -0,0 +1,9 @@ +#include + +int tolower(int c) +{ + if (isupper(c)) + c = c^0x20; + return c; +} + diff --git a/Library/libs/toupper.c b/Library/libs/toupper.c new file mode 100644 index 00000000..2617a225 --- /dev/null +++ b/Library/libs/toupper.c @@ -0,0 +1,9 @@ +#include + +int toupper(int c) +{ + if (islower(c)) + c = c^0x20; + return c; +} + -- 2.34.1