void tmpl_attr_rewrite_leaf_num(tmpl_t *vpt, int16_t from, int16_t to) CC_HINT(nonnull);
-void tmpl_attr_rewrite_num(tmpl_t *vpt, int16_t from, int16_t to) CC_HINT(nonnull);
-
void tmpl_attr_set_request_ref(tmpl_t *vpt, FR_DLIST_HEAD(tmpl_request_list) const *request_def) CC_HINT(nonnull);
void tmpl_attr_set_list(tmpl_t *vpt, fr_dict_attr_t const *list) CC_HINT(nonnull);
if (tmpl_attr_list_num_elements(tmpl_attr(vpt)) == 0) return;
ref = tmpl_attr_list_tail(tmpl_attr(vpt));
- if (ref->ar_num == from) ref->ar_num = to;
- TMPL_ATTR_VERIFY(vpt);
-}
+ switch (ref->ar_filter_type) {
+ case TMPL_ATTR_FILTER_TYPE_NONE:
+ if (from != NUM_UNSPEC) break;
-/** Rewrite all instances of an array number
- *
- */
-void tmpl_attr_rewrite_num(tmpl_t *vpt, int16_t from, int16_t to)
-{
- tmpl_attr_t *ref = NULL;
+ ref->ar_filter_type = TMPL_ATTR_FILTER_TYPE_INDEX;
+ ref->ar_num = to;
+ break;
- tmpl_assert_type(tmpl_is_attr(vpt) || tmpl_is_attr_unresolved(vpt));
+ case TMPL_ATTR_FILTER_TYPE_INDEX:
+ if (ref->ar_num != from) break;
- while ((ref = tmpl_attr_list_next(tmpl_attr(vpt), ref))) if (ref->ar_num == from) ref->ar_num = to;
+ ref->ar_num = to;
+ break;
+
+ /*
+ * Don't rewrite non-index types.
+ */
+ default:
+ break;
+ }
TMPL_ATTR_VERIFY(vpt);
}