efl
275 строк · 9.9 Кб
1#ifdef HAVE_CONFIG_H
2# include "config.h"
3#endif
4
5#include <stdlib.h>
6#include <stdio.h>
7#include <string.h>
8
9
10#include "Evas_Data.h"
11
12typedef struct _Evas_Stringshare Evas_Stringshare;
13typedef struct _Evas_Stringshare_El Evas_Stringshare_El;
14
15struct _Evas_Stringshare
16{
17Evas_Stringshare_El *buckets[1024];
18};
19
20struct _Evas_Stringshare_El
21{
22Evas_Stringshare_El *next;
23// int op;
24int references;
25};
26
27static Evas_Stringshare share =
28{
29{
30NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
31NULL, NULL, NULL, NULL,
32NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
33NULL, NULL, NULL, NULL,
34NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
35NULL, NULL, NULL, NULL,
36NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
37NULL, NULL, NULL, NULL,
38NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
39NULL, NULL, NULL, NULL,
40NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
41NULL, NULL, NULL, NULL,
42NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
43NULL, NULL, NULL, NULL,
44NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
45NULL, NULL, NULL, NULL,
46NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
47NULL, NULL, NULL, NULL,
48NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
49NULL, NULL, NULL, NULL,
50NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
51NULL, NULL, NULL, NULL,
52NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
53NULL, NULL, NULL, NULL,
54NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
55NULL, NULL, NULL, NULL,
56NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
57NULL, NULL, NULL, NULL,
58NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
59NULL, NULL, NULL, NULL,
60NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
61NULL, NULL, NULL, NULL,
62
63NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
64NULL, NULL, NULL, NULL,
65NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
66NULL, NULL, NULL, NULL,
67NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
68NULL, NULL, NULL, NULL,
69NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
70NULL, NULL, NULL, NULL,
71NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
72NULL, NULL, NULL, NULL,
73NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
74NULL, NULL, NULL, NULL,
75NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
76NULL, NULL, NULL, NULL,
77NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
78NULL, NULL, NULL, NULL,
79NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
80NULL, NULL, NULL, NULL,
81NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
82NULL, NULL, NULL, NULL,
83NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
84NULL, NULL, NULL, NULL,
85NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
86NULL, NULL, NULL, NULL,
87NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
88NULL, NULL, NULL, NULL,
89NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
90NULL, NULL, NULL, NULL,
91NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
92NULL, NULL, NULL, NULL,
93NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
94NULL, NULL, NULL, NULL,
95
96NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
97NULL, NULL, NULL, NULL,
98NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
99NULL, NULL, NULL, NULL,
100NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
101NULL, NULL, NULL, NULL,
102NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
103NULL, NULL, NULL, NULL,
104NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
105NULL, NULL, NULL, NULL,
106NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
107NULL, NULL, NULL, NULL,
108NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
109NULL, NULL, NULL, NULL,
110NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
111NULL, NULL, NULL, NULL,
112NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
113NULL, NULL, NULL, NULL,
114NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
115NULL, NULL, NULL, NULL,
116NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
117NULL, NULL, NULL, NULL,
118NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
119NULL, NULL, NULL, NULL,
120NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
121NULL, NULL, NULL, NULL,
122NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
123NULL, NULL, NULL, NULL,
124NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
125NULL, NULL, NULL, NULL,
126NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
127NULL, NULL, NULL, NULL,
128
129NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
130NULL, NULL, NULL, NULL,
131NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
132NULL, NULL, NULL, NULL,
133NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
134NULL, NULL, NULL, NULL,
135NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
136NULL, NULL, NULL, NULL,
137NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
138NULL, NULL, NULL, NULL,
139NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
140NULL, NULL, NULL, NULL,
141NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
142NULL, NULL, NULL, NULL,
143NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
144NULL, NULL, NULL, NULL,
145NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
146NULL, NULL, NULL, NULL,
147NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
148NULL, NULL, NULL, NULL,
149NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
150NULL, NULL, NULL, NULL,
151NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
152NULL, NULL, NULL, NULL,
153NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
154NULL, NULL, NULL, NULL,
155NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
156NULL, NULL, NULL, NULL,
157NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
158NULL, NULL, NULL, NULL,
159NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
160NULL, NULL, NULL, NULL
161}
162};
163
164//static int op = 0;
165//static FILE *f = NULL;
166
167static inline int
168_evas_stringshare_hash_gen(const char *str, int *len)
169{
170unsigned int hash_num = 5381;
171const unsigned char *ptr;
172
173for (ptr = (const unsigned char *)str; *ptr; ptr++)
174{
175hash_num = (hash_num * 33) ^ *ptr;
176}
177
178hash_num &= 0x3ff;
179*len = ptr - (const unsigned char *)str;
180return (int)hash_num;
181}
182
183EAPI const char *
184evas_stringshare_add(const char *str)
185{
186int hash_num, slen;
187char *el_str;
188Evas_Stringshare_El *el, *pel = NULL;
189
190if (!str)
191{
192return NULL; // if (!f)
193
194}
195
196// {
197// char bf[256];
198// snprintf(bf, sizeof(bf), "strlog-%i", getpid());
199// f = fopen(bf, "wb");
200// }
201hash_num = _evas_stringshare_hash_gen(str, &slen);
202for (el = share.buckets[hash_num]; el; pel = el, el = el->next)
203{
204el_str = ((char *)el) + sizeof(Evas_Stringshare_El);
205if (!strcmp(el_str, str))
206{
207if (pel)
208{
209pel->next = el->next;
210el->next = share.buckets[hash_num];
211share.buckets[hash_num] = el;
212}
213
214el->references++;
215// fprintf(f, "strings[%i] = str->add(strings[%i]);\n", el->op, el->op);
216// fflush(f);
217return el_str;
218}
219}
220if (!(el = malloc(sizeof(Evas_Stringshare_El) + slen + 1)))
221return NULL;
222
223el_str = ((char *)el) + sizeof(Evas_Stringshare_El);
224strcpy(el_str, str);
225el->references = 1;
226el->next = share.buckets[hash_num];
227share.buckets[hash_num] = el;
228// el->op = op;
229// fprintf(f, "strings[%i] = str->add(\"%s\");\n", el->op, el_str);
230// fflush(f);
231// op++;
232return el_str;
233}
234
235EAPI void
236evas_stringshare_del(const char *str)
237{
238int hash_num, slen;
239char *el_str;
240Evas_Stringshare_El *el, *pel = NULL;
241
242if (!str)
243return;
244
245hash_num = _evas_stringshare_hash_gen(str, &slen);
246for (el = share.buckets[hash_num]; el; pel = el, el = el->next)
247{
248el_str = ((char *)el) + sizeof(Evas_Stringshare_El);
249if (el_str == str)
250{
251el->references--;
252// fprintf(f, "str->del(strings[%i]);\n", el->op);
253// fflush(f);
254if (el->references == 0)
255{
256if (pel)
257pel->next = el->next;
258else
259share.buckets[hash_num] = el->next;
260
261free(el);
262}
263else if (pel)
264{
265pel->next = el->next;
266el->next = share.buckets[hash_num];
267share.buckets[hash_num] = el;
268}
269
270return;
271}
272}
273printf("EEEK trying to del non-shared stringshare \"%s\"\n", str);
274abort();
275}
276