cmdline: big rework and clean of cmdline library
[libcmdline.git] / src / lib / cmdline_parse_string.c
index 775024c..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,13 +120,17 @@ static int parse_fixed_string(struct cmdline_token_string_data *sd,
        return -1;
 }
 
-int
-cmdline_parse_string(cmdline_parse_token_hdr_t *tk, const char *buf, void *res)
+static int
+cmdline_parse_string(cmdline_parse_token_hdr_t *tk, const char *buf, void *res,
+                    unsigned ressize)
 {
        struct cmdline_token_string *tk2 = (struct cmdline_token_string *)tk;
        struct cmdline_token_string_data *sd = &tk2->string_data;;
        unsigned int token_len;
 
+       if (res && ressize < STR_TOKEN_SIZE)
+               return -1;
+
        token_len = strlen(buf);
 
        if (token_len >= (STR_TOKEN_SIZE - 1) || token_len == 0)
@@ -151,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)
@@ -193,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;;
@@ -203,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);
@@ -219,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,
+};