summaryrefslogtreecommitdiff
path: root/Build/source/libs/xpdf/xpdf-src/xpdf/UnicodeRemapping.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/xpdf/xpdf-src/xpdf/UnicodeRemapping.cc')
-rw-r--r--Build/source/libs/xpdf/xpdf-src/xpdf/UnicodeRemapping.cc33
1 files changed, 28 insertions, 5 deletions
diff --git a/Build/source/libs/xpdf/xpdf-src/xpdf/UnicodeRemapping.cc b/Build/source/libs/xpdf/xpdf-src/xpdf/UnicodeRemapping.cc
index e4f09e19ae3..72dbc0e159c 100644
--- a/Build/source/libs/xpdf/xpdf-src/xpdf/UnicodeRemapping.cc
+++ b/Build/source/libs/xpdf/xpdf-src/xpdf/UnicodeRemapping.cc
@@ -83,7 +83,7 @@ UnicodeRemapping::~UnicodeRemapping() {
}
void UnicodeRemapping::addRemapping(Unicode in, Unicode *out, int len) {
- int i;
+ int i, j;
if (in < 256 && len == 1) {
page0[in] = out[0];
@@ -96,11 +96,16 @@ void UnicodeRemapping::addRemapping(Unicode in, Unicode *out, int len) {
sMap = (UnicodeRemappingString *)
greallocn(sMap, sMapSize, sizeof(UnicodeRemappingString));
}
- sMap[sMapLen].in = in;
- for (i = 0; i < len && i < maxUnicodeString; ++i) {
- sMap[sMapLen].out[i] = out[i];
+ i = findSMap(in);
+ if (i < sMapLen) {
+ memmove(sMap + i + 1, sMap + i,
+ (sMapLen - i) * sizeof(UnicodeRemappingString));
}
- sMap[sMapLen].len = i;
+ sMap[i].in = in;
+ for (j = 0; j < len && j < maxUnicodeString; ++j) {
+ sMap[i].out[j] = out[j];
+ }
+ sMap[i].len = j;
++sMapLen;
}
}
@@ -148,6 +153,24 @@ void UnicodeRemapping::parseFile(GString *fileName) {
fclose(f);
}
+// Determine the location in sMap to insert/replace the entry for [u].
+int UnicodeRemapping::findSMap(Unicode u) {
+ int a, b, m;
+
+ a = -1;
+ b = sMapLen;
+ // invariant: sMap[a].in < u <= sMap[b].in
+ while (b - a > 1) {
+ m = (a + b) / 2;
+ if (sMap[m].in < u) {
+ a = m;
+ } else {
+ b = m;
+ }
+ }
+ return b;
+}
+
int UnicodeRemapping::map(Unicode in, Unicode *out, int size) {
int a, b, m, i;