示例#1
0
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;
}
示例#2
0
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;
}