Filerange text_object_function_inner(Text *txt, size_t pos) { Filerange r = text_object_function(txt, pos); if (!text_range_valid(&r)) return r; size_t b = text_function_end_next(txt, pos); size_t a = text_bracket_match(txt, b); return text_range_new(a+1, b-1); }
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); }
static Filerange text_object_bracket(Text *txt, size_t pos, char type) { char c, open, close; int opened = 1, closed = 1; Filerange r = text_range_empty(); switch (type) { case '(': case ')': open = '('; close = ')'; break; case '{': case '}': open = '{'; close = '}'; break; case '[': case ']': open = '['; close = ']'; break; case '<': case '>': open = '<'; close = '>'; break; case '"': open = '"'; close = '"'; break; case '`': open = '`'; close = '`'; break; case '\'': open = '\''; close = '\''; break; default: return r; } Iterator it = text_iterator_get(txt, pos); if (open == close && text_iterator_byte_get(&it, &c) && (c == '"' || c == '`' || c == '\'')) { size_t match = text_bracket_match(txt, pos); r.start = MIN(pos, match) + 1; r.end = MAX(pos, match); return r; } while (text_iterator_byte_get(&it, &c)) { if (c == open && --opened == 0) { r.start = it.pos + 1; break; } else if (c == close && it.pos != pos) { opened++; } text_iterator_byte_prev(&it, NULL); } it = text_iterator_get(txt, pos); while (text_iterator_byte_get(&it, &c)) { if (c == close && --closed == 0) { r.end = it.pos; break; } else if (c == open && it.pos != pos) { closed++; } text_iterator_byte_next(&it, NULL); } if (!text_range_valid(&r)) return text_range_empty(); return r; }
size_t text_function_start_next(Text *txt, size_t pos) { size_t a = text_function_end_next(txt, pos); size_t b = a; char c; if (a != pos) { Iterator it = text_iterator_get(txt, a); while (text_iterator_byte_next(&it, &c) && (c == '\r' || c == '\n')); a = it.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 MIN(a, b); }
Filerange text_object_function_inner(Text *txt, size_t pos) { Filerange r = object_function(txt, pos); if (!text_range_valid(&r)) return r; return text_range_new(text_bracket_match(txt, r.end)+1, r.end); }