X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Frune%2Fcoding.c;h=f4d110283245cfa5db4e486f283cfdb7bd709c90;hb=ab87e56bec6a8727a1bbfae7858fb5b0122539a7;hp=380a225c948319c66dbb5e004383e8bd07dc28f5;hpb=17a0d069aacb7b690e802de46ceb5d66d4bdba1d;p=ccan diff --git a/ccan/rune/coding.c b/ccan/rune/coding.c index 380a225c..f4d11028 100644 --- a/ccan/rune/coding.c +++ b/ccan/rune/coding.c @@ -184,7 +184,7 @@ static bool pull_char(const char **data, size_t *len, char *c) return true; } -static bool is_valid_cond(enum rune_condition cond) +bool rune_condition_is_valid(enum rune_condition cond) { switch (cond) { case RUNE_COND_IF_MISSING: @@ -203,31 +203,35 @@ static bool is_valid_cond(enum rune_condition cond) return false; } +size_t rune_altern_fieldname_len(const char *alternstr, size_t alternstrlen) +{ + for (size_t i = 0; i < alternstrlen; i++) { + if (cispunct(alternstr[i])) + return i; + } + return alternstrlen; +} + /* Sets *more on success: true if another altern follows */ static struct rune_altern *rune_altern_decode(const tal_t *ctx, const char **data, size_t *len, bool *more) { struct rune_altern *alt = tal(ctx, struct rune_altern); - const char *strstart = *data; char *value; - size_t strlen = 0; + size_t strlen; char c; - /* Swallow field up to conditional */ - for (;;) { - if (!pull_char(data, len, &c)) - return tal_free(alt); - if (cispunct(c)) - break; - strlen++; - } + /* Swallow field up to possible conditional */ + strlen = rune_altern_fieldname_len(*data, *len); + alt->fieldname = tal_strndup(alt, *data, strlen); + *data += strlen; + *len -= strlen; - alt->fieldname = tal_strndup(alt, strstart, strlen); - if (!is_valid_cond(c)) { - pull_invalid(data, len); + /* Grab conditional */ + if (!pull_char(data, len, &c) || !rune_condition_is_valid(c)) return tal_free(alt); - } + alt->condition = c; /* Assign worst case. */