void get_relative_name(Term* term, Branch* relativeTo, caValue* nameOutput) { set_list(nameOutput, 0); // Walk upwards and build the name, stop when we reach relativeTo. // The output list will be reversed but we'll fix that. while (true) { set_string(list_append(nameOutput), get_unique_name(term)); if (term->owningBranch == relativeTo) { break; } term = get_parent_term(term); // If term is null, then it wasn't really a child of relativeTo if (term == NULL) { set_null(nameOutput); return; } } // Fix output list list_reverse(nameOutput); }
Term* find_enclosing_for_loop(Term* location) { while (location != NULL && location->function != FUNCS.for_func) location = get_parent_term(location); return location; }