[2839] in BarnOwl Developers
Re: [PATCH] Replace atokenize with glib's g_strsplit_set
daemon@ATHENA.MIT.EDU (Nelson Elhage)
Tue Dec 28 18:40:45 2010
In-Reply-To: <1292439722-27383-1-git-send-email-davidben@mit.edu>
Date: Tue, 28 Dec 2010 18:40:43 -0500
From: Nelson Elhage <nelhage@nelhage.com>
To: David Benjamin <davidben@mit.edu>
Cc: barnowl-dev@mit.edu
lgtm
On Wed, Dec 15, 2010 at 2:02 PM, David Benjamin <davidben@mit.edu> wrote:
> 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.
> ---
> =C2=A0commands.c =C2=A0 | =C2=A0 =C2=A08 ++++----
> =C2=A0keybinding.c | =C2=A0 14 +++++++-------
> =C2=A0util.c =C2=A0 =C2=A0 =C2=A0 | =C2=A0 40 ---------------------------=
-------------
> =C2=A0variable.c =C2=A0 | =C2=A0 22 +++++++++++-----------
> =C2=A04 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)
> =C2=A0{
> =C2=A0 char *lastrv =3D NULL, *newbuff;
> =C2=A0 char **commands;
> - =C2=A0int =C2=A0ncommands, i;
> + =C2=A0int =C2=A0i;
> =C2=A0 if (argc < 2) {
> =C2=A0 =C2=A0 owl_function_makemsg("Invalid arguments to 'multi' command.=
");
> =C2=A0 =C2=A0 return NULL;
> @@ -1687,15 +1687,15 @@ char *owl_command_multi(int argc, const char *con=
st *argv, const char *buff)
> =C2=A0 =C2=A0 =C2=A0 }
> =C2=A0 =C2=A0 }
> =C2=A0 }
> - =C2=A0commands =3D atokenize(newbuff, ";", &ncommands);
> - =C2=A0for (i=3D0; i<ncommands; i++) {
> + =C2=A0commands =3D g_strsplit_set(newbuff, ";", 0);
> + =C2=A0for (i =3D 0; commands[i] !=3D NULL; i++) {
> =C2=A0 =C2=A0 if (lastrv) {
> =C2=A0 =C2=A0 =C2=A0 owl_free(lastrv);
> =C2=A0 =C2=A0 }
> =C2=A0 =C2=A0 lastrv =3D owl_function_command(commands[i]);
> =C2=A0 }
> =C2=A0 owl_free(newbuff);
> - =C2=A0atokenize_delete(commands, ncommands);
> + =C2=A0g_strfreev(commands);
> =C2=A0 return lastrv;
> =C2=A0}
>
> 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, cons=
t char *keyseq)
> =C2=A0 char **ktokens;
> =C2=A0 int =C2=A0 =C2=A0nktokens, i;
>
> - =C2=A0ktokens =3D atokenize(keyseq, " ", &nktokens);
> - =C2=A0if (!ktokens) return(-1);
> - =C2=A0if (nktokens > OWL_KEYMAP_MAXSTACK) {
> - =C2=A0 =C2=A0atokenize_delete(ktokens, nktokens);
> + =C2=A0ktokens =3D g_strsplit_set(keyseq, " ", 0);
> + =C2=A0nktokens =3D g_strv_length(ktokens);
> + =C2=A0if (nktokens < 1 || nktokens > OWL_KEYMAP_MAXSTACK) {
> + =C2=A0 =C2=A0g_strfreev(ktokens);
> =C2=A0 =C2=A0 return(-1);
> =C2=A0 }
> =C2=A0 kb->keys =3D owl_malloc(nktokens*sizeof(int));
> =C2=A0 for (i=3D0; i<nktokens; i++) {
> =C2=A0 =C2=A0 kb->keys[i] =3D owl_keypress_fromstring(ktokens[i]);
> - =C2=A0 =C2=A0if (kb->keys[i] =3D=3D ERR) {
> - =C2=A0 =C2=A0 =C2=A0atokenize_delete(ktokens, nktokens);
> + =C2=A0 =C2=A0if (kb->keys[i] =3D=3D ERR) {
> + =C2=A0 =C2=A0 =C2=A0g_strfreev(ktokens);
> =C2=A0 =C2=A0 =C2=A0 owl_free(kb->keys);
> =C2=A0 =C2=A0 =C2=A0 return(-1);
> =C2=A0 =C2=A0 }
> =C2=A0 }
> =C2=A0 kb->len =3D nktokens;
> - =C2=A0atokenize_delete(ktokens, nktokens);
> + =C2=A0g_strfreev(ktokens);
> =C2=A0 return(0);
> =C2=A0}
>
> diff --git a/util.c b/util.c
> index bd842df..4e0f352 100644
> --- a/util.c
> +++ b/util.c
> @@ -11,36 +11,6 @@
> =C2=A0#include <glib/gstdio.h>
> =C2=A0#include <glib-object.h>
>
> -char **atokenize(const char *buffer, const char *sep, int *i)
> -{
> - =C2=A0/* each element of return must be freed by user */
> - =C2=A0char **args;
> - =C2=A0char *workbuff, *foo;
> - =C2=A0int done=3D0, first=3D1, count=3D0;
> -
> - =C2=A0workbuff =3D owl_strdup(buffer);
> -
> - =C2=A0args=3DNULL;
> - =C2=A0while (!done) {
> - =C2=A0 =C2=A0if (first) {
> - =C2=A0 =C2=A0 =C2=A0first=3D0;
> - =C2=A0 =C2=A0 =C2=A0foo=3Dstrtok(workbuff, sep);
> - =C2=A0 =C2=A0} else {
> - =C2=A0 =C2=A0 =C2=A0foo=3Dstrtok(NULL, sep);
> - =C2=A0 =C2=A0}
> - =C2=A0 =C2=A0if (foo=3D=3DNULL) {
> - =C2=A0 =C2=A0 =C2=A0done=3D1;
> - =C2=A0 =C2=A0} else {
> - =C2=A0 =C2=A0 =C2=A0args=3Dowl_realloc(args, sizeof(char *) * (count+1)=
);
> - =C2=A0 =C2=A0 =C2=A0args[count] =3D owl_strdup(foo);
> - =C2=A0 =C2=A0 =C2=A0count++;
> - =C2=A0 =C2=A0}
> - =C2=A0}
> - =C2=A0*i=3Dcount;
> - =C2=A0owl_free(workbuff);
> - =C2=A0return(args);
> -}
> -
> =C2=A0const char *skiptokens(const char *buff, int n) {
> =C2=A0 /* skips n tokens and returns where that would be. */
> =C2=A0 char quote =3D 0;
> @@ -126,16 +96,6 @@ char *owl_util_makepath(const char *in)
> =C2=A0 return(out);
> =C2=A0}
>
> -void atokenize_delete(char **tok, int nels)
> -{
> - =C2=A0int i;
> - =C2=A0for (i=3D0; i<nels; i++) {
> - =C2=A0 =C2=A0owl_free(tok[i]);
> - =C2=A0}
> - =C2=A0owl_free(tok);
> -}
> -
> -
> =C2=A0void owl_parse_delete(char **argv, int argc)
> =C2=A0{
> =C2=A0 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) {
> =C2=A0 char **enums;
> =C2=A0 int nenums, val;
> =C2=A0 if (newval =3D=3D NULL) return(0);
> - =C2=A0enums =3D atokenize(v->validsettings, ",", &nenums);
> - =C2=A0if (enums =3D=3D NULL) return(0);
> - =C2=A0atokenize_delete(enums, nenums);
> + =C2=A0enums =3D g_strsplit_set(v->validsettings, ",", 0);
> + =C2=A0nenums =3D g_strv_length(enums);
> + =C2=A0g_strfreev(enums);
> =C2=A0 val =3D *(const int*)newval;
> =C2=A0 if (val < 0 || val >=3D nenums) {
> =C2=A0 =C2=A0 return(0);
> @@ -963,16 +963,15 @@ int owl_variable_enum_validate(const owl_variable *=
v, const void *newval) {
>
> =C2=A0int owl_variable_enum_set_fromstring(owl_variable *v, const char *n=
ewval) {
> =C2=A0 char **enums;
> - =C2=A0int nenums, i, val=3D-1;
> + =C2=A0int i, val=3D-1;
> =C2=A0 if (newval =3D=3D NULL) return(-1);
> - =C2=A0enums =3D atokenize(v->validsettings, ",", &nenums);
> - =C2=A0if (enums =3D=3D NULL) return(-1);
> - =C2=A0for (i=3D0; i<nenums; i++) {
> + =C2=A0enums =3D g_strsplit_set(v->validsettings, ",", 0);
> + =C2=A0for (i =3D 0; enums[i] !=3D NULL; i++) {
> =C2=A0 =C2=A0 if (0=3D=3Dstrcmp(newval, enums[i])) {
> =C2=A0 =C2=A0 =C2=A0 val =3D i;
> =C2=A0 =C2=A0 }
> =C2=A0 }
> - =C2=A0atokenize_delete(enums, nenums);
> + =C2=A0g_strfreev(enums);
> =C2=A0 if (val =3D=3D -1) return(-1);
> =C2=A0 return (v->set_fn(v, &val));
> =C2=A0}
> @@ -985,15 +984,16 @@ int owl_variable_enum_get_tostring(const owl_variab=
le *v, char* buf, int bufsize
> =C2=A0 =C2=A0 snprintf(buf, bufsize, "<null>");
> =C2=A0 =C2=A0 return -1;
> =C2=A0 }
> - =C2=A0enums =3D atokenize(v->validsettings, ",", &nenums);
> + =C2=A0enums =3D g_strsplit_set(v->validsettings, ",", 0);
> + =C2=A0nenums =3D g_strv_length(enums);
> =C2=A0 i =3D *(const int*)val;
> =C2=A0 if (i<0 || i>=3Dnenums) {
> =C2=A0 =C2=A0 snprintf(buf, bufsize, "<invalid:%d>",i);
> - =C2=A0 =C2=A0atokenize_delete(enums, nenums);
> + =C2=A0 =C2=A0g_strfreev(enums);
> =C2=A0 =C2=A0 return(-1);
> =C2=A0 }
> =C2=A0 snprintf(buf, bufsize, "%s", enums[i]);
> - =C2=A0atokenize_delete(enums, nenums);
> + =C2=A0g_strfreev(enums);
> =C2=A0 return 0;
> =C2=A0}
>
> --
> 1.7.3.3.399.g06ddf
>
>