Surely that would cause problems based on ordering? For example, if name was ls, and lsplaylist comes after ls in mpc_table (which it does) when we come to the end of our for loop, lsplaylist struct would be in our local copy when the correct match is ls. Also matches would be 2, so the ternary would fail.
Admittedly, my implementation is dependant on shorter names being before longer names. Rory On 11 November 2014 18:51, Ben Boeckel <maths...@gmail.com> wrote: > On Tue, Nov 11, 2014 at 18:13:53 +0000, Rory McNamara wrote: >> I've probably used format-patch wrong, but there are three commits there. The >> new bit is at the bottom. >> I've rebased, and the whole patch is now attached. > > Ah, I see now, sorry about that. Easier to see the changes now anyways. > Comments inline. > > --Ben > >> From 4d9b77a0443d49da4fc35a9c2543af9465d2e3ac Mon Sep 17 00:00:00 2001 >> From: PsychoMario <pink.banana.f...@gmail.com> >> Date: Tue, 11 Nov 2014 13:05:15 +0000 >> Subject: [PATCH] added least unambiguous to find_command >> >> added least unambiguous info to manpage >> >> disallow overlength but matching commands >> --- >> doc/mpc.1 | 1 + >> src/main.c | 12 +++++++++++- >> 2 files changed, 12 insertions(+), 1 deletion(-) >> >> diff --git a/doc/mpc.1 b/doc/mpc.1 >> index 2bea9a6..b119c81 100644 >> --- a/doc/mpc.1 >> +++ b/doc/mpc.1 >> @@ -96,6 +96,7 @@ If you specify an absolute path, mpc attempts a connection >> via Unix Domain Socke >> The port to connect to; if not given, the value of the environment variable >> MPD_PORT is checked before defaulting to 6600. This default can be changed >> at compile-time. >> .br >> .SH COMMANDS >> +Commands can be used from the least unambiguous prefix (e.g insert or ins) >> .TP >> .B add <file> >> Adds a song from the music database to the playlist. Can also read input >> from pipes. Use "mpc ls | mpc add" to add all files to the playlist. >> diff --git a/src/main.c b/src/main.c >> index 7c30ff6..91b4e86 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, len = 0; >> + do { >> + matches = 0; >> + len += 1; >> + for (unsigned i = 0; mpc_table[i].command != NULL; ++i) >> + if (strncmp(name, mpc_table[i].command, len) == 0) >> + matches += 1; >> + } while (matches > 1); > > This loop is excessive. Why not just do a single loop over all the > commands with len = strlen(name) since there's a restriction below? In > fact, a single loop with a local struct command * which saves any > matches and then do: > > return (matches == 1) ? cmd : NULL; > >> + if (matches == 0) >> + 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) >> return &mpc_table[i]; >> >> return NULL; >> -- >> 2.1.2 >> > _______________________________________________ mpd-devel mailing list mpd-devel@musicpd.org http://mailman.blarg.de/listinfo/mpd-devel