changeset 280:68ce34b4243b

Add parse_assigment() function Add parse_assigment() to parse options/aliases/bindings lines.
author Mikael Berthe <mikael@lilotux.net>
date Wed, 06 Jul 2005 21:28:37 +0100
parents f5dd437c057b
children f562b9af2de7
files mcabber/src/settings.c mcabber/src/settings.h
diffstat 2 files changed, 57 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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 <strings.h>
 #include <stdlib.h>
+#include <ctype.h>
 
 #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;
--- 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);