Blame src/gd_io.c

Packit Service df60bb
/*
Packit Service df60bb
 * io.c
Packit Service df60bb
 *
Packit Service df60bb
 * Implements the simple I/O 'helper' routines.
Packit Service df60bb
 *
Packit Service df60bb
 * Not really essential, but these routines were used extensively in GD,
Packit Service df60bb
 * so they were moved here. They also make IOCtx calls look better...
Packit Service df60bb
 *
Packit Service df60bb
 * Written (or, at least, moved) 1999, Philip Warner.
Packit Service df60bb
 */
Packit Service df60bb
Packit Service df60bb
#ifdef HAVE_CONFIG_H
Packit Service df60bb
#	include "config.h"
Packit Service df60bb
#endif
Packit Service df60bb
Packit Service df60bb
#include <math.h>
Packit Service df60bb
#include <string.h>
Packit Service df60bb
#include <stdlib.h>
Packit Service df60bb
#include "gd.h"
Packit Service df60bb
Packit Service df60bb
/* Use this for commenting out debug-print statements. */
Packit Service df60bb
/* Just use the first '#define' to allow all the prints... */
Packit Service df60bb
/*#define IO_DBG(s) (s) */
Packit Service df60bb
#define IO_DBG(s)
Packit Service df60bb
Packit Service df60bb
#define GD_IO_EOF_CHK(r) \
Packit Service df60bb
	if(r == EOF) { \
Packit Service df60bb
		return 0; \
Packit Service df60bb
	}
Packit Service df60bb
Packit Service df60bb
/*
Packit Service df60bb
 * Write out a word to the I/O context pointer
Packit Service df60bb
 */
Packit Service df60bb
void Putword(int w, gdIOCtx *ctx)
Packit Service df60bb
{
Packit Service df60bb
	unsigned char buf[2];
Packit Service df60bb
	buf[0] = w & 0xff;
Packit Service df60bb
	buf[1] = (w / 256) & 0xff;
Packit Service df60bb
	(ctx->putBuf)(ctx, (char *)buf, 2);
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
void Putchar(int c, gdIOCtx *ctx)
Packit Service df60bb
{
Packit Service df60bb
	(ctx->putC)(ctx, c & 0xff);
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
void gdPutC(const unsigned char c, gdIOCtx *ctx)
Packit Service df60bb
{
Packit Service df60bb
	(ctx->putC)(ctx, c);
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
void gdPutWord (int w, gdIOCtx *ctx)
Packit Service df60bb
{
Packit Service df60bb
	IO_DBG(printf("Putting word...\n"));
Packit Service df60bb
	(ctx->putC)(ctx, (unsigned char)(w >> 8));
Packit Service df60bb
	(ctx->putC)(ctx, (unsigned char)(w & 0xFF));
Packit Service df60bb
	IO_DBG(printf("put.\n"));
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
void gdPutInt (int w, gdIOCtx *ctx)
Packit Service df60bb
{
Packit Service df60bb
	IO_DBG(printf("Putting int...\n"));
Packit Service df60bb
	(ctx->putC)(ctx, (unsigned char) (w >> 24));
Packit Service df60bb
	(ctx->putC)(ctx, (unsigned char) ((w >> 16) & 0xFF));
Packit Service df60bb
	(ctx->putC)(ctx, (unsigned char) ((w >> 8) & 0xFF));
Packit Service df60bb
	(ctx->putC)(ctx, (unsigned char) (w & 0xFF));
Packit Service df60bb
	IO_DBG(printf("put.\n"));
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
int gdGetC(gdIOCtx *ctx)
Packit Service df60bb
{
Packit Service df60bb
	return ((ctx->getC)(ctx));
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
int gdGetByte(int *result, gdIOCtx *ctx)
Packit Service df60bb
{
Packit Service df60bb
	int r;
Packit Service df60bb
Packit Service df60bb
	r = (ctx->getC)(ctx);
Packit Service df60bb
	if(r == EOF) {
Packit Service df60bb
		return 0;
Packit Service df60bb
	}
Packit Service df60bb
Packit Service df60bb
	*result = r;
Packit Service df60bb
Packit Service df60bb
	return 1;
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
int gdGetWord(int *result, gdIOCtx *ctx)
Packit Service df60bb
{
Packit Service df60bb
	int r;
Packit Service df60bb
Packit Service df60bb
	r = (ctx->getC)(ctx);
Packit Service df60bb
	if(r == EOF) {
Packit Service df60bb
		return 0;
Packit Service df60bb
	}
Packit Service df60bb
Packit Service df60bb
	*result = r << 8;
Packit Service df60bb
Packit Service df60bb
	r = (ctx->getC)(ctx);
Packit Service df60bb
	if(r == EOF) {
Packit Service df60bb
		return 0;
Packit Service df60bb
	}
Packit Service df60bb
Packit Service df60bb
	*result += r;
Packit Service df60bb
Packit Service df60bb
	return 1;
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
int gdGetWordLSB(signed short int *result, gdIOCtx *ctx)
Packit Service df60bb
{
Packit Service df60bb
	int high = 0, low = 0;
Packit Service df60bb
	low = (ctx->getC) (ctx);
Packit Service df60bb
	if (low == EOF) {
Packit Service df60bb
		return 0;
Packit Service df60bb
	}
Packit Service df60bb
Packit Service df60bb
	high = (ctx->getC) (ctx);
Packit Service df60bb
	if (high == EOF) {
Packit Service df60bb
		return 0;
Packit Service df60bb
	}
Packit Service df60bb
Packit Service df60bb
	if (result) {
Packit Service df60bb
		*result = (high << 8) | low;
Packit Service df60bb
	}
Packit Service df60bb
Packit Service df60bb
	return 1;
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
int gdGetInt(int *result, gdIOCtx *ctx)
Packit Service df60bb
{
Packit Service df60bb
	int r;
Packit Service df60bb
Packit Service df60bb
	r = (ctx->getC)(ctx);
Packit Service df60bb
	if(r == EOF) {
Packit Service df60bb
		return 0;
Packit Service df60bb
	}
Packit Service df60bb
Packit Service df60bb
	*result = r << 24;
Packit Service df60bb
Packit Service df60bb
	r = (ctx->getC)(ctx);
Packit Service df60bb
	if(r == EOF) {
Packit Service df60bb
		return 0;
Packit Service df60bb
	}
Packit Service df60bb
Packit Service df60bb
	*result += r << 16;
Packit Service df60bb
Packit Service df60bb
	r = (ctx->getC)(ctx);
Packit Service df60bb
	if(r == EOF) {
Packit Service df60bb
		return 0;
Packit Service df60bb
	}
Packit Service df60bb
Packit Service df60bb
	*result += r << 8;
Packit Service df60bb
Packit Service df60bb
	r = (ctx->getC)(ctx);
Packit Service df60bb
	if(r == EOF) {
Packit Service df60bb
		return 0;
Packit Service df60bb
	}
Packit Service df60bb
Packit Service df60bb
	*result += r;
Packit Service df60bb
Packit Service df60bb
	return 1;
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
int gdGetIntLSB(signed int *result, gdIOCtx *ctx)
Packit Service df60bb
{
Packit Service df60bb
	int c = 0;
Packit Service df60bb
	unsigned int r = 0;
Packit Service df60bb
Packit Service df60bb
	c = (ctx->getC) (ctx);
Packit Service df60bb
	if (c == EOF) {
Packit Service df60bb
		return 0;
Packit Service df60bb
	}
Packit Service df60bb
	r |= (c << 24);
Packit Service df60bb
	r >>= 8;
Packit Service df60bb
Packit Service df60bb
	c = (ctx->getC) (ctx);
Packit Service df60bb
	if (c == EOF) {
Packit Service df60bb
		return 0;
Packit Service df60bb
	}
Packit Service df60bb
	r |= (c << 24);
Packit Service df60bb
	r >>= 8;
Packit Service df60bb
Packit Service df60bb
	c = (ctx->getC) (ctx);
Packit Service df60bb
	if (c == EOF) {
Packit Service df60bb
		return 0;
Packit Service df60bb
	}
Packit Service df60bb
	r |= (c << 24);
Packit Service df60bb
	r >>= 8;
Packit Service df60bb
Packit Service df60bb
	c = (ctx->getC) (ctx);
Packit Service df60bb
	if (c == EOF) {
Packit Service df60bb
		return 0;
Packit Service df60bb
	}
Packit Service df60bb
	r |= (c << 24);
Packit Service df60bb
Packit Service df60bb
	if (result) {
Packit Service df60bb
		*result = (signed int)r;
Packit Service df60bb
	}
Packit Service df60bb
Packit Service df60bb
	return 1;
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
int gdPutBuf(const void *buf, int size, gdIOCtx *ctx)
Packit Service df60bb
{
Packit Service df60bb
	IO_DBG(printf("Putting buf...\n"));
Packit Service df60bb
	return (ctx->putBuf)(ctx, buf, size);
Packit Service df60bb
	IO_DBG(printf("put.\n"));
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
int gdGetBuf(void *buf, int size, gdIOCtx *ctx)
Packit Service df60bb
{
Packit Service df60bb
	return (ctx->getBuf)(ctx, buf, size);
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
int gdSeek(gdIOCtx *ctx, const int pos)
Packit Service df60bb
{
Packit Service df60bb
	IO_DBG(printf("Seeking...\n"));
Packit Service df60bb
	return ((ctx->seek)(ctx, pos));
Packit Service df60bb
	IO_DBG(printf("Done.\n"));
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
long gdTell(gdIOCtx *ctx)
Packit Service df60bb
{
Packit Service df60bb
	IO_DBG(printf("Telling...\n"));
Packit Service df60bb
	return ((ctx->tell)(ctx));
Packit Service df60bb
	IO_DBG(printf("told.\n"));
Packit Service df60bb
}