diff --git a/development/scons/scons_manifest.py b/development/scons/scons_manifest.py index ed1088340c..8c92a83224 100644 --- a/development/scons/scons_manifest.py +++ b/development/scons/scons_manifest.py @@ -341,7 +341,6 @@ src_support_files = Split(''' kill.cpp lassert.cpp lstrings.cpp - lyxsum.cpp lyxtime.cpp os.cpp qstring_helpers.cpp diff --git a/src/support/FileName.cpp b/src/support/FileName.cpp index d87ab63f4b..43a6f1eda7 100644 --- a/src/support/FileName.cpp +++ b/src/support/FileName.cpp @@ -16,6 +16,7 @@ #include "support/convert.h" #include "support/debug.h" #include "support/filetools.h" +#include "support/lassert.h" #include "support/lstrings.h" #include "support/qstring_helpers.h" #include "support/os.h" @@ -30,13 +31,15 @@ #include #include -#include "support/lassert.h" +#include #include +#include +#include +#include +#include #include #include -#include -#include #ifdef HAVE_SYS_TYPES_H # include @@ -75,11 +78,85 @@ extern "C" int mkstemp(char *); # endif #endif +// Various implementations of sum(), depending on what methods +// are available. Order is faster to slowest. +#if defined(HAVE_MMAP) && defined(HAVE_MUNMAP) +#define SUM_WITH_MMAP +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#include +#ifdef HAVE_UNISTD_H +# include +#endif +#include +#endif // SUM_WITH_MMAP + using namespace std; +// OK, this is ugly, but it is the only workaround I found to compile +// with gcc (any version) on a system which uses a non-GNU toolchain. +// The problem is that gcc uses a weak symbol for a particular +// instantiation and that the system linker usually does not +// understand those weak symbols (seen on HP-UX, tru64, AIX and +// others). Thus we force an explicit instanciation of this particular +// template (JMarc) +template struct boost::detail::crc_table_t<32, 0x04C11DB7, true>; + namespace lyx { namespace support { +static unsigned long sum(char const * file) +{ +#ifdef SUM_WITH_MMAP + //LYXERR(Debug::FILES, "lyx::sum() using mmap (lightning fast)"); + + int fd = open(file, O_RDONLY); + if (!fd) + return 0; + + struct stat info; + fstat(fd, &info); + + void * mm = mmap(0, info.st_size, PROT_READ, + MAP_PRIVATE, fd, 0); + // Some platforms have the wrong type for MAP_FAILED (compaq cxx). + if (mm == reinterpret_cast(MAP_FAILED)) { + close(fd); + return 0; + } + + char * beg = static_cast(mm); + char * end = beg + info.st_size; + + boost::crc_32_type crc; + crc.process_block(beg, end); + unsigned long result = crc.checksum(); + + munmap(mm, info.st_size); + close(fd); + + return result; + +#else // no SUM_WITH_MMAP + + //LYXERR(Debug::FILES, "lyx::sum() using istreambuf_iterator (fast)"); + ifstream ifs(file, ios_base::in | ios_base::binary); + if (!ifs) + return 0; + + istreambuf_iterator beg(ifs); + istreambuf_iterator end; + boost::crc_32_type crc; + crc = for_each(beg, end, crc); + return crc.checksum(); + +#endif // SUM_WITH_MMAP +} + ///////////////////////////////////////////////////////////////////// // @@ -431,8 +508,6 @@ bool FileName::chdir() const } -extern unsigned long sum(char const * file); - unsigned long FileName::checksum() const { if (!exists()) { diff --git a/src/support/Makefile.am b/src/support/Makefile.am index 1c1f8a038d..1b5f7086e0 100644 --- a/src/support/Makefile.am +++ b/src/support/Makefile.am @@ -72,7 +72,6 @@ liblyxsupport_la_SOURCES = \ lyxlib.h \ lyxtime.cpp \ lyxtime.h \ - lyxsum.cpp \ Messages.cpp \ Messages.h \ os.cpp \ diff --git a/src/support/lyxsum.cpp b/src/support/lyxsum.cpp deleted file mode 100644 index 0f15491802..0000000000 --- a/src/support/lyxsum.cpp +++ /dev/null @@ -1,133 +0,0 @@ -/** - * \file lyxsum.cpp - * This file is part of LyX, the document processor. - * Licence details can be found in the file COPYING. - * - * \author Lars Gullik Bjønnes - * - * Full author contact details are available in file CREDITS. - */ - -#include - -#include "support/debug.h" - -#include - -#include -#include - -using namespace std; - -// OK, this is ugly, but it is the only workaround I found to compile -// with gcc (any version) on a system which uses a non-GNU toolchain. -// The problem is that gcc uses a weak symbol for a particular -// instantiation and that the system linker usually does not -// understand those weak symbols (seen on HP-UX, tru64, AIX and -// others). Thus we force an explicit instanciation of this particular -// template (JMarc) -template struct boost::detail::crc_table_t<32, 0x04C11DB7, true>; - -// Various implementations of lyx::sum(), depending on what methods -// are available. Order is faster to slowest. -#if defined(HAVE_MMAP) && defined(HAVE_MUNMAP) - -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#include -#ifdef HAVE_UNISTD_H -# include -#endif - -#include - - -namespace lyx { -namespace support { - -unsigned long sum(char const * file) -{ - //LYXERR(Debug::FILES, "lyx::sum() using mmap (lightning fast)"); - - int fd = open(file, O_RDONLY); - if (!fd) - return 0; - - struct stat info; - fstat(fd, &info); - - void * mm = mmap(0, info.st_size, PROT_READ, - MAP_PRIVATE, fd, 0); - // Some platforms have the wrong type for MAP_FAILED (compaq cxx). - if (mm == reinterpret_cast(MAP_FAILED)) { - close(fd); - return 0; - } - - char * beg = static_cast(mm); - char * end = beg + info.st_size; - - boost::crc_32_type crc; - crc.process_block(beg, end); - unsigned long result = crc.checksum(); - - munmap(mm, info.st_size); - close(fd); - - return result; -} - -} // namespace support -} // namespace lyx - -#else // No mmap - -#include -#include - -namespace { - -template -inline -unsigned long do_crc(InputIterator first, InputIterator last) -{ - boost::crc_32_type crc; - crc = for_each(first, last, crc); - return crc.checksum(); -} - -} // namespace anon - - -namespace lyx { -namespace support { - - -unsigned long sum(char const * file) -{ - ifstream ifs(file, ios_base::in | ios_base::binary); - if (!ifs) - return 0; - -#if HAVE_DECL_ISTREAMBUF_ITERATOR - //LYXERR(Debug::FILES, "lyx::sum() using istreambuf_iterator (fast)"); - istreambuf_iterator beg(ifs); - istreambuf_iterator end; -#else - //LYXERR(Debug::FILES, "lyx::sum() using istream_iterator (slow as a snail)"); - ifs.unsetf(ios::skipws); - istream_iterator beg(ifs); - istream_iterator end; -#endif - - return do_crc(beg,end); -} - -} // namespace support -} // namespace lyx - -#endif // mmap