Blame src/gdhelpers.c

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