/* * Analogous to back_line(), but deals with "raw lines". * {{ This is supposed to be more efficient than back_line(). }} */ off_t back_raw_line(off_t curr_pos, char **linep, int *line_lenp) { int n; int c; off_t new_pos; if (curr_pos == -1 || curr_pos <= ch_zero() || ch_seek(curr_pos - 1)) return (-1); n = size_linebuf; linebuf[--n] = '\0'; for (;;) { c = ch_back_get(); if (c == '\n' || ABORT_SIGS()) { /* * This is the newline ending the previous line. * We have hit the beginning of the line. */ new_pos = ch_tell() + 1; break; } if (c == EOI) { /* * We have hit the beginning of the file. * This must be the first line in the file. * This must, of course, be the beginning of the line. */ new_pos = ch_zero(); break; } if (n <= 0) { int old_size_linebuf = size_linebuf; char *fm; char *to; if (expand_linebuf()) { /* * Overflowed the input buffer. * Pretend the line ended here. */ new_pos = ch_tell() + 1; break; } /* * Shift the data to the end of the new linebuf. */ for (fm = linebuf + old_size_linebuf - 1, to = linebuf + size_linebuf - 1; fm >= linebuf; fm--, to--) *to = *fm; n = size_linebuf - old_size_linebuf; } linebuf[--n] = c; } if (linep != NULL) *linep = &linebuf[n]; if (line_lenp != NULL) *line_lenp = size_linebuf - 1 - n; return (new_pos); }
/* * Forward forever, or until a highlighted line appears. */ static int forw_loop(int until_hilite) { off_t curr_len; if (ch_getflags() & CH_HELPFILE) return (A_NOACTION); cmd_exec(); jump_forw(); curr_len = ch_length(); highest_hilite = until_hilite ? curr_len : -1; ignore_eoi = 1; while (!sigs) { if (until_hilite && highest_hilite > curr_len) { ring_bell(); break; } make_display(); forward(1, 0, 0); } ignore_eoi = 0; ch_set_eof(); /* * This gets us back in "F mode" after processing * a non-abort signal (e.g. window-change). */ if (sigs && !ABORT_SIGS()) return (until_hilite ? A_F_UNTIL_HILITE : A_F_FOREVER); return (A_NOACTION); }
/* * Analogous to forw_line(), but deals with "raw lines": * lines which are not split for screen width. * {{ This is supposed to be more efficient than forw_line(). }} */ off_t forw_raw_line(off_t curr_pos, char **linep, int *line_lenp) { int n; int c; off_t new_pos; if (curr_pos == -1 || ch_seek(curr_pos) || (c = ch_forw_get()) == EOI) return (-1); n = 0; for (;;) { if (c == '\n' || c == EOI || ABORT_SIGS()) { new_pos = ch_tell(); break; } if (n >= size_linebuf-1) { if (expand_linebuf()) { /* * Overflowed the input buffer. * Pretend the line ended here. */ new_pos = ch_tell() - 1; break; } } linebuf[n++] = (char)c; c = ch_forw_get(); } linebuf[n] = '\0'; if (linep != NULL) *linep = linebuf; if (line_lenp != NULL) *line_lenp = n; return (new_pos); }