5 int lbuf_indents(struct lbuf
*lb
, int r
)
7 char *ln
= lbuf_get(lb
, r
);
11 for (o
= 0; uc_isspace(ln
); o
++)
16 static int uc_nextdir(char **s
, char *beg
, int dir
)
21 *s
= uc_prev(beg
, *s
);
30 int lbuf_findchar(struct lbuf
*lb
, char *cs
, int cmd
, int n
, int *row
, int *off
)
32 char *ln
= lbuf_get(lb
, *row
);
34 int dir
= (cmd
== 'f' || cmd
== 't') ? +1 : -1;
42 while (n
> 0 && !uc_nextdir(&s
, ln
, dir
))
43 if (uc_code(s
) == uc_code(cs
))
45 if (!n
&& (cmd
== 't' || cmd
== 'T'))
46 uc_nextdir(&s
, ln
, -dir
);
48 *off
= uc_off(ln
, s
- ln
);
52 int lbuf_search(struct lbuf
*lb
, char *kw
, int dir
, int *r
, int *o
, int *len
)
58 struct rset
*re
= rset_make(1, &kw
, xic
? RE_ICASE
: 0);
61 for (i
= r0
; !found
&& i
>= 0 && i
< lbuf_len(lb
); i
+= dir
) {
62 char *s
= lbuf_get(lb
, i
);
63 int off
= dir
> 0 && r0
== i
? uc_chr(s
, o0
+ 1) - s
: 0;
64 while (rset_find(re
, s
+ off
, 1, offs
,
65 off
? RE_NOTBOL
: 0) >= 0) {
66 if (dir
< 0 && r0
== i
&&
67 uc_off(s
, off
+ offs
[0]) >= o0
)
70 *o
= uc_off(s
, off
+ offs
[0]);
72 *len
= uc_off(s
+ off
+ offs
[0], offs
[1] - offs
[0]);
73 off
+= offs
[1] > offs
[0] ? offs
[1] : offs
[1] + 1;
82 int lbuf_paragraphbeg(struct lbuf
*lb
, int dir
, int *row
, int *off
)
84 while (*row
>= 0 && *row
< lbuf_len(lb
) && !strcmp("\n", lbuf_get(lb
, *row
)))
86 while (*row
>= 0 && *row
< lbuf_len(lb
) && strcmp("\n", lbuf_get(lb
, *row
)))
88 *row
= MAX(0, MIN(*row
, lbuf_len(lb
) - 1));
93 int lbuf_sectionbeg(struct lbuf
*lb
, int dir
, int *row
, int *off
)
96 while (*row
>= 0 && *row
< lbuf_len(lb
) && lbuf_get(lb
, *row
)[0] != '{')
98 *row
= MAX(0, MIN(*row
, lbuf_len(lb
) - 1));
103 static int lbuf_lnnext(struct lbuf
*lb
, int dir
, int *r
, int *o
)
106 if (off
< 0 || !lbuf_get(lb
, *r
) || off
>= uc_slen(lbuf_get(lb
, *r
)))
112 int lbuf_eol(struct lbuf
*lb
, int row
)
114 int len
= lbuf_get(lb
, row
) ? uc_slen(lbuf_get(lb
, row
)) : 0;
115 return len
? len
- 1 : 0;
118 static int lbuf_next(struct lbuf
*lb
, int dir
, int *r
, int *o
)
120 if (dir
< 0 && *r
>= lbuf_len(lb
))
121 *r
= MAX(0, lbuf_len(lb
) - 1);
122 if (lbuf_lnnext(lb
, dir
, r
, o
)) {
123 if (!lbuf_get(lb
, *r
+ dir
))
126 *o
= dir
> 0 ? 0 : lbuf_eol(lb
, *r
);
132 /* return a pointer to the character at visual position c of line r */
133 static char *lbuf_chr(struct lbuf
*lb
, int r
, int c
)
135 char *ln
= lbuf_get(lb
, r
);
136 return ln
? uc_chr(ln
, c
) : "";
139 /* move to the last character of the word */
140 static int lbuf_wordlast(struct lbuf
*lb
, int kind
, int dir
, int *row
, int *off
)
142 if (!kind
|| !(uc_kind(lbuf_chr(lb
, *row
, *off
)) & kind
))
144 while (uc_kind(lbuf_chr(lb
, *row
, *off
)) & kind
)
145 if (lbuf_next(lb
, dir
, row
, off
))
147 if (!(uc_kind(lbuf_chr(lb
, *row
, *off
)) & kind
))
148 lbuf_next(lb
, -dir
, row
, off
);
152 int lbuf_wordbeg(struct lbuf
*lb
, int big
, int dir
, int *row
, int *off
)
155 lbuf_wordlast(lb
, big
? 3 : uc_kind(lbuf_chr(lb
, *row
, *off
)), dir
, row
, off
);
156 nl
= uc_code(lbuf_chr(lb
, *row
, *off
)) == '\n';
157 if (lbuf_next(lb
, dir
, row
, off
))
159 while (uc_isspace(lbuf_chr(lb
, *row
, *off
))) {
160 nl
+= uc_code(lbuf_chr(lb
, *row
, *off
)) == '\n';
163 if (lbuf_next(lb
, dir
, row
, off
))
169 int lbuf_wordend(struct lbuf
*lb
, int big
, int dir
, int *row
, int *off
)
172 if (!uc_isspace(lbuf_chr(lb
, *row
, *off
))) {
173 if (lbuf_next(lb
, dir
, row
, off
))
175 nl
= dir
< 0 && uc_code(lbuf_chr(lb
, *row
, *off
)) == '\n';
177 nl
+= dir
> 0 && uc_code(lbuf_chr(lb
, *row
, *off
)) == '\n';
178 while (uc_isspace(lbuf_chr(lb
, *row
, *off
))) {
179 if (lbuf_next(lb
, dir
, row
, off
))
181 nl
+= uc_code(lbuf_chr(lb
, *row
, *off
)) == '\n';
184 lbuf_next(lb
, -dir
, row
, off
);
188 if (lbuf_wordlast(lb
, big
? 3 : uc_kind(lbuf_chr(lb
, *row
, *off
)), dir
, row
, off
))
193 /* move to the matching character */
194 int lbuf_pair(struct lbuf
*lb
, int *row
, int *off
)
196 int r
= *row
, o
= *off
;
197 char *ln
= lbuf_get(lb
, *row
);
198 char *pairs
= "()[]{}";
199 int p
; /* index for pairs[] */
200 int dep
= 1; /* parenthesis depth */
203 while (!strchr(pairs
, ln
[o
]))
206 p
= strchr(pairs
, ln
[o
]) - pairs
;
207 while (!lbuf_next(lb
, (p
& 1) ? -1 : +1, &r
, &o
)) {
208 int c
= (unsigned char) lbuf_chr(lb
, r
, o
)[0];
209 if (c
== pairs
[p
^ 1])