34#ifndef SPARSE_FILE_HPP
35#define SPARSE_FILE_HPP
49#define SPARSE_FIXED_ZEROED_BLOCK 40960
51#if SSIZE_MAX < MAX_BUFFER_SIZE
53#define SPARSE_FIXED_ZEROED_BLOCK SSIZE_MAX
63 class sparse_file :
public escape
71 sparse_file(
generic_file *below,
const infinint & hole_size = 15);
72 sparse_file(
const sparse_file & ref) =
default;
73 sparse_file(sparse_file && ref)
noexcept =
default;
74 sparse_file & operator = (
const sparse_file & ref) =
default;
75 sparse_file & operator = (sparse_file && ref)
noexcept =
default;
76 ~sparse_file() =
default;
81 void write_as_escape(
bool mode) { escape_write = mode; };
86 void read_as_escape(
bool mode) { escape_read = mode; };
91 void copy_to_without_skip(
bool mode) { copy_to_no_skip = mode; };
93 bool has_seen_hole()
const {
return seen_hole; };
94 bool has_escaped_data()
const {
return data_escaped; };
107 virtual void copy_to(
generic_file & ref)
override { crc *tmp =
nullptr; copy_to(ref, 0, tmp);
if(tmp !=
nullptr)
throw SRC_BUG; };
112 virtual void copy_to(
generic_file & ref,
const infinint & crc_size, crc * & value)
override;
115 virtual bool skippable(skippability direction,
const infinint & amount)
override {
return false; };
116 virtual bool skip(
const infinint & pos)
override {
if(pos != offset)
throw Efeature(
"skip in sparse_file");
else return true; };
117 virtual bool skip_to_eof()
override {
throw Efeature(
"skip in sparse_file"); };
118 virtual bool skip_relative(S_I x)
override {
if(x != 0)
throw Efeature(
"skip in sparse_file");
return true; };
119 virtual infinint get_position()
const override;
125 void add_mark_at_current_position(sequence_type t) { escape::add_mark_at_current_position(t); };
126 bool skip_to_next_mark(sequence_type t,
bool jump) {
return escape::skip_to_next_mark(t, jump); };
127 bool next_to_read_is_mark(sequence_type t) {
return escape::next_to_read_is_mark(t); };
128 void add_unjumpable_mark(sequence_type t) { escape::add_unjumpable_mark(t); };
132 virtual U_I inherited_read(
char *a, U_I size)
override;
133 virtual void inherited_write(
const char *a, U_I size)
override;
134 virtual void inherited_sync_write()
override;
139 static bool initialized;
140 static unsigned char zeroed_field[SPARSE_FIXED_ZEROED_BLOCK];
142 enum { normal, hole } mode;
145 infinint min_hole_size;
146 U_I UI_min_hole_size;
149 bool copy_to_no_skip;
155 void dump_pending_zeros();
158 void write_hole(
const infinint & length);
175 static bool look_for_hole(
const char *a, U_I size, U_I min_hole_size, U_I & start, U_I & length);
182 static U_I count_initial_zeros(
const char *a, U_I size);
generic_file(gf_mode m)
main constructor
class escape definition, used for sequential reading of archives
include macro defined by the configure script and some specific additional ones
libdar namespace encapsulate all libdar symbols
class generic_file is defined here as well as class fichier