changeset 678:7e207f1023d9

Split stdio and memio stuff to separate files from th_stdio.c
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 29 Feb 2020 12:19:02 +0200
parents 927772fb0745
children 83a48de05fe9
files Makefile.gen th_ioctx.c th_ioctx_mem.c th_ioctx_stdio.c
diffstat 4 files changed, 367 insertions(+), 355 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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 <stdio.h>
 
 
 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
-};
--- /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
+};
--- /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 <stdio.h>
+
+#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,
+};