summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvipdfm-x/unicode.c
diff options
context:
space:
mode:
authorAkira Kakuto <kakuto@fuk.kindai.ac.jp>2015-12-26 04:23:33 +0000
committerAkira Kakuto <kakuto@fuk.kindai.ac.jp>2015-12-26 04:23:33 +0000
commit26036033027b092a462717c3950dc869095717ed (patch)
tree389aa07cdd3c369f8b8370921e6a47924f0c4d95 /Build/source/texk/dvipdfm-x/unicode.c
parentfa5fc01573824dc8ce0d249d12b223a29b589364 (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.c168
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;
+}