static Filerange object_function(Text *txt, size_t pos) { size_t start_prev = text_function_start_prev(txt, pos); size_t end_next = text_function_end_next(txt, pos); size_t start = text_function_start_next(txt, start_prev); size_t end = text_function_end_prev(txt, end_next); if (start == pos) start_prev = pos; if (end == pos) end_next = pos; if (text_function_end_next(txt, start_prev) == end_next && text_function_start_prev(txt, end_next) == start_prev) { return text_range_new(start_prev, end_next); } return text_range_empty(); }
size_t text_function_start_prev(Text *txt, size_t pos) { char c; size_t apos = text_byte_get(txt, pos, &c) && c == '}' && pos > 0 ? pos - 1 : pos; size_t a = text_function_end_next(txt, apos); size_t b = text_function_end_prev(txt, pos); if (a != apos) { size_t match = text_bracket_match(txt, a); a = match != a ? text_line_next(txt, text_line_empty_prev(txt, match)) : pos; } if (b != pos) { size_t match = text_bracket_match(txt, b); b = match != b ? text_line_next(txt, text_line_empty_prev(txt, match)) : pos; } if (a >= pos && b >= pos) return pos; else if (a >= pos) return b; else if (b >= pos) return a; else return MAX(a, b); }