2010-02-13 04:32:22 -08:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "config.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
|
|
|
|
#include "Evas_Data.h"
|
|
|
|
|
2010-07-27 19:37:05 -07:00
|
|
|
typedef struct _Evas_Stringshare Evas_Stringshare;
|
|
|
|
typedef struct _Evas_Stringshare_El Evas_Stringshare_El;
|
2010-02-13 04:32:22 -08:00
|
|
|
|
|
|
|
struct _Evas_Stringshare
|
|
|
|
{
|
|
|
|
Evas_Stringshare_El *buckets[1024];
|
|
|
|
};
|
|
|
|
|
|
|
|
struct _Evas_Stringshare_El
|
|
|
|
{
|
|
|
|
Evas_Stringshare_El *next;
|
|
|
|
// int op;
|
2010-07-27 19:37:05 -07:00
|
|
|
int references;
|
2010-02-13 04:32:22 -08:00
|
|
|
};
|
|
|
|
|
|
|
|
static Evas_Stringshare share =
|
|
|
|
{
|
2010-07-27 19:37:05 -07:00
|
|
|
{
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL
|
|
|
|
}
|
2010-02-13 04:32:22 -08:00
|
|
|
};
|
|
|
|
|
|
|
|
//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++)
|
|
|
|
{
|
2010-07-27 19:37:05 -07:00
|
|
|
hash_num = (hash_num * 33) ^ *ptr;
|
2010-02-13 04:32:22 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
2010-07-27 19:37:05 -07:00
|
|
|
if (!str)
|
2010-07-27 20:03:25 -07:00
|
|
|
{
|
|
|
|
return NULL; // if (!f)
|
|
|
|
|
|
|
|
}
|
2010-07-27 19:37:05 -07:00
|
|
|
|
2010-02-13 04:32:22 -08:00
|
|
|
// {
|
|
|
|
// 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)
|
|
|
|
{
|
2010-07-27 19:37:05 -07:00
|
|
|
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++;
|
2010-02-13 04:32:22 -08:00
|
|
|
// fprintf(f, "strings[%i] = str->add(strings[%i]);\n", el->op, el->op);
|
|
|
|
// fflush(f);
|
2010-07-27 19:37:05 -07:00
|
|
|
return el_str;
|
|
|
|
}
|
2010-02-13 04:32:22 -08:00
|
|
|
}
|
2010-07-27 19:37:05 -07:00
|
|
|
if (!(el = malloc(sizeof(Evas_Stringshare_El) + slen + 1)))
|
|
|
|
return NULL;
|
|
|
|
|
2010-02-13 04:32:22 -08:00
|
|
|
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;
|
|
|
|
|
2010-07-27 19:37:05 -07:00
|
|
|
if (!str)
|
|
|
|
return;
|
|
|
|
|
2010-02-13 04:32:22 -08:00
|
|
|
hash_num = _evas_stringshare_hash_gen(str, &slen);
|
|
|
|
for (el = share.buckets[hash_num]; el; pel = el, el = el->next)
|
|
|
|
{
|
2010-07-27 19:37:05 -07:00
|
|
|
el_str = ((char *)el) + sizeof(Evas_Stringshare_El);
|
|
|
|
if (el_str == str)
|
|
|
|
{
|
|
|
|
el->references--;
|
2010-02-13 04:32:22 -08:00
|
|
|
// fprintf(f, "str->del(strings[%i]);\n", el->op);
|
|
|
|
// fflush(f);
|
2010-07-27 19:37:05 -07:00
|
|
|
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;
|
|
|
|
}
|
2010-02-13 04:32:22 -08:00
|
|
|
}
|
|
|
|
printf("EEEK trying to del non-shared stringshare \"%s\"\n", str);
|
|
|
|
abort();
|
|
|
|
}
|