X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=src%2Flib%2Fcmdline_parse_string.c;h=1b9fdb8400bf036793a44957f72d1e4c262444b4;hb=b1d5b169352e57df3fc14c51ffad4b83f3e5613f;hp=f8fd44bb6b3d03bcbb5b9e3debbeff671a9dadce;hpb=289e62983cdc8579a78be38f6b30545fe5a9f0bf;p=libcmdline.git diff --git a/src/lib/cmdline_parse_string.c b/src/lib/cmdline_parse_string.c index f8fd44b..1b9fdb8 100644 --- a/src/lib/cmdline_parse_string.c +++ b/src/lib/cmdline_parse_string.c @@ -102,60 +102,55 @@ get_next_token(const char *s) return NULL; } -int -cmdline_parse_string(cmdline_parse_token_hdr_t *tk, const char *buf, void *res) +static int parse_fixed_string(struct cmdline_token_string_data *sd, + const char *buf, unsigned token_len) { - struct cmdline_token_string *tk2 = (struct cmdline_token_string *)tk; - struct cmdline_token_string_data *sd = &tk2->string_data;; - unsigned int token_len; + unsigned int conf_token_len; const char *str; - if (! *buf) - return -1; + str = sd->str; + for (str = sd->str; str != NULL ; str = get_next_token(str)) { - /* fixed string */ - if (sd->str) { - str = sd->str; - do { - token_len = get_token_len(str); + conf_token_len = get_token_len(str); + + /* if token from config is too big... */ + if (conf_token_len >= STR_TOKEN_SIZE - 1) + continue; + + /* compare conf token and user token */ + if (token_len == conf_token_len && + strncmp(buf, str, token_len) == 0) + return 0; + } - /* if token is too big... */ - if (token_len >= STR_TOKEN_SIZE - 1) { - continue; - } + return -1; +} - if ( strncmp(buf, str, token_len) ) { - continue; - } +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 ( !cmdline_isendoftoken(*(buf+token_len)) ) { - continue; - } + if (res && ressize < STR_TOKEN_SIZE) + return -1; - break; - } while ( (str = get_next_token(str)) != NULL ); + token_len = strlen(buf); - if (!str) - return -1; - } - /* unspecified string */ - else { - token_len=0; - while(!cmdline_isendoftoken(buf[token_len]) && - token_len < (STR_TOKEN_SIZE-1)) - token_len++; + if (token_len >= (STR_TOKEN_SIZE - 1) || token_len == 0) + return -1; - /* return if token too long */ - if (token_len >= STR_TOKEN_SIZE - 1) { + /* fixed string */ + if (sd->str) { + if (parse_fixed_string(sd, buf, token_len) < 0) return -1; - } } - if (res) { - /* we are sure that token_len is < STR_TOKEN_SIZE-1 */ - strncpy(res, buf, token_len); - *((char *)res + token_len) = 0; - } + /* we already checked that token_len is < STR_TOKEN_SIZE-1 */ + if (res) + strcpy(res, buf); return token_len; }