diff options
author | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2015-12-26 04:23:33 +0000 |
---|---|---|
committer | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2015-12-26 04:23:33 +0000 |
commit | 26036033027b092a462717c3950dc869095717ed (patch) | |
tree | 389aa07cdd3c369f8b8370921e6a47924f0c4d95 /Build/source/texk/dvipdfm-x/unicode.c | |
parent | fa5fc01573824dc8ce0d249d12b223a29b589364 (diff) |
texk/dvipdfm-x: png, and unocode patch from S. Hirata.
git-svn-id: svn://tug.org/texlive/trunk@39201 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/dvipdfm-x/unicode.c')
-rw-r--r-- | Build/source/texk/dvipdfm-x/unicode.c | 168 |
1 files changed, 140 insertions, 28 deletions
diff --git a/Build/source/texk/dvipdfm-x/unicode.c b/Build/source/texk/dvipdfm-x/unicode.c index 09e35ce34c6..682202906a5 100644 --- a/Build/source/texk/dvipdfm-x/unicode.c +++ b/Build/source/texk/dvipdfm-x/unicode.c @@ -26,6 +26,8 @@ * ToUnicode CMap * * Normalization? + * + * I made some unused functions here for completeness and FUTURE USE. */ #ifdef HAVE_CONFIG_H @@ -40,42 +42,98 @@ #include "unicode.h" -static int __verbose = 0; - #define UC_DEBUG 3 #define UC_DEBUG_STR "UC" -void -UC_set_verbose (void) +#define UC_REPLACEMENT_CHAR 0x0000FFFD + +#define UC_SUR_SHIFT 10 +#define UC_SUR_MASK 0x03FFU +#define UC_SUR_LOW_START 0xDC00U +#define UC_SUR_HIGH_START 0xD800U +#define UC_SUR_END 0xE000U + +int +UC_is_valid (int32_t ucv) { - __verbose++; + if ( ucv < 0 || ucv > 0x10FFFFL || + (ucv >= 0x0000D800L && ucv <= 0x0000DFFFL)) + return 0; + return 1; } -#define UC_REPLACEMENT_CHAR 0x0000FFFDL - -#define UC_SUR_SHIFT 10 -#define UC_SUR_MASK 0x3FFUL -#define UC_SUR_LOW_START 0xDC00UL -#define UC_SUR_HIGH_START 0xD800UL +int +UC_UTF16BE_is_valid_string (const unsigned char *p, const unsigned char *endptr) +{ + if (p + 1 >= endptr) + return 0; + while (p < endptr) { + int32_t ucv = UC_UTF16BE_decode_char(&p, endptr); + if (!UC_is_valid(ucv)) + return 0; + } + return 1; +} int -UC_sput_UTF16BE (int32_t ucv, unsigned char **pp, unsigned char *limptr) +UC_UTF8_is_valid_string (const unsigned char *p, const unsigned char *endptr) +{ + if (p + 1 >= endptr) + return 0; + while (p < endptr) { + int32_t ucv = UC_UTF8_decode_char(&p, endptr); + if (!UC_is_valid(ucv)) + return 0; + } + return 1; +} + +int32_t +UC_UTF16BE_decode_char (const unsigned char **pp, const unsigned char *endptr) +{ + const unsigned char *p = *pp; + int32_t ucv = -1; + uint16_t first, second; + + if (p + 1 >= endptr) + return -1; + + first = ((p[0]) << 8|p[1]); p += 2; + if (first >= UC_SUR_HIGH_START && first < UC_SUR_LOW_START) { + if (p + 1 >= endptr) + return -1; + second = (p[0] << 8|p[1]); p += 2; + ucv = second & UC_SUR_MASK; + ucv |= (first & UC_SUR_MASK) << UC_SUR_SHIFT; + ucv += 0x00010000; + } else if (first >= UC_SUR_LOW_START && first < UC_SUR_END) { + return -1; + } else { + ucv = first; + } + + *pp = p; + return ucv; +} + +size_t +UC_UTF16BE_encode_char (int32_t ucv, unsigned char **pp, unsigned char *endptr) { int count = 0; unsigned char *p = *pp; if (ucv >= 0 && ucv <= 0xFFFF) { - if (p + 2 >= limptr) - ERROR("Not enough space available..."); + if (p + 2 >= endptr) + return 0; p[0] = (ucv >> 8) & 0xff; p[1] = ucv & 0xff; count = 2; - } else if (ucv >= 0x010000L && ucv <= 0x10FFFFL) { + } else if (ucv >= 0x010000 && ucv <= 0x10FFFF) { unsigned short high, low; - if (p + 4 >= limptr) - ERROR("Not enough space available..."); - ucv -= 0x00010000L; + if (p + 4 >= endptr) + return 0; + ucv -= 0x00010000; high = (ucv >> UC_SUR_SHIFT) + UC_SUR_HIGH_START; low = (ucv & UC_SUR_MASK) + UC_SUR_LOW_START; p[0] = (high >> 8) & 0xff; @@ -84,8 +142,8 @@ UC_sput_UTF16BE (int32_t ucv, unsigned char **pp, unsigned char *limptr) p[3] = (low & 0xff); count = 4; } else { - if (p + 2 >= limptr) - ERROR("Not enough space available..."); + if (p + 2 >= endptr) + return 0; p[0] = (UC_REPLACEMENT_CHAR >> 8) & 0xff; p[1] = (UC_REPLACEMENT_CHAR & 0xff); count = 2; @@ -95,14 +153,6 @@ UC_sput_UTF16BE (int32_t ucv, unsigned char **pp, unsigned char *limptr) return count; } -int -UC_is_valid (int32_t ucv) -{ - if (ucv < 0 || (ucv >= 0x0000D800L && ucv <= 0x0000DFFFL)) - return 0; - return 1; -} - int32_t UC_UTF8_decode_char (const unsigned char **pp, const unsigned char *endptr) { @@ -144,3 +194,65 @@ UC_UTF8_decode_char (const unsigned char **pp, const unsigned char *endptr) *pp = p; return ucv; } + +size_t +UC_UTF8_encode_char (int32_t ucv, unsigned char **pp, unsigned char *endptr) +{ + int count = 0; + unsigned char *p = *pp; + + ASSERT( pp && *pp && endptr ); + + if (!UC_is_valid(ucv)) + return 0; + + if (ucv < 0x7f) { + if (p >= endptr - 1) + return 0; + p[0] = (unsigned char) ucv; + count = 1; + } else if (ucv <= 0x7ff) { + if (p >= endptr -2) + return 0; + p[0] = (unsigned char) (0xc0 | (ucv >> 6)); + p[1] = (unsigned char) (0x80 | (ucv & 0x3f)); + count = 2; + } else if (ucv <= 0xffff) { + if (p >= endptr - 3) + return 0; + p[0] = (unsigned char) (0xe0 | (ucv >> 12)); + p[1] = (unsigned char) (0x80 | ((ucv >> 6) & 0x3f)); + p[2] = (unsigned char) (0x80 | (ucv & 0x3f)); + count = 3; + } else if (ucv <= 0x1fffff) { + if (p >= endptr - 4) + return 0; + p[0] = (unsigned char) (0xf0 | (ucv >> 18)); + p[1] = (unsigned char) (0x80 | ((ucv >> 12) & 0x3f)); + p[2] = (unsigned char) (0x80 | ((ucv >> 6) & 0x3f)); + p[3] = (unsigned char) (0x80 | (ucv & 0x3f)); + count = 4; + } else if (ucv <= 0x3ffffff) { + if (p >= endptr - 5) + return 0; + p[0] = (unsigned char) (0xf8 | (ucv >> 24)); + p[1] = (unsigned char) (0x80 | ((ucv >> 18) & 0x3f)); + p[2] = (unsigned char) (0x80 | ((ucv >> 12) & 0x3f)); + p[3] = (unsigned char) (0x80 | ((ucv >> 6) & 0x3f)); + p[4] = (unsigned char) (0x80 | (ucv & 0x3f)); + count = 5; + } else if (ucv <= 0x7fffffff) { + if (p >= endptr - 6) + return 0; + p[0] = (unsigned char) (0xfc | (ucv >> 30)); + p[1] = (unsigned char) (0x80 | ((ucv >> 24) & 0x3f)); + p[2] = (unsigned char) (0x80 | ((ucv >> 18) & 0x3f)); + p[3] = (unsigned char) (0x80 | ((ucv >> 12) & 0x3f)); + p[4] = (unsigned char) (0x80 | ((ucv >> 6) & 0x3f)); + p[5] = (unsigned char) (0x80 | (ucv & 0x3f)); + count = 6; + } + + *pp += count; + return count; +} |