summaryrefslogtreecommitdiffstats
path: root/lzip.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--lzip.h44
1 files changed, 29 insertions, 15 deletions
diff --git a/lzip.h b/lzip.h
index fb910ba..86f4d64 100644
--- a/lzip.h
+++ b/lzip.h
@@ -98,9 +98,6 @@ struct Len_model
};
-// defined in main.cc
-extern int verbosity;
-
class Pretty_print // requires global var 'int verbosity'
{
std::string name_;
@@ -154,13 +151,17 @@ class CRC32
uint32_t data[256]; // Table of CRCs of all 8-bit messages.
public:
- CRC32()
+ explicit CRC32( const bool castagnoli = false )
{
+ const unsigned cpol = 0x82F63B78U; // CRC32-C Castagnoli polynomial
+ const unsigned ipol = 0xEDB88320U; // IEEE 802.3 Ethernet polynomial
+ const unsigned poly = castagnoli ? cpol : ipol;
+
for( unsigned n = 0; n < 256; ++n )
{
unsigned c = n;
for( int k = 0; k < 8; ++k )
- { if( c & 1 ) c = 0xEDB88320U ^ ( c >> 1 ); else c >>= 1; }
+ { if( c & 1 ) c = poly ^ ( c >> 1 ); else c >>= 1; }
data[n] = c;
}
}
@@ -179,6 +180,15 @@ public:
c = data[(c^buffer[i])&0xFF] ^ ( c >> 8 );
crc = c;
}
+
+ uint32_t compute_crc( const uint8_t * const buffer,
+ const unsigned long size ) const
+ {
+ uint32_t crc = 0xFFFFFFFFU;
+ for( unsigned long i = 0; i < size; ++i )
+ crc = data[(crc^buffer[i])&0xFF] ^ ( crc >> 8 );
+ return crc ^ 0xFFFFFFFFU;
+ }
};
extern const CRC32 crc32;
@@ -313,12 +323,12 @@ struct Cl_options // command-line options
{
bool ignore_empty;
bool ignore_errors;
- bool ignore_marking;
+ bool ignore_nonzero;
bool ignore_trailing;
bool loose_trailing;
Cl_options()
- : ignore_empty( true ), ignore_errors( false ), ignore_marking( true ),
+ : ignore_empty( false ), ignore_errors( false ), ignore_nonzero( false ),
ignore_trailing( true ), loose_trailing( false ) {}
};
@@ -333,6 +343,8 @@ class Block
public:
Block( const long long p, const long long s ) : pos_( p ), size_( s ) {}
+ Block & assign( const long long p, const long long s )
+ { pos_ = p; size_ = s; return *this; }
long long pos() const { return pos_; }
long long size() const { return size_; }
@@ -354,6 +366,8 @@ public:
{ return pos_ < b.end() && b.pos_ < end(); }
bool overlaps( const long long pos, const long long size ) const
{ return pos_ < pos + size && pos < end(); }
+ bool touches( const Block & b ) const // blocks are mergeable
+ { return pos_ <= b.end() && b.pos_ <= end(); }
Block split( const long long pos );
};
@@ -410,8 +424,10 @@ const char * const bad_magic_msg = "Bad magic number (file not in lzip format)."
const char * const bad_dict_msg = "Invalid dictionary size in member header.";
const char * const corrupt_mm_msg = "Corrupt header in multimember file.";
const char * const empty_msg = "Empty member not allowed.";
-const char * const marking_msg = "Marking data not allowed.";
+const char * const nonzero_msg = "Nonzero first LZMA byte.";
const char * const trailing_msg = "Trailing data not allowed.";
+const char * const mmap_msg = "Can't mmap";
+const char * const short_file_msg = "Input file is too short.";
// defined in alone_to_lz.cc
int alone_to_lz( const int infd, const Pretty_print & pp );
@@ -446,17 +462,13 @@ int dump_members( const std::vector< std::string > & filenames,
const bool force, const bool strip, const bool to_stdout );
int remove_members( const std::vector< std::string > & filenames,
const Cl_options & cl_opts, const Member_list & member_list );
-int clear_marking( const std::vector< std::string > & filenames,
- const Cl_options & cl_opts );
+int nonzero_repair( const std::vector< std::string > & filenames,
+ const Cl_options & cl_opts );
// defined in list.cc
int list_files( const std::vector< std::string > & filenames,
const Cl_options & cl_opts );
-// defined in lzip_index.cc
-int seek_read( const int fd, uint8_t * const buf, const int size,
- const long long pos );
-
// defined in lunzcrash.cc
int lunzcrash_bit( const char * const input_filename,
const Cl_options & cl_opts );
@@ -483,9 +495,11 @@ bool open_outstream( const bool force, const bool protect,
bool output_file_exists();
void cleanup_and_fail( const int retval );
bool check_tty_out();
+void format_trailing_bytes( const uint8_t * const data, const int size,
+ std::string & msg );
void set_signal_handler();
bool close_outstream( const struct stat * const in_statsp );
-std::string insert_fixed( std::string name );
+std::string insert_fixed( std::string name, const bool append_lz = true );
void show_2file_error( const char * const msg1, const char * const name1,
const char * const name2, const char * const msg2 );
class Range_decoder;