cprover
Toggle main menu visibility
Loading...
Searching...
No Matches
mz_zip_archive.cpp
Go to the documentation of this file.
1
/*******************************************************************\
2
3
Module: mz_zip library wrapper
4
5
Author: Diffblue Ltd
6
7
\*******************************************************************/
8
9
#include "
mz_zip_archive.h
"
10
#include <stdexcept>
11
#include <string>
12
#define _LARGEFILE64_SOURCE 1
13
#include <
miniz/miniz.h
>
14
15
// Original struct is an anonymous struct with a typedef, This is
16
// required to remove internals from the header file
17
class
mz_zip_archive_statet
final:
public
mz_zip_archive
18
{
19
public
:
20
explicit
mz_zip_archive_statet
(
const
std::string &filename):
21
mz_zip_archive({ })
22
{
23
if
(MZ_TRUE!=
mz_zip_reader_init_file
(
this
, filename.data(), 0))
24
throw
std::runtime_error(
"MZT: Could not load a file: "
+filename);
25
}
26
27
mz_zip_archive_statet
(
const
void
*
data
,
size_t
size):
28
mz_zip_archive({ })
29
{
30
if
(MZ_TRUE!=
mz_zip_reader_init_mem
(
this
,
data
, size, 0))
31
throw
std::runtime_error(
"MZT: Could not load data from memory"
);
32
}
33
34
mz_zip_archive_statet
(
const
mz_zip_archive_statet
&)=
delete
;
35
mz_zip_archive_statet
(
mz_zip_archive_statet
&&)=
delete
;
36
mz_zip_archive_statet
&
operator=
(
const
mz_zip_archive_statet
&)=
delete
;
37
mz_zip_archive_statet
&
operator=
(
mz_zip_archive_statet
&&)=
delete
;
38
~mz_zip_archive_statet
()
39
{
40
mz_zip_reader_end
(
this
);
41
}
42
};
43
44
static_assert
(
sizeof
(mz_uint)<=
sizeof
(size_t),
45
"size_t cannot store mz_zip file ids, choose a larger type"
);
46
47
mz_zip_archivet::mz_zip_archivet
(
const
std::string &filename):
48
m_state
(new
mz_zip_archive_statet
(filename)) { }
49
50
mz_zip_archivet::mz_zip_archivet
(
const
void
*
data
,
size_t
size):
51
m_state
(new
mz_zip_archive_statet
(
data
, size)) { }
52
53
// VS Compatibility
54
mz_zip_archivet::mz_zip_archivet
(
mz_zip_archivet
&&other):
55
m_state
(
std
::move(other.
m_state
)) { }
56
57
// Has to be defined here because header is incomplete
58
mz_zip_archivet::~mz_zip_archivet
()=
default
;
59
60
// VS Compatibility
61
mz_zip_archivet
&
mz_zip_archivet::operator=
(
mz_zip_archivet
&&other)
62
{
63
m_state
=std::move(other.m_state);
64
return
*
this
;
65
}
66
67
size_t
mz_zip_archivet::get_num_files
()
68
{
69
return
mz_zip_reader_get_num_files
(
m_state
.get());
70
}
71
72
std::string
mz_zip_archivet::get_filename
(
const
size_t
index)
73
{
74
const
auto
id
=
static_cast<
mz_uint
>
(index);
75
mz_uint name_size =
mz_zip_reader_get_filename
(
m_state
.get(),
id
,
nullptr
, 0);
76
if
(name_size == 0)
77
return
{};
// Failure
78
// It is valid to directly write to a string's buffer (see C++11 standard,
79
// basic_string general requirements [string.require], 21.4.1.5)
80
std::string buffer(name_size,
'\0'
);
81
mz_zip_reader_get_filename
(
m_state
.get(),
id
, &buffer[0], buffer.size());
82
// Buffer contains trailing \0
83
buffer.resize(name_size - 1);
84
return
buffer;
85
}
86
87
std::string
mz_zip_archivet::extract
(
const
size_t
index)
88
{
89
const
auto
id
=
static_cast<
mz_uint
>
(index);
90
mz_zip_archive_file_stat file_stat={ };
91
const
mz_bool stat_ok=
mz_zip_reader_file_stat
(
m_state
.get(),
id
, &file_stat);
92
if
(stat_ok==MZ_TRUE)
93
{
94
// It is valid to directly write to a string's buffer (see C++11 standard,
95
// basic_string general requirements [string.require], 21.4.1.5)
96
std::string buffer(file_stat.m_uncomp_size,
'\0'
);
97
const
mz_bool read_ok =
mz_zip_reader_extract_to_mem
(
98
m_state
.get(),
id
, &buffer[0], buffer.size(), 0);
99
if
(read_ok == MZ_TRUE)
100
return
buffer;
101
}
102
throw
std::runtime_error(
"Could not extract the file"
);
103
}
104
105
void
mz_zip_archivet::extract_to_file
(
106
const
size_t
index,
107
const
std::string &path)
108
{
109
const
auto
id
=
static_cast<
mz_uint
>
(index);
110
if
(
111
mz_zip_reader_extract_to_file
(
m_state
.get(),
id
, path.c_str(), 0) !=
112
MZ_TRUE)
113
{
114
throw
std::runtime_error(
"Could not extract the file"
);
115
}
116
}
mz_zip_archive_statet
Definition
mz_zip_archive.cpp:18
mz_zip_archive_statet::mz_zip_archive_statet
mz_zip_archive_statet(mz_zip_archive_statet &&)=delete
mz_zip_archive_statet::~mz_zip_archive_statet
~mz_zip_archive_statet()
Definition
mz_zip_archive.cpp:38
mz_zip_archive_statet::mz_zip_archive_statet
mz_zip_archive_statet(const std::string &filename)
Definition
mz_zip_archive.cpp:20
mz_zip_archive_statet::mz_zip_archive_statet
mz_zip_archive_statet(const void *data, size_t size)
Definition
mz_zip_archive.cpp:27
mz_zip_archive_statet::mz_zip_archive_statet
mz_zip_archive_statet(const mz_zip_archive_statet &)=delete
mz_zip_archive_statet::operator=
mz_zip_archive_statet & operator=(mz_zip_archive_statet &&)=delete
mz_zip_archive_statet::operator=
mz_zip_archive_statet & operator=(const mz_zip_archive_statet &)=delete
mz_zip_archivet::get_num_files
size_t get_num_files()
Get number of files in the archive.
Definition
mz_zip_archive.cpp:67
mz_zip_archivet::extract
std::string extract(size_t index)
Get contents of nth file in the archive.
Definition
mz_zip_archive.cpp:87
mz_zip_archivet::extract_to_file
void extract_to_file(size_t index, const std::string &path)
Write contents of nth file in the archive to a file.
Definition
mz_zip_archive.cpp:105
mz_zip_archivet::~mz_zip_archivet
~mz_zip_archivet()
mz_zip_archivet::get_filename
std::string get_filename(size_t index)
Get file name of nth file in the archive.
Definition
mz_zip_archive.cpp:72
mz_zip_archivet::m_state
std::unique_ptr< mz_zip_archive_statet > m_state
Definition
mz_zip_archive.h:61
mz_zip_archivet::mz_zip_archivet
mz_zip_archivet(const std::string &filename)
Open a zip archive.
Definition
mz_zip_archive.cpp:47
mz_zip_archivet::operator=
mz_zip_archivet & operator=(const mz_zip_archivet &)=delete
mz_zip_reader_end
mz_bool mz_zip_reader_end(mz_zip_archive *pZip)
Definition
miniz.cpp:4036
mz_zip_reader_get_num_files
mz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip)
Definition
miniz.cpp:7842
mz_zip_reader_init_file
mz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint32 flags)
Definition
miniz.cpp:4116
mz_zip_reader_init_mem
mz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem, size_t size, mz_uint flags)
Definition
miniz.cpp:4068
mz_zip_reader_extract_to_mem
mz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags)
Definition
miniz.cpp:4728
mz_zip_reader_file_stat
mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, mz_zip_archive_file_stat *pStat)
Definition
miniz.cpp:7897
mz_zip_reader_extract_to_file
mz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, const char *pDst_filename, mz_uint flags)
Definition
miniz.cpp:5301
mz_zip_reader_get_filename
mz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, char *pFilename, mz_uint filename_buf_size)
Definition
miniz.cpp:7876
miniz.h
mz_zip_archive.h
std
STL namespace.
data
Definition
kdev_t.h:24
jbmc
src
java_bytecode
mz_zip_archive.cpp
Generated by
1.17.0