From 64aa9e8b4541d4c008f3a669dff0cf01d0c5dcf9 Mon Sep 17 00:00:00 2001 From: erdgeist <> Date: Sun, 10 Aug 2008 03:24:00 +0000 Subject: More generic routine for old tbuch format --- src/extractblocks_new.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/extractblocks_new.c diff --git a/src/extractblocks_new.c b/src/extractblocks_new.c new file mode 100644 index 0000000..0a4792e --- /dev/null +++ b/src/extractblocks_new.c @@ -0,0 +1,73 @@ +#include +#include "mystdlib.h" +#include +#include + +int main( int args, char **argv ) +{ + int toindex; + int i, run = 1, filenum = 0, offset = 0, oldoffset = -1; + unsigned char *mappedfile; + MAP map; + + unsigned char mantra0 = 0x1b, mantra1 = 0x35, mantra2 = 0x2d, mantra3 = 0x6c; /* clean*/ +// unsigned char mantra0 = 0x08, mantra1 = 0x57, mantra2 = 0x64, mantra3 = 0x69; /* 98 H */ +// unsigned char mantra0 = 0x13, mantra1 = 0xe4, mantra2 = 0x55, mantra3 = 0x05; /* 99 F */ +// unsigned char mantra0 = 0x12, mantra1 = 0x08, mantra2 = 0x23, mantra3 = 0x01; /* 99 H */ + + unsigned long mantra; + + if( args != 2 ) + { fputs( "Missing filenames.", stderr ); exit( 1 ); } + + map = map_file( argv[1], 1 ); + mappedfile = map->addr; + + mantra0 ^= mappedfile[0]; + mantra1 ^= mappedfile[5]; + mantra2 ^= mappedfile[2]; + mantra3 ^= mappedfile[3]; + + mantra = mantra3 + (mantra2<<8) + (mantra1<<16) + (mantra0<<24); + + while( run ) + { + while( ( offset < map->size ) && ( + ( mappedfile[ offset + 0 ] != ( 0x1b^ mantra0 )) || + ( mappedfile[ offset + 2 ] != ( '-' ^ mantra2 )) || + ( mappedfile[ offset + 3 ] != ( 'l' ^ mantra3 )) || + ( mappedfile[ offset + 4 ] != ( 'h' ^ mantra0 )) || + ( mappedfile[ offset + 5 ] != ( '5' ^ mantra1 )) || + ( mappedfile[ offset + 6 ] != ( '-' ^ mantra2 )) + ) ) offset++; + + printf( "Found an appropriate offset at: %d\n", oldoffset ); + + if( offset == map->size ) + run = 0; + + if( oldoffset != -1 ) + { + unsigned long *mf = (unsigned long*)(mappedfile + oldoffset); + unsigned long df[8]; + char filename[20], cs = 0; + + for( i=0; i<8; ++i) df[i]=mf[i]^mantra; + + snprintf( filename, sizeof( filename ), "%05d.lha", filenum++ ); + memcpy( ((unsigned char*)df) + 22, filename, 5); + + for( i=2; i<29; ++i) cs += ((unsigned char*)df)[i]; + ((unsigned char*)df)[1] = cs; + + i = open( filename, O_CREAT | O_TRUNC | O_WRONLY, 0644 ); + write( i, df, 32 ); + write( i, mf + 8, offset - oldoffset - 32 ); + close( i ); + } + oldoffset = offset; + offset++; + } + + return 0; +} -- cgit v1.2.3