c-ctype: port better to z/OS EBCDIC
authorPaul Eggert <eggert@cs.ucla.edu>
Sat, 26 Sep 2015 02:45:59 +0000 (19:45 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sat, 26 Sep 2015 02:46:50 +0000 (19:46 -0700)
Problems reported by Daniel Richard G. in:
http://lists.gnu.org/archive/html/bug-gnulib/2015-09/msg00050.html
* lib/c-ctype.h (_C_CTYPE_CNTRL): Rewrite in terms of
the C standard escapes and _C_CTYPE_OTHER_CNTRL.
(_C_CTYPE_OTHER_CNTRL): New macro.
* tests/test-c-ctype.c (test_all): Test from CHAR_MIN, not
from SCHAR_MIN, as the functions are defined only from values
promoted from char or from unsigned char, not necessarily from
signed char.

ChangeLog
lib/c-ctype.h
tests/test-c-ctype.c

index 3b3f101fe02ddd753884dc0fe88c4e79bbac7ede..a347908d4dcf4bf4c7c195ad23ae9f42fe9eefd1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2015-09-25  Paul Eggert  <eggert@cs.ucla.edu>
+
+       c-ctype: port better to z/OS EBCDIC
+       Problems reported by Daniel Richard G. in:
+       http://lists.gnu.org/archive/html/bug-gnulib/2015-09/msg00050.html
+       * lib/c-ctype.h (_C_CTYPE_CNTRL): Rewrite in terms of
+       the C standard escapes and _C_CTYPE_OTHER_CNTRL.
+       (_C_CTYPE_OTHER_CNTRL): New macro.
+       * tests/test-c-ctype.c (test_all): Test from CHAR_MIN, not
+       from SCHAR_MIN, as the functions are defined only from values
+       promoted from char or from unsigned char, not necessarily from
+       signed char.
+
 2015-09-25  Pavel Raiskup  <praiskup@redhat.com>
 
        gnulib-common.m4: fix gl_PROG_AR_RANLIB/AM_PROG_AR clash
index 1292fc85c6aeba1622a188dd1a9c4e313d757f00..88e001f6d66e6d0561da8c2ee4b8a339a7d3fc4b 100644 (file)
@@ -80,30 +80,35 @@ extern "C" {
 
 #define _C_CTYPE_SIGNED_EBCDIC ('A' < 0)
 
+/* Cases for control characters.  */
+
+#define _C_CTYPE_CNTRL \
+   case '\a': case '\b': case '\f': case '\n': \
+   case '\r': case '\t': case '\v': \
+   _C_CTYPE_OTHER_CNTRL
+
+/* ASCII control characters other than those with \-letter escapes.  */
+
 #if C_CTYPE_ASCII
-# define _C_CTYPE_CNTRL \
+# define _C_CTYPE_OTHER_CNTRL \
     case '\x00': case '\x01': case '\x02': case '\x03': \
-    case '\x04': case '\x05': case '\x06': case '\x07': \
-    case '\x08': case '\x09': case '\x0a': case '\x0b': \
-    case '\x0c': case '\x0d': case '\x0e': case '\x0f': \
-    case '\x10': case '\x11': case '\x12': case '\x13': \
-    case '\x14': case '\x15': case '\x16': case '\x17': \
-    case '\x18': case '\x19': case '\x1a': case '\x1b': \
-    case '\x1c': case '\x1d': case '\x1e': case '\x1f': \
-    case '\x7f'
+    case '\x04': case '\x05': case '\x06': case '\x0e': \
+    case '\x0f': case '\x10': case '\x11': case '\x12': \
+    case '\x13': case '\x14': case '\x15': case '\x16': \
+    case '\x17': case '\x18': case '\x19': case '\x1a': \
+    case '\x1b': case '\x1c': case '\x1d': case '\x1e': \
+    case '\x1f': case '\x7f'
 #else
    /* Use EBCDIC code page 1047's assignments for ASCII control chars;
       assume all EBCDIC code pages agree about these assignments.  */
-# define _C_CTYPE_CNTRL \
+# define _C_CTYPE_OTHER_CNTRL \
     case '\x00': case '\x01': case '\x02': case '\x03': \
-    case '\x05': case '\x07': case '\x0b': case '\x0c': \
-    case '\x0d': case '\x0e': case '\x0f': case '\x10': \
-    case '\x11': case '\x12': case '\x13': case '\x16': \
-    case '\x18': case '\x19': case '\x1c': case '\x1d': \
-    case '\x1e': case '\x1f': case '\x25': case '\x26': \
-    case '\x27': case '\x2d': case '\x2e': case '\x2f': \
-    case '\x32': case '\x37': case '\x3c': case '\x3d': \
-    case '\x3f'
+    case '\x07': case '\x0e': case '\x0f': case '\x10': \
+    case '\x11': case '\x12': case '\x13': case '\x18': \
+    case '\x19': case '\x1c': case '\x1d': case '\x1e': \
+    case '\x1f': case '\x26': case '\x27': case '\x2d': \
+    case '\x2e': case '\x32': case '\x37': case '\x3c': \
+    case '\x3d': case '\x3f'
 #endif
 
 /* Cases for hex letter digits, digits, lower, and upper, offset by N.  */
index d25dc0369ed1b493628b697b38ee78330ce9ec22..544adeb1785c43a276ad79555bf453530653b0e1 100644 (file)
@@ -70,7 +70,7 @@ test_all (void)
   int c;
   int n_isascii = 0;
 
-  for (c = SCHAR_MIN; c <= UCHAR_MAX; c++)
+  for (c = CHAR_MIN; c <= UCHAR_MAX; c++)
     {
       if (c < 0)
         {