diff --git a/doc/configuration.txt b/doc/configuration.txt index 7c2d83806..df4465caf 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -14036,6 +14036,11 @@ crc32c([]) not be used for security purposes as a 32-bit hash is trivial to break. See also "djb2", "sdbm", "wt6", "crc32" and the "hash-type" directive. +cut_crlf + Cuts the string representation of the input sample on the first carriage + return ('\r') or newline ('\n') character found. Only the string length is + updated. + da-csv-conv([,*]) Asks the DeviceAtlas converter to identify the User Agent string passed on input, and to emit a string made of the concatenation of the properties diff --git a/src/sample.c b/src/sample.c index c28b5449e..43d932d84 100644 --- a/src/sample.c +++ b/src/sample.c @@ -2979,6 +2979,21 @@ static int sample_conv_htonl(const struct arg *arg_p, struct sample *smp, void * return 1; } +/**/ +static int sample_conv_cut_crlf(const struct arg *arg_p, struct sample *smp, void *private) +{ + char *p; + size_t l; + + p = smp->data.u.str.area; + for (l = 0; l < smp->data.u.str.data; l++) { + if (*(p+l) == '\r' || *(p+l) == '\n') + break; + } + smp->data.u.str.data = l; + return 1; +} + /************************************************************************/ /* All supported sample fetch functions must be declared here */ /************************************************************************/ @@ -3447,7 +3462,8 @@ static struct sample_conv_kw_list sample_conv_kws = {ILH, { { "mod", sample_conv_arith_mod, ARG1(1,STR), check_operator, SMP_T_SINT, SMP_T_SINT }, { "neg", sample_conv_arith_neg, 0, NULL, SMP_T_SINT, SMP_T_SINT }, - { "htonl", sample_conv_htonl, 0, NULL, SMP_T_SINT, SMP_T_BIN }, + { "htonl", sample_conv_htonl, 0, NULL, SMP_T_SINT, SMP_T_BIN }, + { "cut_crlf", sample_conv_cut_crlf, 0, NULL, SMP_T_STR, SMP_T_STR }, { NULL, NULL, 0, 0, 0 }, }};