diff options
| -rw-r--r-- | eglib/gmain.c | 63 | ||||
| -rw-r--r-- | eglib/gmain.h | 8 | 
2 files changed, 67 insertions, 4 deletions
diff --git a/eglib/gmain.c b/eglib/gmain.c index 8341c664..b51da600 100644 --- a/eglib/gmain.c +++ b/eglib/gmain.c @@ -1355,6 +1355,37 @@ gchar *g_strconcat(const gchar *string1, ...)  	return concat;  } +gsize g_strlcat(gchar *dest, const gchar *src, gsize dest_size) +{ +	gchar *d = dest; +	const gchar *s = src; +	gsize bytes_left = dest_size; +	gsize dlength;  /* Logically, MIN(strlen(d), dest_size) */ + +	if (!d || !s) +		return 0; + +	/* Find the end of dst and adjust bytes left but don't go past end */ +	while (*d != 0 && bytes_left-- != 0) +		d++; +	dlength = d - dest; +	bytes_left = dest_size - dlength; + +	if (bytes_left == 0) +		return dlength + strlen(s); + +	while (*s != 0) { +		if (bytes_left != 1) { +			*d++ = *s; +			bytes_left--; +		} +		s++; +	} +	*d = 0; + +	return dlength + (s - src);  /* count does not include NULL */ +} +  gchar **g_strsplit(const gchar *string, const gchar *delimiter, gint max_tokens)  {  	GSList *string_list = NULL, *slist; @@ -1427,6 +1458,23 @@ gboolean g_str_has_prefix(const gchar *str, const gchar *prefix)  	return strncmp(str, prefix, prefix_len) == 0;  } +gboolean g_str_has_suffix(const gchar *str, const gchar *suffix) +{ +	int str_len; +	int suffix_len; + +	if (!str || !suffix) +		return FALSE; + +	str_len = strlen(str); +	suffix_len = strlen(suffix); + +	if (str_len < suffix_len) +		return FALSE; + +	return strcmp(str + str_len - suffix_len, suffix) == 0; +} +  /* GKeyFile */  struct _GKeyFile { @@ -1718,7 +1766,20 @@ void g_markup_parse_context_free(GMarkupParseContext *context)  static gchar *g_build_pathname_va(const gchar *first_element,  						va_list args, gpointer *data)  { -	return NULL; +	gchar result[PATH_MAX], *element; + +	strncpy(result, first_element, PATH_MAX); +	element = va_arg(args, gchar *); + +	while (element) { +		g_strlcat(result, "/", PATH_MAX); +		g_strlcat(result, element, PATH_MAX); +		element = va_arg(args, gchar *); +	} + +	va_end(args); + +	return g_strdup(result);  }  gchar *g_build_filename(const gchar *first_element, ...) diff --git a/eglib/gmain.h b/eglib/gmain.h index 3fc99ce3..15b6c072 100644 --- a/eglib/gmain.h +++ b/eglib/gmain.h @@ -227,9 +227,11 @@ gchar *g_strdup(const gchar *str);  gchar* g_strdup_printf(const gchar *format, ...);  gchar* g_strdelimit(gchar *string, const gchar *delimiters, gchar new_delim);  gchar *g_strconcat(const gchar *string1, ...); +gsize g_strlcat(gchar *dest, const gchar *src, gsize dest_size);  gchar **g_strsplit(const gchar *string, const gchar *delimiter, gint max_tokens);  gboolean g_str_equal(gconstpointer v1, gconstpointer v2);  gboolean g_str_has_prefix(const gchar *str, const gchar *prefix); +gboolean g_str_has_suffix(const gchar *str, const gchar *suffix);  #define g_new(struct_type, n_structs) \  	((struct_type *) g_malloc (((gsize) sizeof (struct_type)) * ((gsize) (n_structs)))) @@ -287,7 +289,7 @@ gchar *g_string_free(GString *string, gboolean free_segment);  typedef enum {  	G_MARKUP_DO_NOT_USE_THIS_UNSUPPORTED_FLAG	= 1 << 0, -	G_MARKUP_TREAT_CDATA_AS_TEXT			= 1 << 1   +	G_MARKUP_TREAT_CDATA_AS_TEXT			= 1 << 1  } GMarkupParseFlags;  typedef struct _GMarkupParseContext GMarkupParseContext; @@ -312,7 +314,7 @@ struct _GMarkupParser {  	/* text is not nul-terminated */  	void (*text) (GMarkupParseContext *context,  			const gchar *text, -			gsize text_len,   +			gsize text_len,  			gpointer user_data,  			GError **error); @@ -323,7 +325,7 @@ struct _GMarkupParser {  	/* text is not nul-terminated. */  	void (*passthrough) (GMarkupParseContext *context,  			const gchar *passthrough_text, -			gsize text_len,   +			gsize text_len,  			gpointer user_data,  			GError **error);  | 
