UnicodeRemapping.cc (xpdf-4.03) | : | UnicodeRemapping.cc (xpdf-4.04) | ||
---|---|---|---|---|
skipping to change at line 86 | skipping to change at line 86 | |||
} | } | |||
sMap = NULL; | sMap = NULL; | |||
sMapLen = sMapSize = 0; | sMapLen = sMapSize = 0; | |||
} | } | |||
UnicodeRemapping::~UnicodeRemapping() { | UnicodeRemapping::~UnicodeRemapping() { | |||
gfree(sMap); | gfree(sMap); | |||
} | } | |||
void UnicodeRemapping::addRemapping(Unicode in, Unicode *out, int len) { | void UnicodeRemapping::addRemapping(Unicode in, Unicode *out, int len) { | |||
int i; | int i, j; | |||
if (in < 256 && len == 1) { | if (in < 256 && len == 1) { | |||
page0[in] = out[0]; | page0[in] = out[0]; | |||
} else { | } else { | |||
if (in < 256) { | if (in < 256) { | |||
page0[in] = 0xffffffff; | page0[in] = 0xffffffff; | |||
} | } | |||
if (sMapLen == sMapSize) { | if (sMapLen == sMapSize) { | |||
sMapSize += 16; | sMapSize += 16; | |||
sMap = (UnicodeRemappingString *) | sMap = (UnicodeRemappingString *) | |||
greallocn(sMap, sMapSize, sizeof(UnicodeRemappingString)); | greallocn(sMap, sMapSize, sizeof(UnicodeRemappingString)); | |||
} | } | |||
sMap[sMapLen].in = in; | i = findSMap(in); | |||
for (i = 0; i < len && i < maxUnicodeString; ++i) { | if (i < sMapLen) { | |||
sMap[sMapLen].out[i] = out[i]; | 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; | ++sMapLen; | |||
} | } | |||
} | } | |||
void UnicodeRemapping::parseFile(GString *fileName) { | void UnicodeRemapping::parseFile(GString *fileName) { | |||
FILE *f; | FILE *f; | |||
char buf[256]; | char buf[256]; | |||
Unicode in; | Unicode in; | |||
Unicode out[maxUnicodeString]; | Unicode out[maxUnicodeString]; | |||
char *tok; | char *tok; | |||
skipping to change at line 151 | skipping to change at line 156 | |||
break; | break; | |||
} | } | |||
++n; | ++n; | |||
} | } | |||
addRemapping(in, out, n); | addRemapping(in, out, n); | |||
} | } | |||
fclose(f); | 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 UnicodeRemapping::map(Unicode in, Unicode *out, int size) { | |||
int a, b, m, i; | int a, b, m, i; | |||
if (in < 256 && page0[in] != 0xffffffff) { | if (in < 256 && page0[in] != 0xffffffff) { | |||
out[0] = page0[in]; | out[0] = page0[in]; | |||
return 1; | return 1; | |||
} | } | |||
a = -1; | a = -1; | |||
b = sMapLen; | b = sMapLen; | |||
End of changes. 4 change blocks. | ||||
5 lines changed or deleted | 28 lines changed or added |