diff --git a/common.c b/common.c index a7a12e8..e9af5ec 100644 --- a/common.c +++ b/common.c @@ -116,6 +116,7 @@ lzma_vli find_file_index(void **bdatap) { lzma_vli ret = iter.block.compressed_file_offset; if (xle64dec(gFileIndexBuf + gFIBPos) != PIXZ_INDEX_MAGIC) ret = 0; + gFIBPos += sizeof(uint64_t); if (bdatap && ret) { *bdatap = bdata; @@ -131,11 +132,11 @@ lzma_vli find_file_index(void **bdatap) { return ret; } -bool read_file_index(void) { +lzma_vli read_file_index(void) { void *bdata; - find_file_index(&bdata); + lzma_vli offset = find_file_index(&bdata); if (!bdata) - return false; + return 0; while (true) { char *name = read_file_index_name(); @@ -158,7 +159,7 @@ bool read_file_index(void) { lzma_end(&gStream); free(bdata); - return true; + return offset; } static char *read_file_index_name(void) { diff --git a/pixz.h b/pixz.h index ef8fa0e..f3d3bac 100644 --- a/pixz.h +++ b/pixz.h @@ -56,7 +56,7 @@ extern lzma_check gCheck; void decode_index(void); lzma_vli find_file_index(void **bdatap); -bool read_file_index(void); +lzma_vli read_file_index(void); void dump_file_index(FILE *out); void free_file_index(void); diff --git a/pread.c b/pread.c index 90622d7..3d58e99 100644 --- a/pread.c +++ b/pread.c @@ -18,11 +18,14 @@ static void read_thread(void); static void decode_thread(size_t thnum); +static char **gFileSpecs, **gFileSpecEnd; + static FILE *gOutFile; static lzma_vli gFileIndexOffset = 0; static size_t gBlockInSize = 0, gBlockOutSize = 0; static void set_block_sizes(); +static bool want_file(const char *name); int main(int argc, char **argv) { @@ -43,13 +46,19 @@ int main(int argc, char **argv) { die("Unknown option"); } } - argc -= optind - 1; - argv += optind - 1; - + gFileSpecs = argv + optind; + gFileSpecEnd = gFileSpecs + argc - optind; - // Find block sizes - gFileIndexOffset = find_file_index(NULL); + // Setup file index + gFileIndexOffset = read_file_index(); set_block_sizes(); + for (file_index_t *fi = gFileIndex; fi; fi = fi->next) { + if (!fi->name) + continue; + if (want_file(fi->name)) + printf("want: %s\n", fi->name); + } + exit(0); pipeline_create(block_create, block_free, read_thread, decode_thread); pipeline_item_t *pi; @@ -125,6 +134,21 @@ static void read_thread(void) { pipeline_stop(); } +static bool want_file(const char *name) { + for (char **spec = gFileSpecs; spec < gFileSpecEnd; ++spec) { + bool found = true; + for (const char *a = *spec, *b = name; *a; ++a, ++b) { + if (!*b || *a != *b) { + found = false; + break; + } + } + if (found) + return true; + } + return false; +} + static void decode_thread(size_t thnum) { lzma_stream stream = LZMA_STREAM_INIT; lzma_filter filters[LZMA_FILTERS_MAX + 1]; @@ -159,4 +183,3 @@ static void decode_thread(size_t thnum) { } lzma_end(&stream); } -