From c8b97360470c25007d3675474c636ca1ce95599a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Neira=20Ayuso?= Date: Thu, 25 Jul 2013 22:52:15 +0200 Subject: table: Add json parser support Add function for parsing tables in format JSON Signed-off-by: Alvaro Neira Ayuso Signed-off-by: Pablo Neira Ayuso --- src/utils.c | 61 +++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 37 insertions(+), 24 deletions(-) (limited to 'src/utils.c') diff --git a/src/utils.c b/src/utils.c index ebd40b5..c6bf9ff 100644 --- a/src/utils.c +++ b/src/utils.c @@ -66,57 +66,70 @@ static struct { [NFT_TYPE_S64] = { .len = sizeof(int64_t), .min = INT64_MIN, .max = INT64_MAX }, }; -int nft_strtoi(const char *string, int base, void *out, enum nft_type type) + +int nft_get_value(enum nft_type type, void *val, void *out) { - int64_t sval = 0; - uint64_t uval = -1; - char *endptr; + int64_t sval; + uint64_t uval; switch (type) { case NFT_TYPE_U8: case NFT_TYPE_U16: case NFT_TYPE_U32: case NFT_TYPE_U64: - uval = strtoll(string, &endptr, base); + uval = *((uint64_t *)val); + if (uval > basetype[type].max) { + errno = ERANGE; + return -1; + } + memcpy(out, &uval, basetype[type].len); break; case NFT_TYPE_S8: case NFT_TYPE_S16: case NFT_TYPE_S32: case NFT_TYPE_S64: - sval = strtoull(string, &endptr, base); + sval = *((int64_t *)val); + if (sval < basetype[type].min || + sval > (int64_t)basetype[type].max) { + errno = ERANGE; + return -1; + } + memcpy(out, &sval, basetype[type].len); break; - default: - errno = EINVAL; - return -1; } - if (*endptr) { - errno = EINVAL; - return -1; - } + return 0; +} + +int nft_strtoi(const char *string, int base, void *out, enum nft_type type) +{ + int64_t sval = 0; + uint64_t uval = -1; + char *endptr; switch (type) { case NFT_TYPE_U8: case NFT_TYPE_U16: case NFT_TYPE_U32: case NFT_TYPE_U64: - if (uval > basetype[type].max) { - errno = ERANGE; - return -1; - } - memcpy(out, &uval, basetype[type].len); + uval = strtoll(string, &endptr, base); + nft_get_value(type, &uval, out); break; case NFT_TYPE_S8: case NFT_TYPE_S16: case NFT_TYPE_S32: case NFT_TYPE_S64: - if (sval < basetype[type].min || - sval > (int64_t)basetype[type].max) { - errno = ERANGE; - return -1; - } - memcpy(out, &sval, basetype[type].len); + sval = strtoull(string, &endptr, base); + nft_get_value(type, &sval, out); break; + default: + errno = EINVAL; + return -1; + } + + if (*endptr) { + errno = EINVAL; + return -1; } return 0; -- cgit v1.2.3