summaryrefslogtreecommitdiffstats
path: root/lzd.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lzd.cc')
-rw-r--r--lzd.cc31
1 files changed, 15 insertions, 16 deletions
diff --git a/lzd.cc b/lzd.cc
index b069f0c..f1a500e 100644
--- a/lzd.cc
+++ b/lzd.cc
@@ -1,5 +1,5 @@
/* Lzd - Educational decompressor for lzip files
- Copyright (C) 2013 Antonio Diaz Diaz.
+ Copyright (C) 2013, 2014 Antonio Diaz Diaz.
This program is free software: you have unlimited permission
to copy, distribute and modify it.
@@ -21,7 +21,7 @@
#include <cstring>
#include <stdint.h>
#include <unistd.h>
-#if defined(__MSVCRT__) || defined(__OS2__)
+#if defined(__MSVCRT__) || defined(__OS2__) || defined(_MSC_VER)
#include <fcntl.h>
#include <io.h>
#endif
@@ -213,7 +213,7 @@ public:
break;
}
}
- return symbol - 0x100;
+ return symbol & 0xFF;
}
int decode_len( Len_model & lm, const int pos_state )
@@ -263,7 +263,7 @@ public:
pos( 0 ),
stream_pos( 0 ),
crc_( 0xFFFFFFFFU )
- { buffer[dictionary_size-1] = 0; } // prev_byte of first_byte
+ { buffer[dictionary_size-1] = 0; } // prev_byte of first byte
~LZ_decoder() { delete[] buffer; }
@@ -282,7 +282,7 @@ void LZ_decoder::flush_data()
crc32.update_buf( crc_, buffer + stream_pos, size );
errno = 0;
if( std::fwrite( buffer + stream_pos, 1, size, stdout ) != size )
- { std::fprintf( stderr, "Write error: %s\n", std::strerror( errno ) );
+ { std::fprintf( stderr, "Write error: %s.\n", std::strerror( errno ) );
std::exit( 1 ); }
if( pos >= dictionary_size ) { partial_data_pos += pos; pos = 0; }
stream_pos = pos;
@@ -380,13 +380,13 @@ bool LZ_decoder::decode_member() // Returns false if error
}
}
state.set_match();
- if( rep0 >= dictionary_size || ( rep0 >= pos && !partial_data_pos ) )
- return false;
+ if( rep0 >= dictionary_size || rep0 >= data_position() )
+ { flush_data(); return false; }
}
- for( int i = 0; i < len; ++i )
- put_byte( get_byte( rep0 ) );
+ for( int i = 0; i < len; ++i ) put_byte( get_byte( rep0 ) );
}
}
+ flush_data();
return false;
}
@@ -402,7 +402,7 @@ int main( const int argc, const char * const argv[] )
"It is not safe to use lzd for any real work.\n"
"\nUsage: %s < file.lz > file\n", argv[0] );
std::printf( "Lzd decompresses from standard input to standard output.\n"
- "\nCopyright (C) 2013 Antonio Diaz Diaz.\n"
+ "\nCopyright (C) 2014 Antonio Diaz Diaz.\n"
"This is free software: you are free to change and redistribute it.\n"
"There is NO WARRANTY, to the extent permitted by law.\n"
"Report bugs to lzip-bug@nongnu.org\n"
@@ -410,16 +410,15 @@ int main( const int argc, const char * const argv[] )
return 0;
}
-#if defined(__MSVCRT__) || defined(__OS2__)
- setmode( STDIN_FILENO, O_BINARY );
- setmode( STDOUT_FILENO, O_BINARY );
+#if defined(__MSVCRT__) || defined(__OS2__) || defined(_MSC_VER)
+ setmode( fileno( stdin ), O_BINARY );
+ setmode( fileno( stdout ), O_BINARY );
#endif
for( bool first_member = true; ; first_member = false )
{
File_header header;
- for( int i = 0; i < 6; ++i )
- header[i] = std::getc( stdin );
+ for( int i = 0; i < 6; ++i ) header[i] = std::getc( stdin );
if( std::feof( stdin ) || std::memcmp( header, "LZIP", 4 ) != 0 )
{
if( first_member )
@@ -454,7 +453,7 @@ int main( const int argc, const char * const argv[] )
}
if( std::fclose( stdout ) != 0 )
- { std::fprintf( stderr, "Can't close stdout: %s\n", std::strerror( errno ) );
+ { std::fprintf( stderr, "Can't close stdout: %s.\n", std::strerror( errno ) );
return 1; }
return 0;
}