LHAFileHeader *lha_reader_next_file(LHAReader *reader) { // Free the current decoder if there is one. if (reader->decoder != NULL) { if (reader->inner_decoder == reader->decoder) { reader->inner_decoder = NULL; } lha_decoder_free(reader->decoder); reader->decoder = NULL; } if (reader->inner_decoder != NULL) { lha_decoder_free(reader->inner_decoder); reader->inner_decoder = NULL; } // No point continuing once the end of the input stream has // been reached. if (reader->curr_file_type == CURR_FILE_EOF) { return NULL; } // Advance to the next file from the input stream? // Don't advance until we've done the fake directories first. if (reader->curr_file_type == CURR_FILE_START || reader->curr_file_type == CURR_FILE_NORMAL) { lha_basic_reader_next_file(reader->reader); } // Pop off all appropriate directories from the stack first. if (end_of_top_dir(reader)) { reader->curr_file = reader->dir_stack; reader->dir_stack = reader->dir_stack->_next; reader->curr_file_type = CURR_FILE_FAKE_DIR; } else { reader->curr_file = lha_basic_reader_curr_file(reader->reader); if (reader->curr_file != NULL) { reader->curr_file_type = CURR_FILE_NORMAL; } else { reader->curr_file_type = CURR_FILE_EOF; } } return reader->curr_file; }
int main(int argc, char *argv[]) { LHAInputStream *stream; LHABasicReader *reader; LHAFileHeader *header; if (argc < 2) { printf("Usage: %s <filename>\n", argv[0]); exit(-1); } // Give output in binary mode for cross-platform consistency, // so that it can be compared correctly on Windows. lha_arch_set_binary(stdout); stream = lha_input_stream_from(argv[1]); if (stream == NULL) { fprintf(stderr, "Failed to open '%s'\n", argv[1]); exit(-1); } reader = lha_basic_reader_new(stream); for (;;) { header = lha_basic_reader_next_file(reader); if (header == NULL) { break; } print_header(header); printf("--\n"); } lha_basic_reader_free(reader); lha_input_stream_free(stream); return 0; }