From: Rob Norris Date: Wed, 23 Jan 2013 20:14:39 +0000 (+0000) Subject: [QA] Refactor general string processing to avoid pointer arithmetic. X-Git-Url: https://git.street.me.uk/andy/viking.git/commitdiff_plain/0da89d90b4c50bb129bc1e0dc38f05d553312138 [QA] Refactor general string processing to avoid pointer arithmetic. --- diff --git a/src/preferences.c b/src/preferences.c index bcae6243..6763f100 100644 --- a/src/preferences.c +++ b/src/preferences.c @@ -26,6 +26,7 @@ #include "preferences.h" #include "dir.h" #include "file.h" +#include "util.h" // TODO: STRING_LIST // TODO: share code in file reading @@ -88,11 +89,12 @@ static gboolean preferences_load_from_file() while ( ! feof (f) ) { if (fgets(buf,sizeof(buf),f) == NULL) break; - if ( split_string_from_file_on_equals(buf, &key, &val ) ) { + if ( split_string_from_file_on_equals ( buf, &key, &val ) ) { // if it's not in there, ignore it oldval = g_hash_table_lookup ( values, key ); if ( ! oldval ) { g_free(key); + g_free(val); continue; } @@ -105,6 +107,7 @@ static gboolean preferences_load_from_file() g_hash_table_insert ( values, key, newval ); g_free(key); + g_free(val); // change value } } diff --git a/src/util.c b/src/util.c index 2e3e28f7..92457b82 100644 --- a/src/util.c +++ b/src/util.c @@ -126,24 +126,48 @@ GList * str_array_to_glist(gchar* data[]) return g_list_reverse(gl); } -/* MAKES A COPY OF THE KEY!!! */ -gboolean split_string_from_file_on_equals ( gchar *buf, gchar **key, gchar **val ) +/** + * split_string_from_file_on_equals: + * + * @buf: the input string + * @key: newly allocated string that is before the '=' + * @val: newly allocated string after the '=' + * + * Designed for file line processing, so it ignores strings beginning with special + * characters, such as '#'; returns false in such situations. + * Also returns false if no equals character is found + * + * e.g. if buf = "GPS.parameter=42" + * key = "GPS.parameter" + * val = "42" + */ +gboolean split_string_from_file_on_equals ( const gchar *buf, gchar **key, gchar **val ) { - gchar *eq_pos; - gint len; - // comments, special characters in viking file format if ( buf == NULL || buf[0] == '\0' || buf[0] == '~' || buf[0] == '=' || buf[0] == '#' ) return FALSE; - eq_pos = strchr ( buf, '=' ); - if ( ! eq_pos ) + + if ( ! strchr ( buf, '=' ) ) return FALSE; - *key = g_strndup ( buf, eq_pos - buf ); - *val = eq_pos + 1; - len = strlen(*val); - if ( len > 0 ) - if ( (*val)[len - 1] == '\n' ) - (*val) [ len - 1 ] = '\0'; /* cut off newline */ + + gchar **strv = g_strsplit ( buf, "=", 2 ); + + gint gi = 0; + gchar *str = strv[gi]; + while ( str ) { + if ( gi == 0 ) + *key = g_strdup ( str ); + else + *val = g_strdup ( str ); + gi++; + str = strv[gi]; + } + + g_strfreev ( strv ); + + // Remove newline from val and also any other whitespace + *key = g_strstrip ( *key ); + *val = g_strstrip ( *val ); + return TRUE; } - diff --git a/src/util.h b/src/util.h index b492b0d9..8c10de45 100644 --- a/src/util.h +++ b/src/util.h @@ -36,7 +36,7 @@ gchar *uri_escape(gchar *str); GList * str_array_to_glist(gchar* data[]); -gboolean split_string_from_file_on_equals ( gchar *buf, gchar **key, gchar **val ); +gboolean split_string_from_file_on_equals ( const gchar *buf, gchar **key, gchar **val ); G_END_DECLS