summaryrefslogtreecommitdiffstats
path: root/cli/src/registry.c
diff options
context:
space:
mode:
authorCsaba Henk <csaba@gluster.com>2011-05-11 02:39:14 +0000
committerAnand Avati <avati@gluster.com>2011-05-11 19:17:56 -0700
commit86c818a98a18a3b6c33a494202922f1cd275ac7b (patch)
tree13dc415ce375aa480c7db81c6fd9e99c4e2296e9 /cli/src/registry.c
parent0652f9f92123e8bb3c0fee02c9fb3bbe23d9f7c6 (diff)
cli: taking my revenge for forcing "geo-replication" into commandline
Accept unambigous initial fragments of keywords, eg. gluster vol geo stat is recognized. Compared to readline integration: - no external dependency - works in shell too - works for inner keywords of operations (as in above example, or "vol crea <vol> repl 3 ...") - you save pressing tabs :) If not desired in customer builds, can be disabled by an #ifdef (not integrated into build system as of now); however, I think folks in house could like it. Signed-off-by: Csaba Henk <csaba@gluster.com> Signed-off-by: Anand Avati <avati@gluster.com> BUG: 2757 (refactory gsync/gsyncd/syncdaemon/whatever to geo-replication) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2757
Diffstat (limited to 'cli/src/registry.c')
-rw-r--r--cli/src/registry.c52
1 files changed, 36 insertions, 16 deletions
diff --git a/cli/src/registry.c b/cli/src/registry.c
index 8fa116a48c7..bab44cd8996 100644
--- a/cli/src/registry.c
+++ b/cli/src/registry.c
@@ -260,29 +260,49 @@ err:
return NULL;
}
-
-struct cli_cmd_word *
-cli_cmd_nextword (struct cli_cmd_word *word, const char *token)
+void *
+cli_getunamb (const char *tok, void **choices, cli_selector_t sel)
{
- struct cli_cmd_word *next = NULL;
- struct cli_cmd_word **trav = NULL;
- int ret = 0;
+ void **wcon = NULL;
+ char *w = NULL;
+ unsigned mn = 0;
+ void *ret = NULL;
- if (!word->nextwords)
+ if (!choices || !*tok)
return NULL;
- for (trav = word->nextwords; (next = *trav); trav++) {
- if (next->match) {
-// ret = next->match ();
- } else {
- ret = strcmp (next->word, token);
- }
+ for (wcon = choices; *wcon; wcon++) {
+ w = strtail ((char *)sel (*wcon), tok);
+ if (!w)
+ /* no match */
+ continue;
+ if (!*w)
+ /* exact match */
+ return *wcon;
- if (ret == 0)
- break;
+ ret = *wcon;
+ mn++;
}
- return next;
+#ifdef FORCE_MATCH_EXACT
+ return NULL;
+#else
+ return (mn == 1) ? ret : NULL;
+#endif
+}
+
+static const char *
+sel_cmd_word (void *wcon)
+{
+ return ((struct cli_cmd_word *)wcon)->word;
+}
+
+struct cli_cmd_word *
+cli_cmd_nextword (struct cli_cmd_word *word, const char *token)
+{
+ return (struct cli_cmd_word *)cli_getunamb (token,
+ (void **)word->nextwords,
+ sel_cmd_word);
}