Replace table-based ctype implementation with a code-based one; slower,
authorDavid Given <dg@cowlark.com>
Mon, 16 Mar 2015 21:27:43 +0000 (22:27 +0100)
committerDavid Given <dg@cowlark.com>
Mon, 16 Mar 2015 21:27:43 +0000 (22:27 +0100)
but smaller.

--HG--
extra : source : 7b3fa3e9be82eda290589e21dda60ad78e1fcda0

19 files changed:
Library/include/ctype.h
Library/libs/Makefile
Library/libs/Makefile.6502
Library/libs/ctype.c [deleted file]
Library/libs/isalnum.c [new file with mode: 0644]
Library/libs/isalpha.c [new file with mode: 0644]
Library/libs/isascii.c [new file with mode: 0644]
Library/libs/iscntrl.c [new file with mode: 0644]
Library/libs/isdigit.c [new file with mode: 0644]
Library/libs/isgraph.c [new file with mode: 0644]
Library/libs/islower.c [new file with mode: 0644]
Library/libs/isoctal.c [new file with mode: 0644]
Library/libs/ispunct.c [new file with mode: 0644]
Library/libs/isspace.c [new file with mode: 0644]
Library/libs/isupper.c [new file with mode: 0644]
Library/libs/isxdigit.c [new file with mode: 0644]
Library/libs/toascii.c [new file with mode: 0644]
Library/libs/tolower.c [new file with mode: 0644]
Library/libs/toupper.c [new file with mode: 0644]

index 204622c..f217afe 100644 (file)
@@ -3,46 +3,28 @@
 #ifndef __CTYPE_H
 #define __CTYPE_H
 
-#include <features.h>
-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 */
index 665ccfd..758142e 100644 (file)
@@ -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
index 3481693..0f94610 100644 (file)
@@ -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 (file)
index 05efa46..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/*\r
- *  CTYPE.C    Character classification and conversion\r
- */  \r
-/* Copyright (C) 1995,1996 Robert de Bath <rdebath@cix.compulink.co.uk>\r
- * This file is part of the Linux-8086 C library and is distributed\r
- * under the GNU Library General Public License.\r
- */ \r
-#include <types.h>\r
-#include <ctype.h>\r
-    \r
-#undef toupper\r
-#undef tolower\r
-\r
-unsigned char __ctype[256] = { \r__CT_c, __CT_c, __CT_c, __CT_c, /* 0x00..0x03 */ \r
-           __CT_c, __CT_c, __CT_c, __CT_c, /* 0x04..0x07 */ \r
-           __CT_c, __CT_c | __CT_s, __CT_c | __CT_s, __CT_c | __CT_s, /* 0x08..0x0B */ \r
-           __CT_c | __CT_s, __CT_c | __CT_s, __CT_c, __CT_c, /* 0x0C..0x0F */ \r
-           __CT_c, __CT_c, __CT_c, __CT_c, /* 0x10..0x13 */ \r
-           __CT_c, __CT_c, __CT_c, __CT_c, /* 0x14..0x17 */ \r
-           __CT_c, __CT_c, __CT_c, __CT_c, /* 0x18..0x1B */ \r
-           __CT_c, __CT_c, __CT_c, __CT_c, /* 0x1C..0x1F */ \r
-           __CT_s, __CT_p, __CT_p, __CT_p, /* 0x20..0x23 */ \r
-           __CT_p, __CT_p, __CT_p, __CT_p, /* 0x24..0x27 */ \r
-           __CT_p, __CT_p, __CT_p, __CT_p, /* 0x28..0x2B */ \r
-           __CT_p, __CT_p, __CT_p, __CT_p, /* 0x2C..0x2F */ \r
-           __CT_d | __CT_x, __CT_d | __CT_x, __CT_d | __CT_x,
-           __CT_d | __CT_x, /* 0x30..0x33 */ \r
-           __CT_d | __CT_x, __CT_d | __CT_x, __CT_d | __CT_x,
-           __CT_d | __CT_x, /* 0x34..0x37 */ \r
-           __CT_d | __CT_x, __CT_d | __CT_x, __CT_p, __CT_p, /* 0x38..0x3B */ \r
-           __CT_p, __CT_p, __CT_p, __CT_p, /* 0x3C..0x3F */ \r
-           __CT_p, __CT_u | __CT_x, __CT_u | __CT_x, __CT_u | __CT_x, /* 0x40..0x43 */ \r
-           __CT_u | __CT_x, __CT_u | __CT_x, __CT_u | __CT_x, __CT_u, /* 0x44..0x47 */ \r
-           __CT_u, __CT_u, __CT_u, __CT_u, /* 0x48..0x4B */ \r
-           __CT_u, __CT_u, __CT_u, __CT_u, /* 0x4C..0x4F */ \r
-           __CT_u, __CT_u, __CT_u, __CT_u, /* 0x50..0x53 */ \r
-           __CT_u, __CT_u, __CT_u, __CT_u, /* 0x54..0x57 */ \r
-           __CT_u, __CT_u, __CT_u, __CT_p, /* 0x58..0x5B */ \r
-           __CT_p, __CT_p, __CT_p, __CT_p, /* 0x5C..0x5F */ \r
-           __CT_p, __CT_l | __CT_x, __CT_l | __CT_x, __CT_l | __CT_x, /* 0x60..0x63 */ \r
-           __CT_l | __CT_x, __CT_l | __CT_x, __CT_l | __CT_x, __CT_l, /* 0x64..0x67 */ \r
-           __CT_l, __CT_l, __CT_l, __CT_l, /* 0x68..0x6B */ \r
-           __CT_l, __CT_l, __CT_l, __CT_l, /* 0x6C..0x6F */ \r
-           __CT_l, __CT_l, __CT_l, __CT_l, /* 0x70..0x73 */ \r
-           __CT_l, __CT_l, __CT_l, __CT_l, /* 0x74..0x77 */ \r
-           __CT_l, __CT_l, __CT_l, __CT_p, /* 0x78..0x7B */ \r
-           __CT_p, __CT_p, __CT_p, __CT_c /* 0x7C..0x7F */  \r
-};
-
-int toupper(int c) \r
-{
-       return (islower(c) ? (c ^ 0x20) : (c));
-}
-
-int tolower(int c) \r
-{
-       return (isupper(c) ? (c ^ 0x20) : (c));
-}
diff --git a/Library/libs/isalnum.c b/Library/libs/isalnum.c
new file mode 100644 (file)
index 0000000..e3d2cf0
--- /dev/null
@@ -0,0 +1,6 @@
+#include <ctype.h>
+
+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 (file)
index 0000000..0980d09
--- /dev/null
@@ -0,0 +1,7 @@
+#include <ctype.h>
+
+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 (file)
index 0000000..b4278f0
--- /dev/null
@@ -0,0 +1,7 @@
+#include <ctype.h>
+
+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 (file)
index 0000000..4d770e9
--- /dev/null
@@ -0,0 +1,7 @@
+#include <ctype.h>
+
+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 (file)
index 0000000..7a3a2a9
--- /dev/null
@@ -0,0 +1,8 @@
+#include <ctype.h>
+
+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 (file)
index 0000000..d566013
--- /dev/null
@@ -0,0 +1,7 @@
+#include <ctype.h>
+
+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 (file)
index 0000000..b63fce0
--- /dev/null
@@ -0,0 +1,7 @@
+#include <ctype.h>
+
+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 (file)
index 0000000..3d69a06
--- /dev/null
@@ -0,0 +1,8 @@
+#include <ctype.h>
+
+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 (file)
index 0000000..be72ef8
--- /dev/null
@@ -0,0 +1,7 @@
+#include <ctype.h>
+
+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 (file)
index 0000000..6cba2db
--- /dev/null
@@ -0,0 +1,8 @@
+#include <ctype.h>
+#include <string.h>
+
+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 (file)
index 0000000..d2d3dd8
--- /dev/null
@@ -0,0 +1,7 @@
+#include <ctype.h>
+
+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 (file)
index 0000000..3da08f3
--- /dev/null
@@ -0,0 +1,9 @@
+#include <ctype.h>
+
+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 (file)
index 0000000..e69de29
diff --git a/Library/libs/tolower.c b/Library/libs/tolower.c
new file mode 100644 (file)
index 0000000..57a2bc7
--- /dev/null
@@ -0,0 +1,9 @@
+#include <ctype.h>
+
+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 (file)
index 0000000..2617a22
--- /dev/null
@@ -0,0 +1,9 @@
+#include <ctype.h>
+
+int toupper(int c)
+{
+       if (islower(c))
+               c = c^0x20;
+       return c;
+}
+