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 int flg
= off
? RE_NOTBOL
: 0;
65 while (rset_find(re
, s
+ off
, 1, offs
, flg
) >= 0) {
66 if (dir
< 0 && r0
== i
&& off
+ offs
[0] >= o0
)
69 *o
= uc_off(s
, off
+ offs
[0]);
71 *len
= offs
[1] - offs
[0];
81 int lbuf_paragraphbeg(struct lbuf
*lb
, int dir
, int *row
, int *off
)
83 while (*row
>= 0 && *row
< lbuf_len(lb
) && !strcmp("\n", lbuf_get(lb
, *row
)))
85 while (*row
>= 0 && *row
< lbuf_len(lb
) && strcmp("\n", lbuf_get(lb
, *row
)))
87 *row
= MAX(0, MIN(*row
, lbuf_len(lb
) - 1));
92 int lbuf_sectionbeg(struct lbuf
*lb
, int dir
, int *row
, int *off
)
95 while (*row
>= 0 && *row
< lbuf_len(lb
) && lbuf_get(lb
, *row
)[0] != '{')
97 *row
= MAX(0, MIN(*row
, lbuf_len(lb
) - 1));
102 static int lbuf_lnnext(struct lbuf
*lb
, int dir
, int *r
, int *o
)
105 if (off
< 0 || !lbuf_get(lb
, *r
) || off
>= uc_slen(lbuf_get(lb
, *r
)))
111 int lbuf_eol(struct lbuf
*lb
, int row
)
113 int len
= lbuf_get(lb
, row
) ? uc_slen(lbuf_get(lb
, row
)) : 0;
114 return len
? len
- 1 : 0;
117 static int lbuf_next(struct lbuf
*lb
, int dir
, int *r
, int *o
)
119 if (dir
< 0 && *r
>= lbuf_len(lb
))
120 *r
= MAX(0, lbuf_len(lb
) - 1);
121 if (lbuf_lnnext(lb
, dir
, r
, o
)) {
122 if (!lbuf_get(lb
, *r
+ dir
))
125 *o
= dir
> 0 ? 0 : lbuf_eol(lb
, *r
);
131 /* return a pointer to the character at visual position c of line r */
132 static char *lbuf_chr(struct lbuf
*lb
, int r
, int c
)
134 char *ln
= lbuf_get(lb
, r
);
135 return ln
? uc_chr(ln
, c
) : "";
138 /* move to the last character of the word */
139 static int lbuf_wordlast(struct lbuf
*lb
, int kind
, int dir
, int *row
, int *off
)
141 if (!kind
|| !(uc_kind(lbuf_chr(lb
, *row
, *off
)) & kind
))
143 while (uc_kind(lbuf_chr(lb
, *row
, *off
)) & kind
)
144 if (lbuf_next(lb
, dir
, row
, off
))
146 if (!(uc_kind(lbuf_chr(lb
, *row
, *off
)) & kind
))
147 lbuf_next(lb
, -dir
, row
, off
);
151 int lbuf_wordbeg(struct lbuf
*lb
, int big
, int dir
, int *row
, int *off
)
154 lbuf_wordlast(lb
, big
? 3 : uc_kind(lbuf_chr(lb
, *row
, *off
)), dir
, row
, off
);
155 if (lbuf_next(lb
, dir
, row
, off
))
157 while (uc_isspace(lbuf_chr(lb
, *row
, *off
))) {
158 nl
= uc_code(lbuf_chr(lb
, *row
, *off
)) == '\n' ? nl
+ 1 : 0;
161 if (lbuf_next(lb
, dir
, row
, off
))
167 int lbuf_wordend(struct lbuf
*lb
, int big
, int dir
, int *row
, int *off
)
169 int nl
= uc_code(lbuf_chr(lb
, *row
, *off
)) == '\n' ? -1 : 0;
170 if (!uc_isspace(lbuf_chr(lb
, *row
, *off
)))
171 if (lbuf_next(lb
, dir
, row
, off
))
173 while (uc_isspace(lbuf_chr(lb
, *row
, *off
))) {
174 nl
= uc_code(lbuf_chr(lb
, *row
, *off
)) == '\n' ? nl
+ 1 : 0;
177 lbuf_next(lb
, -dir
, row
, off
);
180 if (lbuf_next(lb
, dir
, row
, off
))
183 if (lbuf_wordlast(lb
, big
? 3 : uc_kind(lbuf_chr(lb
, *row
, *off
)), dir
, row
, off
))