Commit 62b939de authored by Thomas Haller's avatar Thomas Haller

cli: add nmc_complete_strv() which takes a string array for completion that may contain NULL

This will allow for a convenient calling pattern when some elements
should be printed optionally.
parent 4e399d82
......@@ -1349,23 +1349,39 @@ nmc_do_cmd (NmCli *nmc, const NMCCommand cmds[], const char *cmd, int argc, char
/**
* nmc_complete_strings:
* @prefix: a string to match
* @...: a %NULL-terminated list of candidate strings
* @nargs: the number of elements in @args. Or -1 if @args is a NULL terminated
* strv array.
* @args: the argument list. If @nargs is not -1, then some elements may
* be %NULL to indicate to silently skip the values.
*
* Prints all the matching candidates for completion. Useful when there's
* no better way to suggest completion other than a hardcoded string list.
*/
void
nmc_complete_strings (const char *prefix, ...)
nmc_complete_strv (const char *prefix, gssize nargs, const char *const*args)
{
va_list args;
const char *candidate;
gsize i, n;
if (prefix && !prefix[0])
prefix = NULL;
if (nargs < 0) {
nm_assert (nargs == -1);
n = NM_PTRARRAY_LEN (args);
} else
n = (gsize) nargs;
for (i = 0; i < n; i++) {
const char *candidate = args[i];
va_start (args, prefix);
while ((candidate = va_arg (args, const char *))) {
if (!*prefix || matches (prefix, candidate))
g_print ("%s\n", candidate);
if (!candidate)
continue;
if ( prefix
&& !matches (prefix, candidate))
continue;
g_print ("%s\n", candidate);
}
va_end (args);
}
/**
......
......@@ -88,7 +88,9 @@ typedef struct {
void nmc_do_cmd (NmCli *nmc, const NMCCommand cmds[], const char *cmd, int argc, char **argv);
void nmc_complete_strings (const char *prefix, ...) G_GNUC_NULL_TERMINATED;
void nmc_complete_strv (const char *prefix, gssize nargs, const char *const*args);
#define nmc_complete_strings(prefix, ...) nmc_complete_strv ((prefix), NM_NARG (__VA_ARGS__), (const char *const[]) { __VA_ARGS__ })
void nmc_complete_bool (const char *prefix);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment