[poppler] goo/gfile.cc goo/gfile.h goo/gtypes.h poppler/poppler-config.h.cmake poppler/poppler-config.h.in poppler/Stream.cc poppler/XRef.cc utils/pdfinfo.cc

Adrian Johnson ajohnson at kemper.freedesktop.org
Thu Feb 7 00:21:05 PST 2013


 goo/gfile.cc                   |   38 +++++++++++++++++++++++
 goo/gfile.h                    |    7 ++++
 goo/gtypes.h                   |   19 -----------
 poppler/Stream.cc              |   67 +++++------------------------------------
 poppler/XRef.cc                |    4 +-
 poppler/poppler-config.h.cmake |    6 ---
 poppler/poppler-config.h.in    |    6 ---
 utils/pdfinfo.cc               |   16 +--------
 8 files changed, 60 insertions(+), 103 deletions(-)

New commits:
commit 48ed05d95598b642a57456a843baf9f246502bb6
Author: Adrian Johnson <ajohnson at redneon.com>
Date:   Wed Feb 6 21:56:01 2013 +1030

    Make Goffset long long and factor out all fseek/ftell into gfile.cc
    
    This fixes build problems on 32-bit machines due to off_t being
    defined differently depending on whether source files included
    condig.h.
    
    Bug 60095

diff --git a/goo/gfile.cc b/goo/gfile.cc
index b075b2b..7630e20 100644
--- a/goo/gfile.cc
+++ b/goo/gfile.cc
@@ -49,6 +49,8 @@
 #    include <unixlib.h>
 #  endif
 #endif // _WIN32
+#include <stdio.h>
+#include <limits>
 #include "GooString.h"
 #include "gfile.h"
 
@@ -546,6 +548,42 @@ char *getLine(char *buf, int size, FILE *f) {
   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 _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 _WIN32
+  return _ftelli64(f);
+#else
+  return ftell(f);
+#endif
+}
+
+Goffset GoffsetMax() {
+#if HAVE_FSEEKO
+  return (std::numeric_limits<off_t>::max)();
+#elif HAVE_FSEEK64
+  return (std::numeric_limits<off64_t>::max)();
+#elif _WIN32
+  return (std::numeric_limits<__int64>::max)();
+#else
+  return (std::numeric_limits<long>::max)();
+#endif
+}
+
 //------------------------------------------------------------------------
 // GDir and GDirEntry
 //------------------------------------------------------------------------
diff --git a/goo/gfile.h b/goo/gfile.h
index 4e11023..6787a6e 100644
--- a/goo/gfile.h
+++ b/goo/gfile.h
@@ -114,6 +114,13 @@ extern FILE *openFile(const char *path, const char *mode);
 // conventions.
 extern char *getLine(char *buf, int size, FILE *f);
 
+// Like fseek/ftell but uses platform specific variants that support large files
+extern int Gfseek(FILE *f, Goffset offset, int whence);
+extern Goffset Gftell(FILE *f);
+
+// Largest offset supported by Gfseek/Gftell
+extern Goffset GoffsetMax();
+
 //------------------------------------------------------------------------
 // GDir and GDirEntry
 //------------------------------------------------------------------------
diff --git a/goo/gtypes.h b/goo/gtypes.h
index 84245b7..a8d4519 100644
--- a/goo/gtypes.h
+++ b/goo/gtypes.h
@@ -27,10 +27,6 @@
 
 #include "poppler-config.h"
 
-#ifndef _WIN32
-#include <sys/types.h> // for off_t
-#endif
-
 /*
  * These have stupid names to avoid conflicts with some (but not all)
  * C++ compilers which define them.
@@ -51,19 +47,6 @@ typedef unsigned char Guchar;
 typedef unsigned short Gushort;
 typedef unsigned int Guint;
 typedef unsigned long Gulong;
-
-/* Define Goffset to be the offset type used by the version of
- * fseek we are using.
- */
-#if HAVE_FSEEKO
-typedef off_t Goffset;
-#elif HAVE_FSEEK64
-typedef off64_t Goffset;
-#elif _WIN32
-typedef __int64 Goffset;
-#else
-typedef long Goffset;
-#endif
-
+typedef long long Goffset;
 
 #endif
diff --git a/poppler/Stream.cc b/poppler/Stream.cc
index 91a1af2..3e541c6 100644
--- a/poppler/Stream.cc
+++ b/poppler/Stream.cc
@@ -385,7 +385,7 @@ void FileOutStream::close ()
 
 Goffset FileOutStream::getPos ()
 {
-  return ftell(f);
+  return Gftell(f);
 }
 
 void FileOutStream::put (char c)
@@ -800,19 +800,8 @@ Stream *FileStream::makeSubStream(Goffset startA, GBool limitedA,
 }
 
 void FileStream::reset() {
-#if HAVE_FSEEKO
-  savePos = ftello(f);
-  fseeko(f, start, SEEK_SET);
-#elif HAVE_FSEEK64
-  savePos = ftell64(f);
-  fseek64(f, start, SEEK_SET);
-#elif _WIN32
-  savePos = _ftelli64(f);
-  _fseeki64(f, start, SEEK_SET);
-#else
-  savePos = ftell(f);
-  fseek(f, start, SEEK_SET);
-#endif
+  savePos = Gftell(f);
+  Gfseek(f, start, SEEK_SET);
   saved = gTrue;
   bufPtr = bufEnd = buf;
   bufPos = start;
@@ -820,15 +809,7 @@ void FileStream::reset() {
 
 void FileStream::close() {
   if (saved) {
-#if HAVE_FSEEKO
-    fseeko(f, savePos, SEEK_SET);
-#elif HAVE_FSEEK64
-    fseek64(f, savePos, SEEK_SET);
-#elif _WIN32
-    _fseeki64(f, savePos, SEEK_SET);
-#else
-    fseek(f, savePos, SEEK_SET);
-#endif
+    Gfseek(f, savePos, SEEK_SET);
     saved = gFalse;
   }
 }
@@ -858,45 +839,15 @@ void FileStream::setPos(Goffset pos, int dir) {
   Goffset size;
 
   if (dir >= 0) {
-#if HAVE_FSEEKO
-    fseeko(f, pos, SEEK_SET);
-#elif HAVE_FSEEK64
-    fseek64(f, pos, SEEK_SET);
-#elif _WIN32
-    _fseeki64(f, pos, SEEK_SET);
-#else
-    fseek(f, pos, SEEK_SET);
-#endif
+    Gfseek(f, pos, SEEK_SET);
     bufPos = pos;
   } else {
-#if HAVE_FSEEKO
-    fseeko(f, 0, SEEK_END);
-    size = ftello(f);
-#elif HAVE_FSEEK64
-    fseek64(f, 0, SEEK_END);
-    size = ftell64(f);
-#elif _WIN32
-    _fseeki64(f, 0, SEEK_END);
-    size = _ftelli64(f);
-#else
-    fseek(f, 0, SEEK_END);
-    size = ftell(f);
-#endif
+    Gfseek(f, 0, SEEK_END);
+    size = Gftell(f);
     if (pos > size)
       pos = size;
-#if HAVE_FSEEKO
-    fseeko(f, -pos, SEEK_END);
-    bufPos = ftello(f);
-#elif HAVE_FSEEK64
-    fseek64(f, -pos, SEEK_END);
-    bufPos = ftell64(f);
-#elif _WIN32
-    _fseeki64(f, -pos, SEEK_END);
-    bufPos = _ftelli64(f);
-#else
-    fseek(f, -pos, SEEK_END);
-    bufPos = ftell(f);
-#endif
+    Gfseek(f, -pos, SEEK_END);
+    bufPos = Gftell(f);
   }
   bufPtr = bufEnd = buf;
 }
diff --git a/poppler/XRef.cc b/poppler/XRef.cc
index 6aa168e..e2e86ad 100644
--- a/poppler/XRef.cc
+++ b/poppler/XRef.cc
@@ -41,8 +41,8 @@
 #include <math.h>
 #include <ctype.h>
 #include <limits.h>
-#include <limits>
 #include <float.h>
+#include "goo/gfile.h"
 #include "goo/gmem.h"
 #include "Object.h"
 #include "Stream.h"
@@ -852,7 +852,7 @@ GBool XRef::readXRefStreamSection(Stream *xrefStr, int *w, int first, int n) {
       }
       offset = (offset << 8) + c;
     }
-    if (offset > (unsigned long long)(std::numeric_limits<Goffset>::max)()) {
+    if (offset > (unsigned long long)GoffsetMax()) {
       error(errSyntaxError, -1, "Offset inside xref table too large for fseek");
       return gFalse;
     }
diff --git a/poppler/poppler-config.h.cmake b/poppler/poppler-config.h.cmake
index 1fb2999..13a92fe 100644
--- a/poppler/poppler-config.h.cmake
+++ b/poppler/poppler-config.h.cmake
@@ -107,12 +107,6 @@
 #cmakedefine USE_CMS 1
 #endif
 
-/* Define to 1 if you have the `fseek64' function. */
-#cmakedefine HAVE_FSEEK64 1
-
-/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
-#cmakedefine HAVE_FSEEKO 1
-
 // Also, there are preprocessor symbols in the header files
 // that are used but never defined when building poppler using configure
 // or cmake: DISABLE_OUTLINE, DEBUG_MEM, SPLASH_CMYK, HAVE_T1LIB_H,
diff --git a/poppler/poppler-config.h.in b/poppler/poppler-config.h.in
index afd3dbd..11b5691 100644
--- a/poppler/poppler-config.h.in
+++ b/poppler/poppler-config.h.in
@@ -107,12 +107,6 @@
 #undef USE_CMS
 #endif
 
-/* Define to 1 if you have the `fseek64' function. */
-#undef HAVE_FSEEK64
-
-/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
-#undef HAVE_FSEEKO
-
 // Also, there are preprocessor symbols in the header files
 // that are used but never defined when building poppler using configure
 // or cmake: DISABLE_OUTLINE, DEBUG_MEM, SPLASH_CMYK, HAVE_T1LIB_H,
diff --git a/utils/pdfinfo.cc b/utils/pdfinfo.cc
index 8cb9ae1..14e4f6c 100644
--- a/utils/pdfinfo.cc
+++ b/utils/pdfinfo.cc
@@ -36,6 +36,7 @@
 #include "parseargs.h"
 #include "printencodings.h"
 #include "goo/GooString.h"
+#include "goo/gfile.h"
 #include "goo/gmem.h"
 #include "GlobalParams.h"
 #include "Object.h"
@@ -351,19 +352,8 @@ int main(int argc, char *argv[]) {
   f = fopen(fileName->getCString(), "rb");
 #endif
   if (f) {
-#if HAVE_FSEEKO
-    fseeko(f, 0, SEEK_END);
-    printf("File size:      %lld bytes\n", (long long)ftello(f));
-#elif HAVE_FSEEK64
-    fseek64(f, 0, SEEK_END);
-    printf("File size:      %lld bytes\n", (long long)ftell64(f));
-#elif _WIN32
-    _fseeki64(f, 0, SEEK_END);
-    printf("File size:      %lld bytes\n", (long long)_ftelli64(f));
-#else
-    fseek(f, 0, SEEK_END);
-    printf("File size:      %lld bytes\n", (long long)ftell(f));
-#endif
+    Gfseek(f, 0, SEEK_END);
+    printf("File size:      %lld bytes\n", (long long)Gftell(f));
     fclose(f);
   }
 


More information about the poppler mailing list