diff options
author | Peter Breitenlohner <peb@mppmu.mpg.de> | 2015-06-12 09:16:27 +0000 |
---|---|---|
committer | Peter Breitenlohner <peb@mppmu.mpg.de> | 2015-06-12 09:16:27 +0000 |
commit | 651ca331cd7943896e894fd42cf13fa1d012347f (patch) | |
tree | 8a911c2b5c3f6fb05b53a5a03ccd2614c24ac2c1 /Build/source/libs/poppler/poppler-0.32.0/goo/gfile.cc | |
parent | 4403160cd26a0ba4eb014d69bfb9dcd568f64fc6 (diff) |
freetype 2.6
git-svn-id: svn://tug.org/texlive/trunk@37505 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/libs/poppler/poppler-0.32.0/goo/gfile.cc')
-rw-r--r-- | Build/source/libs/poppler/poppler-0.32.0/goo/gfile.cc | 811 |
1 files changed, 0 insertions, 811 deletions
diff --git a/Build/source/libs/poppler/poppler-0.32.0/goo/gfile.cc b/Build/source/libs/poppler/poppler-0.32.0/goo/gfile.cc deleted file mode 100644 index 3528bb357d8..00000000000 --- a/Build/source/libs/poppler/poppler-0.32.0/goo/gfile.cc +++ /dev/null @@ -1,811 +0,0 @@ -//======================================================================== -// -// gfile.cc -// -// Miscellaneous file and directory name manipulation. -// -// Copyright 1996-2003 Glyph & Cog, LLC -// -//======================================================================== - -//======================================================================== -// -// Modified under the Poppler project - http://poppler.freedesktop.org -// -// All changes made under the Poppler project to this file are licensed -// under GPL version 2 or later -// -// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de> -// Copyright (C) 2006 Kristian Høgsberg <krh@redhat.com> -// Copyright (C) 2008 Adam Batkin <adam@batkin.net> -// Copyright (C) 2008, 2010, 2012, 2013 Hib Eris <hib@hiberis.nl> -// Copyright (C) 2009, 2012, 2014 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net> -// Copyright (C) 2013 Adam Reichold <adamreichold@myopera.com> -// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2013 Peter Breitenlohner <peb@mppmu.mpg.de> -// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de> -// -// To see a description of the changes please see the Changelog file that -// came with your tarball or type make ChangeLog if you are building from git -// -//======================================================================== - -#include <config.h> - -#ifdef _WIN32 -# include <time.h> -#else -# if defined(MACOS) -# include <sys/stat.h> -# elif !defined(ACORN) -# include <sys/types.h> -# include <sys/stat.h> -# include <fcntl.h> -# endif -# include <time.h> -# include <limits.h> -# include <string.h> -# if !defined(VMS) && !defined(ACORN) && !defined(MACOS) -# include <pwd.h> -# endif -# if defined(VMS) && (__DECCXX_VER < 50200000) -# include <unixlib.h> -# endif -#endif // _WIN32 -#include <stdio.h> -#include <limits> -#include "GooString.h" -#include "gfile.h" - -// Some systems don't define this, so just make it something reasonably -// large. -#ifndef PATH_MAX -#define PATH_MAX 1024 -#endif - -//------------------------------------------------------------------------ - -GooString *getCurrentDir() { - char buf[PATH_MAX+1]; - -#if defined(__EMX__) - if (_getcwd2(buf, sizeof(buf))) -#elif defined(_WIN32) - if (GetCurrentDirectory(sizeof(buf), buf)) -#elif defined(ACORN) - if (strcpy(buf, "@")) -#elif defined(MACOS) - if (strcpy(buf, ":")) -#else - if (getcwd(buf, sizeof(buf))) -#endif - return new GooString(buf); - return new GooString(); -} - -GooString *appendToPath(GooString *path, const char *fileName) { -#if defined(VMS) - //---------- VMS ---------- - //~ this should handle everything necessary for file - //~ requesters, but it's certainly not complete - char *p0, *p1, *p2; - char *q1; - - p0 = path->getCString(); - p1 = p0 + path->getLength() - 1; - if (!strcmp(fileName, "-")) { - if (*p1 == ']') { - for (p2 = p1; p2 > p0 && *p2 != '.' && *p2 != '['; --p2) ; - if (*p2 == '[') - ++p2; - path->del(p2 - p0, p1 - p2); - } else if (*p1 == ':') { - path->append("[-]"); - } else { - path->clear(); - path->append("[-]"); - } - } else if ((q1 = strrchr(fileName, '.')) && !strncmp(q1, ".DIR;", 5)) { - if (*p1 == ']') { - path->insert(p1 - p0, '.'); - path->insert(p1 - p0 + 1, fileName, q1 - fileName); - } else if (*p1 == ':') { - path->append('['); - path->append(']'); - path->append(fileName, q1 - fileName); - } else { - path->clear(); - path->append(fileName, q1 - fileName); - } - } else { - if (*p1 != ']' && *p1 != ':') - path->clear(); - path->append(fileName); - } - return path; - -#elif defined(_WIN32) - //---------- Win32 ---------- - GooString *tmp; - char buf[256]; - char *fp; - - tmp = new GooString(path); - tmp->append('/'); - tmp->append(fileName); - GetFullPathName(tmp->getCString(), sizeof(buf), buf, &fp); - delete tmp; - path->clear(); - path->append(buf); - return path; - -#elif defined(ACORN) - //---------- RISCOS ---------- - char *p; - int i; - - path->append("."); - i = path->getLength(); - path->append(fileName); - for (p = path->getCString() + i; *p; ++p) { - if (*p == '/') { - *p = '.'; - } else if (*p == '.') { - *p = '/'; - } - } - return path; - -#elif defined(MACOS) - //---------- MacOS ---------- - char *p; - int i; - - path->append(":"); - i = path->getLength(); - path->append(fileName); - for (p = path->getCString() + i; *p; ++p) { - if (*p == '/') { - *p = ':'; - } else if (*p == '.') { - *p = ':'; - } - } - return path; - -#elif defined(__EMX__) - //---------- OS/2+EMX ---------- - int i; - - // appending "." does nothing - if (!strcmp(fileName, ".")) - return path; - - // appending ".." goes up one directory - if (!strcmp(fileName, "..")) { - for (i = path->getLength() - 2; i >= 0; --i) { - if (path->getChar(i) == '/' || path->getChar(i) == '\\' || - path->getChar(i) == ':') - break; - } - if (i <= 0) { - if (path->getChar(0) == '/' || path->getChar(0) == '\\') { - path->del(1, path->getLength() - 1); - } else if (path->getLength() >= 2 && path->getChar(1) == ':') { - path->del(2, path->getLength() - 2); - } else { - path->clear(); - path->append(".."); - } - } else { - if (path->getChar(i-1) == ':') - ++i; - path->del(i, path->getLength() - i); - } - return path; - } - - // otherwise, append "/" and new path component - if (path->getLength() > 0 && - path->getChar(path->getLength() - 1) != '/' && - path->getChar(path->getLength() - 1) != '\\') - path->append('/'); - path->append(fileName); - return path; - -#else - //---------- Unix ---------- - int i; - - // appending "." does nothing - if (!strcmp(fileName, ".")) - return path; - - // appending ".." goes up one directory - if (!strcmp(fileName, "..")) { - for (i = path->getLength() - 2; i >= 0; --i) { - if (path->getChar(i) == '/') - break; - } - if (i <= 0) { - if (path->getChar(0) == '/') { - path->del(1, path->getLength() - 1); - } else { - path->clear(); - path->append(".."); - } - } else { - path->del(i, path->getLength() - i); - } - return path; - } - - // otherwise, append "/" and new path component - if (path->getLength() > 0 && - path->getChar(path->getLength() - 1) != '/') - path->append('/'); - path->append(fileName); - return path; -#endif -} - -GooString *grabPath(char *fileName) { -#ifdef VMS - //---------- VMS ---------- - char *p; - - if ((p = strrchr(fileName, ']'))) - return new GooString(fileName, p + 1 - fileName); - if ((p = strrchr(fileName, ':'))) - return new GooString(fileName, p + 1 - fileName); - return new GooString(); - -#elif defined(__EMX__) || defined(_WIN32) - //---------- OS/2+EMX and Win32 ---------- - char *p; - - if ((p = strrchr(fileName, '/'))) - return new GooString(fileName, p - fileName); - if ((p = strrchr(fileName, '\\'))) - return new GooString(fileName, p - fileName); - if ((p = strrchr(fileName, ':'))) - return new GooString(fileName, p + 1 - fileName); - return new GooString(); - -#elif defined(ACORN) - //---------- RISCOS ---------- - char *p; - - if ((p = strrchr(fileName, '.'))) - return new GooString(fileName, p - fileName); - return new GooString(); - -#elif defined(MACOS) - //---------- MacOS ---------- - char *p; - - if ((p = strrchr(fileName, ':'))) - return new GooString(fileName, p - fileName); - return new GooString(); - -#else - //---------- Unix ---------- - char *p; - - if ((p = strrchr(fileName, '/'))) - return new GooString(fileName, p - fileName); - return new GooString(); -#endif -} - -GBool isAbsolutePath(char *path) { -#ifdef VMS - //---------- VMS ---------- - return strchr(path, ':') || - (path[0] == '[' && path[1] != '.' && path[1] != '-'); - -#elif defined(__EMX__) || defined(_WIN32) - //---------- OS/2+EMX and Win32 ---------- - return path[0] == '/' || path[0] == '\\' || path[1] == ':'; - -#elif defined(ACORN) - //---------- RISCOS ---------- - return path[0] == '$'; - -#elif defined(MACOS) - //---------- MacOS ---------- - return path[0] != ':'; - -#else - //---------- Unix ---------- - return path[0] == '/'; -#endif -} - -time_t getModTime(char *fileName) { -#ifdef _WIN32 - //~ should implement this, but it's (currently) only used in xpdf - return 0; -#else - struct stat statBuf; - - if (stat(fileName, &statBuf)) { - return 0; - } - return statBuf.st_mtime; -#endif -} - -GBool openTempFile(GooString **name, FILE **f, const char *mode) { -#if defined(_WIN32) - //---------- Win32 ---------- - char *tempDir; - GooString *s, *s2; - FILE *f2; - int t, i; - - // this has the standard race condition problem, but I haven't found - // a better way to generate temp file names with extensions on - // Windows - if ((tempDir = getenv("TEMP"))) { - s = new GooString(tempDir); - s->append('\\'); - } else { - s = new GooString(); - } - s->appendf("x_{0:d}_{1:d}_", - (int)GetCurrentProcessId(), (int)GetCurrentThreadId()); - t = (int)time(NULL); - for (i = 0; i < 1000; ++i) { - s2 = s->copy()->appendf("{0:d}", t + i); - if (!(f2 = fopen(s2->getCString(), "r"))) { - if (!(f2 = fopen(s2->getCString(), mode))) { - delete s2; - delete s; - return gFalse; - } - *name = s2; - *f = f2; - delete s; - return gTrue; - } - fclose(f2); - delete s2; - } - delete s; - return gFalse; -#elif defined(VMS) || defined(__EMX__) || defined(ACORN) || defined(MACOS) - //---------- non-Unix ---------- - char *s; - - // There is a security hole here: an attacker can create a symlink - // with this file name after the tmpnam call and before the fopen - // call. I will happily accept fixes to this function for non-Unix - // OSs. - if (!(s = tmpnam(NULL))) { - return gFalse; - } - *name = new GooString(s); - if (!(*f = fopen((*name)->getCString(), mode))) { - delete (*name); - *name = NULL; - return gFalse; - } - return gTrue; -#else - //---------- Unix ---------- - char *s; - int fd; - -#if HAVE_MKSTEMP - if ((s = getenv("TMPDIR"))) { - *name = new GooString(s); - } else { - *name = new GooString("/tmp"); - } - (*name)->append("/XXXXXX"); - fd = mkstemp((*name)->getCString()); -#else // HAVE_MKSTEMP - if (!(s = tmpnam(NULL))) { - return gFalse; - } - *name = new GooString(s); - fd = open((*name)->getCString(), O_WRONLY | O_CREAT | O_EXCL, 0600); -#endif // HAVE_MKSTEMP - if (fd < 0 || !(*f = fdopen(fd, mode))) { - delete *name; - *name = NULL; - return gFalse; - } - return gTrue; -#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; - size_t 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; (i < sizeof(mode) - 1) && mode[i]; ++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; - - i = 0; - while (i < size - 1) { - if ((c = fgetc(f)) == EOF) { - break; - } - buf[i++] = (char)c; - if (c == '\x0a') { - break; - } - if (c == '\x0d') { - c = fgetc(f); - if (c == '\x0a' && i < size - 1) { - buf[i++] = (char)c; - } else if (c != EOF) { - ungetc(c, f); - } - break; - } - } - buf[i] = '\0'; - if (i == 0) { - return NULL; - } - return buf; -} - -int Gfseek(FILE *f, Goffset offset, int whence) { -#if HAVE_FSEEKO - return fseeko(f, offset, whence); -#elif HAVE_FSEEK64 - return fseek64(f, offset, whence); -#elif defined(__MINGW32__) - return fseeko64(f, offset, whence); -#elif _WIN32 - return _fseeki64(f, offset, whence); -#else - return fseek(f, offset, whence); -#endif -} - -Goffset Gftell(FILE *f) { -#if HAVE_FSEEKO - return ftello(f); -#elif HAVE_FSEEK64 - return ftell64(f); -#elif defined(__MINGW32__) - return ftello64(f); -#elif _WIN32 - return _ftelli64(f); -#else - return ftell(f); -#endif -} - -Goffset GoffsetMax() { -#if HAVE_FSEEKO - return (std::numeric_limits<off_t>::max)(); -#elif HAVE_FSEEK64 || defined(__MINGW32__) - return (std::numeric_limits<off64_t>::max)(); -#elif _WIN32 - return (std::numeric_limits<__int64>::max)(); -#else - return (std::numeric_limits<long>::max)(); -#endif -} - -//------------------------------------------------------------------------ -// GooFile -//------------------------------------------------------------------------ - -#ifdef _WIN32 - -int GooFile::read(char *buf, int n, Goffset offset) const { - DWORD m; - - LARGE_INTEGER largeInteger = {0}; - largeInteger.QuadPart = offset; - - OVERLAPPED overlapped = {0}; - overlapped.Offset = largeInteger.LowPart; - overlapped.OffsetHigh = largeInteger.HighPart; - - return FALSE == ReadFile(handle, buf, n, &m, &overlapped) ? -1 : m; -} - -Goffset GooFile::size() const { - LARGE_INTEGER size = {(DWORD)-1,-1}; - - GetFileSizeEx(handle, &size); - - return size.QuadPart; -} - -GooFile* GooFile::open(const GooString *fileName) { - HANDLE handle = CreateFile(fileName->getCString(), - GENERIC_READ, - FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, NULL); - - return handle == INVALID_HANDLE_VALUE ? NULL : new GooFile(handle); -} - -GooFile* GooFile::open(const wchar_t *fileName) { - HANDLE handle = CreateFileW(fileName, - GENERIC_READ, - FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, NULL); - - return handle == INVALID_HANDLE_VALUE ? NULL : new GooFile(handle); -} - -#else - -int GooFile::read(char *buf, int n, Goffset offset) const { -#ifdef HAVE_PREAD64 - return pread64(fd, buf, n, offset); -#else - return pread(fd, buf, n, offset); -#endif -} - -Goffset GooFile::size() const { -#ifdef HAVE_LSEEK64 - return lseek64(fd, 0, SEEK_END); -#else - return lseek(fd, 0, SEEK_END); -#endif -} - -GooFile* GooFile::open(const GooString *fileName) { -#ifdef VMS - int fd = ::open(fileName->getCString(), Q_RDONLY, "ctx=stm"); -#else - int fd = ::open(fileName->getCString(), O_RDONLY); -#endif - - return fd < 0 ? NULL : new GooFile(fd); -} - -#endif // _WIN32 - -//------------------------------------------------------------------------ -// GDir and GDirEntry -//------------------------------------------------------------------------ - -GDirEntry::GDirEntry(char *dirPath, char *nameA, GBool doStat) { -#ifdef VMS - char *p; -#elif defined(_WIN32) - DWORD fa; -#elif defined(ACORN) -#else - struct stat st; -#endif - - name = new GooString(nameA); - dir = gFalse; - fullPath = new GooString(dirPath); - appendToPath(fullPath, nameA); - if (doStat) { -#ifdef VMS - if (!strcmp(nameA, "-") || - ((p = strrchr(nameA, '.')) && !strncmp(p, ".DIR;", 5))) - dir = gTrue; -#elif defined(ACORN) -#else -#ifdef _WIN32 - fa = GetFileAttributes(fullPath->getCString()); - dir = (fa != 0xFFFFFFFF && (fa & FILE_ATTRIBUTE_DIRECTORY)); -#else - if (stat(fullPath->getCString(), &st) == 0) - dir = S_ISDIR(st.st_mode); -#endif -#endif - } -} - -GDirEntry::~GDirEntry() { - delete fullPath; - delete name; -} - -GDir::GDir(char *name, GBool doStatA) { - path = new GooString(name); - doStat = doStatA; -#if defined(_WIN32) - GooString *tmp; - - tmp = path->copy(); - tmp->append("/*.*"); - hnd = FindFirstFile(tmp->getCString(), &ffd); - delete tmp; -#elif defined(ACORN) -#elif defined(MACOS) -#else - dir = opendir(name); -#ifdef VMS - needParent = strchr(name, '[') != NULL; -#endif -#endif -} - -GDir::~GDir() { - delete path; -#if defined(_WIN32) - if (hnd != INVALID_HANDLE_VALUE) { - FindClose(hnd); - hnd = INVALID_HANDLE_VALUE; - } -#elif defined(ACORN) -#elif defined(MACOS) -#else - if (dir) - closedir(dir); -#endif -} - -GDirEntry *GDir::getNextEntry() { - GDirEntry *e = NULL; - -#if defined(_WIN32) - if (hnd != INVALID_HANDLE_VALUE) { - e = new GDirEntry(path->getCString(), ffd.cFileName, doStat); - if (!FindNextFile(hnd, &ffd)) { - FindClose(hnd); - hnd = INVALID_HANDLE_VALUE; - } - } -#elif defined(ACORN) -#elif defined(MACOS) -#elif defined(VMS) - struct dirent *ent; - if (dir) { - if (needParent) { - e = new GDirEntry(path->getCString(), "-", doStat); - needParent = gFalse; - return e; - } - ent = readdir(dir); - if (ent) { - e = new GDirEntry(path->getCString(), ent->d_name, doStat); - } - } -#else - struct dirent *ent; - if (dir) { - do { - ent = readdir(dir); - } - while (ent && (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, ".."))); - if (ent) { - e = new GDirEntry(path->getCString(), ent->d_name, doStat); - } - } -#endif - - return e; -} - -void GDir::rewind() { -#ifdef _WIN32 - GooString *tmp; - - if (hnd != INVALID_HANDLE_VALUE) - FindClose(hnd); - tmp = path->copy(); - tmp->append("/*.*"); - hnd = FindFirstFile(tmp->getCString(), &ffd); - delete tmp; -#elif defined(ACORN) -#elif defined(MACOS) -#else - if (dir) - rewinddir(dir); -#ifdef VMS - needParent = strchr(path->getCString(), '[') != NULL; -#endif -#endif -} |