159 lines
4.4 KiB
Diff
159 lines
4.4 KiB
Diff
|
--- foo/misc/boost/boost/spirit/home/classic/iterator/impl/file_iterator.ipp.orig
|
||
|
+++ foo/misc/boost/boost/spirit/home/classic/iterator/impl/file_iterator.ipp
|
||
|
@@ -181,67 +181,28 @@ public:
|
||
|
{}
|
||
|
|
||
|
explicit mmap_file_iterator(std::string const& fileName)
|
||
|
- : m_filesize(0), m_curChar(0)
|
||
|
- {
|
||
|
- HANDLE hFile = ::CreateFileA(
|
||
|
+ : mmap_file_iterator(::CreateFileA(
|
||
|
fileName.c_str(),
|
||
|
GENERIC_READ,
|
||
|
- FILE_SHARE_READ,
|
||
|
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||
|
NULL,
|
||
|
OPEN_EXISTING,
|
||
|
FILE_FLAG_SEQUENTIAL_SCAN,
|
||
|
NULL
|
||
|
- );
|
||
|
-
|
||
|
- if (hFile == INVALID_HANDLE_VALUE)
|
||
|
- return;
|
||
|
-
|
||
|
- // Store the size of the file, it's used to construct
|
||
|
- // the end iterator
|
||
|
- m_filesize = ::GetFileSize(hFile, NULL);
|
||
|
+ ))
|
||
|
+ {}
|
||
|
|
||
|
- HANDLE hMap = ::CreateFileMapping(
|
||
|
- hFile,
|
||
|
+ explicit mmap_file_iterator(std::wstring const& fileName)
|
||
|
+ : mmap_file_iterator(::CreateFileW(
|
||
|
+ fileName.c_str(),
|
||
|
+ GENERIC_READ,
|
||
|
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||
|
NULL,
|
||
|
- PAGE_READONLY,
|
||
|
- 0, 0,
|
||
|
+ OPEN_EXISTING,
|
||
|
+ FILE_FLAG_SEQUENTIAL_SCAN,
|
||
|
NULL
|
||
|
- );
|
||
|
-
|
||
|
- if (hMap == NULL)
|
||
|
- {
|
||
|
- ::CloseHandle(hFile);
|
||
|
- return;
|
||
|
- }
|
||
|
-
|
||
|
- LPVOID pMem = ::MapViewOfFile(
|
||
|
- hMap,
|
||
|
- FILE_MAP_READ,
|
||
|
- 0, 0, 0
|
||
|
- );
|
||
|
-
|
||
|
- if (pMem == NULL)
|
||
|
- {
|
||
|
- ::CloseHandle(hMap);
|
||
|
- ::CloseHandle(hFile);
|
||
|
- return;
|
||
|
- }
|
||
|
-
|
||
|
- // We hold both the file handle and the memory pointer.
|
||
|
- // We can close the hMap handle now because Windows holds internally
|
||
|
- // a reference to it since there is a view mapped.
|
||
|
- ::CloseHandle(hMap);
|
||
|
-
|
||
|
- // It seems like we can close the file handle as well (because
|
||
|
- // a reference is hold by the filemap object).
|
||
|
- ::CloseHandle(hFile);
|
||
|
-
|
||
|
- // Store the handles inside the shared_ptr (with the custom destructors)
|
||
|
- m_mem.reset(static_cast<CharT*>(pMem), ::UnmapViewOfFile);
|
||
|
-
|
||
|
- // Start of the file
|
||
|
- m_curChar = m_mem.get();
|
||
|
- }
|
||
|
+ ))
|
||
|
+ {}
|
||
|
|
||
|
mmap_file_iterator(const mmap_file_iterator& iter)
|
||
|
{ *this = iter; }
|
||
|
@@ -290,6 +251,59 @@ private:
|
||
|
boost::shared_ptr<CharT> m_mem;
|
||
|
std::size_t m_filesize;
|
||
|
CharT* m_curChar;
|
||
|
+
|
||
|
+ explicit mmap_file_iterator(HANDLE hFile)
|
||
|
+ : m_filesize(0), m_curChar(0)
|
||
|
+ {
|
||
|
+ if (hFile == INVALID_HANDLE_VALUE)
|
||
|
+ return;
|
||
|
+
|
||
|
+ // Store the size of the file, it's used to construct
|
||
|
+ // the end iterator
|
||
|
+ m_filesize = ::GetFileSize(hFile, NULL);
|
||
|
+
|
||
|
+ HANDLE hMap = ::CreateFileMapping(
|
||
|
+ hFile,
|
||
|
+ NULL,
|
||
|
+ PAGE_READONLY,
|
||
|
+ 0, 0,
|
||
|
+ NULL
|
||
|
+ );
|
||
|
+
|
||
|
+ if (hMap == NULL)
|
||
|
+ {
|
||
|
+ ::CloseHandle(hFile);
|
||
|
+ return;
|
||
|
+ }
|
||
|
+
|
||
|
+ LPVOID pMem = ::MapViewOfFile(
|
||
|
+ hMap,
|
||
|
+ FILE_MAP_READ,
|
||
|
+ 0, 0, 0
|
||
|
+ );
|
||
|
+
|
||
|
+ if (pMem == NULL)
|
||
|
+ {
|
||
|
+ ::CloseHandle(hMap);
|
||
|
+ ::CloseHandle(hFile);
|
||
|
+ return;
|
||
|
+ }
|
||
|
+
|
||
|
+ // We hold both the file handle and the memory pointer.
|
||
|
+ // We can close the hMap handle now because Windows holds internally
|
||
|
+ // a reference to it since there is a view mapped.
|
||
|
+ ::CloseHandle(hMap);
|
||
|
+
|
||
|
+ // It seems like we can close the file handle as well (because
|
||
|
+ // a reference is hold by the filemap object).
|
||
|
+ ::CloseHandle(hFile);
|
||
|
+
|
||
|
+ // Store the handles inside the shared_ptr (with the custom destructors)
|
||
|
+ m_mem.reset(static_cast<CharT*>(pMem), ::UnmapViewOfFile);
|
||
|
+
|
||
|
+ // Start of the file
|
||
|
+ m_curChar = m_mem.get();
|
||
|
+ }
|
||
|
};
|
||
|
|
||
|
#endif // BOOST_SPIRIT_FILEITERATOR_WINDOWS
|
||
|
--- foo/misc/boost/boost/spirit/home/classic/iterator/file_iterator.hpp.orig
|
||
|
+++ foo/misc/boost/boost/spirit/home/classic/iterator/file_iterator.hpp
|
||
|
@@ -170,6 +170,12 @@ public:
|
||
|
: base_t(adapted_t(fileName))
|
||
|
{}
|
||
|
|
||
|
+#ifdef BOOST_SPIRIT_FILEITERATOR_WINDOWS
|
||
|
+ file_iterator(std::wstring const& fileName)
|
||
|
+ : base_t(adapted_t(fileName))
|
||
|
+ {}
|
||
|
+#endif
|
||
|
+
|
||
|
file_iterator(const base_t& iter)
|
||
|
: base_t(iter)
|
||
|
{}
|