diff options
Diffstat (limited to 'nerv/lib/io')
-rw-r--r-- | nerv/lib/io/chunk_file.c | 116 | ||||
-rw-r--r-- | nerv/lib/io/chunk_file.h | 32 |
2 files changed, 64 insertions, 84 deletions
diff --git a/nerv/lib/io/chunk_file.c b/nerv/lib/io/chunk_file.c index e70ffc9..4e00b0b 100644 --- a/nerv/lib/io/chunk_file.c +++ b/nerv/lib/io/chunk_file.c @@ -1,23 +1,25 @@ -#include "../../common.h" +#include "../common.h" #include "chunk_file.h" #include <stdlib.h> #include <string.h> #define PARAM_HEADER_SIZE 16 -static size_t read_chunk_header_plain(FILE *fp, int *status) { +static size_t read_chunk_header_plain(FILE *fp, Status *status) { static char buff[PARAM_HEADER_SIZE]; int i; size_t size = 0; if (fread(buff, 1, PARAM_HEADER_SIZE, fp) != PARAM_HEADER_SIZE) { - if (feof(fp)) *status = CF_END_OF_FILE; + if (feof(fp)) + NERV_SET_STATUS(status, CF_END_OF_FILE, 0); else { - *status = CF_INVALID_FORMAT; + NERV_SET_STATUS(status, CF_INVALID_FORMAT, 0); return 0; } } - else *status = CF_NORMAL; + else + NERV_SET_STATUS(status, NERV_NORMAL, 0); for (i = 0; i < PARAM_HEADER_SIZE; i++) if (isdigit(buff[i])) size = size * 10 + buff[i] - '0'; @@ -25,25 +27,19 @@ static size_t read_chunk_header_plain(FILE *fp, int *status) { return size; } -static void write_chunk_header_plain(FILE *fp, size_t size, int *status) { +static void write_chunk_header_plain(FILE *fp, size_t size, Status *status) { static char buff[PARAM_HEADER_SIZE]; int i; for (i = PARAM_HEADER_SIZE - 3; i > 0; i--, size /= 10) buff[i] = size % 10 + '0'; if (size) - { - *status = CF_SECTION_OVERFLOW; - return; - } + NERV_EXIT_STATUS(status, CF_SECTION_OVERFLOW, 0); buff[0] = '['; buff[PARAM_HEADER_SIZE - 2] = ']'; buff[PARAM_HEADER_SIZE - 1] = '\n'; if (fwrite(buff, 1, PARAM_HEADER_SIZE, fp) != PARAM_HEADER_SIZE) - { - *status = CF_WRITE_ERROR; - return; - } - *status = CF_NORMAL; + NERV_EXIT_STATUS(status, CF_WRITE_ERROR, 0); + NERV_SET_STATUS(status, NERV_NORMAL, 0); } static ChunkData *get_chunk_data(FILE *fp, ChunkInfo *info) { @@ -56,48 +52,47 @@ static ChunkData *get_chunk_data(FILE *fp, ChunkInfo *info) { return cdp; } -static const char *read_chunk_metadata(FILE *fp, const char *fn, int *status) { +static const char *read_chunk_metadata(FILE *fp, const char *fn, + Status *status) { #define LINEBUFF_SIZE 1024 #define LUA_RETURN "return " #define LUA_RETURN_LEN (sizeof(LUA_RETURN) - 1) static char buff[LUA_RETURN_LEN + LINEBUFF_SIZE] = LUA_RETURN; - *status = fgets(buff + LUA_RETURN_LEN, - LINEBUFF_SIZE, fp) == (buff + LUA_RETURN_LEN) ? \ - CF_NORMAL : CF_INVALID_FORMAT; + NERV_SET_STATUS(status, (fgets(buff + LUA_RETURN_LEN, + LINEBUFF_SIZE, fp) == (buff + LUA_RETURN_LEN) ? \ + NERV_NORMAL : CF_INVALID_FORMAT), 0); fprintf(stderr, "metadata: %s\n", buff); return buff; } -static void write_chunk_metadata(FILE *fp, const char *mdstr, int *status) { +static void write_chunk_metadata(FILE *fp, const char *mdstr, + Status *status) { size_t size = strlen(mdstr); if (fwrite(mdstr, 1, size, fp) != size || fprintf(fp, "\n") < 0) - { - *status = CF_WRITE_ERROR; - return; - } + NERV_EXIT_STATUS(status, CF_WRITE_ERROR, 0); /* fprintf(stderr, "metadata: %s\n", metadata_str); */ - *status = CF_NORMAL; + NERV_SET_STATUS(status, NERV_NORMAL, 0); } -static ChunkFile *open_write(const char *fn, int *status) { +static ChunkFile *open_write(const char *fn, Status *status) { ChunkFile *cfp; FILE *fp = fopen(fn, "w"); if (!fp) { - *status = CF_ERR_OPEN_FILE; + NERV_SET_STATUS(status, CF_ERR_OPEN_FILE, 0); return NULL; } cfp = (ChunkFile *)malloc(sizeof(ChunkFile)); cfp->fp = fp; cfp->info = NULL; cfp->status = CF_WRITE; - *status = CF_NORMAL; + NERV_SET_STATUS(status, NERV_NORMAL, 0); return cfp; } -static ChunkFile *open_read(const char *fn, int *status) { +static ChunkFile *open_read(const char *fn, Status *status) { size_t chunk_len; off_t offset; int i; @@ -108,7 +103,7 @@ static ChunkFile *open_read(const char *fn, int *status) { if (!fp) { - *status = CF_ERR_OPEN_FILE; + NERV_SET_STATUS(status, CF_ERR_OPEN_FILE, 0); return NULL; } cfp = (ChunkFile *)malloc(sizeof(ChunkFile)); @@ -121,18 +116,18 @@ static ChunkFile *open_read(const char *fn, int *status) { /* skip to the begining of chunk i */ if (fseeko(fp, offset, SEEK_SET) != 0) { - *status = CF_INVALID_FORMAT; + NERV_SET_STATUS(status, CF_INVALID_FORMAT, 0); return NULL; } /* read header */ chunk_len = read_chunk_header_plain(fp, status); - if (*status == CF_END_OF_FILE) break; - if (*status != CF_NORMAL) + if (status->err_code == CF_END_OF_FILE) break; + if (status->err_code != NERV_NORMAL) return NULL; cip = (ChunkInfo *)malloc(sizeof(ChunkInfo)); /* read metadata */ mdstr = read_chunk_metadata(fp, fn, status); - if (*status != CF_NORMAL) + if (status->err_code != NERV_NORMAL) return NULL; cip->metadata = strdup(mdstr); cip->offset = ftello(fp); @@ -142,14 +137,15 @@ static ChunkFile *open_read(const char *fn, int *status) { cip->next = head; head = cip; } - *status = CF_NORMAL; cfp->fp = fp; cfp->info = head; cfp->status = CF_READ; + NERV_SET_STATUS(status, NERV_NORMAL, 0); return cfp; } -ChunkFile *nerv_chunk_file_create(const char *fn, const char *mode, int *status) { +ChunkFile *nerv_chunk_file_create(const char *fn, const char *mode, + Status *status) { int rd = 1, bin = 0; size_t i, len = strlen(mode); for (i = 0; i < len; i++) @@ -163,41 +159,45 @@ ChunkFile *nerv_chunk_file_create(const char *fn, const char *mode, int *status) open_write(fn, status); } -int nerv_chunk_file_write_chunkdata(ChunkFile *cfp, const char *mdstr, - ChunkDataWriter_t writer, void *writer_arg) { - int status; +void nerv_chunk_file_write_chunkdata(ChunkFile *cfp, const char *mdstr, + ChunkDataWriter_t writer, void *writer_arg, + Status *status) { off_t start; size_t size; if (cfp->status != CF_WRITE) - return CF_INVALID_OP; + NERV_EXIT_STATUS(status, CF_INVALID_OP, 0); start = ftello(cfp->fp); - write_chunk_header_plain(cfp->fp, 0, &status); /* fill zeros */ - if (status != CF_NORMAL) return status; - write_chunk_metadata(cfp->fp, mdstr, &status); - if (status != CF_NORMAL) return status; + write_chunk_header_plain(cfp->fp, 0, status); /* fill zeros */ + if (status->err_code != NERV_NORMAL) + return; + write_chunk_metadata(cfp->fp, mdstr, status); + if (status->err_code != NERV_NORMAL) + return; writer(writer_arg); size = ftello(cfp->fp) - start; fseeko(cfp->fp, start, SEEK_SET); /* write the calced size */ - write_chunk_header_plain(cfp->fp, size, &status); - if (status != CF_NORMAL) return status; + write_chunk_header_plain(cfp->fp, size, status); + if (status->err_code != NERV_NORMAL) + return; fseeko(cfp->fp, 0, SEEK_END); - return CF_NORMAL; + NERV_SET_STATUS(status, NERV_NORMAL, 0); } -ChunkData *nerv_chunk_file_get_chunkdata(ChunkFile *cfp, ChunkInfo *cip, int *status) { +ChunkData *nerv_chunk_file_get_chunkdata(ChunkFile *cfp, ChunkInfo *cip, + Status *status) { ChunkData *cdp; if (cfp->status != CF_READ) { - *status = CF_INVALID_OP; + NERV_SET_STATUS(status, CF_INVALID_OP, 0); return NULL; } if (!(cdp = get_chunk_data(cfp->fp, cip))) { - *status = CF_END_OF_FILE; + NERV_SET_STATUS(status, CF_END_OF_FILE, 0); return NULL; } - *status = CF_NORMAL; + NERV_SET_STATUS(status, NERV_NORMAL, 0); return cdp; } @@ -227,17 +227,3 @@ void nerv_chunk_data_destroy(ChunkData *cdp) { free(cdp->data); free(cdp); } - -const char *nerv_chunk_file_errstr(int status) { - switch (status) - { - case CF_INVALID_FORMAT: return "invalid format"; - case CF_END_OF_FILE: return "unexpected end of file"; - case CF_SECTION_OVERFLOW: return "section overflow"; - case CF_WRITE_ERROR: return "error while writing"; - case CF_ERR_OPEN_FILE: return "error while opening file"; - case CF_INVALID_OP: return "invalid operation"; - default: return "unknown"; - } - return NULL; -} diff --git a/nerv/lib/io/chunk_file.h b/nerv/lib/io/chunk_file.h index 71f0d03..f08d838 100644 --- a/nerv/lib/io/chunk_file.h +++ b/nerv/lib/io/chunk_file.h @@ -1,18 +1,6 @@ #ifndef NERV_CHUNK_FILE_H #define NERV_CHUNK_FILE_H -#include "../../common.h" -enum { - CF_NORMAL, - CF_INVALID_FORMAT, - CF_END_OF_FILE, - CF_SECTION_OVERFLOW, - CF_WRITE_ERROR, - CF_ERR_OPEN_FILE, - CF_INVALID_OP, - CF_READ, - CF_WRITE, - CF_CLOSED -}; +#include "../common.h" typedef struct ChunkInfo { struct ChunkInfo *next; @@ -23,7 +11,11 @@ typedef struct ChunkInfo { typedef struct ChunkFile { FILE *fp; ChunkInfo *info; - int status; + enum { + CF_READ, + CF_WRITE, + CF_CLOSED + } status; } ChunkFile; typedef struct ChunkData { @@ -32,12 +24,14 @@ typedef struct ChunkData { } ChunkData; typedef void (*ChunkDataWriter_t)(void *); -ChunkFile *nerv_chunk_file_create(const char *fn, const char *mode, int *status); -int nerv_chunk_file_write_chunkdata(ChunkFile *cfp, const char *mdstr, - ChunkDataWriter_t writer, void *writer_arg); -ChunkData *nerv_chunk_file_get_chunkdata(ChunkFile *cfp, ChunkInfo *cip, int *status); +ChunkFile *nerv_chunk_file_create(const char *fn, const char *mode, + Status *status); +void nerv_chunk_file_write_chunkdata(ChunkFile *cfp, const char *mdstr, + ChunkDataWriter_t writer, void *writer_arg, + Status *status); +ChunkData *nerv_chunk_file_get_chunkdata(ChunkFile *cfp, ChunkInfo *cip, + Status *status); void nerv_chunk_file_close(ChunkFile *cfp); void nerv_chunk_file_destroy(ChunkFile *cfp); void nerv_chunk_data_destroy(ChunkData *cdp); -const char *nerv_chunk_file_errstr(int status); #endif |