diff --git a/include/proto/sample.h b/include/proto/sample.h index 19b9f02bc4..91f4513051 100644 --- a/include/proto/sample.h +++ b/include/proto/sample.h @@ -41,6 +41,7 @@ const char *sample_src_names(unsigned int use); const char *sample_ckp_names(unsigned int use); struct sample_fetch *find_sample_fetch(const char *kw, int len); struct sample_fetch *sample_fetch_getnext(struct sample_fetch *current, int *idx); +struct sample_conv *sample_conv_getnext(struct sample_conv *current, int *idx); int smp_resolve_args(struct proxy *p); int smp_expr_output_type(struct sample_expr *expr); int c_none(struct sample *smp); diff --git a/src/sample.c b/src/sample.c index 896f6897ab..3c464c46f2 100644 --- a/src/sample.c +++ b/src/sample.c @@ -427,6 +427,48 @@ struct sample_fetch *sample_fetch_getnext(struct sample_fetch *current, int *idx } } +/* This function browses the list of available converters. is + * the last used converter. If it is the first call, it must set to NULL. + * is the index of the next converter entry. It is used as private + * value. It is useless to initiate it. + * + * It returns always the next sample_conv entry, and NULL when the end of + * the list is reached. + */ +struct sample_conv *sample_conv_getnext(struct sample_conv *current, int *idx) +{ + struct sample_conv_kw_list *kwl; + struct sample_conv *base; + + if (!current) { + /* Get first kwl entry. */ + kwl = LIST_NEXT(&sample_convs.list, struct sample_conv_kw_list *, list); + (*idx) = 0; + } else { + /* Get kwl corresponding to the curret entry. */ + base = current + 1 - (*idx); + kwl = container_of(base, struct sample_conv_kw_list, kw); + } + + while (1) { + /* Check if kwl is the last entry. */ + if (&kwl->list == &sample_convs.list) + return NULL; + + /* idx contain the next keyword. If it is available, return it. */ + if (kwl->kw[*idx].kw) { + (*idx)++; + return &kwl->kw[(*idx)-1]; + } + + /* get next entry in the main list, and return NULL if the end is reached. */ + kwl = LIST_NEXT(&kwl->list, struct sample_conv_kw_list *, list); + + /* Set index to 0, ans do one other loop. */ + (*idx) = 0; + } +} + /* * Returns the pointer on sample format conversion keyword structure identified by * string of in buffer .