summaryrefslogtreecommitdiff
path: root/Build/source/libs/gd/libgd-src/src/gd_io_file.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/gd/libgd-src/src/gd_io_file.c')
-rw-r--r--Build/source/libs/gd/libgd-src/src/gd_io_file.c132
1 files changed, 132 insertions, 0 deletions
diff --git a/Build/source/libs/gd/libgd-src/src/gd_io_file.c b/Build/source/libs/gd/libgd-src/src/gd_io_file.c
new file mode 100644
index 00000000000..d3893e4cea2
--- /dev/null
+++ b/Build/source/libs/gd/libgd-src/src/gd_io_file.c
@@ -0,0 +1,132 @@
+/*
+ * io_file.c
+ *
+ * Implements the file interface.
+ *
+ * As will all I/O modules, most functions are for local use only (called
+ * via function pointers in the I/O context).
+ *
+ * Most functions are just 'wrappers' for standard file functions.
+ *
+ * Written/Modified 1999, Philip Warner.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+/* For platforms with incomplete ANSI defines. Fortunately,
+ * SEEK_SET is defined to be zero by the standard. */
+
+#ifndef SEEK_SET
+# define SEEK_SET 0
+#endif /* SEEK_SET */
+
+#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+#include "gd.h"
+#include "gdhelpers.h"
+
+/* this is used for creating images in main memory */
+
+typedef struct fileIOCtx {
+ gdIOCtx ctx;
+ FILE *f;
+}
+fileIOCtx;
+
+gdIOCtx *newFileCtx(FILE *f);
+
+static int fileGetbuf(gdIOCtx *, void *, int);
+static int filePutbuf(gdIOCtx *, const void *, int);
+static void filePutchar(gdIOCtx *, int);
+static int fileGetchar(gdIOCtx *ctx);
+
+static int fileSeek(struct gdIOCtx *, const int);
+static long fileTell(struct gdIOCtx *);
+static void gdFreeFileCtx(gdIOCtx *ctx);
+
+/* return data as a dynamic pointer */
+BGD_DECLARE(gdIOCtx *) gdNewFileCtx(FILE *f)
+{
+ fileIOCtx *ctx;
+
+ if (f == NULL) return NULL;
+ ctx = (fileIOCtx *)gdMalloc(sizeof(fileIOCtx));
+ if(ctx == NULL) {
+ return NULL;
+ }
+
+ ctx->f = f;
+
+ ctx->ctx.getC = fileGetchar;
+ ctx->ctx.putC = filePutchar;
+
+ ctx->ctx.getBuf = fileGetbuf;
+ ctx->ctx.putBuf = filePutbuf;
+
+ ctx->ctx.tell = fileTell;
+ ctx->ctx.seek = fileSeek;
+
+ ctx->ctx.gd_free = gdFreeFileCtx;
+
+ return (gdIOCtx *)ctx;
+}
+
+static void gdFreeFileCtx(gdIOCtx *ctx)
+{
+ gdFree(ctx);
+}
+
+
+static int filePutbuf(gdIOCtx *ctx, const void *buf, int size)
+{
+ fileIOCtx *fctx;
+ fctx = (fileIOCtx *)ctx;
+
+ return fwrite(buf, 1, size, fctx->f);
+}
+
+static int fileGetbuf(gdIOCtx *ctx, void *buf, int size)
+{
+ fileIOCtx *fctx;
+ fctx = (fileIOCtx *)ctx;
+
+ return (fread(buf, 1, size, fctx->f));
+}
+
+static void filePutchar(gdIOCtx *ctx, int a)
+{
+ unsigned char b;
+ fileIOCtx *fctx;
+ fctx = (fileIOCtx *)ctx;
+
+ b = a;
+
+ putc(b, fctx->f);
+}
+
+static int fileGetchar(gdIOCtx *ctx)
+{
+ fileIOCtx *fctx;
+ fctx = (fileIOCtx *)ctx;
+
+ return getc(fctx->f);
+}
+
+static int fileSeek(struct gdIOCtx *ctx, const int pos)
+{
+ fileIOCtx *fctx;
+ fctx = (fileIOCtx *)ctx;
+ return (fseek(fctx->f, pos, SEEK_SET) == 0);
+}
+
+static long fileTell (struct gdIOCtx *ctx)
+{
+ fileIOCtx *fctx;
+ fctx = (fileIOCtx *)ctx;
+
+ return ftell(fctx->f);
+}