add header decode and pipeline construction to image reader
This commit is contained in:
99
src/read.c
Normal file
99
src/read.c
Normal file
@@ -0,0 +1,99 @@
|
||||
#include "read.h"
|
||||
#include "bin.h"
|
||||
#include "pipeline.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
struct ec3_reader {
|
||||
unsigned short r_version;
|
||||
unsigned short r_cluster_size;
|
||||
size_t r_tag_table_offset;
|
||||
size_t r_extent_table_offset;
|
||||
size_t r_cluster_table_offset;
|
||||
unsigned int r_nr_tags;
|
||||
unsigned int r_nr_extents;
|
||||
unsigned int r_nr_cluster_groups;
|
||||
|
||||
uint64_t r_id;
|
||||
|
||||
struct ec3_pipeline *r_pipeline;
|
||||
};
|
||||
|
||||
static void decode_header(const struct ec3_header *in, struct ec3_reader *out)
|
||||
{
|
||||
out->r_version = b_i16_btoh(in->h_version);
|
||||
out->r_cluster_size = ec3_get_cluster_size(b_i16_btoh(in->h_cluster_size));
|
||||
out->r_tag_table_offset = b_i64_btoh(in->h_tag_table_offset);
|
||||
out->r_extent_table_offset = b_i64_btoh(in->h_extent_table_offset);
|
||||
out->r_cluster_table_offset = b_i64_btoh(in->h_cluster_table_offset);
|
||||
out->r_nr_tags = b_i32_btoh(in->h_tag_count);
|
||||
out->r_nr_extents = b_i32_btoh(in->h_tag_count);
|
||||
out->r_nr_cluster_groups = b_i32_btoh(in->h_cluster_group_count);
|
||||
}
|
||||
|
||||
enum ec3_status ec3_reader_create(FILE *inp, struct ec3_reader **out)
|
||||
{
|
||||
struct ec3_header header;
|
||||
|
||||
fseek(inp, 0, SEEK_SET);
|
||||
size_t r = fread(&header, sizeof header, 1, inp);
|
||||
|
||||
if (r != 1) {
|
||||
return ferror(inp) ? EC3_ERR_IO_FAILURE : EC3_ERR_BAD_FORMAT;
|
||||
}
|
||||
|
||||
if (b_i32_btoh(header.h_magic) != EC3_SIGNATURE) {
|
||||
return EC3_ERR_BAD_FORMAT;
|
||||
}
|
||||
|
||||
struct ec3_reader *reader = malloc(sizeof *reader);
|
||||
if (!reader) {
|
||||
return EC3_ERR_NO_MEMORY;
|
||||
}
|
||||
|
||||
memset(reader, 0x0, sizeof *reader);
|
||||
|
||||
decode_header(&header, reader);
|
||||
|
||||
unsigned short compression = b_i16_btoh(header.h_compression);
|
||||
unsigned short encryption = b_i16_btoh(header.h_encryption);
|
||||
|
||||
struct ec3_pipeline_stage_args stages[3] = { 0 };
|
||||
stages[0].type = EC3_PIPELINE_FILE;
|
||||
|
||||
if (encryption != EC3_ENCRYPTION_NONE) {
|
||||
stages[1].type = ec3_get_pipeline_stage_for_encryption_func(encryption);
|
||||
}
|
||||
|
||||
if (compression != EC3_COMPRESSION_NONE) {
|
||||
stages[2].type = ec3_get_pipeline_stage_for_compression_func(compression);
|
||||
}
|
||||
|
||||
enum ec3_status status = ec3_pipeline_create(
|
||||
stages,
|
||||
sizeof stages / sizeof stages[0],
|
||||
reader->r_cluster_size,
|
||||
&reader->r_pipeline);
|
||||
|
||||
if (status != EC3_SUCCESS) {
|
||||
free(reader);
|
||||
return status;
|
||||
}
|
||||
|
||||
return EC3_SUCCESS;
|
||||
}
|
||||
|
||||
void ec3_reader_finish(struct ec3_reader *reader)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
enum ec3_status ec3_reader_open_tag(struct ec3_reader *reader, uint64_t tag_ident, struct ec3_tag_reader **out)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
enum ec3_status ec3_tag_reader_close(struct ec3_tag_reader *tag)
|
||||
{
|
||||
|
||||
}
|
||||
19
src/read.h
Normal file
19
src/read.h
Normal file
@@ -0,0 +1,19 @@
|
||||
#ifndef READ_H_
|
||||
#define READ_H_
|
||||
|
||||
#include "status.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
struct ec3_reader;
|
||||
struct ec3_tag_reader;
|
||||
|
||||
extern enum ec3_status ec3_reader_create(FILE *inp, struct ec3_reader **out);
|
||||
extern void ec3_reader_finish(struct ec3_reader *reader);
|
||||
|
||||
extern enum ec3_status ec3_reader_open_tag(struct ec3_reader *reader, uint64_t tag_ident, struct ec3_tag_reader **out);
|
||||
|
||||
extern enum ec3_status ec3_tag_reader_close(struct ec3_tag_reader *tag);
|
||||
|
||||
#endif
|
||||
@@ -7,6 +7,7 @@ enum ec3_status {
|
||||
EC3_ERR_NO_ENTRY,
|
||||
EC3_ERR_NOT_SUPPORTED,
|
||||
EC3_ERR_BAD_STATE,
|
||||
EC3_ERR_BAD_FORMAT,
|
||||
EC3_ERR_INVALID_VALUE,
|
||||
EC3_ERR_NAME_EXISTS,
|
||||
EC3_ERR_IO_FAILURE,
|
||||
|
||||
Reference in New Issue
Block a user