42 #include "../my_config.h"
55 #define ESCAPE_FIXED_SEQUENCE_NORMAL 0xAD
56 #define ESCAPE_FIXED_SEQUENCE_SPARSE_FILE 0xAE
58 #define MAX_BUFFER_SIZE 102400
60 #if SSIZE_MAX < MAX_BUFFER_SIZE
61 #undef MAX_BUFFER_SIZE
62 #define MAX_BUFFER_SIZE SSIZE_MAX
72 class escape :
public generic_file
106 escape(generic_file *below,
107 const std::set<sequence_type> & x_unjumpable
109 escape(
const escape & ref) :
generic_file(ref) { copy_from(ref); };
110 escape(escape && ref) noexcept :
generic_file(std::move(ref)) { nullifyptr(); move_from(std::move(ref)); };
111 escape & operator = (
const escape & ref);
112 escape & operator = (escape && ref) noexcept {
generic_file::operator = (std::move(ref)); move_from(std::move(ref));
return *
this; };
117 void add_mark_at_current_position(sequence_type t);
125 bool skip_to_next_mark(sequence_type t,
bool jump);
126 bool next_to_read_is_mark(sequence_type t);
127 bool next_to_read_is_which_mark(sequence_type & t);
129 void add_unjumpable_mark(sequence_type t) {
if(
is_terminated())
throw SRC_BUG; unjumpable.insert(t); };
130 void remove_unjumpable_mark(sequence_type t);
131 bool is_unjumpable_mark(sequence_type t)
const {
return unjumpable.find(t) != unjumpable.end(); };
132 void clear_all_unjumpable_marks() { unjumpable.clear(); };
140 virtual bool skippable(skippability direction,
const infinint & amount)
override;
141 virtual bool skip(
const infinint & pos)
override;
142 virtual bool skip_to_eof()
override;
143 virtual bool skip_relative(S_I x)
override;
144 virtual bool truncatable(
const infinint & pos)
const override {
return x_below->truncatable(pos); };
145 virtual infinint get_position()
const override;
148 virtual void inherited_read_ahead(
const infinint & amount)
override;
149 virtual U_I inherited_read(
char *a, U_I size)
override;
150 virtual void inherited_write(
const char *a, U_I size)
override;
151 virtual void inherited_truncate(
const infinint & pos)
override;
152 virtual void inherited_sync_write()
override { flush_write(); };
153 virtual void inherited_flush_read()
override { flush_write(); clean_read(); };
154 virtual void inherited_terminate()
override { flush_or_clean(); };
156 void change_fixed_escape_sequence(
unsigned char value) { fixed_sequence[0] = value; };
157 bool has_escaped_data_since_last_skip()
const {
return escaped_data_count_since_last_skip > 0; };
164 static constexpr U_I ESCAPE_SEQUENCE_LENGTH = 6;
165 static constexpr U_I INITIAL_WRITE_BUFFER_SIZE = 2*ESCAPE_SEQUENCE_LENGTH;
166 static constexpr U_I INITIAL_READ_BUFFER_SIZE = MAX_BUFFER_SIZE;
167 static const infinint READ_BUFFER_SIZE_INFININT;
176 static const unsigned char usual_fixed_sequence[ESCAPE_SEQUENCE_LENGTH];
181 U_I write_buffer_size;
182 char write_buffer[INITIAL_WRITE_BUFFER_SIZE];
186 U_I escape_seq_offset_in_buffer;
188 U_I read_buffer_size;
189 U_I read_buffer_alloc;
190 std::set<sequence_type> unjumpable;
191 unsigned char fixed_sequence[ESCAPE_SEQUENCE_LENGTH];
192 infinint escaped_data_count_since_last_skip;
193 infinint below_position;
197 void set_fixed_sequence_for(sequence_type t) { fixed_sequence[ESCAPE_SEQUENCE_LENGTH - 1] = type2char(t); };
198 void check_below()
const {
if(x_below ==
nullptr)
throw SRC_BUG; };
201 void flush_or_clean()
216 void nullifyptr() noexcept { x_below =
nullptr; };
217 void copy_from(
const escape & ref);
218 void move_from(escape && ref) noexcept;
219 bool mini_read_buffer();
224 static char type2char(sequence_type x);
225 static sequence_type char2type(
char x);
233 static U_I trouve_amorce(
const char *a, U_I size,
const unsigned char escape_sequence[ESCAPE_SEQUENCE_LENGTH]);
243 static U_I remove_data_marks_and_stop_at_first_real_mark(
char *a, U_I size, U_I & delta,
const unsigned char escape_sequence[ESCAPE_SEQUENCE_LENGTH]);
generic_file(gf_mode m)
main constructor
generic_file & operator=(const generic_file &ref)
assignment operator
bool is_terminated() const
gf_mode get_mode() const
retreive the openning mode for this object
class generic_file is defined here as well as class fichier
@ gf_write_only
write only access
@ gf_read_only
read only access
@ gf_read_write
read and write access
libdar namespace encapsulate all libdar symbols