[2823] in BarnOwl Developers

home help back first fref pref prev next nref lref last post

[PATCH] Replace atokenize with glib's g_strsplit_set

daemon@ATHENA.MIT.EDU (David Benjamin)
Wed Dec 15 14:02:07 2010

From: David Benjamin <davidben@MIT.EDU>
To: barnowl-dev@mit.edu
Date: Wed, 15 Dec 2010 14:02:02 -0500

Glib's had g_strsplit_set since forever, and it does exactly the same
thing as atokenize, modulo needing a pesky NULL check. We may as well
use it.
---
 commands.c   |    8 ++++----
 keybinding.c |   14 +++++++-------
 util.c       |   40 ----------------------------------------
 variable.c   |   22 +++++++++++-----------
 4 files changed, 22 insertions(+), 62 deletions(-)

diff --git a/commands.c b/commands.c
index 4629474..42bb538 100644
--- a/commands.c
+++ b/commands.c
@@ -1669,7 +1669,7 @@ char *owl_command_multi(int argc, const char *const *argv, const char *buff)
 {
   char *lastrv = NULL, *newbuff;
   char **commands;
-  int  ncommands, i;
+  int  i;
   if (argc < 2) {
     owl_function_makemsg("Invalid arguments to 'multi' command.");    
     return NULL;
@@ -1687,15 +1687,15 @@ char *owl_command_multi(int argc, const char *const *argv, const char *buff)
       }
     }
   }
-  commands = atokenize(newbuff, ";", &ncommands);
-  for (i=0; i<ncommands; i++) {
+  commands = g_strsplit_set(newbuff, ";", 0);
+  for (i = 0; commands[i] != NULL; i++) {
     if (lastrv) {
       owl_free(lastrv);
     }
     lastrv = owl_function_command(commands[i]);
   }
   owl_free(newbuff);
-  atokenize_delete(commands, ncommands);
+  g_strfreev(commands);
   return lastrv;
 }
 
diff --git a/keybinding.c b/keybinding.c
index fc762b5..4a05252 100644
--- a/keybinding.c
+++ b/keybinding.c
@@ -38,23 +38,23 @@ int owl_keybinding_make_keys(owl_keybinding *kb, const char *keyseq)
   char **ktokens;
   int    nktokens, i;
 
-  ktokens = atokenize(keyseq, " ", &nktokens);
-  if (!ktokens) return(-1);
-  if (nktokens > OWL_KEYMAP_MAXSTACK) {
-    atokenize_delete(ktokens, nktokens);
+  ktokens = g_strsplit_set(keyseq, " ", 0);
+  nktokens = g_strv_length(ktokens);
+  if (nktokens < 1 || nktokens > OWL_KEYMAP_MAXSTACK) {
+    g_strfreev(ktokens);
     return(-1);
   }
   kb->keys = owl_malloc(nktokens*sizeof(int));
   for (i=0; i<nktokens; i++) {
     kb->keys[i] = owl_keypress_fromstring(ktokens[i]);
-    if (kb->keys[i] == ERR) { 
-      atokenize_delete(ktokens, nktokens);
+    if (kb->keys[i] == ERR) {
+      g_strfreev(ktokens);
       owl_free(kb->keys);
       return(-1);
     }
   }
   kb->len = nktokens;
-  atokenize_delete(ktokens, nktokens);
+  g_strfreev(ktokens);
   return(0);
 }
 
diff --git a/util.c b/util.c
index bd842df..4e0f352 100644
--- a/util.c
+++ b/util.c
@@ -11,36 +11,6 @@
 #include <glib/gstdio.h>
 #include <glib-object.h>
 
-char **atokenize(const char *buffer, const char *sep, int *i)
-{
-  /* each element of return must be freed by user */
-  char **args;
-  char *workbuff, *foo;
-  int done=0, first=1, count=0;
-
-  workbuff = owl_strdup(buffer);
-
-  args=NULL;
-  while (!done) {
-    if (first) {
-      first=0;
-      foo=strtok(workbuff, sep);
-    } else {
-      foo=strtok(NULL, sep);
-    }
-    if (foo==NULL) {
-      done=1;
-    } else {
-      args=owl_realloc(args, sizeof(char *) * (count+1));
-      args[count] = owl_strdup(foo);
-      count++;
-    }
-  }
-  *i=count;
-  owl_free(workbuff);
-  return(args);
-}
-
 const char *skiptokens(const char *buff, int n) {
   /* skips n tokens and returns where that would be. */
   char quote = 0;
@@ -126,16 +96,6 @@ char *owl_util_makepath(const char *in)
   return(out);
 }
 
-void atokenize_delete(char **tok, int nels)
-{
-  int i;
-  for (i=0; i<nels; i++) {
-    owl_free(tok[i]);
-  }
-  owl_free(tok);
-}
-
-
 void owl_parse_delete(char **argv, int argc)
 {
   int i;
diff --git a/variable.c b/variable.c
index 10a3c9e..b549851 100644
--- a/variable.c
+++ b/variable.c
@@ -951,9 +951,9 @@ int owl_variable_enum_validate(const owl_variable *v, const void *newval) {
   char **enums;
   int nenums, val;
   if (newval == NULL) return(0);
-  enums = atokenize(v->validsettings, ",", &nenums);
-  if (enums == NULL) return(0);
-  atokenize_delete(enums, nenums);
+  enums = g_strsplit_set(v->validsettings, ",", 0);
+  nenums = g_strv_length(enums);
+  g_strfreev(enums);
   val = *(const int*)newval;
   if (val < 0 || val >= nenums) {
     return(0);
@@ -963,16 +963,15 @@ int owl_variable_enum_validate(const owl_variable *v, const void *newval) {
 
 int owl_variable_enum_set_fromstring(owl_variable *v, const char *newval) {
   char **enums;
-  int nenums, i, val=-1;
+  int i, val=-1;
   if (newval == NULL) return(-1);
-  enums = atokenize(v->validsettings, ",", &nenums);
-  if (enums == NULL) return(-1);
-  for (i=0; i<nenums; i++) {
+  enums = g_strsplit_set(v->validsettings, ",", 0);
+  for (i = 0; enums[i] != NULL; i++) {
     if (0==strcmp(newval, enums[i])) {
       val = i;
     }
   }
-  atokenize_delete(enums, nenums);
+  g_strfreev(enums);
   if (val == -1) return(-1);
   return (v->set_fn(v, &val));
 }
@@ -985,15 +984,16 @@ int owl_variable_enum_get_tostring(const owl_variable *v, char* buf, int bufsize
     snprintf(buf, bufsize, "<null>");
     return -1;
   }
-  enums = atokenize(v->validsettings, ",", &nenums);
+  enums = g_strsplit_set(v->validsettings, ",", 0);
+  nenums = g_strv_length(enums);
   i = *(const int*)val;
   if (i<0 || i>=nenums) {
     snprintf(buf, bufsize, "<invalid:%d>",i);
-    atokenize_delete(enums, nenums);
+    g_strfreev(enums);
     return(-1);
   }
   snprintf(buf, bufsize, "%s", enums[i]);
-  atokenize_delete(enums, nenums);
+  g_strfreev(enums);
   return 0;
 }
 
-- 
1.7.3.3.399.g06ddf


home help back first fref pref prev next nref lref last post