# HG changeset patch # User Mikael Berthe # Date 1120681717 -3600 # Node ID 68ce34b4243bcdc81cd804ae262be094d79f2650 # Parent f5dd437c057b845fdd83fb2bc187974383d9b655 Add parse_assigment() function Add parse_assigment() to parse options/aliases/bindings lines. diff -r f5dd437c057b -r 68ce34b4243b mcabber/src/settings.c --- a/mcabber/src/settings.c Tue Jul 05 23:50:50 2005 +0100 +++ b/mcabber/src/settings.c Wed Jul 06 21:28:37 2005 +0100 @@ -21,6 +21,7 @@ #include #include +#include #include "settings.h" @@ -58,6 +59,61 @@ /* -- */ +// parse_assigment(assignment, pkey, pval) +// Read assignment and split it to key, value +// +// If this is an assignment, the function will return TRUE and +// set *pkey and *pval (*pval is set to NULL if value field is empty). +// +// If this isn't a assignment (no = char), the function will set *pval +// to NULL and return FALSE. +// +// The called should g_free() *pkey and *pval (if not NULL) after use. +guint parse_assigment(gchar *assignment, gchar **pkey, gchar **pval) +{ + char *key, *val, *t; + + *pkey = *pval = NULL; + + key = assignment; + // Remove leading spaces in option name + while ((!isalnum(*key)) && (*key != '=') && *key) { + //if (!isblank(*key)) + // scr_LogPrint("Error in setting parsing!\n"); + key++; + } + if (!*key) return FALSE; // Empty assignment + + if (*key == '=') { + //scr_LogPrint("Cannot parse setting!\n"); + return FALSE; + } + // Ok, key points to the option name + + for (val = key+1 ; *val && (*val != '=') ; val++) + if (!isalnum(*val) && !isblank(*val) && (*val != '_') && (*val != '-')) { + // Key should only have alnum chars... + //scr_LogPrint("Error in setting parsing!\n"); + return FALSE; + } + // Remove trailing spaces in option name: + for (t = val-1 ; t > key && isblank(*t) ; t--) + ; + *pkey = g_strndup(key, t+1-key); + + if (!*val) return FALSE; // Not an assignment + + // Remove leading and trailing spaces in option value: + for (val++; *val && isblank(*val) ; val++) ; + for (t = val ; *t ; t++) ; + for (t-- ; t >= val && isblank(*t) ; t--) ; + + if (t < val) return FALSE; // no value (variable reset for example) + + *pval = g_strndup(val, t+1-val); + return TRUE; +} + void settings_set(guint type, gchar *key, gchar *value) { GSList **plist; diff -r f5dd437c057b -r 68ce34b4243b mcabber/src/settings.h --- a/mcabber/src/settings.h Tue Jul 05 23:50:50 2005 +0100 +++ b/mcabber/src/settings.h Wed Jul 06 21:28:37 2005 +0100 @@ -10,6 +10,7 @@ #define settings_opt_get(k) settings_get(SETTINGS_TYPE_OPTION, k) #define settings_opt_get_int(k) settings_get_int(SETTINGS_TYPE_OPTION, k) +guint parse_assigment(gchar *assignment, gchar **pkey, gchar **pval); void settings_set(guint type, gchar *key, gchar *value); void settings_del(guint type, gchar *key); gchar *settings_get(guint type, gchar *key);