aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/evas/src/lib/file/evas_module.c
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/evas/src/lib/file/evas_module.c')
-rw-r--r--libraries/evas/src/lib/file/evas_module.c582
1 files changed, 0 insertions, 582 deletions
diff --git a/libraries/evas/src/lib/file/evas_module.c b/libraries/evas/src/lib/file/evas_module.c
deleted file mode 100644
index dc0d26b..0000000
--- a/libraries/evas/src/lib/file/evas_module.c
+++ /dev/null
@@ -1,582 +0,0 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <string.h>
6
7#include <evas_common.h>
8#include <evas_private.h>
9#include <evas_module.h>
10
11
12static Eina_Hash *evas_modules[4] = {
13 NULL,
14 NULL,
15 NULL,
16 NULL
17};
18
19static Eina_List *eina_evas_modules = NULL;
20static Eina_List *evas_module_paths = NULL;
21static Eina_Array *evas_engines = NULL;
22
23static Eina_List *
24_evas_module_append(Eina_List *list, char *path)
25{
26 if (path)
27 {
28 if (evas_file_path_exists(path))
29 list = eina_list_append(list, path);
30 else
31 free(path);
32 }
33 return list;
34}
35
36/* this will alloc a list of paths to search for the modules */
37/* by now these are: */
38/* 1. ~/.evas/modules/ */
39/* 2. $(EVAS_MODULE_DIR)/evas/modules/ */
40/* 3. dladdr/evas/modules/ */
41/* 4. PREFIX/evas/modules/ */
42void
43evas_module_paths_init(void)
44{
45 char *path;
46
47 /* 1. ~/.evas/modules/ */
48 path = eina_module_environment_path_get("HOME", "/.evas/modules");
49 evas_module_paths = _evas_module_append(evas_module_paths, path);
50
51 /* 2. $(EVAS_MODULE_DIR)/evas/modules/ */
52 path = eina_module_environment_path_get("EVAS_MODULES_DIR", "/evas/modules");
53 if (eina_list_search_unsorted(evas_module_paths, (Eina_Compare_Cb) strcmp, path))
54 free(path);
55 else
56 evas_module_paths = _evas_module_append(evas_module_paths, path);
57
58 /* 3. libevas.so/../evas/modules/ */
59 path = eina_module_symbol_path_get(evas_module_paths_init, "/evas/modules");
60 if (eina_list_search_unsorted(evas_module_paths, (Eina_Compare_Cb) strcmp, path))
61 free(path);
62 else
63 evas_module_paths = _evas_module_append(evas_module_paths, path);
64
65 /* 4. PREFIX/evas/modules/ */
66#ifndef _MSC_VER
67 path = PACKAGE_LIB_DIR "/evas/modules";
68 if (!eina_list_search_unsorted(evas_module_paths, (Eina_Compare_Cb) strcmp, path))
69 {
70 path = strdup(path);
71 if (path)
72 evas_module_paths = _evas_module_append(evas_module_paths, path);
73 }
74#endif
75}
76
77#define EVAS_EINA_STATIC_MODULE_DEFINE(Tn, Name) \
78 Eina_Bool evas_##Tn##_##Name##_init(void); \
79 void evas_##Tn##_##Name##_shutdown(void);
80
81#define EVAS_EINA_STATIC_MODULE_USE(Tn, Name) \
82 { evas_##Tn##_##Name##_init, evas_##Tn##_##Name##_shutdown }
83
84EVAS_EINA_STATIC_MODULE_DEFINE(engine, buffer);
85EVAS_EINA_STATIC_MODULE_DEFINE(engine, direct3d);
86EVAS_EINA_STATIC_MODULE_DEFINE(engine, directfb);
87EVAS_EINA_STATIC_MODULE_DEFINE(engine, fb);
88EVAS_EINA_STATIC_MODULE_DEFINE(engine, gl_x11);
89EVAS_EINA_STATIC_MODULE_DEFINE(engine, gl_sdl);
90EVAS_EINA_STATIC_MODULE_DEFINE(engine, psl1ght);
91EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_16);
92EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_16_ddraw);
93EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_16_sdl);
94EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_16_wince);
95EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_16_x11);
96EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_8);
97EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_8_x11);
98EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_ddraw);
99EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_gdi);
100EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_generic);
101EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_x11);
102EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, bmp);
103EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, edb);
104EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, eet);
105EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, generic);
106EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, gif);
107EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, ico);
108EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, jpeg);
109EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, pmaps);
110EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, png);
111EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, psd);
112EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, svg);
113EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, tga);
114EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, tiff);
115EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, wbmp);
116EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, xpm);
117EVAS_EINA_STATIC_MODULE_DEFINE(image_saver, edb);
118EVAS_EINA_STATIC_MODULE_DEFINE(image_saver, eet);
119EVAS_EINA_STATIC_MODULE_DEFINE(image_saver, jpeg);
120EVAS_EINA_STATIC_MODULE_DEFINE(image_saver, png);
121EVAS_EINA_STATIC_MODULE_DEFINE(image_saver, tiff);
122
123static const struct {
124 Eina_Bool (*init)(void);
125 void (*shutdown)(void);
126} evas_static_module[] = {
127#ifdef EVAS_STATIC_BUILD_BUFFER
128 EVAS_EINA_STATIC_MODULE_USE(engine, buffer),
129#endif
130#ifdef EVAS_STATIC_BUILD_DIRECT3D
131 EVAS_EINA_STATIC_MODULE_USE(engine, direct3d),
132#endif
133#ifdef EVAS_STATIC_BUILD_DIRECTFB
134 EVAS_EINA_STATIC_MODULE_USE(engine, directfb),
135#endif
136#ifdef EVAS_STATIC_BUILD_FB
137 EVAS_EINA_STATIC_MODULE_USE(engine, fb),
138#endif
139#ifdef EVAS_STATIC_BUILD_GL_X11
140 EVAS_EINA_STATIC_MODULE_USE(engine, gl_x11),
141#endif
142#ifdef EVAS_STATIC_BUILD_GL_SDL
143 EVAS_EINA_STATIC_MODULE_USE(engine, gl_sdl),
144#endif
145#ifdef EVAS_STATIC_BUILD_PSL1GHT
146 EVAS_EINA_STATIC_MODULE_USE(engine, psl1ght),
147#endif
148#ifdef EVAS_STATIC_BUILD_SOFTWARE_16
149 EVAS_EINA_STATIC_MODULE_USE(engine, software_16),
150#endif
151#ifdef EVAS_STATIC_BUILD_SOFTWARE_16_DDRAW
152 EVAS_EINA_STATIC_MODULE_USE(engine, software_16_ddraw),
153#endif
154#ifdef EVAS_STATIC_BUILD_SOFTWARE_16_SDL
155 EVAS_EINA_STATIC_MODULE_USE(engine, software_16_sdl),
156#endif
157#ifdef EVAS_STATIC_BUILD_SOFTWARE_16_WINCE
158 EVAS_EINA_STATIC_MODULE_USE(engine, software_16_wince),
159#endif
160#ifdef EVAS_STATIC_BUILD_SOFTWARE_16_X11
161 EVAS_EINA_STATIC_MODULE_USE(engine, software_16_x11),
162#endif
163#ifdef EVAS_STATIC_BUILD_SOFTWARE_16_DDRAW
164 EVAS_EINA_STATIC_MODULE_USE(engine, software_ddraw),
165#endif
166#ifdef EVAS_STATIC_BUILD_SOFTWARE_16_GDI
167 EVAS_EINA_STATIC_MODULE_USE(engine, software_gdi),
168#endif
169#ifdef EVAS_STATIC_BUILD_SOFTWARE_8
170 EVAS_EINA_STATIC_MODULE_USE(engine, software_8),
171#endif
172#ifdef EVAS_STATIC_BUILD_SOFTWARE_8_X11
173 EVAS_EINA_STATIC_MODULE_USE(engine, software_8_x11),
174#endif
175#ifdef EVAS_STATIC_BUILD_SOFTWARE_GENERIC
176 EVAS_EINA_STATIC_MODULE_USE(engine, software_generic),
177#endif
178#ifdef EVAS_STATIC_BUILD_SOFTWARE_X11
179 EVAS_EINA_STATIC_MODULE_USE(engine, software_x11),
180#endif
181#ifdef EVAS_STATIC_BUILD_BMP
182 EVAS_EINA_STATIC_MODULE_USE(image_loader, bmp),
183#endif
184#ifdef EVAS_STATIC_BUILD_EDB
185 EVAS_EINA_STATIC_MODULE_USE(image_loader, edb),
186#endif
187#ifdef EVAS_STATIC_BUILD_EET
188 EVAS_EINA_STATIC_MODULE_USE(image_loader, eet),
189#endif
190#ifdef EVAS_STATIC_BUILD_GENERIC
191 EVAS_EINA_STATIC_MODULE_USE(image_loader, generic),
192#endif
193#ifdef EVAS_STATIC_BUILD_GIF
194 EVAS_EINA_STATIC_MODULE_USE(image_loader, gif),
195#endif
196#ifdef EVAS_STATIC_BUILD_ICO
197 EVAS_EINA_STATIC_MODULE_USE(image_loader, ico),
198#endif
199#ifdef EVAS_STATIC_BUILD_JPEG
200 EVAS_EINA_STATIC_MODULE_USE(image_loader, jpeg),
201#endif
202#ifdef EVAS_STATIC_BUILD_PMAPS
203 EVAS_EINA_STATIC_MODULE_USE(image_loader, pmaps),
204#endif
205#ifdef EVAS_STATIC_BUILD_PNG
206 EVAS_EINA_STATIC_MODULE_USE(image_loader, png),
207#endif
208#ifdef EVAS_STATIC_BUILD_PSD
209 EVAS_EINA_STATIC_MODULE_USE(image_loader, psd),
210#endif
211#ifdef EVAS_STATIC_BUILD_SVG
212 EVAS_EINA_STATIC_MODULE_USE(image_loader, svg),
213#endif
214#ifdef EVAS_STATIC_BUILD_TGA
215 EVAS_EINA_STATIC_MODULE_USE(image_loader, tga),
216#endif
217#ifdef EVAS_STATIC_BUILD_TIFF
218 EVAS_EINA_STATIC_MODULE_USE(image_loader, tiff),
219#endif
220#ifdef EVAS_STATIC_BUILD_WBMP
221 EVAS_EINA_STATIC_MODULE_USE(image_loader, wbmp),
222#endif
223#ifdef EVAS_STATIC_BUILD_XPM
224 EVAS_EINA_STATIC_MODULE_USE(image_loader, xpm),
225#endif
226#ifdef EVAS_STATIC_BUILD_EDB
227 EVAS_EINA_STATIC_MODULE_USE(image_saver, edb),
228#endif
229#ifdef EVAS_STATIC_BUILD_EET
230 EVAS_EINA_STATIC_MODULE_USE(image_saver, eet),
231#endif
232#if defined (EVAS_BUILD_SAVER_JPEG) && defined (EVAS_STATIC_BUILD_JPEG)
233 EVAS_EINA_STATIC_MODULE_USE(image_saver, jpeg),
234#endif
235#ifdef EVAS_STATIC_BUILD_PNG
236 EVAS_EINA_STATIC_MODULE_USE(image_saver, png),
237#endif
238#ifdef EVAS_STATIC_BUILD_TIFF
239 EVAS_EINA_STATIC_MODULE_USE(image_saver, tiff),
240#endif
241 { NULL, NULL }
242};
243
244/* this will alloc an Evas_Module struct for each module
245 * it finds on the paths */
246void
247evas_module_init(void)
248{
249 int i;
250
251 evas_module_paths_init();
252
253 evas_modules[EVAS_MODULE_TYPE_ENGINE] = eina_hash_string_small_new(/* FIXME: Add a function to cleanup stuff. */ NULL);
254 evas_modules[EVAS_MODULE_TYPE_IMAGE_LOADER] = eina_hash_string_small_new(/* FIXME: Add a function to cleanup stuff. */ NULL);
255 evas_modules[EVAS_MODULE_TYPE_IMAGE_SAVER] = eina_hash_string_small_new(/* FIXME: Add a function to cleanup stuff. */ NULL);
256 evas_modules[EVAS_MODULE_TYPE_OBJECT] = eina_hash_string_small_new(/* FIXME: Add a function to cleanup stuff. */ NULL);
257
258 evas_engines = eina_array_new(4);
259
260 for (i = 0; evas_static_module[i].init; ++i)
261 evas_static_module[i].init();
262}
263
264Eina_Bool
265evas_module_register(const Evas_Module_Api *module, Evas_Module_Type type)
266{
267 Evas_Module *em;
268
269 if ((unsigned int)type > 3) return EINA_FALSE;
270 if (!module) return EINA_FALSE;
271 if (module->version != EVAS_MODULE_API_VERSION) return EINA_FALSE;
272
273 em = eina_hash_find(evas_modules[type], module->name);
274 if (em) return EINA_FALSE;
275
276 em = calloc(1, sizeof (Evas_Module));
277 if (!em) return EINA_FALSE;
278
279 em->definition = module;
280
281 if (type == EVAS_MODULE_TYPE_ENGINE)
282 {
283 eina_array_push(evas_engines, em);
284 em->id_engine = eina_array_count(evas_engines);
285 }
286
287 eina_hash_direct_add(evas_modules[type], module->name, em);
288
289 return EINA_TRUE;
290}
291
292Eina_List *
293evas_module_engine_list(void)
294{
295 Evas_Module *em;
296 Eina_List *r = NULL;
297 Eina_Array_Iterator iterator;
298 unsigned int i;
299
300 EINA_ARRAY_ITER_NEXT(evas_engines, i, em, iterator)
301 r = eina_list_append(r, em->definition->name);
302
303 return r;
304}
305
306Eina_Bool
307evas_module_unregister(const Evas_Module_Api *module, Evas_Module_Type type)
308{
309 Evas_Module *em;
310
311 if ((unsigned int)type > 3) return EINA_FALSE;
312 if (!module) return EINA_FALSE;
313
314 em = eina_hash_find(evas_modules[type], module->name);
315 if (!em || em->definition != module) return EINA_FALSE;
316
317 if (type == EVAS_MODULE_TYPE_ENGINE)
318 eina_array_data_set(evas_engines, em->id_engine, NULL);
319
320 eina_hash_del(evas_modules[type], module->name, em);
321 free(em);
322
323 return EINA_TRUE;
324}
325
326#if defined(__CEGCC__) || defined(__MINGW32CE__)
327# define EVAS_MODULE_NAME_IMAGE_SAVER "saver_%s.dll"
328# define EVAS_MODULE_NAME_IMAGE_LOADER "loader_%s.dll"
329# define EVAS_MODULE_NAME_ENGINE "engine_%s.dll"
330# define EVAS_MODULE_NAME_OBJECT "object_%s.dll"
331#elif _WIN32
332# define EVAS_MODULE_NAME_IMAGE_SAVER "module.dll"
333# define EVAS_MODULE_NAME_IMAGE_LOADER "module.dll"
334# define EVAS_MODULE_NAME_ENGINE "module.dll"
335# define EVAS_MODULE_NAME_OBJECT "module.dll"
336#else
337# define EVAS_MODULE_NAME_IMAGE_SAVER "module.so"
338# define EVAS_MODULE_NAME_IMAGE_LOADER "module.so"
339# define EVAS_MODULE_NAME_ENGINE "module.so"
340# define EVAS_MODULE_NAME_OBJECT "module.so"
341#endif
342
343Evas_Module *
344evas_module_find_type(Evas_Module_Type type, const char *name)
345{
346 const char *path;
347 const char *format = NULL;
348 char buffer[4096];
349 Evas_Module *em;
350 Eina_Module *en;
351 Eina_List *l;
352
353 if ((unsigned int)type > 3) return NULL;
354
355 em = eina_hash_find(evas_modules[type], name);
356 if (em) return em;
357
358 EINA_LIST_FOREACH(evas_module_paths, l, path)
359 {
360 switch (type)
361 {
362 case EVAS_MODULE_TYPE_ENGINE: format = "%s/engines/%s/%s/" EVAS_MODULE_NAME_ENGINE; break;
363 case EVAS_MODULE_TYPE_IMAGE_LOADER: format = "%s/loaders/%s/%s/" EVAS_MODULE_NAME_IMAGE_LOADER; break;
364 case EVAS_MODULE_TYPE_IMAGE_SAVER: format = "%s/savers/%s/%s/" EVAS_MODULE_NAME_IMAGE_SAVER; break;
365 case EVAS_MODULE_TYPE_OBJECT: format = "%s/object/%s/%s/" EVAS_MODULE_NAME_OBJECT; break;
366 }
367
368 snprintf(buffer, sizeof (buffer), format, path, name, MODULE_ARCH, name);
369 if (!evas_file_path_is_file(buffer)) continue;
370
371 en = eina_module_new(buffer);
372 if (!en) continue;
373
374 if (!eina_module_load(en))
375 {
376 eina_module_free(en);
377 continue;
378 }
379
380 em = eina_hash_find(evas_modules[type], name);
381 if (em)
382 {
383 eina_evas_modules = eina_list_append(eina_evas_modules, en);
384 return em;
385 }
386
387 eina_module_free(en);
388 }
389
390 return NULL;
391}
392
393Evas_Module *
394evas_module_engine_get(int render_method)
395{
396 if ((render_method <= 0) ||
397 ((unsigned int)render_method > eina_array_count(evas_engines)))
398 return NULL;
399 return eina_array_data_get(evas_engines, render_method - 1);
400}
401
402void
403evas_module_foreach_image_loader(Eina_Hash_Foreach cb, const void *fdata)
404{
405 eina_hash_foreach(evas_modules[EVAS_MODULE_TYPE_IMAGE_LOADER], cb, fdata);
406}
407
408int
409evas_module_load(Evas_Module *em)
410{
411 if (em->loaded) return 1;
412 if (!em->definition) return 0;
413
414 if (!em->definition->func.open(em)) return 0;
415 em->loaded = 1;
416
417#ifdef BUILD_ASYNC_PRELOAD
418 LKI(em->lock);
419#endif
420 return 1;
421}
422
423void
424evas_module_unload(Evas_Module *em)
425{
426 if (!em->loaded)
427 return;
428 if (!em->definition)
429 return ;
430
431// for now lets not unload modules - they may still be in use.
432// em->definition->func.close(em);
433// em->loaded = 0;
434
435#ifdef BUILD_ASYNC_PRELOAD
436 LKD(em->lock);
437#endif
438}
439
440void
441evas_module_ref(Evas_Module *em)
442{
443#ifdef BUILD_ASYNC_PRELOAD
444 LKL(em->lock);
445#endif
446 em->ref++;
447#ifdef BUILD_ASYNC_PRELOAD
448 LKU(em->lock);
449#endif
450}
451
452void
453evas_module_unref(Evas_Module *em)
454{
455#ifdef BUILD_ASYNC_PRELOAD
456 LKL(em->lock);
457#endif
458 em->ref--;
459#ifdef BUILD_ASYNC_PRELOAD
460 LKU(em->lock);
461#endif
462}
463
464static int use_count = 0;
465
466void
467evas_module_use(Evas_Module *em)
468{
469 em->last_used = use_count;
470}
471
472void
473evas_module_clean(void)
474{
475 static int call_count = 0;
476/* int ago; */
477 int noclean = -1;
478/* Eina_List *l; */
479/* Evas_Module *em; */
480
481 /* only clean modules every 256 calls */
482 call_count++;
483 if (call_count <= 256) return;
484 call_count = 0;
485
486 if (noclean == -1)
487 {
488 if (getenv("EVAS_NOCLEAN"))
489 noclean = 1;
490 else
491 noclean = 0;
492 }
493 if (noclean == 1) return;
494
495 /* disable module cleaning for now - may cause instability with some modules */
496 return;
497
498 /* FIXME: Don't know what it is supposed to do. */
499/* /\* incriment use counter = 28bits *\/ */
500/* use_count++; */
501/* if (use_count > 0x0fffffff) use_count = 0; */
502
503/* /\* printf("CLEAN!\n"); *\/ */
504/* /\* go through all modules *\/ */
505/* EINA_LIST_FOREACH(evas_modules, l, em) */
506/* { */
507/* /\* printf("M %s %i %i\n", em->name, em->ref, em->loaded); *\/ */
508/* /\* if the module is refernced - skip *\/ */
509/* if ((em->ref > 0) || (!em->loaded)) continue; */
510/* /\* how many clean cycles ago was this module last used *\/ */
511/* ago = use_count - em->last_used; */
512/* if (em->last_used > use_count) ago += 0x10000000; */
513/* /\* if it was used last more than N clean cycles ago - unload *\/ */
514/* if (ago > 5) */
515/* { */
516/* /\* printf(" UNLOAD %s\n", em->name); *\/ */
517/* evas_module_unload(em); */
518/* } */
519/* } */
520}
521
522/* will dlclose all the modules loaded and free all the structs */
523void
524evas_module_shutdown(void)
525{
526 Eina_Module *en;
527 char *path;
528 int i;
529
530 for (i = 0; evas_static_module[i].shutdown; ++i)
531 evas_static_module[i].shutdown();
532
533 EINA_LIST_FREE(eina_evas_modules, en)
534 eina_module_free(en);
535
536 eina_hash_free(evas_modules[EVAS_MODULE_TYPE_ENGINE]);
537 evas_modules[EVAS_MODULE_TYPE_ENGINE] = NULL;
538 eina_hash_free(evas_modules[EVAS_MODULE_TYPE_IMAGE_LOADER]);
539 evas_modules[EVAS_MODULE_TYPE_IMAGE_LOADER] = NULL;
540 eina_hash_free(evas_modules[EVAS_MODULE_TYPE_IMAGE_SAVER]);
541 evas_modules[EVAS_MODULE_TYPE_IMAGE_SAVER] = NULL;
542 eina_hash_free(evas_modules[EVAS_MODULE_TYPE_OBJECT]);
543 evas_modules[EVAS_MODULE_TYPE_OBJECT] = NULL;
544
545 EINA_LIST_FREE(evas_module_paths, path)
546 free(path);
547
548 eina_array_free(evas_engines);
549 evas_engines = NULL;
550}
551
552EAPI int
553_evas_module_engine_inherit(Evas_Func *funcs, char *name)
554{
555 Evas_Module *em;
556
557 em = evas_module_find_type(EVAS_MODULE_TYPE_ENGINE, name);
558 if (em)
559 {
560 if (evas_module_load(em))
561 {
562 /* FIXME: no way to unref */
563 evas_module_ref(em);
564 evas_module_use(em);
565 *funcs = *((Evas_Func *)(em->functions));
566 return 1;
567 }
568 }
569 return 0;
570}
571
572static Eina_Prefix *pfx = NULL;
573
574EAPI const char *
575_evas_module_libdir_get(void)
576{
577 if (!pfx) pfx = eina_prefix_new
578 (NULL, _evas_module_libdir_get, "EVAS", "evas", NULL,
579 PACKAGE_BIN_DIR, PACKAGE_LIB_DIR, PACKAGE_DATA_DIR, PACKAGE_DATA_DIR);
580 if (!pfx) return NULL;
581 return eina_prefix_lib_get(pfx);
582}