CMakeLists.txt | 1 ConfigureChecks.cmake | 1 config.h.cmake | 3 ++ configure.ac | 1 cpp/poppler-document.cpp | 4 ++ cpp/poppler-embedded-file.cpp | 6 ++-- cpp/poppler-global.cpp | 6 +++- cpp/poppler-private.cpp | 25 ----------------- cpp/poppler-private.h | 3 -- cpp/tests/poppler-dump.cpp | 5 --- glib/demo/utils.c | 6 ---- glib/poppler-date.cc | 33 ++++------------------- goo/Makefile.am | 3 +- goo/glibc.cc | 58 +++++++++++++++++++++++++++++++++++++++++ goo/glibc.h | 37 ++++++++++++++++++++++++++ poppler/DateInfo.cc | 59 ++++++++++++++++++++++-------------------- poppler/DateInfo.h | 6 +++- poppler/Form.cc | 2 - utils/pdfinfo.1 | 3 ++ utils/pdfinfo.cc | 47 +++++++++++++++++++++++++++++++-- 20 files changed, 210 insertions(+), 99 deletions(-)
New commits: commit df0779031d6ae0180024f92602bc2a680cf73dd5 Author: Jakub Kucharski <[email protected]> Date: Thu May 19 16:11:04 2016 +0200 cpp: switched from detail::convert_date() to core's dateStringToTime() diff --git a/cpp/poppler-document.cpp b/cpp/poppler-document.cpp index 1c24b47..3b2c066 100644 --- a/cpp/poppler-document.cpp +++ b/cpp/poppler-document.cpp @@ -1,5 +1,6 @@ /* * Copyright (C) 2009-2011, Pino Toscano <[email protected]> + * Copyright (C) 2016 Jakub Kucharski <[email protected]> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,6 +28,7 @@ #include "poppler-toc-private.h" #include "Catalog.h" +#include "DateInfo.h" #include "ErrorCodes.h" #include "GlobalParams.h" #include "Outline.h" @@ -379,7 +381,7 @@ time_type document::info_date(const std::string &key) const Object obj; time_type result = time_type(-1); if (info_dict->lookup(PSTR(key.c_str()), &obj)->isString()) { - result = detail::convert_date(obj.getString()->getCString()); + result = dateStringToTime(obj.getString()); } obj.free(); info.free(); diff --git a/cpp/poppler-embedded-file.cpp b/cpp/poppler-embedded-file.cpp index 2c5d077..f87649c 100644 --- a/cpp/poppler-embedded-file.cpp +++ b/cpp/poppler-embedded-file.cpp @@ -1,5 +1,6 @@ /* * Copyright (C) 2009-2011, Pino Toscano <[email protected]> + * Copyright (C) 2016 Jakub Kucharski <[email protected]> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,6 +26,7 @@ #include "Stream.h" #include "Catalog.h" #include "FileSpec.h" +#include "DateInfo.h" using namespace poppler; @@ -107,7 +109,7 @@ int embedded_file::size() const time_type embedded_file::modification_date() const { GooString *goo = d->file_spec->getEmbeddedFile()->modDate(); - return goo ? detail::convert_date(goo->getCString()) : time_type(-1); + return goo ? dateStringToTime(goo) : time_type(-1); } /** @@ -117,7 +119,7 @@ time_type embedded_file::modification_date() const time_type embedded_file::creation_date() const { GooString *goo = d->file_spec->getEmbeddedFile()->createDate(); - return goo ? detail::convert_date(goo->getCString()) : time_type(-1); + return goo ? dateStringToTime(goo) : time_type(-1); } /** diff --git a/cpp/poppler-global.cpp b/cpp/poppler-global.cpp index b99259f..db2953e 100644 --- a/cpp/poppler-global.cpp +++ b/cpp/poppler-global.cpp @@ -3,6 +3,7 @@ * Copyright (C) 2010, Hib Eris <[email protected]> * Copyright (C) 2014, 2015 Hans-Peter Deifel <[email protected]> * Copyright (C) 2015, Tamas Szekeres <[email protected]> + * Copyright (C) 2016 Jakub Kucharski <[email protected]> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,6 +24,8 @@ #include "poppler-private.h" +#include "DateInfo.h" + #include <algorithm> #include <cerrno> @@ -315,7 +318,8 @@ ustring ustring::from_latin1(const std::string &str) */ time_type poppler::convert_date(const std::string &date) { - return detail::convert_date(date.c_str()); + GooString gooDateStr(date.c_str()); + return dateStringToTime(&gooDateStr); } std::ostream& poppler::operator<<(std::ostream& stream, const byte_array &array) diff --git a/cpp/poppler-private.cpp b/cpp/poppler-private.cpp index 3c3fe95..4362319 100644 --- a/cpp/poppler-private.cpp +++ b/cpp/poppler-private.cpp @@ -2,6 +2,7 @@ * Copyright (C) 2009-2010, Pino Toscano <[email protected]> * Copyright (C) 2013 Adrian Johnson <[email protected]> * Copyright (C) 2014, Hans-Peter Deifel <[email protected]> + * Copyright (C) 2016 Jakub Kucharski <[email protected]> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,7 +21,6 @@ #include "poppler-private.h" -#include "DateInfo.h" #include "GooString.h" #include "Page.h" @@ -115,26 +115,3 @@ GooString* detail::ustring_to_unicode_GooString(const ustring &str) GooString *goo = new GooString(&ba[0]); return goo; } - -time_type detail::convert_date(const char *date) -{ - int year, mon, day, hour, min, sec, tzHours, tzMins; - char tz; - - if (!parseDateString(date, &year, &mon, &day, &hour, &min, &sec, - &tz, &tzHours, &tzMins)) { - return time_type(-1); - } - - struct tm time; - time.tm_sec = sec; - time.tm_min = min; - time.tm_hour = hour; - time.tm_mday = day; - time.tm_mon = mon - 1; - time.tm_year = year - 1900; - time.tm_wday = -1; - time.tm_yday = -1; - time.tm_isdst = -1; - return mktime(&time); -} diff --git a/cpp/poppler-private.h b/cpp/poppler-private.h index 8d315c8..7d554d0 100644 --- a/cpp/poppler-private.h +++ b/cpp/poppler-private.h @@ -2,6 +2,7 @@ * Copyright (C) 2009, Pino Toscano <[email protected]> * Copyright (C) 2013 Adrian Johnson <[email protected]> * Copyright (C) 2014, Hans-Peter Deifel <[email protected]> + * Copyright (C) 2016 Jakub Kucharski <[email protected]> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -50,8 +51,6 @@ ustring unicode_GooString_to_ustring(GooString *str); ustring unicode_to_ustring(const Unicode *u, int length); GooString* ustring_to_unicode_GooString(const ustring &str); -time_type convert_date(const char *date); - } template <typename ConstIterator> commit ff24d677c6078c3dfb54c35541369d908314bcdb Author: Adrian Johnson <[email protected]> Date: Wed Feb 24 20:57:37 2016 +1030 pdfinfo: add -isodates for printing dates in ISO-8601 format diff --git a/utils/pdfinfo.1 b/utils/pdfinfo.1 index 35bf6d5..f3a60d7 100644 --- a/utils/pdfinfo.1 +++ b/utils/pdfinfo.1 @@ -105,6 +105,9 @@ file. Note that extracting text this way might be slow for big PDF files. (Implies .BR \-struct .) .TP +.B \-isodates +Prints dates in ISO-8601 format (including the time zone). +.TP .B \-rawdates Prints the raw (undecoded) date strings, directly from the PDF file. .TP diff --git a/utils/pdfinfo.cc b/utils/pdfinfo.cc index 413de2f..3756ad3 100644 --- a/utils/pdfinfo.cc +++ b/utils/pdfinfo.cc @@ -63,6 +63,7 @@ static void printInfoString(Dict *infoDict, const char *key, const char *text, UnicodeMap *uMap); static void printInfoDate(Dict *infoDict, const char *key, const char *text); +static void printISODate(Dict *infoDict, const char *key, const char *text); static void printBox(const char *text, PDFRectangle *box); static void printStruct(const StructElement *element, unsigned indent = 0); static void printIndent(unsigned level); @@ -72,6 +73,7 @@ static int lastPage = 0; static GBool printBoxes = gFalse; static GBool printMetadata = gFalse; static GBool printJS = gFalse; +static GBool isoDates = gFalse; static GBool rawDates = gFalse; static char textEncName[128] = ""; static char ownerPassword[33] = "\001"; @@ -97,6 +99,8 @@ static const ArgDesc argDesc[] = { "print the logical document structure (for tagged files)"}, {"-struct-text", argFlag, &printStructureText, 0, "print text contents along with document structure (for tagged files)"}, + {"-isodates", argFlag, &isoDates, 0, + "print the dates in ISO-8601 format"}, {"-rawdates", argFlag, &rawDates, 0, "print the undecoded date strings directly from the PDF file"}, {"-enc", argString, textEncName, sizeof(textEncName), @@ -238,7 +242,10 @@ int main(int argc, char *argv[]) { printInfoString(info.getDict(), "Author", "Author: ", uMap); printInfoString(info.getDict(), "Creator", "Creator: ", uMap); printInfoString(info.getDict(), "Producer", "Producer: ", uMap); - if (rawDates) { + if (isoDates) { + printISODate(info.getDict(), "CreationDate", "CreationDate: "); + printISODate(info.getDict(), "ModDate", "ModDate: "); + } else if (rawDates) { printInfoString(info.getDict(), "CreationDate", "CreationDate: ", uMap); printInfoString(info.getDict(), "ModDate", "ModDate: ", @@ -508,6 +515,33 @@ static void printInfoDate(Dict *infoDict, const char *key, const char *text) { obj.free(); } +void printISODate(Dict *infoDict, const char *key, const char *text) +{ + Object obj; + char *s; + int year, mon, day, hour, min, sec, tz_hour, tz_minute; + char tz; + + if (infoDict->lookup(key, &obj)->isString()) { + fputs(text, stdout); + s = obj.getString()->getCString(); + if ( parseDateString( s, &year, &mon, &day, &hour, &min, &sec, &tz, &tz_hour, &tz_minute ) ) { + fprintf(stdout, "%04d-%02d-%02dT%02d:%02d:%02d", year, mon, day, hour, min, sec); + if (tz_hour == 0 && tz_minute == 0) { + fprintf(stdout, "Z"); + } else { + fprintf(stdout, "%c%02d", tz, tz_hour); + if (tz_minute) + fprintf(stdout, ":%02d", tz_minute); + } + } else { + fputs(s, stdout); + } + fputc('\n', stdout); + } + obj.free(); +} + static void printBox(const char *text, PDFRectangle *box) { printf("%s%8.2f %8.2f %8.2f %8.2f\n", text, box->x1, box->y1, box->x2, box->y2); commit dd08f24f5e52c56546dfda70be483dc29e03c2e6 Author: Adrian Johnson <[email protected]> Date: Wed Feb 24 21:10:08 2016 +1030 pdfinfo: convert dates to local time zone diff --git a/utils/pdfinfo.cc b/utils/pdfinfo.cc index 911d40b..413de2f 100644 --- a/utils/pdfinfo.cc +++ b/utils/pdfinfo.cc @@ -470,6 +470,7 @@ static void printInfoDate(Dict *infoDict, const char *key, const char *text) { int year, mon, day, hour, min, sec, tz_hour, tz_minute; char tz; struct tm tmStruct; + time_t time; char buf[256]; if (infoDict->lookup(key, &obj)->isString()) { @@ -487,8 +488,14 @@ static void printInfoDate(Dict *infoDict, const char *key, const char *text) { tmStruct.tm_yday = -1; tmStruct.tm_isdst = -1; // compute the tm_wday and tm_yday fields - if (mktime(&tmStruct) != (time_t)-1 && - strftime(buf, sizeof(buf), "%c", &tmStruct)) { + time = timegm(&tmStruct); + if (time != (time_t)-1) { + int offset = (tz_hour*60 + tz_minute)*60; + if (tz == '-') + offset *= -1; + time -= offset; + localtime_r(&time, &tmStruct); + strftime(buf, sizeof(buf), "%c %Z", &tmStruct); fputs(buf, stdout); } else { fputs(s, stdout); commit e4690ee1be027dd7028e86ea6732a3f4f2680ef7 Author: Adrian Johnson <[email protected]> Date: Tue Feb 23 21:01:49 2016 +1030 glib: return date in UTC instead of local time Bug 94173 diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake index d3f5732..345f29c 100644 --- a/ConfigureChecks.cmake +++ b/ConfigureChecks.cmake @@ -30,6 +30,7 @@ check_function_exists(ftell64 HAVE_FTELL64) check_function_exists(pread64 HAVE_PREAD64) check_function_exists(lseek64 HAVE_LSEEK64) check_function_exists(gmtime_r HAVE_GMTIME_R) +check_function_exists(timegm HAVE_TIMEGM) check_function_exists(gettimeofday HAVE_GETTIMEOFDAY) check_function_exists(localtime_r HAVE_LOCALTIME_R) check_function_exists(popen HAVE_POPEN) diff --git a/config.h.cmake b/config.h.cmake index 85c6d32..7988b74 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -64,6 +64,9 @@ /* Defines if gmtime_r is available on your system */ #cmakedefine HAVE_GMTIME_R 1 +/* Defines if timegm is available on your system */ +#cmakedefine HAVE_TIMEGM 1 + /* Define if you have the iconv() function and it works. */ #cmakedefine HAVE_ICONV 1 diff --git a/configure.ac b/configure.ac index 8ff8ea5..e9b0687 100644 --- a/configure.ac +++ b/configure.ac @@ -178,6 +178,7 @@ AC_LANG_CPLUSPLUS AC_CHECK_DECL(gettimeofday, [AC_CHECK_FUNC(gettimeofday, AC_DEFINE(HAVE_GETTIMEOFDAY, 1, [Defines if gettimeofday is available on your system]))],[],[#include <sys/time.h>]) AC_CHECK_FUNC(localtime_r, AC_DEFINE(HAVE_LOCALTIME_R, 1, [Defines if localtime_r is available on your system])) AC_CHECK_FUNC(gmtime_r, AC_DEFINE(HAVE_GMTIME_R, 1, [Defines if gmtime_r is available on your system])) +AC_CHECK_FUNC(timegm, AC_DEFINE(HAVE_TIMEGM, 1, [Defines if timegm is available on your system])) AC_CHECK_FUNC(rand_r, AC_DEFINE(HAVE_RAND_R, 1, [Defines if rand_r is available on your system])) dnl ##### Check for extra libraries needed by X. (LynxOS needs this.) diff --git a/glib/poppler-date.cc b/glib/poppler-date.cc index e3141c1..ad86b30 100644 --- a/glib/poppler-date.cc +++ b/glib/poppler-date.cc @@ -17,6 +17,7 @@ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ +#include <goo/glibc.h> #include <DateInfo.h> #include "poppler-date.h" @@ -37,32 +38,12 @@ gboolean poppler_date_parse (const gchar *date, time_t *timet) { - gint year, mon, day, hour, min, sec, tz_hour, tz_minute; - gchar tz; - struct tm time; - time_t retval; - - /* See PDF Reference 1.3, Section 3.8.2 for PDF Date representation */ - // TODO do something with the timezone information - if (!parseDateString (date, &year, &mon, &day, &hour, &min, &sec, &tz, &tz_hour, &tz_minute)) + time_t t; + GooString dateString(date); + t = dateStringToTime(&dateString); + if (t == (time_t)-1) return FALSE; - - time.tm_year = year - 1900; - time.tm_mon = mon - 1; - time.tm_mday = day; - time.tm_hour = hour; - time.tm_min = min; - time.tm_sec = sec; - time.tm_wday = -1; - time.tm_yday = -1; - time.tm_isdst = -1; /* 0 = DST off, 1 = DST on, -1 = don't know */ - - /* compute tm_wday and tm_yday and check date */ - retval = mktime (&time); - if (retval == (time_t) - 1) - return FALSE; - - *timet = retval; - return TRUE; + *timet = t; + return TRUE; } diff --git a/goo/glibc.cc b/goo/glibc.cc index fa1c858..4968047 100644 --- a/goo/glibc.cc +++ b/goo/glibc.cc @@ -32,3 +32,27 @@ struct tm *localtime_r(const time_t *timep, struct tm *result) return lt; } #endif + +#ifndef HAVE_TIMEGM +// Get offset of local time from UTC in seconds. DST is ignored. +static time_t getLocalTimeZoneOffset() +{ + time_t utc, local; + struct tm tm_utc; + time (&utc); + gmtime_r(&utc, &tm_utc); + local = mktime(&tm_utc); + return difftime(utc, local); +} + +time_t timegm(struct tm *tm) +{ + tm->tm_isdst = 0; + time_t t = mktime(tm); + if (t == -1) + return t; + + t += getLocalTimeZoneOffset(); + return t; +} +#endif diff --git a/goo/glibc.h b/goo/glibc.h index cc156e7..49479e9 100644 --- a/goo/glibc.h +++ b/goo/glibc.h @@ -27,6 +27,10 @@ struct tm *gmtime_r(const time_t *timep, struct tm *result); struct tm *localtime_r(const time_t *timep, struct tm *result); #endif +#ifndef HAVE_TIMEGM +time_t timegm(struct tm *tm); +#endif + }; #endif // GLIBC_H diff --git a/poppler/DateInfo.cc b/poppler/DateInfo.cc index 99da404..791f19e 100644 --- a/poppler/DateInfo.cc +++ b/poppler/DateInfo.cc @@ -75,7 +75,7 @@ GBool parseDateString(const char *dateString, int *year, int *month, int *day, i return gFalse; } - +// Convert time to PDF date string GooString *timeToDateString(time_t *timet) { GooString *dateString; char s[5]; @@ -115,27 +115,35 @@ GooString *timeToDateString(time_t *timet) { return dateString; } -time_t pdfTimeToInteger(GooString *time_str) -{ +// Convert PDF date string to time. Returns -1 if conversion fails. +time_t dateStringToTime(GooString *dateString) { int year, mon, day, hour, min, sec, tz_hour, tz_minute; char tz; - struct tm time_struct; - - if (!parseDateString (time_str->getCString(), &year, - &mon, &day, &hour, &min, &sec, &tz, &tz_hour, &tz_minute)) - return 0; - - time_struct.tm_year = year - 1900; - time_struct.tm_mon = mon - 1; - time_struct.tm_mday = day; - time_struct.tm_hour = hour; - time_struct.tm_min = min; - time_struct.tm_sec = sec; - time_struct.tm_wday = -1; - time_struct.tm_yday = -1; - time_struct.tm_isdst = -1; - - time_t unix_time = mktime(&time_struct); - - return unix_time; + struct tm tm; + time_t time; + + if (!parseDateString (dateString->getCString(), &year, &mon, &day, &hour, &min, &sec, &tz, &tz_hour, &tz_minute)) + return -1; + + tm.tm_year = year - 1900; + tm.tm_mon = mon - 1; + tm.tm_mday = day; + tm.tm_hour = hour; + tm.tm_min = min; + tm.tm_sec = sec; + tm.tm_wday = -1; + tm.tm_yday = -1; + tm.tm_isdst = -1; /* 0 = DST off, 1 = DST on, -1 = don't know */ + + /* compute tm_wday and tm_yday and check date */ + time = timegm (&tm); + if (time == (time_t)-1) + return time; + + time_t offset = (tz_hour*60 + tz_minute)*60; + if (tz == '-') + offset *= -1; + time -= offset; + + return time; } diff --git a/poppler/DateInfo.h b/poppler/DateInfo.h index 840ee5a..e411268 100644 --- a/poppler/DateInfo.h +++ b/poppler/DateInfo.h @@ -33,6 +33,10 @@ GBool parseDateString(const char *string, int *year, int *month, int *day, int * * If timet is NULL, current time is used. */ GooString *timeToDateString(time_t *timet); -time_t pdfTimeToInteger(GooString *time_str); + +/* Convert PDF date string to time. + * Returns -1 if conversion fails. + */ +time_t dateStringToTime(GooString *dateString); #endif diff --git a/poppler/Form.cc b/poppler/Form.cc index 4dd56b7..b63ea36 100644 --- a/poppler/Form.cc +++ b/poppler/Form.cc @@ -1421,7 +1421,7 @@ void FormFieldSignature::parseInfo() sig_dict.dictLookup("M", &time_of_signing); if (time_of_signing.isString()) { GooString *time_str = time_of_signing.getString(); - signature_info->setSigningTime(pdfTimeToInteger(time_str)); // Put this information directly in SignatureInfo object + signature_info->setSigningTime(dateStringToTime(time_str)); // Put this information directly in SignatureInfo object time_of_signing.free(); } commit 7936af2eeb8f84993acabd1b306da50d49256b31 Author: Adrian Johnson <[email protected]> Date: Tue Feb 23 20:52:30 2016 +1030 Emulate some non portable glibc functions when not available diff --git a/CMakeLists.txt b/CMakeLists.txt index dd81d27..a2986f7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -325,6 +325,7 @@ set(poppler_SRCS goo/ImgWriter.cc goo/gstrtod.cc goo/grandom.cc + goo/glibc.cc fofi/FoFiBase.cc fofi/FoFiEncodings.cc fofi/FoFiTrueType.cc diff --git a/cpp/tests/poppler-dump.cpp b/cpp/tests/poppler-dump.cpp index d335ff0..c7ff349 100644 --- a/cpp/tests/poppler-dump.cpp +++ b/cpp/tests/poppler-dump.cpp @@ -16,6 +16,7 @@ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ +#include <goo/glibc.h> #include <poppler-document.h> #include <poppler-embedded-file.h> #include <poppler-font.h> @@ -94,13 +95,9 @@ std::ostream& operator<<(std::ostream& stream, const poppler::ustring &str) static std::string out_date(std::time_t date) { if (date != std::time_t(-1)) { -#ifdef HAVE_GMTIME_R struct tm time; gmtime_r(&date, &time); struct tm *t = &time; -#else - struct tm *t = gmtime(&date); -#endif char buf[32]; strftime(buf, sizeof(buf) - 1, "%d/%m/%Y %H:%M:%S", t); return std::string(buf); diff --git a/glib/demo/utils.c b/glib/demo/utils.c index 440793b..10d6d4b 100644 --- a/glib/demo/utils.c +++ b/glib/demo/utils.c @@ -484,15 +484,9 @@ pgd_format_date (time_t utime) char s[256]; const char *fmt_hack = "%c"; size_t len; -#ifdef HAVE_LOCALTIME_R struct tm t; if (time == 0 || !localtime_r (&time, &t)) return NULL; len = strftime (s, sizeof (s), fmt_hack, &t); -#else - struct tm *t; - if (time == 0 || !(t = localtime (&time)) ) return NULL; - len = strftime (s, sizeof (s), fmt_hack, t); -#endif if (len == 0 || s[0] == '\0') return NULL; diff --git a/goo/Makefile.am b/goo/Makefile.am index 370e850..8b4595e 100644 --- a/goo/Makefile.am +++ b/goo/Makefile.am @@ -40,7 +40,8 @@ libgoo_la_SOURCES = \ ImgWriter.cc \ gtypes_p.h \ gstrtod.cc \ - grandom.cc + grandom.cc \ + glibc.cc if BUILD_LIBJPEG libjpeg_includes = $(LIBJPEG_CFLAGS) diff --git a/goo/glibc.cc b/goo/glibc.cc new file mode 100644 index 0000000..fa1c858 --- /dev/null +++ b/goo/glibc.cc @@ -0,0 +1,34 @@ +//======================================================================== +// +// glibc.h +// +// Emulate various non-portable glibc functions. +// +// This file is licensed under the GPLv2 or later +// +// Copyright (C) 2016 Adrian Johnson <[email protected]> +// +//======================================================================== + +#include "glibc.h" + +#ifndef HAVE_GMTIME_R +struct tm *gmtime_r(const time_t *timep, struct tm *result) +{ + struct tm *gt; + gt = gmtime(timep); + if (gt) + *result = *gt; + return gt; +} +#endif + +#ifndef HAVE_LOCALTIME_R +struct tm *localtime_r(const time_t *timep, struct tm *result) +{ + struct tm *lt; + lt = localtime(timep); + *result = *lt; + return lt; +} +#endif diff --git a/goo/glibc.h b/goo/glibc.h new file mode 100644 index 0000000..cc156e7 --- /dev/null +++ b/goo/glibc.h @@ -0,0 +1,33 @@ +//======================================================================== +// +// glibc.h +// +// Emulate various non-portable glibc functions. +// +// This file is licensed under the GPLv2 or later +// +// Copyright (C) 2016 Adrian Johnson <[email protected]> +// +//======================================================================== + +#ifndef GLIBC_H +#define GLIBC_H + +#include "config.h" + +#include <time.h> + +extern "C" { + +#ifndef HAVE_GMTIME_R +struct tm *gmtime_r(const time_t *timep, struct tm *result); +#endif + +#ifndef HAVE_LOCALTIME_R +struct tm *localtime_r(const time_t *timep, struct tm *result); +#endif + +}; + +#endif // GLIBC_H + diff --git a/poppler/DateInfo.cc b/poppler/DateInfo.cc index 8cd4883..99da404 100644 --- a/poppler/DateInfo.cc +++ b/poppler/DateInfo.cc @@ -22,6 +22,7 @@ #include <config.h> +#include "glibc.h" #include "DateInfo.h" #include <stdio.h> @@ -81,13 +82,9 @@ GooString *timeToDateString(time_t *timet) { struct tm *gt; size_t len; time_t timep = timet ? *timet : time(NULL); - -#ifdef HAVE_GMTIME_R struct tm t; + gt = gmtime_r (&timep, &t); -#else - gt = gmtime (&timep); -#endif dateString = new GooString ("D:"); _______________________________________________ poppler mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/poppler
