IV srl_iterator_hash_exists_sv(pTHX_ srl_iterator_t *iter, SV *name) { STRLEN name_len; const char *name_ptr = SvPV(name, name_len); return srl_iterator_hash_exists(aTHX_ iter, name_ptr, name_len); }
SRL_STATIC_INLINE void srl_parse_hash_list(pTHX_ srl_path_t *path, int expr_idx, SV *route, const char *list, STRLEN list_len) { STRLEN item_len; const char *item = NULL; srl_iterator_ptr iter = path->iter; IV depth = srl_iterator_stack_depth(aTHX_ iter); SRL_PATH_TRACE("parse items '%.*s' in hash of size=%d at depth=%"IVdf, (int) list_len, list, srl_iterator_stack(aTHX_ iter)->length, depth); while (next_item_in_list(list, list_len, &item, &item_len)) { assert(srl_iterator_stack_depth(aTHX_ iter) == depth); if (item_len == 0) continue; SRL_PATH_TRACE("scan for item=%.*s in hash at depth=%"IVdf, (int) item_len, item, srl_iterator_stack_depth(aTHX_ iter)); if (srl_iterator_hash_exists(aTHX_ iter, item, item_len) != SRL_ITER_NOT_FOUND) { srl_parse_next_str(aTHX_ path, expr_idx + 1, route, item, item_len); srl_iterator_rewind(aTHX_ iter, srl_iterator_stack_depth(aTHX_ iter) - depth); } else { srl_iterator_rewind(aTHX_ iter, 0); } } }
SRL_STATIC_INLINE void srl_parse_hash_item(pTHX_ srl_path_t *path, int expr_idx, SV *route, const char *str, STRLEN str_len) { srl_iterator_ptr iter = path->iter; SRL_PATH_TRACE("parse item '%.*s' in hash of size=%d at depth=%"IVdf, (int) str_len, str, srl_iterator_stack(aTHX_ iter)->length, srl_iterator_stack_depth(aTHX_ iter)); if (srl_iterator_hash_exists(aTHX_ iter, str, str_len) != SRL_ITER_NOT_FOUND) { srl_parse_next_str(aTHX_ path, expr_idx + 1, route, str, str_len); } }