path: root/src/multibyte/internal.h
diff options
authorRich Felker <>2015-06-16 04:44:17 +0000
committerRich Felker <>2015-06-16 05:28:48 +0000
commit1507ebf837334e9e07cfab1ca1c2e88449069a80 (patch)
tree92bad1f861e442f7e2d2fa4e178f471f4371509a /src/multibyte/internal.h
parent38e2f727237230300fea6aff68802db04625fd23 (diff)
byte-based C locale, phase 1: multibyte character handling functions
this patch makes the functions which work directly on multibyte characters treat the high bytes as individual abstract code units rather than as multibyte sequences when MB_CUR_MAX is 1. since MB_CUR_MAX is presently defined as a constant 4, all of the new code added is dead code, and optimizing compilers' code generation should not be affected at all. a future commit will activate the new code. as abstract code units, bytes 0x80 to 0xff are represented by wchar_t values 0xdf80 to 0xdfff, at the end of the surrogates range. this ensures that they will never be misinterpreted as Unicode characters, and that all wctype functions return false for these "characters" without needing locale-specific logic. a high range outside of Unicode such as 0x7fffff80 to 0x7fffffff was also considered, but since C11's char16_t also needs to be able to represent conversions of these bytes, the surrogate range was the natural choice.
Diffstat (limited to 'src/multibyte/internal.h')
1 files changed, 7 insertions, 0 deletions
diff --git a/src/multibyte/internal.h b/src/multibyte/internal.h
index cc017fa2..53d62eda 100644
--- a/src/multibyte/internal.h
+++ b/src/multibyte/internal.h
@@ -23,3 +23,10 @@ extern const uint32_t bittab[];
#define SA 0xc2u
#define SB 0xf4u
+/* Arbitrary encoding for representing code units instead of characters. */
+#define CODEUNIT(c) (0xdfff & (signed char)(c))
+#define IS_CODEUNIT(c) ((unsigned)(c)-0xdf80 < 0x80)
+/* Get inline definition of MB_CUR_MAX. */
+#include "locale_impl.h"