summaryrefslogtreecommitdiffstats
path: root/share/doc/papers/px/pxin3.n
diff options
context:
space:
mode:
Diffstat (limited to 'share/doc/papers/px/pxin3.n')
-rw-r--r--share/doc/papers/px/pxin3.n597
1 files changed, 0 insertions, 597 deletions
diff --git a/share/doc/papers/px/pxin3.n b/share/doc/papers/px/pxin3.n
deleted file mode 100644
index d0f78d5..0000000
--- a/share/doc/papers/px/pxin3.n
+++ /dev/null
@@ -1,597 +0,0 @@
-.\" Copyright (c) 1979 The Regents of the University of California.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 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
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)pxin3.n 5.2 (Berkeley) 4/17/91
-.\" $FreeBSD$
-.\"
-.ta 8n 16n 24n
-.nr H1 2
-.if n .ND
-.NH
-Input/output
-.NH 2
-The files structure
-.PP
-Each file in the Pascal environment is represented by a pointer
-to a
-.I files
-structure in the heap.
-At the location addressed by the pointer is the element
-in the file's window variable.
-Behind this window variable is information about the file,
-at the following offsets:
-.so table3.1.n
-.PP
-Here
-.SM FBUF
-is a pointer to the system FILE block for the file.
-The standard system I/O library is
-used that provides block buffered input/output,
-with 1024 characters normally transferred at each read or write.
-.PP
-The files in the
-Pascal environment,
-are all linked together on a single file chain through the
-.SM FCHAIN
-links.
-For each file the
-.SM FLEV
-pointer gives its associated file variable.
-These are used to free files at block exit as described in section 3.3
-below.
-.PP
-The
-FNAME
-and
-PFNAME
-give the associated
-file name for the file and the name to be used when printing
-error diagnostics respectively.
-Although these names are usually the same,
-.I input
-and
-.I output
-usually have no associated
-file name so the distinction is necessary.
-.PP
-The
-FUNIT
-word contains
-a set of flags.
-whose representations are:
-.TS
-center;
-l l l.
-EOF 0x0100 At end-of-file
-EOLN 0x0200 At end-of-line (text files only)
-SYNC 0x0400 File window is out of sync
-TEMP 0x0800 File is temporary
-FREAD 0x1000 File is open for reading
-FWRITE 0x2000 File is open for writing
-FTEXT 0x4000 File is a text file; process EOLN
-FDEF 0x8000 File structure created, but file not opened
-.TE
-.PP
-The
-EOF
-and
-EOLN
-bits here reflect the associated built-in function values.
-TEMP
-specifies that the file has a generated temporary name and that
-it should therefore be removed when its block exits.
-FREAD
-and
-FWRITE
-specify that
-.I reset
-and
-.I rewrite
-respectively have been done on the file so that
-input or output operations can be done.
-FTEXT
-specifies the file is a text file so that
-EOLN
-processing should be done,
-with newline characters turned into blanks, etc.
-.PP
-The
-SYNC
-bit,
-when true,
-specifies that there is no usable image in the file buffer window.
-As discussed in the
-.I "Berkeley Pascal User's Manual,"
-the interactive environment necessitates having
-``input^'' undefined at the beginning
-of execution so that a program may print a prompt
-before the user is required to type input.
-The
-SYNC
-bit implements this.
-When it is set,
-it specifies that the element in the window
-must be updated before it can be used.
-This is never done until necessary.
-.NH 2
-Initialization of files
-.PP
-All the variables in the Pascal runtime environment are cleared to zero on
-block entry.
-This is necessary for simple processing of files.
-If a file is unused, its pointer will be
-.B nil.
-All references to an inactive file are thus references through a
-.B nil
-pointer.
-If the Pascal system did not clear storage to zero before execution
-it would not be possible to detect inactive files in this simple way;
-it would probably be necessary to generate (possibly complicated)
-code to initialize
-each file on block entry.
-.PP
-When a file is first mentioned in a
-.I reset
-or
-.I rewrite
-call,
-a buffer of the form described above is associated with it,
-and the necessary information about the file is placed in this
-buffer.
-The file is also linked into the active file chain.
-This chain is kept sorted by block mark address, the
-FLEV
-entries.
-.NH 2
-Block exit
-.PP
-When block exit occurs the interpreter must free the files that are in
-use in the block
-and their associated buffers.
-This is simple and efficient because the files in the active file chain are
-sorted by increasing block mark address.
-This means that the files for the current block will be at the front
-of the chain.
-For each file that is no longer accessible
-the interpreter first flushes the files buffer
-if it is an output file.
-The interpreter then returns the file buffer and the files structure and window
-to the free space in the heap and removes the file from the active file chain.
-.NH 2
-Flushing
-.PP
-Flushing all the file buffers at abnormal termination,
-or on a call to the procedure
-.I flush
-or
-.I message
-is done by flushing
-each file on the file chain that has the
-FWRITE
-bit set in its flags word.
-.NH 2
-The active file
-.PP
-For input-output,
-.I px
-maintains a notion of an active file.
-Each operation that references a file makes the file
-it will be using the active file and then does its operation.
-A subtle point here is that one may do a procedure call to
-.I write
-that involves a call to a function that references another file,
-thereby destroying the active file set up before the
-.I write.
-Thus the active file is saved at block entry
-in the block mark and restored at block exit.\*(Dg
-.FS
-\*(dg\ It would probably be better to dispense with the notion of
-active file and use another mechanism that did not involve extra
-overhead on each procedure and function call.
-.FE
-.NH 2
-File operations
-.PP
-Files in Pascal can be used in two distinct ways:
-as the object of
-.I read,
-.I write,
-.I get,
-and
-.I put
-calls, or indirectly as though they were pointers.
-The second use as pointers must be careful
-not to destroy the active file in a reference such as
-.LS
-write(output, input\(ua)
-.LE
-or the system would incorrectly write on the input device.
-.PP
-The fundamental operator related to the use of a file is
-.SM FNIL.
-This takes the file variable, as a pointer,
-insures that the pointer is not
-.B nil,
-and also that a usable image is in the file window,
-by forcing the
-.SM SYNC
-bit to be cleared.
-.PP
-A simple example that demonstrates the use of the file operators
-is given by
-.LS
-writeln(f)
-.LE
-that produces
-.DS
-.mD
-.TS
-lp-2w(8) l.
-RV:\fIl f\fP
-UNIT
-WRITLN
-.TE
-.DE
-.NH 2
-Read operations
-.SH
-GET
-.IP
-Advance the active file to the next input element.
-.SH
-FNIL
-.IP
-A file pointer is on the stack. Insure that the associated file is active
-and that the file is synced so that there is input available in the window.
-.SH
-READ*
-.IP
-If the file is a text file, read a block of text
-and convert it to the internal type of the specified
-operand. If the file is not a text file then
-do an unformatted read of the next record.
-The procedure
-.SM READLN
-reads upto and including the next end of line character.
-.SH
-READE A
-.IP
-The operator
-.SM READE
-reads a string name of an enumerated type and converts it
-to its internal value.
-.SM READE
-takes a pointer to a data structure as shown in figure 3.2.
-.so fig3.2.n
-See the description of
-.SM NAM
-in the next section for an example.
-.NH 2
-Write operations
-.SH
-PUT
-.IP
-Output the element in the active file window.
-.SH
-WRITEF s
-.IP
-The argument(s) on the stack are output
-by the
-.I fprintf
-standard
-.SM I/O
-library routine.
-The sub-opcode
-.I s
-specifies the number
-of longword arguments on the stack.
-.SH
-WRITEC
-.IP
-The character on the top of the stack is output
-without formatting. Formatted characters must be output with
-.SM WRITEF .
-.SH
-WRITES
-.IP
-The string specified by the pointer on the top of the stack is output
-by the
-.I fwrite
-standard
-.SM I/O
-library routine.
-All characters including nulls are printed.
-.SH
-WRITLN
-.IP
-A linefeed is output to the active file.
-The line-count for the file is
-incremented and checked against the line limit.
-.SH
-PAGE
-.IP
-A formfeed is output to the active file.
-.SH
-NAM A
-.IP
-The value on the top of the stack is converted to a pointer
-to an enumerated type string name.
-The address
-.SM A
-points to an enumerated type structure identical
-to that used by
-.SM READE .
-An error is raised if the value is out of range.
-The form of this structure for the predefined type
-.B boolean
-is shown in figure 3.3.
-.so fig3.3.n
-The code for
-.SM NAM
-is
-.DS
-.mD
-_NAM:
- \fBincl\fR lc
- \fBaddl3\fR (lc)+,ap,r6 #r6 points to scalar name list
- \fBmovl\fR (sp)+,r3 #r3 has data value
- \fBcmpw\fR r3,(r6)+ #check value out of bounds
- \fBbgequ\fR enamrng
- \fBmovzwl\fR (r6)[r3],r4 #r4 has string index
- \fBpushab\fR (r6)[r4] #push string pointer
- \fBjmp\fR (loop)
-enamrng:
- \fBmovw\fR $ENAMRNG,_perrno
- \fBjbr\fR error
-.DE
-The address of the table is calculated by adding the base address
-of the interpreter code,
-.I ap
-to the offset pointed to by
-.I lc .
-The first word of the table gives the number of records and
-provides a range check of the data to be output.
-The pointer is then calculated as
-.DS
-.mD
-tblbase = ap + A;
-size = *tblbase++;
-return(tblbase + tblbase[value]);
-.DE
-.SH
-MAX s,w
-.IP
-The sub-opcode
-.I s
-is subtracted from the integer on the top of the stack.
-The maximum of the result and the second argument,
-.I w ,
-replaces the value on the top of the stack.
-This function verifies that variable specified
-width arguments are non-negative, and meet certain minimum width
-requirements.
-.SH
-MIN s
-.IP
-The minimum of the value on the top of the stack
-and the sub-opcode replaces the value on the top
-of the stack.
-.sp 1
-.LP
-The uses of files and the file operations are summarized
-in an example which outputs a real variable (r) with a variable
-width field (i).
-.LS
-writeln('r =',r:i,' ',true);
-.LE
-that generates the code
-.DS
-.mD
-.TS
-lp-2w(8) l.
-UNITOUT
-FILE
-CON14:1
-CON14:3
-LVCON:4 "r ="
-WRITES
-RV8\fI:l r\fP
-RV4\fI:l i\fP
-MAX:8 1
-RV4\fI:l i\fP
-MAX:1 1
-LVCON:8 " %*.*E"
-FILE
-WRITEF:6
-CONC4 \' \'
-WRITEC
-CON14:1
-NAM \fIbool\fP
-LVCON:4 "%s"
-FILE
-WRITEF:3
-WRITLN
-.TE
-.DE
-.PP
-Here the operator
-.SM UNITOUT
-is an abbreviated form of the operator
-.SM UNIT
-that is used when the file to be made active is
-.I output .
-A file descriptor, record count, string size, and a pointer
-to the constant string ``r ='' are pushed
-and then output by
-.SM WRITES .
-Next the value of
-.I r
-is pushed on the stack
-and the precision size is calculated by taking
-seven less than the width, but not less than one.
-This is followed by the width that is reduced by
-one to leave space for the required leading blank.
-If the width is too narrow, it
-is expanded by
-.I fprintf .
-A pointer to the format string is pushed followed
-by a file descriptor and the operator
-.SM WRITEF
-that prints out
-.I r .
-The value of six on
-.SM WRITEF
-comes from two longs for
-.I r
-and a long each for the precision, width, format string pointer,
-and file descriptor.
-The operator
-.SM CONC4
-pushes the
-.I blank
-character onto a long on the stack that is then printed out by
-.SM WRITEC .
-The internal representation for
-.I true
-is pushed as a long onto the stack and is
-then replaced by a pointer to the string ``true''
-by the operator
-.SM NAM
-using the table
-.I bool
-for conversion.
-This string is output by the operator
-.SM WRITEF
-using the format string ``%s''.
-Finally the operator
-.SM WRITLN
-appends a newline to the file.
-.NH 2
-File activation and status operations
-.SH
-UNIT*
-.IP
-The file pointed to by the file pointer on the top
-of the stack is converted to be the active file.
-The opcodes
-.SM UNITINP
-and
-.SM UNITOUT
-imply standard input and output respectively
-instead of explicitly pushing their file pointers.
-.SH
-FILE
-.IP
-The standard
-.SM I/O
-library file descriptor associated with the active file
-is pushed onto the stack.
-.SH
-EOF
-.IP
-The file pointed to by the file pointer on the top
-of the stack is checked for end of file. A boolean
-is returned with
-.I true
-indicating the end of file condition.
-.SH
-EOLN
-.IP
-The file pointed to by the file pointer on the top
-of the stack is checked for end of line. A boolean
-is returned with
-.I true
-indicating the end of line condition.
-Note that only text files can check for end of line.
-.NH 2
-File housekeeping operations
-.SH
-DEFNAME
-.IP
-Four data items are passed on the stack;
-the size of the data type associated with the file,
-the maximum size of the file name,
-a pointer to the file name,
-and a pointer to the file variable.
-A file record is created with the specified window size
-and the file variable set to point to it.
-The file is marked as defined but not opened.
-This allows
-.B program
-statement association of file names with file variables
-before their use by a
-.SM RESET
-or a
-.SM REWRITE .
-.SH
-BUFF s
-.IP
-The sub-opcode is placed in the external variable
-.I _bufopt
-to specify the amount of I/O buffering that is desired.
-The current options are:
-.DS
-0 \- character at a time buffering
-1 \- line at a time buffering
-2 \- block buffering
-.DE
-The default value is 1.
-.SH
-RESET
-.br
-REWRITE
-.IP
-Four data items are passed on the stack;
-the size of the data type associated with the file,
-the maximum size of the name (possibly zero),
-a pointer to the file name (possibly null),
-and a pointer to the file variable.
-If the file has never existed it is created as in
-.SM DEFNAME .
-If no file name is specified and no previous name exists
-(for example one created by
-.SM DEFNAME
-) then a system temporary name is created.
-.SM RESET
-then opens the file for input, while
-.SM REWRITE
-opens the file for output.
-.sp 1
-.PP
-The three remaining file operations are
-.SM FLUSH
-that flushes the active file,
-.SM REMOVE
-that takes the pointer to a file name and removes the
-specified file, and
-.SM MESSAGE
-that flushes all the output files and sets the
-standard error file to be the active file.
OpenPOWER on IntegriCloud