efl/src/lib/ecore_x/xcb/ecore_xcb_xdefaults.c

117 lines
2.8 KiB
C

#include "ecore_xcb_private.h"
#include <fnmatch.h>
/* local function prototypes */
static Eina_Bool _ecore_xcb_xdefaults_glob_match(const char *str,
const char *glob);
/* local variables */
static Eina_File *_ecore_xcb_xdefaults_file = NULL;
static char *_ecore_xcb_xdefaults_data = NULL;
void
_ecore_xcb_xdefaults_init(void)
{
char buff[PATH_MAX];
LOGFN(__FILE__, __LINE__, __FUNCTION__);
snprintf(buff, sizeof(buff), "%s/.Xdefaults", getenv("HOME"));
if ((_ecore_xcb_xdefaults_file = eina_file_open(buff, EINA_FALSE)))
{
eina_mmap_safety_enabled_set(EINA_TRUE);
_ecore_xcb_xdefaults_data =
eina_file_map_all(_ecore_xcb_xdefaults_file, EINA_FILE_SEQUENTIAL);
}
}
void
_ecore_xcb_xdefaults_shutdown(void)
{
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!_ecore_xcb_xdefaults_file) return;
if (_ecore_xcb_xdefaults_data)
eina_file_map_free(_ecore_xcb_xdefaults_file, _ecore_xcb_xdefaults_data);
if (_ecore_xcb_xdefaults_file) eina_file_close(_ecore_xcb_xdefaults_file);
}
char *
_ecore_xcb_xdefaults_string_get(const char *prog,
const char *param)
{
char buff[1024], ret[1024];
char *str = NULL;
char **ea = NULL;
unsigned int count = 0, i = 0;
if ((!_ecore_xcb_xdefaults_data) || (!_ecore_xcb_xdefaults_file))
return NULL;
snprintf(buff, sizeof(buff), "*%s*.*%s*", prog, param);
str = _ecore_xcb_xdefaults_data;
ea = eina_str_split_full(str, "\n", -1, &count);
for (i = 0; i < count; i++)
{
if (_ecore_xcb_xdefaults_glob_match(ea[i], buff))
sscanf(ea[i], "%*[^:]:%*[ ]%s", ret);
}
if ((ea) && (ea[0]))
{
free(ea[0]);
free(ea);
}
return strdup(ret);
}
int
_ecore_xcb_xdefaults_int_get(const char *prog,
const char *param)
{
char buff[1024];
char *str = NULL;
char **ea = NULL;
unsigned int count = 0, i = 0;
int ret = -1;
if ((!_ecore_xcb_xdefaults_data) || (!_ecore_xcb_xdefaults_file))
return 0;
snprintf(buff, sizeof(buff), "*%s*.*%s*", prog, param);
str = _ecore_xcb_xdefaults_data;
ea = eina_str_split_full(str, "\n", -1, &count);
for (i = 0; i < count; i++)
{
if (_ecore_xcb_xdefaults_glob_match(ea[i], buff))
sscanf(ea[i], "%*[^:]:%*[ ]%d", &ret);
}
if ((ea) && (ea[0]))
{
free(ea[0]);
free(ea);
}
return ret;
}
/* local functions */
static Eina_Bool
_ecore_xcb_xdefaults_glob_match(const char *str,
const char *glob)
{
if ((!str) || (!glob)) return EINA_FALSE;
if (glob[0] == 0)
{
if (str[0] == 0) return EINA_TRUE;
return EINA_FALSE;
}
if (!strcmp(glob, "*")) return EINA_TRUE;
if (!fnmatch(glob, str, 0)) return EINA_TRUE;
return EINA_FALSE;
}