The current svn_ctype_* implementation depends on ASCII character encoding.
APR's ctype functions are portable, so use those on EBCDIC systems.
A somewhat surprising side effect is that svn messages become mostly
readable on z/OS with the help of svn_utf__cstring_from_utf8_fuzzy().
I thought it would be more readable to have one #if around the entire block
of svn_ctype_is* macros rather than around each individual macro. I did not
want to create a second set of nearly duplicate Doxygen docs so I just
punted on those. Let me know if you'd prefer to see it formatted
differently.
Greg
[[[ Use portable ctypes on EBCDIC systems ]]]
Index: subversion/include/svn_ctype.h
===================================================================
--- subversion/include/svn_ctype.h (revision 947165)
+++ subversion/include/svn_ctype.h (working copy)
@@ -31,6 +31,9 @@
#include <apr.h>
+#if APR_CHARSET_EBCDIC
+#include <apr_lib.h>
+#endif
#ifdef __cplusplus
extern "C" {
@@ -76,6 +79,7 @@
/** All printable ASCII */
#define SVN_CTYPE_PRINT (SVN_CTYPE_GRAPH | SVN_CTYPE_SPACE)
+#if !APR_CHARSET_EBCDIC
/** Check if @a c is an ASCII control character. */
#define svn_ctype_iscntrl(c) svn_ctype_test((c), SVN_CTYPE_CNTRL)
@@ -114,6 +118,48 @@
#define svn_ctype_isprint(c) svn_ctype_test((c), SVN_CTYPE_PRINT)
/** @} */
+
+#else /* EBCDIC - use the APR implementation */
+
+/** Check if c is a control character. */
+#define svn_ctype_iscntrl(c) apr_iscntrl(c)
+
+/** Check if c is a whitespace character. */
+#define svn_ctype_isspace(c) apr_isspace(c)
+
+/** Check if c is a digit. */
+#define svn_ctype_isdigit(c) apr_isdigit(c)
+
+/** Check if c is an uppercase letter. */
+#define svn_ctype_isupper(c) apr_isupper(c)
+
+/** Check if c is a lowercase letter. */
+#define svn_ctype_islower(c) apr_islower(c)
+
+/** Check if c is a punctuation mark. */
+#define svn_ctype_ispunct(c) apr_ispunct(c)
+
+/** Check if c is a member of either the POSIX Portable Characters Set
+ or the POSIX Control Character Set. */
+#define svn_ctype_isascii(c) apr_isascii(c)
+
+/** Check if c is a letter. */
+#define svn_ctype_isalpha(c) apr_isalpha(c)
+
+/** Check if c is a letter or decimal digit. */
+#define svn_ctype_isalnum(c) apr_isalnum(c)
+
+/** Check if c is a hexadecimal digit. */
+#define svn_ctype_isxdigit(c) apr_isxdigit(c)
+
+/** Check if c is a graphical (visible printable) character. */
+#define svn_ctype_isgraph(c) apr_isgraph(c)
+
+/** Check if c is a printable character. */
+#define svn_ctype_isprint(c) apr_isprint(c)
+
+#endif /* EBCDIC */
+
/**
* @defgroup ctype_extra Extended character classification