On Mon, Jul 01, 2019 at 10:16:43PM +0200, Ander Juaristi wrote:
> diff --git a/include/nftables/libnftables.h b/include/nftables/libnftables.h
> index e39c588..87d4ff5 100644
> --- a/include/nftables/libnftables.h
> +++ b/include/nftables/libnftables.h
> @@ -52,6 +52,7 @@ enum {
> NFT_CTX_OUTPUT_NUMERIC_PROTO = (1 << 7),
> NFT_CTX_OUTPUT_NUMERIC_PRIO = (1 << 8),
> NFT_CTX_OUTPUT_NUMERIC_SYMBOL = (1 << 9),
> + NFT_CTX_OUTPUT_SECONDS = (1 << 10),
I'd rename this to:
NFT_CTX_OUTPUT_NUMERIC_TIME
> NFT_CTX_OUTPUT_NUMERIC_ALL = (NFT_CTX_OUTPUT_NUMERIC_PROTO |
> NFT_CTX_OUTPUT_NUMERIC_PRIO |
> NFT_CTX_OUTPUT_NUMERIC_SYMBOL),
You have to update NFT_CTX_OUTPUT_NUMERIC_ALL.
> +static void day_type_print(const struct expr *expr, struct output_ctx *octx)
> +{
> + const char *days[] = {
> + "Sunday",
> + "Monday",
> + "Tuesday",
> + "Wednesday",
> + "Thursday",
> + "Friday",
> + "Saturday"
Probably print in short format?
Sun
Mon
Tue
Wed
Thu
Fri
Sat
like 'date'.
> + };
> + uint8_t daynum = mpz_get_uint8(expr->value),
missing line break between variable definition and code.
> + numdays = array_size(days);
^^^^^^^^^
Unnecessary indentation.
> +
> + if (daynum >= 0 && daynum < numdays)
> + nft_print(octx, "\"%s\"", days[daynum]);
> + else
> + nft_print(octx, "Unknown day");
> +}
> +
> +static int parse_day_type_numeric(const char *sym)
> +{
> + char c = *sym;
> + return (c >= '0' && c <= '6') ?
> + (c - '0') :
> + -1;
Oh, I'd suggest:
if (c >= '0' && c <= '6')
return (c - '0');
return -1;
> +}
> +
> +static struct error_record *day_type_parse(const struct expr *sym,
> + struct expr **res)
> +{
> + const char *days[] = {
> + "Sunday",
> + "Monday",
> + "Tuesday",
> + "Wednesday",
> + "Thursday",
> + "Friday",
> + "Saturday"
> + };
Can you add a helper function to translate numeric day to literal? So
you don't need to define this again, probably:
day_str = nft_day_str(day_num);
> + int daynum = -1, numdays = array_size(days);
> + int symlen = strlen(sym->identifier), daylen;
> +
> + if (symlen < 3) {
> + if (symlen == 1)
> + daynum = parse_day_type_numeric(sym->identifier);
> +
> + if (daynum >= 0)
> + goto success;
goto for success path is discouraged.
Better if you use 'goto' to deal with error path.
> +
> + return error(&sym->location, "Day name must be at least three
> characters long");
> + }
> +
> + for (int i = 0; i < numdays && daynum == -1; i++) {
> + daylen = strlen(days[i]);
> +
> + if (strncasecmp(sym->identifier,
> + days[i],
> + min(symlen, daylen)) == 0)
> + daynum = i;
> + }
Introduce a helper function to do this literal to numeric lookup?