enlightenment/src/bin/e_path.c

395 lines
8.4 KiB
C
Raw Normal View History

2005-02-07 05:51:09 -08:00
/*
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#include "e.h"
/* local subsystem functions */
static void _e_path_free(E_Path *ep);
static void _e_path_cache_free(E_Path *ep);
static Evas_Bool _e_path_cache_free_cb(const Evas_Hash *hash, const void *key, void *data, void *fdata);
/* externally accessible functions */
2006-01-07 02:39:46 -08:00
EAPI E_Path *
e_path_new(void)
{
E_Path *ep;
ep = E_OBJECT_ALLOC(E_Path, E_PATH_TYPE, _e_path_free);
return ep;
}
2006-01-07 02:39:46 -08:00
EAPI void
2005-05-19 20:09:44 -07:00
e_path_default_path_append(E_Path *ep, const char *path)
{
E_OBJECT_CHECK(ep);
E_OBJECT_TYPE_CHECK(ep, E_PATH_TYPE);
if (!path) return;
if (path[0] == '~')
{
2005-05-19 20:09:44 -07:00
E_Path_Dir *epd;
char *new_path;
const char *home_dir;
int len1, len2;
home_dir = e_user_homedir_get();
len1 = strlen(home_dir);
len2 = strlen(path);
new_path = malloc(len1 + len2 + 1);
if (!new_path) return;
2005-05-19 20:09:44 -07:00
epd = malloc(sizeof(E_Path_Dir));
if (!epd)
{
free(new_path);
return;
}
strcpy(new_path, home_dir);
strcat(new_path, path + 1);
epd->dir = eina_stringshare_add(new_path);
free(new_path);
ep->default_dir_list = eina_list_append(ep->default_dir_list, epd);
}
else
2005-05-19 20:09:44 -07:00
{
E_Path_Dir *epd;
epd = malloc(sizeof(E_Path_Dir));
if (!epd)
return;
epd->dir = eina_stringshare_add(path);
ep->default_dir_list = eina_list_append(ep->default_dir_list, epd);
2005-05-19 20:09:44 -07:00
}
_e_path_cache_free(ep);
}
2006-01-07 02:39:46 -08:00
EAPI void
e_path_user_path_set(E_Path *ep, Eina_List **user_dir_list)
2005-05-19 20:09:44 -07:00
{
E_OBJECT_CHECK(ep);
E_OBJECT_TYPE_CHECK(ep, E_PATH_TYPE);
ep->user_dir_list = user_dir_list;
_e_path_cache_free(ep);
}
2006-01-07 02:39:46 -08:00
EAPI void
2005-05-19 20:09:44 -07:00
e_path_user_path_append(E_Path *ep, const char *path)
{
E_OBJECT_CHECK(ep);
E_OBJECT_TYPE_CHECK(ep, E_PATH_TYPE);
if (!path) return;
if (path[0] == '~')
{
2005-05-19 20:09:44 -07:00
E_Path_Dir *epd;
char *new_path;
const char *home_dir;
int len1, len2;
home_dir = e_user_homedir_get();
len1 = strlen(home_dir);
len2 = strlen(path);
new_path = malloc(len1 + len2 + 1);
if (!new_path) return;
2005-05-19 20:09:44 -07:00
epd = malloc(sizeof(E_Path_Dir));
if (!epd)
{
free(new_path);
return;
}
strcpy(new_path, home_dir);
strcat(new_path, path + 1);
epd->dir = eina_stringshare_add(new_path);
free(new_path);
*(ep->user_dir_list) = eina_list_append(*(ep->user_dir_list), epd);
}
else
2005-05-19 20:09:44 -07:00
{
E_Path_Dir *epd;
epd = malloc(sizeof(E_Path_Dir));
if (!epd)
return;
epd->dir = eina_stringshare_add(path);
*(ep->user_dir_list) = eina_list_append(*(ep->user_dir_list), epd);
2005-05-19 20:09:44 -07:00
}
_e_path_cache_free(ep);
}
2006-01-07 02:39:46 -08:00
EAPI void
2005-05-19 20:09:44 -07:00
e_path_user_path_prepend(E_Path *ep, const char *path)
{
E_OBJECT_CHECK(ep);
E_OBJECT_TYPE_CHECK(ep, E_PATH_TYPE);
if (!path) return;
if (path[0] == '~')
{
E_Path_Dir *epd;
char *new_path;
const char *home_dir;
2005-05-19 20:09:44 -07:00
int len1, len2;
home_dir = e_user_homedir_get();
len1 = strlen(home_dir);
len2 = strlen(path);
new_path = malloc(len1 + len2 + 1);
if (!new_path) return;
2005-05-19 20:09:44 -07:00
epd = malloc(sizeof(E_Path_Dir));
if (!epd)
{
free(new_path);
return;
}
strcpy(new_path, home_dir);
strcat(new_path, path + 1);
epd->dir = eina_stringshare_add(new_path);
free(new_path);
*(ep->user_dir_list) = eina_list_prepend(*(ep->user_dir_list), epd);
2005-05-19 20:09:44 -07:00
}
else
{
E_Path_Dir *epd;
epd = malloc(sizeof(E_Path_Dir));
if (!epd)
return;
epd->dir = eina_stringshare_add(path);
*(ep->user_dir_list) = eina_list_prepend(*(ep->user_dir_list), epd);
2005-05-19 20:09:44 -07:00
}
_e_path_cache_free(ep);
}
2006-01-07 02:39:46 -08:00
EAPI void
2005-05-19 20:09:44 -07:00
e_path_user_path_remove(E_Path *ep, const char *path)
{
Eina_List *l;
E_OBJECT_CHECK(ep);
E_OBJECT_TYPE_CHECK(ep, E_PATH_TYPE);
if (!path) return;
if (path[0] == '~')
{
char *new_path;
const char *home_dir;
int len1, len2;
home_dir = e_user_homedir_get();
len1 = strlen(home_dir);
len2 = strlen(path);
new_path = malloc(len1 + len2 + 1);
if (!new_path) return;
strcpy(new_path, home_dir);
strcat(new_path, path + 1);
2005-05-19 20:09:44 -07:00
for (l = *(ep->user_dir_list); l; l = l->next)
{
2005-05-19 20:09:44 -07:00
E_Path_Dir *epd;
2005-05-19 20:09:44 -07:00
epd = l->data;
if (epd->dir)
{
2005-05-19 20:09:44 -07:00
if (!strcmp(epd->dir, new_path))
{
*(ep->user_dir_list) = eina_list_remove_list(
2005-05-19 20:09:44 -07:00
*(ep->user_dir_list), l);
eina_stringshare_del(epd->dir);
2005-05-19 20:09:44 -07:00
free(epd);
free(new_path);
_e_path_cache_free(ep);
return;
}
}
}
free(new_path);
}
else
{
2005-05-19 20:09:44 -07:00
for (l = *(ep->user_dir_list); l; l = l->next)
{
2005-05-19 20:09:44 -07:00
E_Path_Dir *epd;
epd = l->data;
if (epd->dir)
{
2005-05-19 20:09:44 -07:00
if (!strcmp(epd->dir, path))
{
*(ep->user_dir_list) = eina_list_remove_list(
2005-05-19 20:09:44 -07:00
*(ep->user_dir_list), l);
eina_stringshare_del(epd->dir);
2005-05-19 20:09:44 -07:00
free(epd);
_e_path_cache_free(ep);
return;
}
}
}
}
}
EAPI void
e_path_user_path_clear(E_Path *ep)
{
while (*(ep->user_dir_list))
{
E_Path_Dir *epd;
epd = (*(ep->user_dir_list))->data;
*(ep->user_dir_list) = eina_list_remove_list(*(ep->user_dir_list), *(ep->user_dir_list));
eina_stringshare_del(epd->dir);
free(epd);
}
_e_path_cache_free(ep);
}
EAPI const char *
e_path_find(E_Path *ep, const char *file)
{
Eina_List *l;
char *str;
char buf[PATH_MAX] = "";
E_OBJECT_CHECK_RETURN(ep, NULL);
E_OBJECT_TYPE_CHECK_RETURN(ep, E_PATH_TYPE, NULL);
2005-05-19 20:09:44 -07:00
if (!file) return NULL;
str = evas_hash_find(ep->hash, file);
if (str) return eina_stringshare_add(str);
2005-05-19 20:09:44 -07:00
/* Look in the default dir list */
for (l = ep->default_dir_list; l; l = l->next)
{
E_Path_Dir *epd;
2006-12-28 05:58:12 -08:00
2005-05-19 20:09:44 -07:00
epd = l->data;
if (epd->dir)
{
snprintf(buf, sizeof(buf), "%s/%s", epd->dir, file);
if (ecore_file_exists(buf))
{
if (evas_hash_size(ep->hash) >= 512)
_e_path_cache_free(ep);
ep->hash = evas_hash_add(ep->hash, file,
eina_stringshare_add(buf));
return eina_stringshare_add(buf);
}
2005-05-19 20:09:44 -07:00
}
}
/* Look in the users dir list */
for (l = *(ep->user_dir_list); l; l = l->next)
{
2005-05-19 20:09:44 -07:00
E_Path_Dir *epd;
2005-05-19 20:09:44 -07:00
epd = l->data;
if (epd->dir)
{
snprintf(buf, sizeof(buf), "%s/%s", epd->dir, file);
if (ecore_file_exists(buf))
{
if (evas_hash_size(ep->hash) >= 512)
_e_path_cache_free(ep);
ep->hash = evas_hash_add(ep->hash, file,
eina_stringshare_add(buf));
return eina_stringshare_add(buf);
}
}
}
return NULL;
}
2006-01-07 02:39:46 -08:00
EAPI void
e_path_evas_append(E_Path *ep, Evas *evas)
{
Eina_List *l;
Eina_List *dir_list;
E_OBJECT_CHECK(ep);
E_OBJECT_TYPE_CHECK(ep, E_PATH_TYPE);
if (!evas) return;
2005-05-19 20:09:44 -07:00
dir_list = e_path_dir_list_get(ep);
for (l = dir_list; l; l = l->next)
{
2005-05-19 20:09:44 -07:00
E_Path_Dir *epd;
2005-05-19 20:09:44 -07:00
epd = l->data;
if (epd->dir) evas_font_path_append(evas, epd->dir);
eina_stringshare_del(epd->dir);
free(epd);
2005-05-19 20:09:44 -07:00
}
if (dir_list) eina_list_free(dir_list);
2005-05-19 20:09:44 -07:00
}
/* combine default_list and and user_list in and easy to use list */
EAPI Eina_List *
2005-05-19 20:09:44 -07:00
e_path_dir_list_get(E_Path *ep)
{
Eina_List *dir_list;
Eina_List *l;
2005-05-19 20:09:44 -07:00
E_Path_Dir *new_epd;
E_Path_Dir *epd;
dir_list = NULL;
if (ep->user_dir_list)
2005-05-19 20:09:44 -07:00
{
for (l = *(ep->user_dir_list); l; l = l->next)
{
epd = l->data;
new_epd = malloc(sizeof(E_Path_Dir));
new_epd->dir = eina_stringshare_add(epd->dir);
dir_list = eina_list_append(dir_list, new_epd);
}
2005-05-19 20:09:44 -07:00
}
for (l = ep->default_dir_list; l; l = l->next)
{
epd = l->data;
new_epd = malloc(sizeof(E_Path_Dir));
new_epd->dir = eina_stringshare_add(epd->dir);
dir_list = eina_list_append(dir_list, new_epd);
}
2005-05-19 20:09:44 -07:00
return dir_list;
}
2006-01-07 02:39:46 -08:00
EAPI void
e_path_dir_list_free(Eina_List *dir_list)
2005-05-19 20:09:44 -07:00
{
E_Path_Dir *epd;
while (dir_list)
{
epd = dir_list->data;
dir_list = eina_list_remove_list(dir_list, dir_list);
eina_stringshare_del(epd->dir);
2005-05-19 20:09:44 -07:00
free(epd);
}
}
/* local subsystem functions */
static void
_e_path_free(E_Path *ep)
{
_e_path_cache_free(ep);
2005-05-19 20:09:44 -07:00
while (ep->default_dir_list)
{
2005-05-19 20:09:44 -07:00
E_Path_Dir *epd;
epd = ep->default_dir_list->data;
eina_stringshare_del(epd->dir);
2005-05-19 20:09:44 -07:00
free(epd);
ep->default_dir_list = eina_list_remove_list(ep->default_dir_list,
ep->default_dir_list);
}
free(ep);
}
static void
_e_path_cache_free(E_Path *ep)
{
if (!ep->hash) return;
2005-02-16 03:31:21 -08:00
evas_hash_foreach(ep->hash, _e_path_cache_free_cb, NULL);
evas_hash_free(ep->hash);
2005-05-19 20:09:44 -07:00
ep->hash = NULL;
}
static Evas_Bool
_e_path_cache_free_cb(const Evas_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
{
eina_stringshare_del(data);
return 1;
}