* Copyright (c) 1988 Mark Nudleman
* Copyright (c) 1988 Regents of the University of California.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
static char sccsid
[] = "@(#)input.c 5.4 (Berkeley) 6/1/90";
* High level routines dealing with getting lines of input
* from the file being viewed.
* When we speak of "lines" here, we mean PRINTABLE lines;
* lines processed with respect to the screen width.
* We use the term "raw line" to refer to lines simply
* delimited by newlines; not processed with respect to screen width.
* A "current" position is passed and a "new" position is returned.
* The current position is the position of the first character of
* a line. The new position is the position of the first character
* of the NEXT line. The line obtained is the line starting at curr_pos.
if (curr_pos
== NULL_POSITION
|| ch_seek(curr_pos
))
if (c
== '\n' || c
== EOI
)
* Append the char to the line and get the next char.
* The char won't fit in the line; the line
* is too long to print in the screen width.
if (squeeze
&& *line
== '\0')
* Skip down to the last contiguous blank line
* and pretend it is the one which we are returning.
while ((c
= ch_forw_get()) == '\n')
* A "current" position is passed and a "new" position is returned.
* The current position is the position of the first character of
* a line. The new position is the position of the first character
* of the PREVIOUS line. The line obtained is the one starting at new_pos.
off_t new_pos
, begin_new_pos
;
if (curr_pos
== NULL_POSITION
|| curr_pos
<= (off_t
)0 ||
* Find out if the "current" line was blank.
(void) ch_forw_get(); /* Skip the newline */
c
= ch_forw_get(); /* First char of "current" line */
(void) ch_back_get(); /* Restore our position */
* The "current" line was blank.
* Skip over any preceeding blank lines,
* since we skipped them in forw_line().
while ((c
= ch_back_get()) == '\n')
* Scan backwards until we hit the beginning of the line.
* This is the newline ending the previous line.
* We have hit the beginning of the line.
* 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.
* Now scan forwards from the beginning of this line.
* We keep discarding "printable lines" (based on screen width)
* until we reach the curr_pos.
* {{ This algorithm is pretty inefficient if the lines
* are much longer than the screen width,
* but I don't know of any better way. }}
* Got a full printable line, but we haven't
* reached our curr_pos yet. Discard the line
} while (new_pos
< curr_pos
);