From: Arran Cudbard-Bell Date: Thu, 18 Mar 2021 20:38:20 +0000 (+0000) Subject: Slightly less awful X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=617a9bcefeb4d6f6693ea5fce206b10622b11bb4;p=thirdparty%2Ffreeradius-server.git Slightly less awful --- diff --git a/src/lib/unlang/xlat_builtin.c b/src/lib/unlang/xlat_builtin.c index 4309f563108..6218fd092e3 100644 --- a/src/lib/unlang/xlat_builtin.c +++ b/src/lib/unlang/xlat_builtin.c @@ -1546,9 +1546,7 @@ static xlat_action_t xlat_func_lpad(UNUSED TALLOC_CTX *ctx, fr_dcursor_t *out, fr_sbuff_init(&sbuff, buff, pad_len + 1); fr_sbuff_marker(&m_data, &sbuff); fr_sbuff_advance(&m_data, pad_len - len); /* Mark where we want the data to go */ - fr_sbuff_move(&m_data, &sbuff, len); /* Shift the data */ - fr_sbuff_set(&m_data, fr_sbuff_start(&sbuff) + (pad_len - len)); - fr_sbuff_set_to_start(&sbuff); /* reset to the beginning of the buffer */ + fr_sbuff_move(&FR_SBUFF_NO_ADVANCE(&m_data), &FR_SBUFF_NO_ADVANCE(&sbuff), len); /* Shift the data */ if (fill_len == 1) { memset(fr_sbuff_current(&sbuff), *fill_str, fr_sbuff_ahead(&m_data)); diff --git a/src/lib/util/sbuff.h b/src/lib/util/sbuff.h index f37e8e9c106..4d78fd81897 100644 --- a/src/lib/util/sbuff.h +++ b/src/lib/util/sbuff.h @@ -366,38 +366,66 @@ do { \ /** Prevent an sbuff being advanced as it's passed into a printing or parsing function * - * @param[in] _sbuff to make an ephemeral copy of. - */ -#define FR_SBUFF_NO_ADVANCE(_sbuff) \ -((fr_sbuff_t){ \ - .buff = (_sbuff)->buff, \ - .start = (_sbuff)->p, \ - .end = (_sbuff)->end, \ - .p = (_sbuff)->p, \ - .is_const = (_sbuff)->is_const, \ - .extend = (_sbuff)->extend, \ - .shifted = (_sbuff)->shifted, \ - .uctx = (_sbuff)->uctx, \ - .parent = (_sbuff) \ -}) + * @param[in] _sbuff_or_marker to make an ephemeral copy of. + */ +#define FR_SBUFF_NO_ADVANCE(_sbuff_or_marker) \ +_Generic((_sbuff_or_marker), \ + fr_sbuff_t * : ((fr_sbuff_t){ \ + .buff = ((fr_sbuff_t *)(_sbuff_or_marker))->buff, \ + .start = ((fr_sbuff_t *)(_sbuff_or_marker))->p, \ + .end = ((fr_sbuff_t *)(_sbuff_or_marker))->end, \ + .p = ((fr_sbuff_t *)(_sbuff_or_marker))->p, \ + .is_const = ((fr_sbuff_t *)(_sbuff_or_marker))->is_const, \ + .extend = ((fr_sbuff_t *)(_sbuff_or_marker))->extend, \ + .shifted = ((fr_sbuff_t *)(_sbuff_or_marker))->shifted, \ + .uctx = ((fr_sbuff_t *)(_sbuff_or_marker))->uctx, \ + .parent = ((fr_sbuff_t *)(_sbuff_or_marker)) \ + }), \ + fr_sbuff_marker_t * : ((fr_sbuff_t){ \ + .buff = ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent->buff, \ + .start = ((fr_sbuff_marker_t *)(_sbuff_or_marker))->p, \ + .end = ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent->end, \ + .p = ((fr_sbuff_marker_t *)(_sbuff_or_marker))->p, \ + .is_const = ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent->is_const, \ + .extend = ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent->extend, \ + .shifted = ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent->shifted, \ + .uctx = ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent->uctx, \ + .parent = ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \ + }) \ +) + /** Copy all fields in an sbuff * * @param[in] _sbuff to make an ephemeral copy of. */ -#define FR_SBUFF_COPY(_sbuff) \ -((fr_sbuff_t){ \ - .buff = (_sbuff)->buff, \ - .start = (_sbuff)->p, \ - .end = (_sbuff)->end, \ - .p = (_sbuff)->p, \ - .is_const = (_sbuff)->is_const, \ - .adv_parent = 1, \ - .extend = (_sbuff)->extend, \ - .shifted = (_sbuff)->shifted, \ - .uctx = (_sbuff)->uctx, \ - .parent = (_sbuff) \ -}) +#define FR_SBUFF_COPY(_sbuff_or_marker) \ +_Generic((_sbuff_or_marker), \ + fr_sbuff_t * : ((fr_sbuff_t){ \ + .buff = ((fr_sbuff_t *)(_sbuff_or_marker))->buff, \ + .start = ((fr_sbuff_t *)(_sbuff_or_marker))->p, \ + .end = ((fr_sbuff_t *)(_sbuff_or_marker))->end, \ + .p = ((fr_sbuff_t *)(_sbuff_or_marker))->p, \ + .is_const = ((fr_sbuff_t *)(_sbuff_or_marker))->is_const, \ + .adv_parent = 1, \ + .extend = ((fr_sbuff_t *)(_sbuff_or_marker))->extend, \ + .shifted = ((fr_sbuff_t *)(_sbuff_or_marker))->shifted, \ + .uctx = ((fr_sbuff_t *)(_sbuff_or_marker))->uctx, \ + .parent = ((fr_sbuff_t *)(_sbuff_or_marker)) \ + }), \ + fr_sbuff_marker_t * : ((fr_sbuff_t){ \ + .buff = ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent->buff, \ + .start = ((fr_sbuff_marker_t *)(_sbuff_or_marker))->p, \ + .end = ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent->end, \ + .p = ((fr_sbuff_marker_t *)(_sbuff_or_marker))->p, \ + .is_const = ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent->is_const, \ + .adv_parent = 1, \ + .extend = ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent->extend, \ + .shifted = ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent->shifted, \ + .uctx = ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent->uctx, \ + .parent = ((fr_sbuff_marker_t *)(_sbuff_or_marker))->parent \ + }) \ +) /** Creates a compound literal to pass into functions which accept a sbuff *