Blame src/gdhelpers.c

Packit ed3af9
#ifdef HAVE_CONFIG_H
Packit ed3af9
#include "config.h"
Packit ed3af9
#endif
Packit ed3af9
Packit ed3af9
#include "gd.h"
Packit ed3af9
#include "gdhelpers.h"
Packit ed3af9
#include <stdlib.h>
Packit ed3af9
#include <string.h>
Packit ed3af9
Packit ed3af9
#include <sys/types.h>
Packit ed3af9
#include <ctype.h>
Packit ed3af9
Packit ed3af9
/* TBB: gd_strtok_r is not portable; provide an implementation */
Packit ed3af9
Packit ed3af9
#define SEP_TEST (separators[*((unsigned char *) s)])
Packit ed3af9
Packit ed3af9
char *
Packit ed3af9
gd_strtok_r (char *s, char *sep, char **state)
Packit ed3af9
{
Packit ed3af9
	char separators[256];
Packit ed3af9
	char *result = 0;
Packit ed3af9
	memset (separators, 0, sizeof (separators));
Packit ed3af9
	while (*sep) {
Packit ed3af9
		separators[*((unsigned char *) sep)] = 1;
Packit ed3af9
		sep++;
Packit ed3af9
	}
Packit ed3af9
	if (!s) {
Packit ed3af9
		/* Pick up where we left off */
Packit ed3af9
		s = *state;
Packit ed3af9
	}
Packit ed3af9
	/* 1. EOS */
Packit ed3af9
	if (!(*s)) {
Packit ed3af9
		*state = s;
Packit ed3af9
		return 0;
Packit ed3af9
	}
Packit ed3af9
	/* 2. Leading separators, if any */
Packit ed3af9
	if (SEP_TEST) {
Packit ed3af9
		do {
Packit ed3af9
			s++;
Packit ed3af9
		} while (SEP_TEST);
Packit ed3af9
		/* 2a. EOS after separators only */
Packit ed3af9
		if (!(*s)) {
Packit ed3af9
			*state = s;
Packit ed3af9
			return 0;
Packit ed3af9
		}
Packit ed3af9
	}
Packit ed3af9
	/* 3. A token */
Packit ed3af9
	result = s;
Packit ed3af9
	do {
Packit ed3af9
		/* 3a. Token at end of string */
Packit ed3af9
		if (!(*s)) {
Packit ed3af9
			*state = s;
Packit ed3af9
			return result;
Packit ed3af9
		}
Packit ed3af9
		s++;
Packit ed3af9
	} while (!SEP_TEST);
Packit ed3af9
	/* 4. Terminate token and skip trailing separators */
Packit ed3af9
	*s = '\0';
Packit ed3af9
	do {
Packit ed3af9
		s++;
Packit ed3af9
	} while (SEP_TEST);
Packit ed3af9
	/* 5. Return token */
Packit ed3af9
	*state = s;
Packit ed3af9
	return result;
Packit ed3af9
}
Packit ed3af9
Packit ed3af9
void * gdCalloc (size_t nmemb, size_t size)
Packit ed3af9
{
Packit ed3af9
	return calloc (nmemb, size);
Packit ed3af9
}
Packit ed3af9
Packit ed3af9
void *
Packit ed3af9
gdMalloc (size_t size)
Packit ed3af9
{
Packit ed3af9
	return malloc (size);
Packit ed3af9
}
Packit ed3af9
Packit ed3af9
void *
Packit ed3af9
gdRealloc (void *ptr, size_t size)
Packit ed3af9
{
Packit ed3af9
	return realloc (ptr, size);
Packit ed3af9
}
Packit ed3af9
Packit ed3af9
void *
Packit ed3af9
gdReallocEx (void *ptr, size_t size)
Packit ed3af9
{
Packit ed3af9
	void *newPtr = gdRealloc (ptr, size);
Packit ed3af9
	if (!newPtr && ptr)
Packit ed3af9
		gdFree(ptr);
Packit ed3af9
	return newPtr;
Packit ed3af9
}
Packit ed3af9
Packit ed3af9
/*
Packit ed3af9
  Function: gdFree
Packit ed3af9
Packit ed3af9
    Frees memory that has been allocated by libgd functions.
Packit ed3af9
Packit ed3af9
	Unless more specialized functions exists (for instance, <gdImageDestroy>),
Packit ed3af9
	all memory that has been allocated by public libgd functions has to be
Packit ed3af9
	freed by calling <gdFree>, and not by free(3), because libgd internally
Packit ed3af9
	doesn't use alloc(3) and friends but rather its own allocation functions,
Packit ed3af9
	which are, however, not publicly available.
Packit ed3af9
Packit ed3af9
  Parameters:
Packit ed3af9
Packit ed3af9
	ptr - Pointer to the memory space to free. If it is NULL, no operation is
Packit ed3af9
		  performed.
Packit ed3af9
Packit ed3af9
  Returns:
Packit ed3af9
Packit ed3af9
	Nothing.
Packit ed3af9
*/
Packit ed3af9
BGD_DECLARE(void) gdFree (void *ptr)
Packit ed3af9
{
Packit ed3af9
	free (ptr);
Packit ed3af9
}
Packit ed3af9
Packit ed3af9