fofi/FoFiType1C.cc | 2 goo/gfile.cc | 108 +++++++++++++++++++++++++++++++++++++++++-- goo/gfile.h | 13 +++++ poppler/CharCodeToUnicode.cc | 4 - poppler/GlobalParams.cc | 10 +-- 5 files changed, 127 insertions(+), 10 deletions(-)
New commits: commit 830d2b40770333489a08f23a3b16a372770a8d19 Author: Albert Astals Cid <[email protected]> Date: Thu Sep 1 23:23:57 2011 +0200 xpdf303: Use openFile diff --git a/poppler/CharCodeToUnicode.cc b/poppler/CharCodeToUnicode.cc index 4befdc8..e44f304 100644 --- a/poppler/CharCodeToUnicode.cc +++ b/poppler/CharCodeToUnicode.cc @@ -123,7 +123,7 @@ CharCodeToUnicode *CharCodeToUnicode::parseCIDToUnicode(GooString *fileName, Unicode u; CharCodeToUnicode *ctu; - if (!(f = fopen(fileName->getCString(), "r"))) { + if (!(f = openFile(fileName->getCString(), "r"))) { error(errIO, -1, "Couldn't open cidToUnicode file '{0:t}'", fileName); return NULL; @@ -170,7 +170,7 @@ CharCodeToUnicode *CharCodeToUnicode::parseUnicodeToUnicode( int line, n, i; char *tokptr; - if (!(f = fopen(fileName->getCString(), "r"))) { + if (!(f = openFile(fileName->getCString(), "r"))) { gfree(uBuf); error(errIO, -1, "Couldn't open unicodeToUnicode file '{0:t}'", fileName); diff --git a/poppler/GlobalParams.cc b/poppler/GlobalParams.cc index f49950d..dc08ccc 100644 --- a/poppler/GlobalParams.cc +++ b/poppler/GlobalParams.cc @@ -798,7 +798,7 @@ void GlobalParams::parseNameToUnicode(GooString *name) { Unicode u; char *tokptr; - if (!(f = fopen(name->getCString(), "r"))) { + if (!(f = openFile(name->getCString(), "r"))) { error(errIO, -1, "Couldn't open 'nameToUnicode' file '{0:t}'", name); return; @@ -957,7 +957,7 @@ FILE *GlobalParams::getUnicodeMapFile(GooString *encodingName) { lockGlobalParams; if ((fileName = (GooString *)unicodeMaps->lookup(encodingName))) { - f = fopen(fileName->getCString(), "r"); + f = openFile(fileName->getCString(), "r"); } else { f = NULL; } @@ -980,7 +980,7 @@ FILE *GlobalParams::findCMapFile(GooString *collection, GooString *cMapName) { for (i = 0; i < list->getLength(); ++i) { dir = (GooString *)list->get(i); fileName = appendToPath(dir->copy(), cMapName->getCString()); - f = fopen(fileName->getCString(), "r"); + f = openFile(fileName->getCString(), "r"); delete fileName; if (f) { unlockGlobalParams; @@ -1000,7 +1000,7 @@ FILE *GlobalParams::findToUnicodeFile(GooString *name) { for (i = 0; i < toUnicodeDirs->getLength(); ++i) { dir = (GooString *)toUnicodeDirs->get(i); fileName = appendToPath(dir->copy(), name->getCString()); - f = fopen(fileName->getCString(), "r"); + f = openFile(fileName->getCString(), "r"); delete fileName; if (f) { unlockGlobalParams; @@ -1487,7 +1487,7 @@ GooString *GlobalParams::findFontFile(GooString *fontName, const char **exts) { for (ext = exts; *ext; ++ext) { fileName = appendToPath(dir->copy(), fontName->getCString()); fileName->append(*ext); - if ((f = fopen(fileName->getCString(), "rb"))) { + if ((f = openFile(fileName->getCString(), "rb"))) { fclose(f); unlockGlobalParams; return fileName; commit ddf9d6e35b40b902519cbaa8cb664ba6dfdfd510 Author: Albert Astals Cid <[email protected]> Date: Thu Sep 1 23:21:26 2011 +0200 xpdf303: openFile + minor fixes for openTempFile in Windows diff --git a/goo/gfile.cc b/goo/gfile.cc index 2e4271f..7522424 100644 --- a/goo/gfile.cc +++ b/goo/gfile.cc @@ -39,6 +39,7 @@ # include <sys/stat.h> # include <fcntl.h> # endif +# include <time.h> # include <limits.h> # include <string.h> # if !defined(VMS) && !defined(ACORN) && !defined(MACOS) @@ -476,11 +477,11 @@ GBool openTempFile(GooString **name, FILE **f, const char *mode) { } else { s = new GooString(); } - s->append("x"); + s->appendf("x_{0:d}_{1:d}_", + (int)GetCurrentProcessId(), (int)GetCurrentThreadId()); t = (int)time(NULL); for (i = 0; i < 1000; ++i) { - sprintf(buf, "%d", t + i); - s2 = s->copy()->append(buf); + s2 = s->copy()->appendf("{0:d}", t + i); if (!(f2 = fopen(s2->getCString(), "r"))) { if (!(f2 = fopen(s2->getCString(), mode))) { delete s2; @@ -552,6 +553,107 @@ GBool executeCommand(char *cmd) { #endif } +#ifdef WIN32 +GooString *fileNameToUTF8(char *path) { + GooString *s; + char *p; + + s = new GooString(); + for (p = path; *p; ++p) { + if (*p & 0x80) { + s->append((char)(0xc0 | ((*p >> 6) & 0x03))); + s->append((char)(0x80 | (*p & 0x3f))); + } else { + s->append(*p); + } + } + return s; +} + +GooString *fileNameToUTF8(wchar_t *path) { + GooString *s; + wchar_t *p; + + s = new GooString(); + for (p = path; *p; ++p) { + if (*p < 0x80) { + s->append((char)*p); + } else if (*p < 0x800) { + s->append((char)(0xc0 | ((*p >> 6) & 0x1f))); + s->append((char)(0x80 | (*p & 0x3f))); + } else { + s->append((char)(0xe0 | ((*p >> 12) & 0x0f))); + s->append((char)(0x80 | ((*p >> 6) & 0x3f))); + s->append((char)(0x80 | (*p & 0x3f))); + } + } + return s; +} +#endif + +FILE *openFile(const char *path, const char *mode) { +#ifdef WIN32 + OSVERSIONINFO version; + wchar_t wPath[_MAX_PATH + 1]; + char nPath[_MAX_PATH + 1]; + wchar_t wMode[8]; + const char *p; + int i; + + // NB: _wfopen is only available in NT + version.dwOSVersionInfoSize = sizeof(version); + GetVersionEx(&version); + if (version.dwPlatformId == VER_PLATFORM_WIN32_NT) { + for (p = path, i = 0; *p && i < _MAX_PATH; ++i) { + if ((p[0] & 0xe0) == 0xc0 && + p[1] && (p[1] & 0xc0) == 0x80) { + wPath[i] = (wchar_t)(((p[0] & 0x1f) << 6) | + (p[1] & 0x3f)); + p += 2; + } else if ((p[0] & 0xf0) == 0xe0 && + p[1] && (p[1] & 0xc0) == 0x80 && + p[2] && (p[2] & 0xc0) == 0x80) { + wPath[i] = (wchar_t)(((p[0] & 0x0f) << 12) | + ((p[1] & 0x3f) << 6) | + (p[2] & 0x3f)); + p += 3; + } else { + wPath[i] = (wchar_t)(p[0] & 0xff); + p += 1; + } + } + wPath[i] = (wchar_t)0; + for (i = 0; mode[i] && i < sizeof(mode) - 1; ++i) { + wMode[i] = (wchar_t)(mode[i] & 0xff); + } + wMode[i] = (wchar_t)0; + return _wfopen(wPath, wMode); + } else { + for (p = path, i = 0; *p && i < _MAX_PATH; ++i) { + if ((p[0] & 0xe0) == 0xc0 && + p[1] && (p[1] & 0xc0) == 0x80) { + nPath[i] = (char)(((p[0] & 0x1f) << 6) | + (p[1] & 0x3f)); + p += 2; + } else if ((p[0] & 0xf0) == 0xe0 && + p[1] && (p[1] & 0xc0) == 0x80 && + p[2] && (p[2] & 0xc0) == 0x80) { + nPath[i] = (char)(((p[1] & 0x3f) << 6) | + (p[2] & 0x3f)); + p += 3; + } else { + nPath[i] = p[0]; + p += 1; + } + } + nPath[i] = '\0'; + return fopen(nPath, mode); + } +#else + return fopen(path, mode); +#endif +} + char *getLine(char *buf, int size, FILE *f) { int c, i; diff --git a/goo/gfile.h b/goo/gfile.h index 208d391..d4b9082 100644 --- a/goo/gfile.h +++ b/goo/gfile.h @@ -107,6 +107,19 @@ extern GBool openTempFile(GooString **name, FILE **f, const char *mode); // Execute <command>. Returns true on success. extern GBool executeCommand(char *cmd); +#ifdef WIN32 +// Convert a file name from Latin-1 to UTF-8. +extern GooString *fileNameToUTF8(char *path); + +// Convert a file name from UCS-2 to UTF-8. +extern GooString *fileNameToUTF8(wchar_t *path); +#endif + +// Open a file. On Windows, this converts the path from UTF-8 to +// UCS-2 and calls _wfopen (if available). On other OSes, this simply +// calls fopen. +extern FILE *openFile(const char *path, const char *mode); + // Just like fgets, but handles Unix, Mac, and/or DOS end-of-line // conventions. extern char *getLine(char *buf, int size, FILE *f); commit 68e8fa9ff4f13b6703148b3eb6ea628418211243 Author: Albert Astals Cid <[email protected]> Date: Thu Sep 1 23:17:59 2011 +0200 xpdf303: make gcc happy diff --git a/fofi/FoFiType1C.cc b/fofi/FoFiType1C.cc index 1abc866..97943de 100644 --- a/fofi/FoFiType1C.cc +++ b/fofi/FoFiType1C.cc @@ -2093,6 +2093,8 @@ void FoFiType1C::readFD(int offset, int length, Type1CPrivateDict *pDict) { GBool hasFontMatrix; hasFontMatrix = gFalse; + fontMatrix[0] = fontMatrix[1] = fontMatrix[2] = 0; // make gcc happy + fontMatrix[3] = fontMatrix[4] = fontMatrix[5] = 0; pSize = pOffset = 0; pos = offset; nOps = 0; _______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
