diff options
| -rw-r--r-- | eglib/gmain.c | 77 | 
1 files changed, 51 insertions, 26 deletions
| diff --git a/eglib/gmain.c b/eglib/gmain.c index 5be81a3c..9936143d 100644 --- a/eglib/gmain.c +++ b/eglib/gmain.c @@ -15,6 +15,7 @@  #include <sys/stat.h>  #include <sys/mman.h>  #include <sys/file.h> +#include <ctype.h>  #include <gmain.h> @@ -1221,15 +1222,29 @@ gboolean g_key_file_load_from_file(GKeyFile *key_file,  	return TRUE;  } +static char *next_line(const char *ptr) +{ +	char *nl; + +	nl = strchr(ptr, '\n'); +	if (!nl) +		return NULL; + +	if (nl[1] == '\0') +		return NULL; + +	return nl + 1; +} +  gchar *g_key_file_get_string(GKeyFile *key_file,  				const gchar *group_name,  				const gchar *key,  				GError **error)  {  	struct stat st; -	char *map, *nl, *off, *group = NULL, *value = NULL, tmp[1024]; +	char *map, *line, *group = NULL, *value = NULL;  	off_t size; -	size_t key_len, to_copy, value_len; +	size_t key_len, group_len;   	int fd, err = 0;  	fd = open(key_file->filename, O_RDONLY); @@ -1257,40 +1272,50 @@ gchar *g_key_file_get_string(GKeyFile *key_file,  		goto unlock;  	} -	group = strstr(map, group_name); -	if (!group) -		goto unmap; - -	nl = strchr(group, '\n'); -	if (!nl) -		goto unmap; +	group_len = strlen(group_name); +	key_len = strlen(key); -	off = strstr(nl + 1, key); -	if (!off) -		goto unmap; +	for (line = map; line != NULL; line = next_line(line)) { +		int i; +		size_t to_copy, value_len; +		char tmp[1024], *nl; -	key_len = strlen(key); +		if (*line == '#') +			continue; -	if (off[key_len] != '=') -		goto unmap; +		if (!group) { +			if (line[0] != '[' || strcmp(line + 1, group_name)) +				continue; +			if (line[group_len + 1] == ']') +				group = line + 1; +			continue; +		} -	off += key_len + 1; +		if (strncmp(line, key, key_len)) +			continue; -	nl = strchr(off, '\n'); -	if (!nl) -		goto unmap; +		for (i = 0; line[i] != '\n'; i++) { +			if (line[i] == '=') +				break; +			if (!isspace(line[i])) +				break; +		} -	value_len = nl - off; +		if (line[i] != '=') +			continue; -	to_copy = value_len > (sizeof(tmp) - 1) ? sizeof(tmp) - 1 : value_len; +		nl = strchr(line, '\n'); +		if (!nl) +			continue; -	memset(tmp, 0, sizeof(tmp)); +		value_len = nl - (line + i + 1); +		to_copy = value_len > (sizeof(tmp) - 1) ? sizeof(tmp) - 1 : value_len; +		memset(tmp, 0, sizeof(tmp)); +		strncpy(tmp, line + i + 1, to_copy); -	strncpy(tmp, off, to_copy); +		value = g_strdup(tmp); +	} -	value = g_strdup(tmp); -		 -unmap:  	munmap(map, size);  unlock: | 
