shithub: riscv

Download patch

ref: ec533a1ad8403ae94db37774e78d5b371b8fecfc
parent: 74bf624055abda1d4f6dfb986b0188a4102024f0
author: Ori Bernstein <ori@eigenstate.org>
date: Sat Aug 29 07:09:20 EDT 2020

ape/ctype.h: add isblank, fix functions (thanks staalmannen)

Our ctype.h mistakenly ommitted isblank. Add it in.

While we're here, the make the 'isfoo()' functions
are broken: they're offsetting into the array, and
don't work with negative character values.

Sync the function bodies with the macros, and make
them produce correct results.

--- a/sys/include/ape/ctype.h
+++ b/sys/include/ape/ctype.h
@@ -8,6 +8,7 @@
 
 extern int isalnum(int);
 extern int isalpha(int);
+extern int isblank(int);
 extern int iscntrl(int);
 extern int isdigit(int);
 extern int isgraph(int);
@@ -38,6 +39,7 @@
 extern unsigned char _ctype[];
 #define	isalnum(c)	(_ctype[(unsigned char)(c)]&(_ISupper|_ISlower|_ISdigit))
 #define	isalpha(c)	(_ctype[(unsigned char)(c)]&(_ISupper|_ISlower))
+#define	isblank(c)	(_ctype[(unsigned char)(c)]&_ISblank)
 #define	iscntrl(c)	(_ctype[(unsigned char)(c)]&_IScntrl)
 #define	isdigit(c)	(_ctype[(unsigned char)(c)]&_ISdigit)
 #define	isgraph(c)	(_ctype[(unsigned char)(c)]&(_ISpunct|_ISupper|_ISlower|_ISdigit))
--- a/sys/src/ape/lib/ap/gen/isalnum.c
+++ b/sys/src/ape/lib/ap/gen/isalnum.c
@@ -2,6 +2,7 @@
 
 #undef isalnum
 #undef isalpha
+#undef isblank
 #undef iscntrl
 #undef isdigit
 #undef isgraph
@@ -11,14 +12,16 @@
 #undef isspace
 #undef isupper
 #undef isxdigit
-int isalnum(int c){ return (_ctype+1)[c]&(_ISupper|_ISlower|_ISdigit); }
-int isalpha(int c){ return (_ctype+1)[c]&(_ISupper|_ISlower); }
-int iscntrl(int c){ return (_ctype+1)[c]&_IScntrl; }
-int isdigit(int c){ return (_ctype+1)[c]&_ISdigit; }
-int isgraph(int c){ return (_ctype+1)[c]&(_ISpunct|_ISupper|_ISlower|_ISdigit); }
-int islower(int c){ return (_ctype+1)[c]&_ISlower; }
-int isprint(int c){ return (_ctype+1)[c]&(_ISpunct|_ISupper|_ISlower|_ISdigit|_ISblank); }
-int ispunct(int c){ return (_ctype+1)[c]&_ISpunct; }
-int isspace(int c){ return (_ctype+1)[c]&_ISspace; }
-int isupper(int c){ return (_ctype+1)[c]&_ISupper; }
-int isxdigit(int c){ return (_ctype+1)[c]&_ISxdigit; }
+
+int isalnum(int c) {return _ctype[(unsigned char)(c)]&(_ISupper|_ISlower|_ISdigit);}
+int isalpha(int c) {return _ctype[(unsigned char)(c)]&(_ISupper|_ISlower);}
+int isblank(int c) {return _ctype[(unsigned char)(c)]&_ISblank;}
+int iscntrl(int c) {return _ctype[(unsigned char)(c)]&_IScntrl;}
+int isdigit(int c) {return _ctype[(unsigned char)(c)]&_ISdigit;}
+int isgraph(int c) {return _ctype[(unsigned char)(c)]&(_ISpunct|_ISupper|_ISlower|_ISdigit);}
+int islower(int c) {return _ctype[(unsigned char)(c)]&_ISlower;}
+int isprint(int c) {return _ctype[(unsigned char)(c)]&(_ISpunct|_ISupper|_ISlower|_ISdigit|_ISblank);}
+int ispunct(int c) {return _ctype[(unsigned char)(c)]&_ISpunct;}
+int isspace(int c) {return _ctype[(unsigned char)(c)]&_ISspace;}
+int isupper(int c) {return _ctype[(unsigned char)(c)]&_ISupper;}
+int isxdigit(int c) {return _ctype[(unsigned char)(c)]&_ISxdigit;}