bufread.icn: Procedures for buffered read and lookahead

link bufread
March 11,1995; Charles A. Shartsis
This file is in the public domain.

Synopsis:

    bufopen(s)      Open a file name s for buffered read and lookahead
    bufread(f)      Read the next line from file f
    bufnext(f, n)   Return the next nth record from file f
                    without changing the next record to be read by
                    bufread
    bufclose(f)     Close file f
____________________________________________________________

These procedures provide a mechanism for looking ahead an
arbitrary number of records in an open file while still
keeping track of the logical current record and end-of-file.
Although similar in intent to the procedures in buffer.icn, these
procedures are used differently.  The procedures bufopen,
bufread, and bufclose were designed to closely mirror the
built-in open, read, and close.

A code segment like

        file := open("name", "r") | stop("open failed")
        while line := read(file) do {
            ...process current line...
        }
        close(file)

can be changed to the following with no difference in behavior:

        file := bufopen("name", "r") | stop("open failed")
        while line := bufread(file) do {
            ...process current line...
        }
        bufclose(file)

However in addition to processing the current line, one may
also process subsequent lines BEFORE they are logically
read:

        file := bufopen("name", "r") | stop("open failed")
        while line := bufread(file) do {
            ...process current line...
            line := bufnext(file,1) # return next line
            ...process next line...
            line := bufnext(file,2) # return 2nd next line
            ...process 2nd next line...
            ...etc...
        }
        bufclose(file)

In the code above, calls to bufnext do not affect the results of
subsequent bufread's.  The bufread procedure always steps through
the input file a line at a time without skipping lines whether or
not bufnext is called.
____________________________________________________________

Here is a more detailed description of the procedures:

bufopen(s)
==========
Produces a file resulting from opening s for reading ("r" option),
but fails if the file cannot be opened.  if s is missing or
the value of s is &null, then standard input is opened and
&input is returned.  Unlike the Icon open function, bufopen()
can and must be called prior to any call to bufread or bufnext
involving standard input.  Unlike named files, only one buffered
standard input may be open at any given time.

Default:
s   &null   (indicates &input should be opened for buffered
            reading)

Errors (from open):
103     s not string

Errors (new):
Attempt to open standard input when currently open


bufread(f)
==========
Produces a string consisting of the next line from f, but fails on
end of file.   Calls to bufnext do not affect the results of
subsequent bufread's.  The procedure bufread always steps
through a file a line at a time without skipping lines.  The
procedure bufread fails when a logical end of file is
reached, i.e., when the physical end of file has
been reached AND the internal buffer is empty.

Default:
f   &input

Errors:
f is not a file
f not opened for buffered reads (includes &input)


bufnext(f, n)
=============
Produces a string consisting of the nth next line from f after
the current line.  It fails when the physical end of file
has been reached.

Default:
f   &input
n   1 (the next line after the current one)

Errors:
f is not a file
f not opened for buffered reads (includes &input)
n not convertible to integer
n not positive


bufclose(f)
===========
Produces f after closing it.  Standard input must
be closed before it can be reopened using bufopen.
If standard input is closed, all lines read using bufnext
are lost when it is reopened.  In general, there is no
practical reason to bufclose and then bufopen standard input.
One may want to bufclose standard input to release its
internal buffer for garbage collection.

Default:
f   &input

Errors (from close):
105     f not file

Source code | Program Library Page | Icon Home Page