cmdline: big rework and clean of cmdline library
[libcmdline.git] / src / lib / cmdline_parse_string.c
index 1b9fdb8..1b2c146 100644 (file)
 #include "cmdline_parse.h"
 #include "cmdline_parse_string.h"
 
-struct cmdline_token_ops cmdline_token_string_ops = {
-       .parse = cmdline_parse_string,
-       .complete_get_nb = cmdline_complete_get_nb_string,
-       .complete_get_elt = cmdline_complete_get_elt_string,
-       .get_help = cmdline_get_help_string,
-};
-
 #define MULTISTRING_HELP "Mul-choice STRING"
 #define ANYSTRING_HELP   "Any STRING"
 #define FIXEDSTRING_HELP "Fixed STRING"
@@ -102,8 +95,9 @@ get_next_token(const char *s)
        return NULL;
 }
 
-static int parse_fixed_string(struct cmdline_token_string_data *sd,
-                             const char *buf, unsigned token_len)
+static int
+parse_fixed_string(struct cmdline_token_string_data *sd,
+                  const char *buf, unsigned token_len)
 {
        unsigned int conf_token_len;
        const char *str;
@@ -126,7 +120,7 @@ static int parse_fixed_string(struct cmdline_token_string_data *sd,
        return -1;
 }
 
-int
+static int
 cmdline_parse_string(cmdline_parse_token_hdr_t *tk, const char *buf, void *res,
                     unsigned ressize)
 {
@@ -155,38 +149,31 @@ cmdline_parse_string(cmdline_parse_token_hdr_t *tk, const char *buf, void *res,
        return token_len;
 }
 
-int cmdline_complete_get_nb_string(cmdline_parse_token_hdr_t *tk)
+static int
+cmdline_complete_string_start(cmdline_parse_token_hdr_t *tk, void **opaque)
 {
        struct cmdline_token_string *tk2 = (struct cmdline_token_string *)tk;
        struct cmdline_token_string_data *sd = &tk2->string_data;;
-       int ret=1;
        const char *str;
 
-       if (!sd->str)
-               return 0;
-
        str = sd->str;
-       while( (str = get_next_token(str)) != NULL ) {
-               ret++;
-       }
-       return ret;
+       *opaque = (void *)str;
+       if (str == NULL)
+               return -1; /* no completion */
+       return 0;
 }
 
-int cmdline_complete_get_elt_string(cmdline_parse_token_hdr_t *tk, int idx,
-                                   char *dstbuf, unsigned int size)
+static int
+cmdline_complete_string_iterate(cmdline_parse_token_hdr_t *tk, void **opaque,
+                               char *dstbuf, unsigned int size)
 {
-       struct cmdline_token_string *tk2 = (struct cmdline_token_string *)tk;
-       struct cmdline_token_string_data *sd = &tk2->string_data;;
        const char *s;
        unsigned int len;
 
-       s = sd->str;
-
-       while (idx-- && s)
-               s = get_next_token(s);
-
-       if (!s)
+       s = *opaque;
+       if (s == NULL)
                return -1;
+       *opaque = (void *)get_next_token(s);
 
        len = get_token_len(s);
        if (len > size - 1)
@@ -197,9 +184,9 @@ int cmdline_complete_get_elt_string(cmdline_parse_token_hdr_t *tk, int idx,
        return 0;
 }
 
-
-int cmdline_get_help_string(cmdline_parse_token_hdr_t *tk, char *dstbuf,
-                           unsigned int size)
+static int
+cmdline_help_string(cmdline_parse_token_hdr_t *tk, char *dstbuf,
+                   unsigned int size)
 {
        struct cmdline_token_string *tk2 = (struct cmdline_token_string *)tk;
        struct cmdline_token_string_data *sd = &tk2->string_data;;
@@ -207,13 +194,11 @@ int cmdline_get_help_string(cmdline_parse_token_hdr_t *tk, char *dstbuf,
 
        s = sd->str;
 
-       if (s) {
-               if (get_next_token(s)) {
+       if (s != NULL) {
+               if (get_next_token(s))
                        strncpy(dstbuf, MULTISTRING_HELP, size);
-               }
-               else {
+               else
                        strncpy(dstbuf, FIXEDSTRING_HELP, size);
-               }
        }
        else {
                strncpy(dstbuf, ANYSTRING_HELP, size);
@@ -223,3 +208,11 @@ int cmdline_get_help_string(cmdline_parse_token_hdr_t *tk, char *dstbuf,
 
        return 0;
 }
+
+struct cmdline_token_ops cmdline_token_string_ops = {
+       .parse = cmdline_parse_string,
+       .complete_start = cmdline_complete_string_start,
+       .complete_iterate = cmdline_complete_string_iterate,
+       .complete_end = NULL,
+       .help = cmdline_help_string,
+};