]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Slightly less awful
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 18 Mar 2021 20:38:20 +0000 (20:38 +0000)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 18 Mar 2021 20:38:20 +0000 (20:38 +0000)
src/lib/unlang/xlat_builtin.c
src/lib/util/sbuff.h

index 4309f563108b21d844b6333ac1f5d298884eff0f..6218fd092e3048f81785fe298e82e2071d27af6a 100644 (file)
@@ -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));
index f37e8e9c10628fd1ed76316214e83a06dcd6c1c0..4d78fd818972b68e35f2df72df1c54ee9b923957 100644 (file)
@@ -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
  *