mirror of
https://github.com/Dushistov/sdcv.git
synced 2025-12-22 20:50:52 +00:00
0.4.2 release
This commit is contained in:
94
src/lib/mapfile.hpp
Normal file
94
src/lib/mapfile.hpp
Normal file
@@ -0,0 +1,94 @@
|
||||
#ifndef _MAPFILE_HPP_
|
||||
#define _MAPFILE_HPP_
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_MMAP
|
||||
# include <sys/types.h>
|
||||
# include <fcntl.h>
|
||||
# include <sys/mman.h>
|
||||
#endif
|
||||
#ifdef _WIN32
|
||||
# include <windows.h>
|
||||
#endif
|
||||
#include <glib.h>
|
||||
|
||||
class MapFile {
|
||||
public:
|
||||
MapFile(void) :
|
||||
data(NULL),
|
||||
#ifdef HAVE_MMAP
|
||||
mmap_fd(-1)
|
||||
#elif defined(_WIN32)
|
||||
hFile(0),
|
||||
hFileMap(0)
|
||||
#endif
|
||||
{
|
||||
}
|
||||
~MapFile();
|
||||
bool open(const char *file_name, unsigned long file_size);
|
||||
inline gchar *begin(void) { return data; }
|
||||
private:
|
||||
char *data;
|
||||
unsigned long size;
|
||||
#ifdef HAVE_MMAP
|
||||
int mmap_fd;
|
||||
#elif defined(_WIN32)
|
||||
HANDLE hFile;
|
||||
HANDLE hFileMap;
|
||||
#endif
|
||||
};
|
||||
|
||||
inline bool MapFile::open(const char *file_name, unsigned long file_size)
|
||||
{
|
||||
size=file_size;
|
||||
#ifdef HAVE_MMAP
|
||||
if ((mmap_fd = ::open(file_name, O_RDONLY)) < 0) {
|
||||
//g_print("Open file %s failed!\n",fullfilename);
|
||||
return false;
|
||||
}
|
||||
data = (gchar *)mmap( NULL, file_size, PROT_READ, MAP_SHARED, mmap_fd, 0);
|
||||
if ((void *)data == (void *)(-1)) {
|
||||
//g_print("mmap file %s failed!\n",idxfilename);
|
||||
data=NULL;
|
||||
return false;
|
||||
}
|
||||
#elif defined( _WIN32)
|
||||
hFile = CreateFile(file_name, GENERIC_READ, 0, NULL, OPEN_ALWAYS,
|
||||
FILE_ATTRIBUTE_NORMAL, 0);
|
||||
hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0,
|
||||
file_size, NULL);
|
||||
data = (gchar *)MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, file_size);
|
||||
#else
|
||||
gsize read_len;
|
||||
if (!g_file_get_contents(file_name, &data, &read_len, NULL))
|
||||
return false;
|
||||
|
||||
if (read_len!=file_size)
|
||||
return false;
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
inline MapFile::~MapFile()
|
||||
{
|
||||
if (!data)
|
||||
return;
|
||||
#ifdef HAVE_MMAP
|
||||
munmap(data, size);
|
||||
close(mmap_fd);
|
||||
#else
|
||||
# ifdef _WIN32
|
||||
UnmapViewOfFile(data);
|
||||
CloseHandle(hFileMap);
|
||||
CloseHandle(hFile);
|
||||
# else
|
||||
g_free(data);
|
||||
# endif
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif//!_MAPFILE_HPP_
|
||||
Reference in New Issue
Block a user