summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/lib/texmfmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/lib/texmfmp.c')
-rw-r--r--Build/source/texk/web2c/lib/texmfmp.c57
1 files changed, 49 insertions, 8 deletions
diff --git a/Build/source/texk/web2c/lib/texmfmp.c b/Build/source/texk/web2c/lib/texmfmp.c
index 12307761463..494b353c08c 100644
--- a/Build/source/texk/web2c/lib/texmfmp.c
+++ b/Build/source/texk/web2c/lib/texmfmp.c
@@ -1953,22 +1953,65 @@ compare_paths P2C(const_string, p1, const_string, p2)
return ret;
}
-#ifdef XeTeX
-#define strstartar strstart
-#endif
+#ifdef XeTeX /* the string pool is UTF-16 but we want a UTF-8 string */
+
+string
+gettexstring P1C(strnumber, s)
+{
+ unsigned bytesToWrite = 0;
+ poolpointer len, i, j;
+ string name;
+ len = strstart[s + 1 - 65536L] - strstart[s - 65536L];
+ name = (string)xmalloc(len * 3 + 1); /* max UTF16->UTF8 expansion (code units, not bytes) */
+ for (i = 0, j = 0; i < len; i++) {
+ unsigned c = strpool[i + strstart[s - 65536L]];
+ if (c >= 0xD800 && c <= 0xDBFF) {
+ unsigned lo = strpool[++i + strstart[s - 65536L]];
+ if (lo >= 0xDC00 && lo <= 0xDFFF)
+ c = (c - 0xD800) * 0x0400 + lo - 0xDC00;
+ else
+ c = 0xFFFD;
+ }
+ if (c < 0x80)
+ bytesToWrite = 1;
+ else if (c < 0x800)
+ bytesToWrite = 2;
+ else if (c < 0x10000)
+ bytesToWrite = 3;
+ else if (c < 0x110000)
+ bytesToWrite = 4;
+ else {
+ bytesToWrite = 3;
+ c = 0xFFFD;
+ }
+
+ j += bytesToWrite;
+ switch (bytesToWrite) { /* note: everything falls through. */
+ case 4: name[--j] = ((c | 0x80) & 0xBF); c >>= 6;
+ case 3: name[--j] = ((c | 0x80) & 0xBF); c >>= 6;
+ case 2: name[--j] = ((c | 0x80) & 0xBF); c >>= 6;
+ case 1: name[--j] = (c | firstByteMark[bytesToWrite]);
+ }
+ j += bytesToWrite;
+ }
+ name[j] = 0;
+ return name;
+}
+
+#else
string
gettexstring P1C(strnumber, s)
{
poolpointer len;
string name;
-#if !defined(Omega) && !defined(eOmega) && !defined(Aleph) && !defined(XeTeX)
+#if !defined(Omega) && !defined(eOmega) && !defined(Aleph)
len = strstart[s + 1] - strstart[s];
#else
len = strstartar[s + 1 - 65536L] - strstartar[s - 65536L];
#endif
name = (string)xmalloc (len + 1);
-#if !defined(Omega) && !defined(eOmega) && !defined(Aleph) && !defined(XeTeX)
+#if !defined(Omega) && !defined(eOmega) && !defined(Aleph)
strncpy (name, (string)&strpool[strstart[s]], len);
#else
{
@@ -1981,9 +2024,7 @@ gettexstring P1C(strnumber, s)
return name;
}
-#ifdef XeTeX
-#undef strstartar
-#endif
+#endif /* not XeTeX */
boolean
isnewsource P2C(strnumber, srcfilename, int, lineno)