# HG changeset patch # User Matti Hamalainen # Date 1582971542 -7200 # Node ID 7e207f1023d9966ca0cf8aea521fed4f05e086e9 # Parent 927772fb0745c451f56f83fb6c8bc2ff43ac95c3 Split stdio and memio stuff to separate files from th_stdio.c diff -r 927772fb0745 -r 7e207f1023d9 Makefile.gen --- a/Makefile.gen Sat Feb 29 12:14:41 2020 +0200 +++ b/Makefile.gen Sat Feb 29 12:19:02 2020 +0200 @@ -17,9 +17,9 @@ ### Objects and binaries ### THLIBS_A=$(OBJPATH)thlibs.a -THLIBS_OBJ=th_util.o th_config.o th_string.o th_ioctx.o \ - th_args.o th_crypto.o th_datastruct.o th_network.o \ - th_file.o th_regex.o +THLIBS_OBJ=th_util.o th_config.o th_string.o th_args.o \ + th_crypto.o th_datastruct.o th_network.o th_file.o \ + th_ioctx.o th_ioctx_stdio.o th_ioctx_mem.o th_regex.o TESTS_OBJ=tests.o diff -r 927772fb0745 -r 7e207f1023d9 th_ioctx.c --- a/th_ioctx.c Sat Feb 29 12:14:41 2020 +0200 +++ b/th_ioctx.c Sat Feb 29 12:19:02 2020 +0200 @@ -8,7 +8,6 @@ #include "th_ioctx.h" #include "th_string.h" #include "th_endian.h" -#include static void th_io_update_atime(th_ioctx *ctx) @@ -361,354 +360,3 @@ TH_DEFINE_FUNC(be64, uint64_t, BE64) #undef TH_DEFINE_FUNC - - -// -// stdio wrappers for I/O contexts -// -#define CTX_FH ((FILE *) ctx->data) - - -static int th_stdio_fopen(th_ioctx *ctx) -{ - ctx->data = (void *) fopen(ctx->filename, ctx->mode); - ctx->status = th_get_error(); - return (ctx->data != NULL) ? THERR_OK : THERR_FOPEN; -} - - -static void th_stdio_fclose(th_ioctx *ctx) -{ - if (CTX_FH != NULL) - { - fclose(CTX_FH); - ctx->data = NULL; - } -} - - -static int th_stdio_ferror(th_ioctx *ctx) -{ - return ctx->status; -} - - -static off_t th_stdio_ftell(th_ioctx *ctx) -{ - return ftello(CTX_FH); -} - - -static int th_stdio_fseek(th_ioctx *ctx, const off_t pos, const int whence) -{ - int ret = fseeko(CTX_FH, pos, whence); - ctx->status = th_get_error(); - return ret; -} - - -static int th_stdio_freset(th_ioctx *ctx) -{ - if (CTX_FH != NULL) - return th_stdio_fseek(ctx, 0, SEEK_SET); - else - return THERR_OK; -} - - -static off_t th_stdio_fsize(th_ioctx *ctx) -{ - off_t savePos, fileSize; - - // Check if the size is cached - if (ctx->size != 0) - return ctx->size; - - // Get file size - if ((savePos = th_stdio_ftell(ctx)) < 0) - return -1; - - if (th_stdio_fseek(ctx, 0, SEEK_END) != 0) - return -1; - - if ((fileSize = th_stdio_ftell(ctx)) < 0) - return -1; - - if (th_stdio_fseek(ctx, savePos, SEEK_SET) != 0) - return -1; - - ctx->size = fileSize; - return fileSize; -} - - -static BOOL th_stdio_feof(th_ioctx *ctx) -{ - return feof(CTX_FH); -} - - -static int th_stdio_fgetc(th_ioctx *ctx) -{ - int ret = fgetc(CTX_FH); - ctx->status = th_get_error(); - return ret; -} - - -static int th_stdio_fputc(int v, th_ioctx *ctx) -{ - int ret = fputc(v, CTX_FH); - ctx->status = th_get_error(); - return ret; -} - - -static size_t th_stdio_fread(void *ptr, size_t size, size_t nmemb, th_ioctx *ctx) -{ - size_t ret = fread(ptr, size, nmemb, CTX_FH); - ctx->status = th_get_error(); - return ret; -} - - -static size_t th_stdio_fwrite(const void *ptr, size_t size, size_t nmemb, th_ioctx *ctx) -{ - size_t ret = fwrite(ptr, size, nmemb, CTX_FH); - ctx->status = th_get_error(); - return ret; -} - - -static char * th_stdio_fgets(char *str, int size, th_ioctx *ctx) -{ - char *ret = fgets(str, size, CTX_FH); - ctx->status = th_get_error(); - return ret; -} - - -static int th_stdio_fputs(const char *str, th_ioctx *ctx) -{ - int ret = fputs(str, CTX_FH); - ctx->status = th_get_error(); - return ret; -} - - -static int th_stdio_vfprintf(th_ioctx *ctx, const char *fmt, va_list ap) -{ - int ret = vfprintf(CTX_FH, fmt, ap); - ctx->status = th_get_error(); - return ret; -} - - -const th_ioctx_ops th_stdio_io_ops = -{ - "stdio", - - th_stdio_fopen, - th_stdio_fclose, - - th_stdio_freset, - th_stdio_ferror, - th_stdio_fseek, - th_stdio_fsize, - th_stdio_ftell, - th_stdio_feof, - th_stdio_fgetc, - th_stdio_fputc, - th_stdio_fread, - th_stdio_fwrite, - - th_stdio_fgets, - th_stdio_fputs, - th_stdio_vfprintf, -}; - - -static BOOL th_mem_realloc(th_ioctx *ctx, const size_t newSize) -{ - size_t grow; - - if (ctx->maxSize > 0 && newSize > ctx->maxSize) - { - ctx->status = THERR_BOUNDS; - return FALSE; - } - - if (newSize < ctx->memAlloc) - return TRUE; - - grow = (ctx->minAlloc > 0) ? ctx->minAlloc : 8 * 1024; - if (newSize - ctx->memAlloc > grow) - grow += newSize - ctx->memAlloc; - - if (ctx->maxSize > 0 && ctx->memAlloc + grow >= ctx->maxSize) - { - ctx->status = THERR_BOUNDS; - return FALSE; - } - - ctx->memAlloc += grow; - if ((ctx->memData = th_realloc(ctx->memData, ctx->memAlloc)) == NULL) - { - ctx->status = THERR_MALLOC; - return FALSE; - } - - ctx->memSize = newSize; - - return TRUE; -} - - -static int th_mem_freset(th_ioctx *ctx) -{ - ctx->memOffset = 0; - return THERR_OK; -} - - -static int th_mem_ferror(th_ioctx *ctx) -{ - return ctx->status; -} - - -static int th_mem_fseek(th_ioctx *ctx, const off_t offset, const int whence) -{ - off_t newPos; - - // Calculate the new position - switch (whence) - { - case SEEK_SET: - newPos = offset; - break; - - case SEEK_CUR: - newPos = ctx->memOffset + offset; - break; - - case SEEK_END: - newPos = ctx->memSize + offset; - break; - - default: - return -1; - } - - // Set the new position - ctx->memOffset = newPos; - - // Check the new position - if (newPos < 0) - return -1; - - //if (!th_mem_realloc(ctx, newPos)) - // return -1; - - return 0; -} - - -static off_t th_mem_fsize(th_ioctx *ctx) -{ - return ctx->memSize; -} - - -static off_t th_mem_ftell(th_ioctx *ctx) -{ - return ctx->memOffset; -} - - -static BOOL th_mem_feof(th_ioctx *ctx) -{ - return ((size_t) ctx->memOffset) >= ctx->memSize; -} - - -static int th_mem_fgetc(th_ioctx *ctx) -{ - // Check for EOF - if ((size_t) ctx->memOffset < ctx->memSize) - return ctx->memData[ctx->memOffset++]; - else - return EOF; -} - - -static size_t th_mem_fread(void *buf, size_t size, size_t nmemb, th_ioctx *ctx) -{ - size_t length = size * nmemb; - - // Check if we can read the whole chunk - if (((size_t) ctx->memOffset + length) >= ctx->memSize) - { - nmemb = (ctx->memSize - ctx->memOffset) / size; - length = size * nmemb; - } - - memcpy(buf, ctx->memData + ctx->memOffset, length); - ctx->memOffset += length; - return nmemb; -} - - -static int th_mem_fputc(int ch, th_ioctx *ctx) -{ - // Check for EOF - if (!th_mem_realloc(ctx, ctx->memOffset + 1)) - return EOF; - - ctx->memData[ctx->memOffset++] = ch; - return ch; -} - - -static size_t th_mem_fwrite(const void *buf, size_t size, size_t nmemb, th_ioctx *ctx) -{ - size_t length = size * nmemb; - - // Check if we can write the whole chunk - if (!th_mem_realloc(ctx, ctx->memOffset + length)) - { - nmemb = (ctx->memSize - ctx->memOffset) / size; - length = size * nmemb; - } - - if (length > 0) - { - memcpy(ctx->memData + ctx->memOffset, buf, length); - ctx->memOffset += length; - } - return nmemb; -} - - -const th_ioctx_ops th_mem_io_ops = -{ - "MemIO", - - NULL, - NULL, - - th_mem_freset, - th_mem_ferror, - th_mem_fseek, - th_mem_fsize, - th_mem_ftell, - th_mem_feof, - th_mem_fgetc, - th_mem_fputc, - th_mem_fread, - th_mem_fwrite, - - NULL, - NULL, - NULL -}; diff -r 927772fb0745 -r 7e207f1023d9 th_ioctx_mem.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/th_ioctx_mem.c Sat Feb 29 12:19:02 2020 +0200 @@ -0,0 +1,194 @@ +/* + * Simple I/O abstraction and context handling layer + * Programmed and designed by Matti 'ccr' Hamalainen + * (C) Copyright 2012-2020 Tecnic Software productions (TNSP) + * + * Please read file 'COPYING' for information on license and distribution. + */ +#include "th_ioctx.h" + + +static BOOL th_mem_realloc(th_ioctx *ctx, const size_t newSize) +{ + size_t grow; + + if (ctx->maxSize > 0 && newSize > ctx->maxSize) + { + ctx->status = THERR_BOUNDS; + return FALSE; + } + + if (newSize < ctx->memAlloc) + return TRUE; + + grow = (ctx->minAlloc > 0) ? ctx->minAlloc : 8 * 1024; + if (newSize - ctx->memAlloc > grow) + grow += newSize - ctx->memAlloc; + + if (ctx->maxSize > 0 && ctx->memAlloc + grow >= ctx->maxSize) + { + ctx->status = THERR_BOUNDS; + return FALSE; + } + + ctx->memAlloc += grow; + if ((ctx->memData = th_realloc(ctx->memData, ctx->memAlloc)) == NULL) + { + ctx->status = THERR_MALLOC; + return FALSE; + } + + ctx->memSize = newSize; + + return TRUE; +} + + +static int th_mem_freset(th_ioctx *ctx) +{ + ctx->memOffset = 0; + return THERR_OK; +} + + +static int th_mem_ferror(th_ioctx *ctx) +{ + return ctx->status; +} + + +static int th_mem_fseek(th_ioctx *ctx, const off_t offset, const int whence) +{ + off_t newPos; + + // Calculate the new position + switch (whence) + { + case SEEK_SET: + newPos = offset; + break; + + case SEEK_CUR: + newPos = ctx->memOffset + offset; + break; + + case SEEK_END: + newPos = ctx->memSize + offset; + break; + + default: + return -1; + } + + // Set the new position + ctx->memOffset = newPos; + + // Check the new position + if (newPos < 0) + return -1; + + //if (!th_mem_realloc(ctx, newPos)) + // return -1; + + return 0; +} + + +static off_t th_mem_fsize(th_ioctx *ctx) +{ + return ctx->memSize; +} + + +static off_t th_mem_ftell(th_ioctx *ctx) +{ + return ctx->memOffset; +} + + +static BOOL th_mem_feof(th_ioctx *ctx) +{ + return ((size_t) ctx->memOffset) >= ctx->memSize; +} + + +static int th_mem_fgetc(th_ioctx *ctx) +{ + // Check for EOF + if ((size_t) ctx->memOffset < ctx->memSize) + return ctx->memData[ctx->memOffset++]; + else + return EOF; +} + + +static size_t th_mem_fread(void *buf, size_t size, size_t nmemb, th_ioctx *ctx) +{ + size_t length = size * nmemb; + + // Check if we can read the whole chunk + if (((size_t) ctx->memOffset + length) >= ctx->memSize) + { + nmemb = (ctx->memSize - ctx->memOffset) / size; + length = size * nmemb; + } + + memcpy(buf, ctx->memData + ctx->memOffset, length); + ctx->memOffset += length; + return nmemb; +} + + +static int th_mem_fputc(int ch, th_ioctx *ctx) +{ + // Check for EOF + if (!th_mem_realloc(ctx, ctx->memOffset + 1)) + return EOF; + + ctx->memData[ctx->memOffset++] = ch; + return ch; +} + + +static size_t th_mem_fwrite(const void *buf, size_t size, size_t nmemb, th_ioctx *ctx) +{ + size_t length = size * nmemb; + + // Check if we can write the whole chunk + if (!th_mem_realloc(ctx, ctx->memOffset + length)) + { + nmemb = (ctx->memSize - ctx->memOffset) / size; + length = size * nmemb; + } + + if (length > 0) + { + memcpy(ctx->memData + ctx->memOffset, buf, length); + ctx->memOffset += length; + } + return nmemb; +} + + +const th_ioctx_ops th_mem_io_ops = +{ + "MemIO", + + NULL, + NULL, + + th_mem_freset, + th_mem_ferror, + th_mem_fseek, + th_mem_fsize, + th_mem_ftell, + th_mem_feof, + th_mem_fgetc, + th_mem_fputc, + th_mem_fread, + th_mem_fwrite, + + NULL, + NULL, + NULL +}; diff -r 927772fb0745 -r 7e207f1023d9 th_ioctx_stdio.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/th_ioctx_stdio.c Sat Feb 29 12:19:02 2020 +0200 @@ -0,0 +1,170 @@ +/* + * Simple I/O abstraction and context handling layer + * Programmed and designed by Matti 'ccr' Hamalainen + * (C) Copyright 2012-2020 Tecnic Software productions (TNSP) + * + * Please read file 'COPYING' for information on license and distribution. + */ +#include "th_ioctx.h" +#include + +#define CTX_FH ((FILE *) ctx->data) + + +static int th_stdio_fopen(th_ioctx *ctx) +{ + ctx->data = (void *) fopen(ctx->filename, ctx->mode); + ctx->status = th_get_error(); + return (ctx->data != NULL) ? THERR_OK : THERR_FOPEN; +} + + +static void th_stdio_fclose(th_ioctx *ctx) +{ + if (CTX_FH != NULL) + { + fclose(CTX_FH); + ctx->data = NULL; + } +} + + +static int th_stdio_ferror(th_ioctx *ctx) +{ + return ctx->status; +} + + +static off_t th_stdio_ftell(th_ioctx *ctx) +{ + return ftello(CTX_FH); +} + + +static int th_stdio_fseek(th_ioctx *ctx, const off_t pos, const int whence) +{ + int ret = fseeko(CTX_FH, pos, whence); + ctx->status = th_get_error(); + return ret; +} + + +static int th_stdio_freset(th_ioctx *ctx) +{ + if (CTX_FH != NULL) + return th_stdio_fseek(ctx, 0, SEEK_SET); + else + return THERR_OK; +} + + +static off_t th_stdio_fsize(th_ioctx *ctx) +{ + off_t savePos, fileSize; + + // Check if the size is cached + if (ctx->size != 0) + return ctx->size; + + // Get file size + if ((savePos = th_stdio_ftell(ctx)) < 0) + return -1; + + if (th_stdio_fseek(ctx, 0, SEEK_END) != 0) + return -1; + + if ((fileSize = th_stdio_ftell(ctx)) < 0) + return -1; + + if (th_stdio_fseek(ctx, savePos, SEEK_SET) != 0) + return -1; + + ctx->size = fileSize; + return fileSize; +} + + +static BOOL th_stdio_feof(th_ioctx *ctx) +{ + return feof(CTX_FH); +} + + +static int th_stdio_fgetc(th_ioctx *ctx) +{ + int ret = fgetc(CTX_FH); + ctx->status = th_get_error(); + return ret; +} + + +static int th_stdio_fputc(int v, th_ioctx *ctx) +{ + int ret = fputc(v, CTX_FH); + ctx->status = th_get_error(); + return ret; +} + + +static size_t th_stdio_fread(void *ptr, size_t size, size_t nmemb, th_ioctx *ctx) +{ + size_t ret = fread(ptr, size, nmemb, CTX_FH); + ctx->status = th_get_error(); + return ret; +} + + +static size_t th_stdio_fwrite(const void *ptr, size_t size, size_t nmemb, th_ioctx *ctx) +{ + size_t ret = fwrite(ptr, size, nmemb, CTX_FH); + ctx->status = th_get_error(); + return ret; +} + + +static char * th_stdio_fgets(char *str, int size, th_ioctx *ctx) +{ + char *ret = fgets(str, size, CTX_FH); + ctx->status = th_get_error(); + return ret; +} + + +static int th_stdio_fputs(const char *str, th_ioctx *ctx) +{ + int ret = fputs(str, CTX_FH); + ctx->status = th_get_error(); + return ret; +} + + +static int th_stdio_vfprintf(th_ioctx *ctx, const char *fmt, va_list ap) +{ + int ret = vfprintf(CTX_FH, fmt, ap); + ctx->status = th_get_error(); + return ret; +} + + +const th_ioctx_ops th_stdio_io_ops = +{ + "stdio", + + th_stdio_fopen, + th_stdio_fclose, + + th_stdio_freset, + th_stdio_ferror, + th_stdio_fseek, + th_stdio_fsize, + th_stdio_ftell, + th_stdio_feof, + th_stdio_fgetc, + th_stdio_fputc, + th_stdio_fread, + th_stdio_fwrite, + + th_stdio_fgets, + th_stdio_fputs, + th_stdio_vfprintf, +};