[Extractor-gtk-cvslog] SF.net SVN: extractor-gtk: [36] trunk/extractor/generic.c
Extract files from unusual archive formats
Brought to you by:
someone-guy
From: <som...@us...> - 2007-09-16 11:01:05
|
Revision: 36 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=36&view=rev Author: someone-guy Date: 2007-09-16 04:01:01 -0700 (Sun, 16 Sep 2007) Log Message: ----------- Add detection of end of bzip2 file Modified Paths: -------------- trunk/extractor/generic.c Modified: trunk/extractor/generic.c =================================================================== --- trunk/extractor/generic.c 2007-09-16 10:35:34 UTC (rev 35) +++ trunk/extractor/generic.c 2007-09-16 11:01:01 UTC (rev 36) @@ -29,6 +29,7 @@ static file_t *get_list(FILE *in) { register uint32_t t = 0; int i; + int bz2idx = -1; int cnt = 0; file_t *list = calloc(1, sizeof(file_t)); rewind(in); @@ -52,6 +53,7 @@ case TAG(0, 'B', 'Z', 'h'): add_entry(&list, cnt, "bz2"); list[cnt].start = ftell(in) - 3; + bz2idx = cnt; cnt++; break; case 0xffd8ff: @@ -75,6 +77,21 @@ } break; } + if (bz2idx >= 0) { + // bzip2 block end marker, between 25 and 32 bits of it are used + // change these and t to 64 bit for more accurate detection + uint32_t endmark = 0x177245385090ULL; + uint32_t mask = 0xffffffffffffULL; + for (i = 0; i < 8; i++) { + if ((t & mask) == endmark) { + // end marker plus space for CRC + list[bz2idx].len = ftell(in) - list[i].start + 4; + break; + } + endmark <<= 1; + mask <<= 1; + } + } } return list; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |