[ Avaa Bypassed ]




Upload:

Command:

hmhc3928@3.15.5.211: ~ $
#include "gd.h"
#include "gdhelpers.h"

#ifdef HAVE_LIBFREETYPE
#define NEED_CACHE 1
#endif

#ifdef NEED_CACHE

/*
 * gdcache.c
 *
 * Caches of pointers to user structs in which the least-recently-used
 * element is replaced in the event of a cache miss after the cache has
 * reached a given size.
 *
 * John Ellson  (ellson@graphviz.org)  Oct 31, 1997
 *
 * Test this with:
 *               gcc -o gdcache -g -Wall -DTEST gdcache.c
 *
 * The cache is implemented by a singly-linked list of elements
 * each containing a pointer to a user struct that is being managed by
 * the cache.
 *
 * The head structure has a pointer to the most-recently-used
 * element, and elements are moved to this position in the list each
 * time they are used.  The head also contains pointers to three
 * user defined functions:
 *              - a function to test if a cached userdata matches some keydata
 *              - a function to provide a new userdata struct to the cache
 *          if there has been a cache miss.
 *              - a function to release a userdata struct when it is
 *          no longer being managed by the cache
 *
 * In the event of a cache miss the cache is allowed to grow up to
 * a specified maximum size.  After the maximum size is reached then
 * the least-recently-used element is discarded to make room for the
 * new.  The most-recently-returned value is always left at the
 * beginning of the list after retrieval.
 *
 * In the current implementation the cache is traversed by a linear
 * search from most-recent to least-recent.  This linear search
 * probably limits the usefulness of this implementation to cache
 * sizes of a few tens of elements.
 */

#include "gdcache.h"

/*********************************************************/
/* implementation                                        */
/*********************************************************/


/* create a new cache */
gdCache_head_t *
gdCacheCreate (
		int size,
		gdCacheTestFn_t gdCacheTest,
		gdCacheFetchFn_t gdCacheFetch,
		gdCacheReleaseFn_t gdCacheRelease)
{
  gdCache_head_t *head;

  head = (gdCache_head_t *) gdPMalloc(sizeof (gdCache_head_t));
  head->mru = NULL;
  head->size = size;
  head->gdCacheTest = gdCacheTest;
  head->gdCacheFetch = gdCacheFetch;
  head->gdCacheRelease = gdCacheRelease;
  return head;
}

void
gdCacheDelete (gdCache_head_t * head)
{
  gdCache_element_t *elem, *prev;

  elem = head->mru;
  while (elem)
    {
      (*(head->gdCacheRelease)) (elem->userdata);
      prev = elem;
      elem = elem->next;
      gdPFree ((char *) prev);
    }
  gdPFree ((char *) head);
}

void *
gdCacheGet (gdCache_head_t * head, void *keydata)
{
  int i = 0;
  gdCache_element_t *elem, *prev = NULL, *prevprev = NULL;
  void *userdata;

  elem = head->mru;
  while (elem)
    {
      if ((*(head->gdCacheTest)) (elem->userdata, keydata))
	{
	  if (i)
	    {			/* if not already most-recently-used */
	      /* relink to top of list */
	      prev->next = elem->next;
	      elem->next = head->mru;
	      head->mru = elem;
	    }
	  return elem->userdata;
	}
      prevprev = prev;
      prev = elem;
      elem = elem->next;
      i++;
    }
  userdata = (*(head->gdCacheFetch)) (&(head->error), keydata);
  if (!userdata)
    {
      /* if there was an error in the fetch then don't cache */
      return NULL;
    }
  if (i < head->size)
    {				/* cache still growing - add new elem */
      elem = (gdCache_element_t *) gdPMalloc(sizeof (gdCache_element_t));
    }
  else
    {				/* cache full - replace least-recently-used */
      /* preveprev becomes new end of list */
      prevprev->next = NULL;
      elem = prev;
      (*(head->gdCacheRelease)) (elem->userdata);
    }
  /* relink to top of list */
  elem->next = head->mru;
  head->mru = elem;
  elem->userdata = userdata;
  return userdata;
}



/*********************************************************/
/* test stub                                             */
/*********************************************************/


#ifdef TEST

#include <stdio.h>

typedef struct
{
  int key;
  int value;
}
key_value_t;

static int
cacheTest (void *map, void *key)
{
  return (((key_value_t *) map)->key == *(int *) key);
}

static void *
cacheFetch (char **error, void *key)
{
  key_value_t *map;

  map = (key_value_t *) gdMalloc (sizeof (key_value_t));
  map->key = *(int *) key;
  map->value = 3;

  *error = NULL;
  return (void *) map;
}

static void
cacheRelease (void *map)
{
  gdFree ((char *) map);
}

int
main (char *argv[], int argc)
{
  gdCache_head_t *cacheTable;
  int elem, key;

  cacheTable = gdCacheCreate (3, cacheTest, cacheFetch, cacheRelease);

  key = 20;
  elem = *(int *) gdCacheGet (cacheTable, &key);
  key = 30;
  elem = *(int *) gdCacheGet (cacheTable, &key);
  key = 40;
  elem = *(int *) gdCacheGet (cacheTable, &key);
  key = 50;
  elem = *(int *) gdCacheGet (cacheTable, &key);
  key = 30;
  elem = *(int *) gdCacheGet (cacheTable, &key);
  key = 30;
  elem = *(int *) gdCacheGet (cacheTable, &key);

  gdCacheDelete (cacheTable);

  return 0;
}

#endif /* TEST */
#endif /* HAVE_NEECACHE */

Filemanager

Name Type Size Permission Actions
gd.c File 72.75 KB 0644
gd.h File 32.2 KB 0644
gd_arc.c File 1.66 KB 0644
gd_color.c File 1.5 KB 0644
gd_crop.c File 9.04 KB 0644
gd_filter.c File 10.3 KB 0644
gd_gd.c File 5.2 KB 0644
gd_gd2.c File 19.73 KB 0644
gd_gif_in.c File 13.89 KB 0644
gd_gif_out.c File 20.54 KB 0644
gd_interpolation.c File 71.93 KB 0644
gd_io.c File 2.69 KB 0644
gd_io.h File 963 B 0644
gd_io_dp.c File 6.93 KB 0644
gd_io_file.c File 2.31 KB 0644
gd_io_ss.c File 2.66 KB 0644
gd_jpeg.c File 26.21 KB 0644
gd_matrix.c File 7.78 KB 0644
gd_pixelate.c File 1.33 KB 0644
gd_png.c File 22 KB 0644
gd_rotate.c File 12.98 KB 0644
gd_security.c File 671 B 0644
gd_ss.c File 1.08 KB 0644
gd_topal.c File 63.08 KB 0644
gd_transform.c File 1.27 KB 0644
gd_wbmp.c File 5.17 KB 0644
gd_webp.c File 5.04 KB 0644
gdcache.c File 4.99 KB 0644
gdcache.h File 2.68 KB 0644
gdfontg.c File 113.25 KB 0644
gdfontg.h File 529 B 0644
gdfontl.c File 108.5 KB 0644
gdfontl.h File 527 B 0644
gdfontmb.c File 79.24 KB 0644
gdfontmb.h File 495 B 0644
gdfonts.c File 69.46 KB 0644
gdfonts.h File 491 B 0644
gdfontt.c File 38.49 KB 0644
gdfontt.h File 522 B 0644
gdft.c File 32.57 KB 0644
gdhelpers.c File 1.19 KB 0644
gdhelpers.h File 1.32 KB 0644
gdkanji.c File 12.11 KB 0644
gdtables.c File 5.45 KB 0644
gdxpm.c File 3.21 KB 0644
wbmp.c File 6.76 KB 0644
wbmp.h File 1.25 KB 0644
webpimg.c File 28.33 KB 0644
webpimg.h File 7.04 KB 0644
xbm.c File 5.3 KB 0644