author | sandman <sandman> | 2002-05-23 23:51:52 (UTC) |
---|---|---|
committer | sandman <sandman> | 2002-05-23 23:51:52 (UTC) |
commit | 2f3bb7b07f833273d966d41813e68bfe8b9d8d76 (patch) (side-by-side diff) | |
tree | 00beb1bd9e7f4ba79e22334a0d258269b28f4564 /noncore/unsupported/qpdf/xpdf/CharCodeToUnicode.cc | |
parent | 6e82b45dd416ceeba78765717b700e853c96a137 (diff) | |
download | opie-2f3bb7b07f833273d966d41813e68bfe8b9d8d76.zip opie-2f3bb7b07f833273d966d41813e68bfe8b9d8d76.tar.gz opie-2f3bb7b07f833273d966d41813e68bfe8b9d8d76.tar.bz2 |
Port to xpdf 1.01
Diffstat (limited to 'noncore/unsupported/qpdf/xpdf/CharCodeToUnicode.cc') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/unsupported/qpdf/xpdf/CharCodeToUnicode.cc | 160 |
1 files changed, 78 insertions, 82 deletions
diff --git a/noncore/unsupported/qpdf/xpdf/CharCodeToUnicode.cc b/noncore/unsupported/qpdf/xpdf/CharCodeToUnicode.cc index 6793398..912981e 100644 --- a/noncore/unsupported/qpdf/xpdf/CharCodeToUnicode.cc +++ b/noncore/unsupported/qpdf/xpdf/CharCodeToUnicode.cc @@ -4,3 +4,3 @@ // -// Copyright 2001 Derek B. Noonburg +// Copyright 2001-2002 Glyph & Cog, LLC // @@ -20,2 +20,3 @@ #include "GlobalParams.h" +#include "PSTokenizer.h" #include "CharCodeToUnicode.h" @@ -34,2 +35,22 @@ struct CharCodeToUnicodeString { +static int getCharFromString(void *data) { + char *p; + int c; + + p = *(char **)data; + if (*p) { + c = *p++; + *(char **)data = p; + } else { + c = EOF; + } + return c; +} + +static int getCharFromFile(void *data) { + return fgetc((FILE *)data); +} + +//------------------------------------------------------------------------ + CharCodeToUnicode *CharCodeToUnicode::parseCIDToUnicode(GString *collectionA) { @@ -77,27 +98,2 @@ CharCodeToUnicode *CharCodeToUnicode::make8BitToUnicode(Unicode *toUnicode) { -static char *getLineFromString(char *buf, int size, char **s) { - char c; - int i; - - i = 0; - while (i < size - 1 && **s) { - buf[i++] = c = *(*s)++; - if (c == '\x0a') { - break; - } - if (c == '\x0d') { - if (**s == '\x0a' && i < size - 1) { - buf[i++] = '\x0a'; - ++*s; - } - break; - } - } - buf[i] = '\0'; - if (i == 0) { - return NULL; - } - return buf; -} - CharCodeToUnicode *CharCodeToUnicode::parseCMap(GString *buf, int nBits) { @@ -108,4 +104,3 @@ CharCodeToUnicode *CharCodeToUnicode::parseCMap(GString *buf, int nBits) { p = buf->getCString(); - ctu->parseCMap1((char *(*)(char *, int, void *))&getLineFromString, - &p, nBits); + ctu->parseCMap1(&getCharFromString, &p, nBits); return ctu; @@ -113,7 +108,6 @@ CharCodeToUnicode *CharCodeToUnicode::parseCMap(GString *buf, int nBits) { -void CharCodeToUnicode::parseCMap1(char *(*getLineFunc)(char *, int, void *), - void *data, int nBits) { - char buf[256]; - GBool inBFChar, inBFRange; - char *tok1, *tok2, *tok3; +void CharCodeToUnicode::parseCMap1(int (*getCharFunc)(void *), void *data, + int nBits) { + PSTokenizer *pst; + char tok1[256], tok2[256], tok3[256]; int nDigits, n1, n2, n3; @@ -128,19 +122,31 @@ void CharCodeToUnicode::parseCMap1(char *(*getLineFunc)(char *, int, void *), nDigits = nBits / 4; - inBFChar = inBFRange = gFalse; - while ((*getLineFunc)(buf, sizeof(buf), data)) { - tok1 = strtok(buf, " \t\r\n"); - if (!tok1 || tok1[0] == '%') { - continue; - } - tok2 = strtok(NULL, " \t\r\n"); - tok3 = strtok(NULL, " \t\r\n"); - if (inBFChar) { - if (!strcmp(tok1, "endbfchar")) { - inBFChar = gFalse; - } else if (tok2) { - n1 = strlen(tok1); - n2 = strlen(tok2); + pst = new PSTokenizer(getCharFunc, data); + pst->getToken(tok1, sizeof(tok1), &n1); + while (pst->getToken(tok2, sizeof(tok2), &n2)) { + if (!strcmp(tok2, "usecmap")) { + if (tok1[0] == '/') { + name = new GString(tok1 + 1); + if ((f = globalParams->findToUnicodeFile(name))) { + parseCMap1(&getCharFromFile, f, nBits); + fclose(f); + } else { + error(-1, "Couldn't find ToUnicode CMap file for '%s'", + name->getCString()); + } + delete name; + } + pst->getToken(tok1, sizeof(tok1), &n1); + } else if (!strcmp(tok2, "beginbfchar")) { + while (pst->getToken(tok1, sizeof(tok1), &n1)) { + if (!strcmp(tok1, "endbfchar")) { + break; + } + if (!pst->getToken(tok2, sizeof(tok2), &n2) || + !strcmp(tok2, "endbfchar")) { + error(-1, "Illegal entry in bfchar block in ToUnicode CMap"); + break; + } if (!(n1 == 2 + nDigits && tok1[0] == '<' && tok1[n1 - 1] == '>' && tok2[0] == '<' && tok2[n2 - 1] == '>')) { - error(-1, "Illegal line in bfchar block in ToUnicode CMap"); + error(-1, "Illegal entry in bfchar block in ToUnicode CMap"); continue; @@ -149,3 +155,3 @@ void CharCodeToUnicode::parseCMap1(char *(*getLineFunc)(char *, int, void *), if (sscanf(tok1 + 1, "%x", &code1) != 1) { - error(-1, "Illegal line in bfchar block in ToUnicode CMap"); + error(-1, "Illegal entry in bfchar block in ToUnicode CMap"); continue; @@ -162,3 +168,3 @@ void CharCodeToUnicode::parseCMap1(char *(*getLineFunc)(char *, int, void *), if (sscanf(tok2 + 1, "%x", &u) != 1) { - error(-1, "Illegal line in bfchar block in ToUnicode CMap"); + error(-1, "Illegal entry in bfchar block in ToUnicode CMap"); continue; @@ -179,3 +185,3 @@ void CharCodeToUnicode::parseCMap1(char *(*getLineFunc)(char *, int, void *), if (sscanf(uHex, "%x", &sMap[sMapLen].u[j]) != 1) { - error(-1, "Illegal line in bfchar block in ToUnicode CMap"); + error(-1, "Illegal entry in bfchar block in ToUnicode CMap"); } @@ -184,12 +190,16 @@ void CharCodeToUnicode::parseCMap1(char *(*getLineFunc)(char *, int, void *), } - } else { - error(-1, "Illegal bfchar block in ToUnicode CMap"); } - } else if (inBFRange) { - if (!strcmp(tok1, "endbfrange")) { - inBFRange = gFalse; - } else if (tok2 && tok3) { - n1 = strlen(tok1); - n2 = strlen(tok2); - n3 = strlen(tok3); + pst->getToken(tok1, sizeof(tok1), &n1); + } else if (!strcmp(tok2, "beginbfrange")) { + while (pst->getToken(tok1, sizeof(tok1), &n1)) { + if (!strcmp(tok1, "endbfrange")) { + break; + } + if (!pst->getToken(tok2, sizeof(tok2), &n2) || + !strcmp(tok2, "endbfrange") || + !pst->getToken(tok3, sizeof(tok3), &n3) || + !strcmp(tok3, "endbfrange")) { + error(-1, "Illegal entry in bfrange block in ToUnicode CMap"); + break; + } if (!(n1 == 2 + nDigits && tok1[0] == '<' && tok1[n1 - 1] == '>' && @@ -197,3 +207,3 @@ void CharCodeToUnicode::parseCMap1(char *(*getLineFunc)(char *, int, void *), tok3[0] == '<' && tok3[n3 - 1] == '>')) { - error(-1, "Illegal line in bfrange block in ToUnicode CMap"); + error(-1, "Illegal entry in bfrange block in ToUnicode CMap"); continue; @@ -203,3 +213,3 @@ void CharCodeToUnicode::parseCMap1(char *(*getLineFunc)(char *, int, void *), sscanf(tok2 + 1, "%x", &code2) != 1) { - error(-1, "Illegal line in bfrange block in ToUnicode CMap"); + error(-1, "Illegal entry in bfrange block in ToUnicode CMap"); continue; @@ -216,3 +226,3 @@ void CharCodeToUnicode::parseCMap1(char *(*getLineFunc)(char *, int, void *), if (sscanf(tok3 + 1, "%x", &u) != 1) { - error(-1, "Illegal line in bfrange block in ToUnicode CMap"); + error(-1, "Illegal entry in bfrange block in ToUnicode CMap"); continue; @@ -236,3 +246,3 @@ void CharCodeToUnicode::parseCMap1(char *(*getLineFunc)(char *, int, void *), if (sscanf(uHex, "%x", &sMap[sMapLen].u[j]) != 1) { - error(-1, "Illegal line in bfrange block in ToUnicode CMap"); + error(-1, "Illegal entry in bfrange block in ToUnicode CMap"); } @@ -243,23 +253,9 @@ void CharCodeToUnicode::parseCMap1(char *(*getLineFunc)(char *, int, void *), } - } else { - error(-1, "Illegal bfrange block in ToUnicode CMap"); } - } else if (tok2 && !strcmp(tok2, "usecmap")) { - if (tok1[0] == '/') { - name = new GString(tok1 + 1); - if ((f = globalParams->findToUnicodeFile(name))) { - parseCMap1((char *(*)(char *, int, void *))&getLine, f, nBits); - fclose(f); - } else { - error(-1, "Couldn't find ToUnicode CMap file for '%s'", - name->getCString()); - } - delete name; - } - } else if (tok2 && !strcmp(tok2, "beginbfchar")) { - inBFChar = gTrue; - } else if (tok2 && !strcmp(tok2, "beginbfrange")) { - inBFRange = gTrue; + pst->getToken(tok1, sizeof(tok1), &n1); + } else { + strcpy(tok1, tok2); } } + delete pst; } |