aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2013-09-19 07:29:17 +1000
committerSteve Bennett <steveb@workware.net.au>2013-09-19 12:29:17 +1000
commit14f066bc24c7c5f8ca5559db321ef722d673c076 (patch)
tree4c6dae396cb2cd69f4469a1bf0b2ddb0b8982a7c
parentdcb268ae2e41a2f87e418b8d5285623977b2fbb4 (diff)
downloadjimtcl-14f066bc24c7c5f8ca5559db321ef722d673c076.zip
jimtcl-14f066bc24c7c5f8ca5559db321ef722d673c076.tar.gz
jimtcl-14f066bc24c7c5f8ca5559db321ef722d673c076.tar.bz2
Build on platforms without isascii
Signed-off-by: Steve Bennett <steveb@workware.net.au> Reported-by: Paul Fertser <fercerpav@gmail.com>
-rw-r--r--auto.def2
-rw-r--r--jim.c11
-rw-r--r--tests/string.test6
-rw-r--r--utf8.c5
4 files changed, 22 insertions, 2 deletions
diff --git a/auto.def b/auto.def
index 1bb6f7c..556361a 100644
--- a/auto.def
+++ b/auto.def
@@ -85,7 +85,7 @@ if {[cc-check-function-in-lib socket socket]} {
cc-check-functions ualarm lstat fork vfork system select execvpe
cc-check-functions backtrace geteuid mkstemp realpath strptime isatty
-cc-check-functions regcomp waitpid sigaction sys_signame sys_siglist
+cc-check-functions regcomp waitpid sigaction sys_signame sys_siglist isascii
cc-check-functions syslog opendir readlink sleep usleep pipe getaddrinfo utimes
if {[cc-check-functions sysinfo]} {
cc-with {-includes sys/sysinfo.h} {
diff --git a/jim.c b/jim.c
index 1cd696f..86b5479 100644
--- a/jim.c
+++ b/jim.c
@@ -2970,6 +2970,15 @@ static Jim_Obj *JimStringTrim(Jim_Interp *interp, Jim_Obj *strObjPtr, Jim_Obj *t
return strObjPtr;
}
+/* Some platforms don't have isascii - need a non-macro version */
+#ifdef HAVE_ISASCII
+#define jim_isascii isascii
+#else
+static int jim_isascii(int c)
+{
+ return !(c & ~0x7f);
+}
+#endif
static int JimStringIs(Jim_Interp *interp, Jim_Obj *strObjPtr, Jim_Obj *strClass, int strict)
{
@@ -3017,7 +3026,7 @@ static int JimStringIs(Jim_Interp *interp, Jim_Obj *strObjPtr, Jim_Obj *strClass
case STR_IS_ALPHA: isclassfunc = isalpha; break;
case STR_IS_ALNUM: isclassfunc = isalnum; break;
- case STR_IS_ASCII: isclassfunc = isascii; break;
+ case STR_IS_ASCII: isclassfunc = jim_isascii; break;
case STR_IS_DIGIT: isclassfunc = isdigit; break;
case STR_IS_LOWER: isclassfunc = islower; break;
case STR_IS_UPPER: isclassfunc = isupper; break;
diff --git a/tests/string.test b/tests/string.test
index e4d5dc5..650088c 100644
--- a/tests/string.test
+++ b/tests/string.test
@@ -248,6 +248,12 @@ test string-6.12 {string is alnum, true} {
test string-6.15 {string is alpha, true} {
string is alpha abc
} 1
+test string-6.16 {string is ascii, true} {
+ string is ascii abc123
+} 1
+test string-6.17 {string is ascii, false} {
+ string is ascii 0123Ü567
+} 0
test string-6.24 {string is digit, true} {
string is digit 0123456789
} 1
diff --git a/utf8.c b/utf8.c
index 562dca9..c31a57f 100644
--- a/utf8.c
+++ b/utf8.c
@@ -178,6 +178,11 @@ static int utf8_map_case(const struct casemap *mapping, int num, int ch)
return ch;
}
+/* Some platforms don't have isascii */
+#ifndef isascii
+#define isascii(C) (!((C) & ~0x7f))
+#endif
+
int utf8_upper(int ch)
{
if (isascii(ch)) {