From: David Carlier Date: Tue, 15 Mar 2016 19:00:35 +0000 (+0000) Subject: MINOR: sample: Moves ARGS underlying type from 32 to 64 bits. X-Git-Tag: v1.7-dev3~101 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=15073a3393873349e04d41c69482391a4b86818f;p=thirdparty%2Fhaproxy.git MINOR: sample: Moves ARGS underlying type from 32 to 64 bits. ARG# macros allow to create a list up to 7 in theory but 5 in practice. The change to a guaranteed 64 bits type increase to up to 12. --- diff --git a/include/proto/arg.h b/include/proto/arg.h index 91c1acde70..db63b0e213 100644 --- a/include/proto/arg.h +++ b/include/proto/arg.h @@ -31,22 +31,43 @@ * the number of mandatory arguments in a mask. */ #define ARGM(m) \ - (m & ARGM_MASK) + (uint64_t)(m & ARGM_MASK) #define ARG1(m, t1) \ - (ARGM(m) + (ARGT_##t1 << (ARGM_BITS))) + (ARGM(m) + ((uint64_t)ARGT_##t1 << (ARGM_BITS))) #define ARG2(m, t1, t2) \ - (ARG1(m, t1) + (ARGT_##t2 << (ARGM_BITS + ARGT_BITS))) + (ARG1(m, t1) + ((uint64_t)ARGT_##t2 << (ARGM_BITS + ARGT_BITS))) #define ARG3(m, t1, t2, t3) \ - (ARG2(m, t1, t2) + (ARGT_##t3 << (ARGM_BITS + ARGT_BITS * 2))) + (ARG2(m, t1, t2) + ((uint64_t)ARGT_##t3 << (ARGM_BITS + ARGT_BITS * 2))) #define ARG4(m, t1, t2, t3, t4) \ - (ARG3(m, t1, t2, t3) + (ARGT_##t4 << (ARGM_BITS + ARGT_BITS * 3))) + (ARG3(m, t1, t2, t3) + ((uint64_t)ARGT_##t4 << (ARGM_BITS + ARGT_BITS * 3))) #define ARG5(m, t1, t2, t3, t4, t5) \ - (ARG4(m, t1, t2, t3, t4) + (ARGT_##t5 << (ARGM_BITS + ARGT_BITS * 4))) + (ARG4(m, t1, t2, t3, t4) + ((uint64_t)ARGT_##t5 << (ARGM_BITS + ARGT_BITS * 4))) + +#define ARG6(m, t1, t2, t3, t4, t5, t6) \ + (ARG5(m, t1, t2, t3, t4, t5) + ((uint64_t)ARGT_##t6 << (ARGM_BITS + ARGT_BITS * 5))) + +#define ARG7(m, t1, t2, t3, t4, t5, t6, t7) \ + (ARG6(m, t1, t2, t3, t4, t5, t6) + ((uint64_t)ARGT_##t7 << (ARGM_BITS + ARGT_BITS * 6))) + +#define ARG8(m, t1, t2, t3, t4, t5, t6, t7, t8) \ + (ARG7(m, t1, t2, t3, t4, t5, t6, t7) + ((uint64_t)ARGT_##t8 << (ARGM_BITS + ARGT_BITS * 7))) + +#define ARG9(m, t1, t2, t3, t4, t5, t6, t7, t8, t9) \ + (ARG8(m, t1, t2, t3, t4, t5, t6, t7, t8) + ((uint64_t)ARGT_##t9 << (ARGM_BITS + ARGT_BITS * 8))) + +#define ARG10(m, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10) \ + (ARG9(m, t1, t2, t3, t4, t5, t6, t7, t8, t9) + ((uint64_t)ARGT_##t10 << (ARGM_BITS + ARGT_BITS * 9))) + +#define ARG11(m, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11) \ + (ARG10(m, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10) + ((uint64_t)ARGT_##t11 << (ARGM_BITS + ARGT_BITS * 10))) + +#define ARG12(m, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12) \ + (ARG11(m, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11) + ((uint64_t)ARGT_##t12 << (ARGM_BITS + ARGT_BITS * 11))) /* Mapping between argument number and literal description. */ extern const char *arg_type_names[]; @@ -58,7 +79,7 @@ extern struct arg empty_arg_list[ARGM_NBARGS]; struct arg_list *arg_list_clone(const struct arg_list *orig); struct arg_list *arg_list_add(struct arg_list *orig, struct arg *arg, int pos); -int make_arg_list(const char *in, int len, unsigned int mask, struct arg **argp, +int make_arg_list(const char *in, int len, uint64_t mask, struct arg **argp, char **err_msg, const char **err_ptr, int *err_arg, struct arg_list *al); diff --git a/include/types/arg.h b/include/types/arg.h index 5430de733f..fef12ec55d 100644 --- a/include/types/arg.h +++ b/include/types/arg.h @@ -35,12 +35,12 @@ #define ARGT_NBTYPES (1 << ARGT_BITS) #define ARGT_MASK (ARGT_NBTYPES - 1) -/* encoding of the arg count : up to 5 args are possible. 4 bits are left +/* encoding of the arg count : up to 12 args are possible. 4 bits are left * unused at the top. */ #define ARGM_MASK ((1 << ARGM_BITS) - 1) -#define ARGM_BITS 3 -#define ARGM_NBARGS (32 - ARGM_BITS) / sizeof(int) +#define ARGM_BITS 4 +#define ARGM_NBARGS (sizeof(uint64_t) * 8 - ARGM_BITS) / ARGT_BITS enum { ARGT_STOP = 0, /* end of the arg list */ diff --git a/include/types/sample.h b/include/types/sample.h index 4a46be836e..955f9bda43 100644 --- a/include/types/sample.h +++ b/include/types/sample.h @@ -280,7 +280,7 @@ struct sample_conv { int (*process)(const struct arg *arg_p, struct sample *smp, void *private); /* process function */ - unsigned int arg_mask; /* arguments (ARG*()) */ + uint64_t arg_mask; /* arguments (ARG*()) */ int (*val_args)(struct arg *arg_p, struct sample_conv *smp_conv, const char *file, int line, @@ -304,7 +304,7 @@ struct sample_fetch { struct sample *smp, const char *kw, /* fetch processing function */ void *private); /* private value. */ - unsigned int arg_mask; /* arguments (ARG*()) */ + uint64_t arg_mask; /* arguments (ARG*()) */ int (*val_args)(struct arg *arg_p, char **err_msg); /* argument validation function */ unsigned long out_type; /* output sample type */ diff --git a/src/arg.c b/src/arg.c index 7248c54b02..9e551fb8e0 100644 --- a/src/arg.c +++ b/src/arg.c @@ -91,7 +91,7 @@ struct arg_list *arg_list_add(struct arg_list *orig, struct arg *arg, int pos) * argument type in each subsequent ARGT_BITS-bit sblock. If is not * NULL, it must point to a freeable or NULL pointer. */ -int make_arg_list(const char *in, int len, unsigned int mask, struct arg **argp, +int make_arg_list(const char *in, int len, uint64_t mask, struct arg **argp, char **err_msg, const char **err_ptr, int *err_arg, struct arg_list *al) {