On Tue, Nov 11, 2014 at 19:33:45 +0000, Rory McNamara wrote:
> I've removed the do while, but there is still two for loops. The first
> has a bail early for exact matches.

Ah, indeed.

> I think it now correctly fails in all cases. I also think it doesn't
> have problems based on ordering, as it only looks for the match if
> ther is only one.

See comments inline.

--Ben

> diff --git a/src/main.c b/src/main.c
> index 7c30ff6..8664662 100644
> --- a/src/main.c
> +++ b/src/main.c
> @@ -214,8 +214,18 @@ setup_connection(void)
>  static struct command *
>  find_command(const char *name)
>  {
> +     int matches = 0, len = 0;
> +     for (unsigned i = 0; mpc_table[i].command != NULL; ++i) {
> +             if (strncmp(name, mpc_table[i].command, strlen(name)) == 0) {
> +                     matches += 1;
> +                     if (strlen(name) == strlen(mpc_table[i].command))
> +                             return &mpc_table[i]; //Exact match

There are a *lot* of strlen(name) calls here, so a variable to cache it
would be good.

> +             }
> +     }
> +     if (matches != 1) //Ambiguous or nonexistent
> +             return NULL;
>       for (unsigned i = 0; mpc_table[i].command != NULL; ++i)
> -             if (strcmp(name, mpc_table[i].command) == 0)
> +             if (strncmp(name, mpc_table[i].command, len) == 0 && 
> strncmp(name, mpc_table[i].command, strlen(name)) == 0)

len is always 0 here (never written above).

>                       return &mpc_table[i];
>  
>       return NULL;
_______________________________________________
mpd-devel mailing list
mpd-devel@musicpd.org
http://mailman.blarg.de/listinfo/mpd-devel

Reply via email to