forked from enlightenment/efl
Remove easy to replace data type from Evas and replace them by Eina.
This make Eina a requirements for Evas. SVN revision: 36717
This commit is contained in:
parent
e692738d22
commit
9460febabb
|
@ -5,6 +5,7 @@ includedir=@includedir@
|
|||
|
||||
Name: evas
|
||||
Description: Evas canvas display library
|
||||
Requires: eina-0
|
||||
Version: @VERSION@
|
||||
Libs: -L${libdir} -levas
|
||||
Libs.private: @pthread_libs@ @dlopen_libs@ @EDB_LIBS@ @EET_LIBS@ @FREETYPE_LIBS@ @FONTCONFIG_LIBS@
|
||||
|
|
|
@ -27,6 +27,8 @@
|
|||
# endif
|
||||
#endif /* ! _WIN32 */
|
||||
|
||||
#include <Eina.h>
|
||||
|
||||
/**
|
||||
* @file
|
||||
* @brief These routines are used for Evas data types.
|
||||
|
@ -34,10 +36,11 @@
|
|||
|
||||
typedef unsigned char Evas_Bool;
|
||||
|
||||
#define Evas_List Eina_List
|
||||
#define Evas_Object_List Eina_Inlist
|
||||
|
||||
typedef struct _Evas_Array_Hash Evas_Array_Hash;
|
||||
typedef struct _Evas_Hash Evas_Hash; /**< A Hash table handle */
|
||||
typedef struct _Evas_List Evas_List; /**< A generic linked list node handle */
|
||||
typedef struct _Evas_Object_List Evas_Object_List;
|
||||
|
||||
struct _Evas_Hash
|
||||
{
|
||||
|
@ -45,21 +48,6 @@ struct _Evas_Hash
|
|||
Evas_Object_List *buckets[256];
|
||||
};
|
||||
|
||||
struct _Evas_List /** A linked list node */
|
||||
{
|
||||
void *data; /**< Pointer to list element payload */
|
||||
Evas_List *next; /**< Next member in the list */
|
||||
Evas_List *prev; /**< Previous member in the list */
|
||||
struct _Evas_List_Accounting *accounting; /**< Private list accounting info - don't touch */
|
||||
};
|
||||
|
||||
struct _Evas_Object_List
|
||||
{
|
||||
Evas_Object_List *next, *prev;
|
||||
Evas_Object_List *last;
|
||||
};
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
@ -99,50 +87,47 @@ extern "C" {
|
|||
* Evas List functions
|
||||
*/
|
||||
|
||||
EAPI Evas_List *evas_list_append (Evas_List *list, const void *data);
|
||||
EAPI Evas_List *evas_list_prepend (Evas_List *list, const void *data);
|
||||
EAPI Evas_List *evas_list_append_relative (Evas_List *list, const void *data, const void *relative);
|
||||
EAPI Evas_List *evas_list_append_relative_list (Evas_List *list, const void *data, Evas_List *relative);
|
||||
EAPI Evas_List *evas_list_prepend_relative (Evas_List *list, const void *data, const void *relative);
|
||||
EAPI Evas_List *evas_list_prepend_relative_list (Evas_List *list, const void *data, Evas_List *relative);
|
||||
EAPI Evas_List *evas_list_remove (Evas_List *list, const void *data);
|
||||
EAPI Evas_List *evas_list_remove_list (Evas_List *list, Evas_List *remove_list);
|
||||
EAPI Evas_List *evas_list_promote_list (Evas_List *list, Evas_List *move_list);
|
||||
EAPI void *evas_list_find (const Evas_List *list, const void *data);
|
||||
EAPI Evas_List *evas_list_find_list (const Evas_List *list, const void *data);
|
||||
EAPI Evas_List *evas_list_free (Evas_List *list);
|
||||
EAPI Evas_List *evas_list_last (const Evas_List *list);
|
||||
EAPI Evas_List *evas_list_next (const Evas_List *list);
|
||||
EAPI Evas_List *evas_list_prev (const Evas_List *list);
|
||||
EAPI void *evas_list_data (const Evas_List *list);
|
||||
EAPI int evas_list_count (const Evas_List *list);
|
||||
EAPI void *evas_list_nth (const Evas_List *list, int n);
|
||||
EAPI Evas_List *evas_list_nth_list (const Evas_List *list, int n);
|
||||
EAPI Evas_List *evas_list_reverse (Evas_List *list);
|
||||
EAPI Evas_List *evas_list_sort (Evas_List *list, int size, int(*func)(void*,void*));
|
||||
EAPI int evas_list_alloc_error (void);
|
||||
|
||||
#define evas_list_append eina_list_append
|
||||
#define evas_list_prepend eina_list_prepend
|
||||
#define evas_list_append_relative eina_list_append_relative
|
||||
#define evas_list_append_relative_list eina_list_append_relative_list
|
||||
#define evas_list_prepend_relative eina_list_prepend_relative
|
||||
#define evas_list_prepend_relative_list eina_list_prepend_relative_list
|
||||
#define evas_list_remove eina_list_remove
|
||||
#define evas_list_remove_list eina_list_remove_list
|
||||
#define evas_list_promote_list eina_list_promote_list
|
||||
#define evas_list_find eina_list_data_find
|
||||
#define evas_list_find_list eina_list_data_find_list
|
||||
#define evas_list_free eina_list_free
|
||||
#define evas_list_last eina_list_last
|
||||
#define evas_list_next eina_list_next
|
||||
#define evas_list_prev eina_list_prev
|
||||
#define evas_list_data eina_list_data_get
|
||||
#define evas_list_count eina_list_count
|
||||
#define evas_list_nth eina_list_nth
|
||||
#define evas_list_nth_list eina_list_nth_list
|
||||
#define evas_list_reverse eina_list_reverse
|
||||
#define evas_list_sort eina_list_sort
|
||||
#define evas_list_alloc_error eina_error_get
|
||||
|
||||
/*
|
||||
* Evas Object List functions
|
||||
*/
|
||||
|
||||
EAPI void *evas_object_list_append (void *in_list, void *in_item);
|
||||
EAPI void *evas_object_list_prepend (void *in_list, void *in_item);
|
||||
EAPI void *evas_object_list_append_relative (void *in_list, void *in_item, void *in_relative);
|
||||
EAPI void *evas_object_list_prepend_relative (void *in_list, void *in_item, void *in_relative);
|
||||
EAPI void *evas_object_list_remove (void *in_list, void *in_item);
|
||||
EAPI void *evas_object_list_find (void *in_list, void *in_item);
|
||||
|
||||
#define evas_object_list_append eina_inlist_append
|
||||
#define evas_object_list_prepend eina_inlist_prepend
|
||||
#define evas_object_list_append_relative eina_inlist_append_relative
|
||||
#define evas_object_list_prepend_relative eina_inlist_prepend_relative
|
||||
#define evas_object_list_remove eina_inlist_remove
|
||||
#define evas_object_list_find eina_inlist_find
|
||||
|
||||
/*
|
||||
* Evas Stringshare functions
|
||||
*/
|
||||
|
||||
EAPI void evas_stringshare_init (void); /* not implemented */
|
||||
EAPI void evas_stringshare_shutdown (void); /* not implemented */
|
||||
EAPI const char *evas_stringshare_add (const char *str);
|
||||
EAPI void evas_stringshare_del (const char *str);
|
||||
#define evas_stringshare_init eina_stringshare_init
|
||||
#define evas_stringshare_shutdown eina_stringshare_shutdown
|
||||
#define evas_stringshare_add eina_stringshare_add
|
||||
#define evas_stringshare_del eina_stringshare_del
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -12,9 +12,6 @@ AM_CPPFLAGS = -I. \
|
|||
noinst_LTLIBRARIES = libevas_data.la
|
||||
libevas_data_la_SOURCES = \
|
||||
evas_hash.c \
|
||||
evas_list.c \
|
||||
evas_object_list.c \
|
||||
evas_stringshare.c \
|
||||
evas_array_hash.c \
|
||||
evas_mempool.c
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,164 +0,0 @@
|
|||
/*
|
||||
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "Evas_Data.h"
|
||||
|
||||
/* list ops */
|
||||
void *
|
||||
evas_object_list_append(void *in_list, void *in_item)
|
||||
{
|
||||
Evas_Object_List *l, *new_l;
|
||||
Evas_Object_List *list;
|
||||
|
||||
list = in_list;
|
||||
new_l = in_item;
|
||||
new_l->next = NULL;
|
||||
if (!list)
|
||||
{
|
||||
new_l->prev = NULL;
|
||||
new_l->last = new_l;
|
||||
return new_l;
|
||||
}
|
||||
if (list->last) l = list->last;
|
||||
else for (l = list; (l) && (l->next); l = l->next);
|
||||
l->next = new_l;
|
||||
new_l->prev = l;
|
||||
list->last = new_l;
|
||||
return list;
|
||||
}
|
||||
|
||||
void *
|
||||
evas_object_list_prepend(void *in_list, void *in_item)
|
||||
{
|
||||
Evas_Object_List *new_l;
|
||||
Evas_Object_List *list;
|
||||
|
||||
list = in_list;
|
||||
new_l = in_item;
|
||||
new_l->prev = NULL;
|
||||
if (!list)
|
||||
{
|
||||
new_l->next = NULL;
|
||||
new_l->last = new_l;
|
||||
return new_l;
|
||||
}
|
||||
new_l->next = list;
|
||||
list->prev = new_l;
|
||||
new_l->last = list->last;
|
||||
list->last = NULL;
|
||||
return new_l;
|
||||
}
|
||||
|
||||
void *
|
||||
evas_object_list_append_relative(void *in_list, void *in_item, void *in_relative)
|
||||
{
|
||||
Evas_Object_List *list, *relative, *new_l;
|
||||
|
||||
list = in_list;
|
||||
new_l = in_item;
|
||||
relative = in_relative;
|
||||
if (relative)
|
||||
{
|
||||
if (relative->next)
|
||||
{
|
||||
new_l->next = relative->next;
|
||||
relative->next->prev = new_l;
|
||||
}
|
||||
else new_l->next = NULL;
|
||||
relative->next = new_l;
|
||||
new_l->prev = relative;
|
||||
if (!new_l->next) list->last = new_l;
|
||||
return list;
|
||||
}
|
||||
return evas_object_list_append(list, new_l);
|
||||
}
|
||||
|
||||
void *
|
||||
evas_object_list_prepend_relative(void *in_list, void *in_item, void *in_relative)
|
||||
{
|
||||
Evas_Object_List *list, *relative, *new_l;
|
||||
|
||||
list = in_list;
|
||||
new_l = in_item;
|
||||
relative = in_relative;
|
||||
if (relative)
|
||||
{
|
||||
new_l->prev = relative->prev;
|
||||
new_l->next = relative;
|
||||
relative->prev = new_l;
|
||||
if (new_l->prev)
|
||||
{
|
||||
new_l->prev->next = new_l;
|
||||
if (!new_l->next)
|
||||
list->last = new_l;
|
||||
return list;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!new_l->next)
|
||||
new_l->last = new_l;
|
||||
else
|
||||
{
|
||||
new_l->last = list->last;
|
||||
list->last = NULL;
|
||||
}
|
||||
return new_l;
|
||||
}
|
||||
}
|
||||
return evas_object_list_prepend(list, new_l);
|
||||
}
|
||||
|
||||
void *
|
||||
evas_object_list_remove(void *in_list, void *in_item)
|
||||
{
|
||||
Evas_Object_List *return_l;
|
||||
Evas_Object_List *list, *item;
|
||||
|
||||
/* checkme */
|
||||
if(!in_list)
|
||||
return in_list;
|
||||
|
||||
list = in_list;
|
||||
item = in_item;
|
||||
if (!item) return list;
|
||||
if (item->next)
|
||||
item->next->prev = item->prev;
|
||||
if (item->prev)
|
||||
{
|
||||
item->prev->next = item->next;
|
||||
return_l = list;
|
||||
}
|
||||
else
|
||||
{
|
||||
return_l = item->next;
|
||||
if (return_l)
|
||||
return_l->last = list->last;
|
||||
}
|
||||
if (item == list->last)
|
||||
list->last = item->prev;
|
||||
item->next = NULL;
|
||||
item->prev = NULL;
|
||||
return return_l;
|
||||
}
|
||||
|
||||
void *
|
||||
evas_object_list_find(void *in_list, void *in_item)
|
||||
{
|
||||
Evas_Object_List *l;
|
||||
Evas_Object_List *list, *item;
|
||||
|
||||
list = in_list;
|
||||
item = in_item;
|
||||
for (l = list; l; l = l->next)
|
||||
{
|
||||
if (l == item) return item;
|
||||
}
|
||||
return NULL;
|
||||
}
|
|
@ -1,205 +0,0 @@
|
|||
/*
|
||||
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
#include "Evas_Data.h"
|
||||
|
||||
typedef struct _Evas_Stringshare Evas_Stringshare;
|
||||
typedef struct _Evas_Stringshare_El Evas_Stringshare_El;
|
||||
|
||||
struct _Evas_Stringshare
|
||||
{
|
||||
Evas_Stringshare_El *buckets[1024];
|
||||
};
|
||||
|
||||
struct _Evas_Stringshare_El
|
||||
{
|
||||
Evas_Stringshare_El *next;
|
||||
// int op;
|
||||
int references;
|
||||
};
|
||||
|
||||
static Evas_Stringshare share =
|
||||
{
|
||||
{
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||||
}
|
||||
};
|
||||
|
||||
//static int op = 0;
|
||||
//static FILE *f = NULL;
|
||||
|
||||
static inline int
|
||||
_evas_stringshare_hash_gen(const char *str, int *len)
|
||||
{
|
||||
unsigned int hash_num = 5381;
|
||||
const unsigned char *ptr;
|
||||
|
||||
for (ptr = (const unsigned char *)str; *ptr; ptr++)
|
||||
{
|
||||
hash_num = (hash_num * 33) ^ *ptr;
|
||||
}
|
||||
|
||||
hash_num &= 0x3ff;
|
||||
*len = ptr - (const unsigned char *)str;
|
||||
return (int)hash_num;
|
||||
}
|
||||
|
||||
EAPI const char *
|
||||
evas_stringshare_add(const char *str)
|
||||
{
|
||||
int hash_num, slen;
|
||||
char *el_str;
|
||||
Evas_Stringshare_El *el, *pel = NULL;
|
||||
|
||||
if (!str) return NULL;
|
||||
// if (!f)
|
||||
// {
|
||||
// char bf[256];
|
||||
// snprintf(bf, sizeof(bf), "strlog-%i", getpid());
|
||||
// f = fopen(bf, "w");
|
||||
// }
|
||||
hash_num = _evas_stringshare_hash_gen(str, &slen);
|
||||
for (el = share.buckets[hash_num]; el; pel = el, el = el->next)
|
||||
{
|
||||
el_str = ((char *)el) + sizeof(Evas_Stringshare_El);
|
||||
if (!strcmp(el_str, str))
|
||||
{
|
||||
if (pel)
|
||||
{
|
||||
pel->next = el->next;
|
||||
el->next = share.buckets[hash_num];
|
||||
share.buckets[hash_num] = el;
|
||||
}
|
||||
el->references++;
|
||||
// fprintf(f, "strings[%i] = str->add(strings[%i]);\n", el->op, el->op);
|
||||
// fflush(f);
|
||||
return el_str;
|
||||
}
|
||||
}
|
||||
if (!(el = malloc(sizeof(Evas_Stringshare_El) + slen + 1))) return NULL;
|
||||
el_str = ((char *)el) + sizeof(Evas_Stringshare_El);
|
||||
strcpy(el_str, str);
|
||||
el->references = 1;
|
||||
el->next = share.buckets[hash_num];
|
||||
share.buckets[hash_num] = el;
|
||||
// el->op = op;
|
||||
// fprintf(f, "strings[%i] = str->add(\"%s\");\n", el->op, el_str);
|
||||
// fflush(f);
|
||||
// op++;
|
||||
return el_str;
|
||||
}
|
||||
|
||||
EAPI void
|
||||
evas_stringshare_del(const char *str)
|
||||
{
|
||||
int hash_num, slen;
|
||||
char *el_str;
|
||||
Evas_Stringshare_El *el, *pel = NULL;
|
||||
|
||||
if (!str) return;
|
||||
hash_num = _evas_stringshare_hash_gen(str, &slen);
|
||||
for (el = share.buckets[hash_num]; el; pel = el, el = el->next)
|
||||
{
|
||||
el_str = ((char *)el) + sizeof(Evas_Stringshare_El);
|
||||
if (el_str == str)
|
||||
{
|
||||
el->references--;
|
||||
// fprintf(f, "str->del(strings[%i]);\n", el->op);
|
||||
// fflush(f);
|
||||
if (el->references == 0)
|
||||
{
|
||||
if (pel) pel->next = el->next;
|
||||
else share.buckets[hash_num] = el->next;
|
||||
free(el);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (pel)
|
||||
{
|
||||
pel->next = el->next;
|
||||
el->next = share.buckets[hash_num];
|
||||
share.buckets[hash_num] = el;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
printf("EEEK trying to del non-shared stringshare \"%s\"\n", str);
|
||||
abort();
|
||||
}
|
Loading…
Reference in New Issue