aboutsummaryrefslogtreecommitdiff
path: root/nerv/lib/io
diff options
context:
space:
mode:
Diffstat (limited to 'nerv/lib/io')
-rw-r--r--nerv/lib/io/chunk_file.c116
-rw-r--r--nerv/lib/io/chunk_file.h32
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