void lha_reader_free(LHAReader *reader) { LHAFileHeader *header; if (reader->decoder != NULL) { if (reader->inner_decoder == reader->decoder) { reader->inner_decoder = NULL; } lha_decoder_free(reader->decoder); } if (reader->inner_decoder != NULL) { lha_decoder_free(reader->inner_decoder); } // Free any file headers in the stack. while (reader->dir_stack != NULL) { header = reader->dir_stack; reader->dir_stack = header->_next; lha_file_header_free(header); } lha_basic_reader_free(reader->reader); free(reader); }
LHAReader *lha_reader_new(LHAInputStream *stream) { LHABasicReader *basic_reader; LHAReader *reader; basic_reader = lha_basic_reader_new(stream); if (basic_reader == NULL) { return NULL; } reader = malloc(sizeof(LHAReader)); if (reader == NULL) { lha_basic_reader_free(basic_reader); return NULL; } reader->reader = basic_reader; reader->curr_file = NULL; reader->curr_file_type = CURR_FILE_START; reader->decoder = NULL; reader->inner_decoder = NULL; reader->dir_stack = NULL; reader->dir_policy = LHA_READER_DIR_END_OF_DIR; return reader; }
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; }