123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- #include "gd.h"
- #include "gdhelpers.h"
- #ifdef HAVE_LIBFREETYPE
- #define NEED_CACHE 1
- #endif
- #ifdef NEED_CACHE
- #include "gdcache.h"
- 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)
- {
-
- 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)
- {
-
- return NULL;
- }
- if (i < head->size)
- {
- elem = (gdCache_element_t *) gdPMalloc(sizeof (gdCache_element_t));
- }
- else
- {
-
- prevprev->next = NULL;
- elem = prev;
- (*(head->gdCacheRelease)) (elem->userdata);
- }
-
- elem->next = head->mru;
- head->mru = elem;
- elem->userdata = userdata;
- return userdata;
- }
- #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
- #endif
|