Annotation of embedaddon/php/ext/gd/libgd/gd_io_ss.c, revision 1.1
1.1 ! misho 1:
! 2: /*
! 3: * io_ss.c
! 4: *
! 5: * Implements the Source/Sink interface.
! 6: *
! 7: * As will all I/O modules, most functions are for local use only (called
! 8: * via function pointers in the I/O context).
! 9: *
! 10: * The Source/Sink model is the primary 'user' interface for alternate data
! 11: * sources; the IOCtx interface is intended (at least in version 1.5) to be
! 12: * used internally until it settles down a bit.
! 13: *
! 14: * This module just layers the Source/Sink interface on top of the IOCtx; no
! 15: * support is provided for tell/seek, so GD2 writing is not possible, and
! 16: * retrieving parts of GD2 files is also not possible.
! 17: *
! 18: * A new SS context does not need to be created with both a Source and a Sink.
! 19: *
! 20: * Written/Modified 1999, Philip Warner.
! 21: *
! 22: */
! 23:
! 24: #include <math.h>
! 25: #include <string.h>
! 26: #include <stdlib.h>
! 27: #include "gd.h"
! 28: #include "gdhelpers.h"
! 29:
! 30: /* this is used for creating images in main memory */
! 31:
! 32: typedef struct ssIOCtx
! 33: {
! 34: gdIOCtx ctx;
! 35: gdSourcePtr src;
! 36: gdSinkPtr snk;
! 37: } ssIOCtx;
! 38:
! 39: typedef struct ssIOCtx *ssIOCtxPtr;
! 40:
! 41: gdIOCtx *gdNewSSCtx (gdSourcePtr src, gdSinkPtr snk);
! 42:
! 43: static int sourceGetbuf (gdIOCtx *, void *, int);
! 44: static int sourceGetchar (gdIOCtx * ctx);
! 45: static int sinkPutbuf (gdIOCtx * ctx, const void *buf, int size);
! 46: static void sinkPutchar (gdIOCtx * ctx, int a);
! 47: static void gdFreeSsCtx (gdIOCtx * ctx);
! 48:
! 49: /* return data as a dynamic pointer */
! 50: gdIOCtx * gdNewSSCtx (gdSourcePtr src, gdSinkPtr snk)
! 51: {
! 52: ssIOCtxPtr ctx;
! 53:
! 54: ctx = (ssIOCtxPtr) gdMalloc (sizeof (ssIOCtx));
! 55:
! 56: ctx->src = src;
! 57: ctx->snk = snk;
! 58:
! 59: ctx->ctx.getC = sourceGetchar;
! 60: ctx->ctx.getBuf = sourceGetbuf;
! 61:
! 62: ctx->ctx.putC = sinkPutchar;
! 63: ctx->ctx.putBuf = sinkPutbuf;
! 64:
! 65: ctx->ctx.tell = NULL;
! 66: ctx->ctx.seek = NULL;
! 67:
! 68: ctx->ctx.gd_free = gdFreeSsCtx;
! 69:
! 70: return (gdIOCtx *) ctx;
! 71: }
! 72:
! 73: static void gdFreeSsCtx (gdIOCtx * ctx)
! 74: {
! 75: gdFree(ctx);
! 76: }
! 77:
! 78:
! 79: static int sourceGetbuf (gdIOCtx * ctx, void *buf, int size)
! 80: {
! 81: ssIOCtx *lctx;
! 82: int res;
! 83:
! 84: lctx = (ssIOCtx *) ctx;
! 85:
! 86: res = ((lctx->src->source) (lctx->src->context, buf, size));
! 87:
! 88: /*
! 89: * Translate the return values from the Source object:
! 90: * 0 is EOF, -1 is error
! 91: */
! 92:
! 93: if (res == 0) {
! 94: return EOF;
! 95: } else if (res < 0) {
! 96: return 0;
! 97: } else {
! 98: return res;
! 99: }
! 100: }
! 101:
! 102: static int sourceGetchar (gdIOCtx * ctx)
! 103: {
! 104: int res;
! 105: unsigned char buf;
! 106:
! 107: res = sourceGetbuf (ctx, &buf, 1);
! 108:
! 109: if (res == 1) {
! 110: return buf;
! 111: } else {
! 112: return EOF;
! 113: }
! 114: }
! 115:
! 116: static int sinkPutbuf (gdIOCtx * ctx, const void *buf, int size)
! 117: {
! 118: ssIOCtxPtr lctx;
! 119: int res;
! 120:
! 121: lctx = (ssIOCtx *) ctx;
! 122:
! 123: res = (lctx->snk->sink) (lctx->snk->context, buf, size);
! 124:
! 125: if (res <= 0) {
! 126: return 0;
! 127: } else {
! 128: return res;
! 129: }
! 130: }
! 131:
! 132: static void sinkPutchar (gdIOCtx * ctx, int a)
! 133: {
! 134: unsigned char b;
! 135:
! 136: b = a;
! 137: sinkPutbuf (ctx, &b, 1);
! 138: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>