From ed6373ac1a82f3842af49346b33170e38c58ec8d Mon Sep 17 00:00:00 2001 From: Jesse van den Kieboom Date: Tue, 15 Nov 2005 11:59:11 +0000 Subject: [PATCH] Added functions, fixed functions for utf-8 --- gnoemoe/gm-string.c | 105 +++++++++++++++++++++++++++++++++++++++----- gnoemoe/gm-string.h | 31 +++---------- 2 files changed, 100 insertions(+), 36 deletions(-) diff --git a/gnoemoe/gm-string.c b/gnoemoe/gm-string.c index 0c46e40..0712999 100644 --- a/gnoemoe/gm-string.c +++ b/gnoemoe/gm-string.c @@ -188,16 +188,97 @@ gm_string_trim(const gchar *str) { } } -void -gm_string_remove_char(char *str, char rem) { - int i, j = 0; - - for (i = 0; str[i] != '\0'; i++) { - if (str[i] != rem) { - str[j] = str[i]; - j++; - } - } - - str[j] = '\0'; +gchar * +gm_string_remove_char(gchar *str, gchar rem) { + gchar *ptr = str; + gboolean changed = FALSE; + gunichar c; + + while (*str != '\0') { + c = g_utf8_get_char(str); + + if (c != (gunichar)rem) { + if (changed) { + ptr += g_unichar_to_utf8(c, ptr); + ++ptr; + } else { + ptr = g_utf8_next_char(ptr); + } + } else { + changed = TRUE; + } + + str = g_utf8_next_char(str); + } + + *ptr = '\0'; + + return str; +} + +void +gm_string_skip_space(gchar const **ptr) { + while (**ptr != '\0' && g_unichar_isspace(g_utf8_get_char(*ptr))) { + *ptr = g_utf8_next_char(*ptr); + } +} + +void +gm_string_skip_nonspace(gchar const **ptr) { + while (**ptr != '\0' && !g_unichar_isspace(g_utf8_get_char(*ptr))) { + *ptr = g_utf8_next_char(*ptr); + } +} + +void +gm_string_skip_till(gchar const **ptr, gchar const *find) { + gchar const *fptr; + gunichar check; + + while (**ptr != '\0') { + check = g_utf8_get_char(*ptr); + + for (fptr = find; *fptr; ++fptr) { + // CHECK: find should also be treated as utf8! + if (check == (gunichar)(*fptr)) { + return; + } + } + + *ptr = g_utf8_next_char(*ptr); + } +} + +gchar * +gm_string_escape(gchar const *line) { + GString *new_line; + gchar *ptr; + gunichar c; + + if (*line == '\0') { + return g_strdup(""); + } + + if (g_utf8_strchr(line, '"', -1) || g_utf8_strchr(line, '\\', -1)) { + // We need at least strlen(line) + new_line = g_string_sized_new(strlen(line)); + + while (*line != '\0') { + c = g_utf8_get_char(line); + + if (c == '"' || c == '\\') { + g_string_append_c(new_line, '\\'); + } + + g_string_append_unichar(new_line, c); + line = g_utf8_next_char(line); + } + + ptr = new_line->str; + g_string_free(new_line, FALSE); + + return ptr; + } else { + return g_strdup(line); + } } diff --git a/gnoemoe/gm-string.h b/gnoemoe/gm-string.h index 9bd2b03..ab0b876 100644 --- a/gnoemoe/gm-string.h +++ b/gnoemoe/gm-string.h @@ -4,33 +4,16 @@ #include #include -/*typedef struct _stringlist_item stringlist_item; -struct _stringlist_item { - char *data; - - stringlist_item *next; - stringlist_item *prev; -}; - -typedef struct _stringlist stringlist; -struct _stringlist { - stringlist_item *firstItem; - stringlist_item *lastItem; - - unsigned int count; -}; - -void stringlist_add(stringlist * strl, char *data); -void stringlist_remove(stringlist * strl, stringlist_item * removed); -stringlist *stringlist_create(char *argstr, char *delim); -void stringlist_destroy(stringlist * strl); -char *stringlist_glue_it(stringlist * strl, char *glue); -*/ - int gm_string_to_int(const gchar *str, int *result); char *gm_string_catn(char *str, char *add, unsigned int n); char *gm_string_cat(char *str, char *add); char *gm_string_trim(const gchar *str); -void gm_string_remove_char(char *str, char rem); +gchar *gm_string_remove_char(gchar *str, gchar rem); + +void gm_string_skip_space(gchar const **ptr); +void gm_string_skip_nonspace(gchar const **ptr); +void gm_string_skip_till(gchar const **ptr, gchar const *find); + +gchar *gm_string_escape(gchar const *line); #endif