@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H             LIB042D
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL
~
~
                                                            ISSUE 11~
~V9 -1
~P
~V9 1
~YLIB042D
~S~M~OLIBRARY IMPLEMENTATION DESCRIPTION
~S~M~OSection 4 Version 2D
~S~OSection 4.2D Document Section Management
~S~O1. General Description
~BThis module provides facilities for managing the sections of an
input/output document.  In addition to procedures for getting the
next section, it also provides facilities for setting the stream
to the start of a section and for accessing the header of a document.
~S~O2. Interfaces
~
Library procedures:~
   BREAK.INPUT(STREAM)~
   BREAK.OUTPUT(STREAM)~
   PROMPT(MESSAGE)~
   SELECT.HEADER()~
   SELECT.DOC()~
   OUT.HDR(MESSAGE)~
   WIND()~
   PROMPT.CH(CHAR)~
   END.POS()~
~S~O3. Implementation
~S~O3.1 Outline of Operation
~BThe operation of this module is largely controlled by the type
of document associated with a stream, with appropriate actions to
get the next input/output section according to whether the document
is a file, message etc.
~Y
~V9 -1
~P
~D15
~HFLOWCHARTS
~
~
~H                LIB042D
~V9 -1
~F
@TITLE LIB04(2D,11)

@COL 1S-2R

@FLOW 1-2

@BOX 1.0
DOCUMENT SECTION MANAGEMENT
@BOX 2.0
PROCEDURES IN SUB-SECTION
   1 BREAK INPUT
   2 BREAK OUTPUT
   3 PROMPT
   4 SELECT HEADER
   5 SELECT DOC
   6 OUT HDR
   7 WIND
   8 PROMPT CH
   9 END POS
@BOX 1.1
::DOCUMENT SECTION MANAGEMENT
@BOX 2.1
#LIB04.1
#LIB04.2
#LIB04.3
#LIB04.4
#LIB04.5
#LIB04.6
#LIB04.7
#LIB04.8
#LIB04.9
**IN -1
@END


@TITLE LIB04/1(2D,11)

@COL 1S

@BOX 1.0
DOCUMENT SECTION MANAGEMENT PSPECS
@BOX 1.1
LSPEC BREAK.INPUT (INTEGER);
LSPEC BREAK.OUTPUT (INTEGER);
LSPEC PROMPT (ADDR [LOGICAL8]);
LSPEC SELECT.HEADER ();
LSPEC SELECT.DOC ();
LSPEC OUT.HDR (ADDR [LOGICAL8]);
LSPEC WIND ();
LSPEC PROMPT.CH (INTEGER);
LSPEC END.POS ();
**IN -1
@END



@TITLE LIB04.1(2D,11)

@COL 14R-15R-16N
@COL 1S-2R-3T-4R-5R-6T-7R-8T-9T-10R-11N-12R-13F
@COL 17R-18R-19N

@ROW 14-4
@ROW 7-17
@ROW 15-10-18
@ROW 16-11-19

@FLOW 1-2-3NO-4-5-6NO-7-8NO-9NO-10-11-12-13
@FLOW 3YES-14-16-11
@FLOW 6YES-17-19-11
@FLOW 8YES-15-16
@FLOW 9YES-18-19

@BOX 1.0
BREAK INPUT (STREAM)
@BOX 2.0
SET POINTERS FOR
REQUIRED STREAM
@BOX 3.0
IS STREAM UNDEFINED?
@BOX 4.0
SET POINTERS TO SHOW
NO INPUT
@BOX 5.0
SET SECTION NUMBER AND POSITION
FOR NEW SECTION
@BOX 6.0
IS STREAM OF TYPE "STRING"?
@BOX 7.0
RELEASE BUFFER SEGMENT
[LIB07]
@BOX 8.0
IS IT A MESSAGE STREAM?
@BOX 9.0
INPUT FROM CURRENT FILE?
@BOX 10.0
PROCESS FILE INPUT
#LIB04.1.2
@BOX 12.0
RESTORE POINTERS FOR
CURRENTLY SELECTED STREAM
@BOX 13.0
END
@BOX 14.0
ENTER TRAP (5, 4)
STREAM UNDEFINED
@BOX 15.0
PROCESS MESSAGE INPUT
#LIB04.1.1
@BOX 17.0
ENTER TRAP (5, 5)
WRONG TYPE OF STREAM
@BOX 18.0
PROCESS CURRENT FILE INPUT
#LIB04.1.3
@BOX 1.1
PROC BREAK.INPUT (STREAM);
INTEGER CURRENT.STREAM, AREA;
@BOX 2.1
CURRENT.IN => CURRENT.STREAM;
IF STREAM >= 0 THEN
   SELECT.INPUT (STREAM);
FI
@BOX 3.1
IF I.STREAM [CURRENT.IN] => AREA = NO.OF.STREAMS
@BOX 4.1
SELECT INPUT^;
NIL => BYTE.PTR;
0 => PTR => PTR.END;
-1 => BLOCK;
IF BUF >= 0 THEN
   NO.OF.STREAMS => BUFFER [BUF];
   -1 => BUF;
FI
@BOX 5.1
1 +> SECTION.NO;
@BOX 6.1
IF MODE & STRING.IO /= 0
@BOX 7.1
LIB07.RELEASE.BUFFER.SEG (SEG);
@BOX 8.1
IF DOC.TYPE = 6
@BOX 9.1
IF DOC.TYPE = 0
@BOX 10.1
::PROCESS FILE INPUT
#LIB04.1.2
@BOX 12.1
SELECT.INPUT (CURRENT.STREAM);
@BOX 13.1
END
@BOX 14.1
ENTER.TRAP (5, 4);
@BOX 15.1
::PROCESS MESSAGE INPUT
#LIB04.1.1
@BOX 17.1
ENTER.TRAP (5, 5);
@BOX 18.1
::PROCESS CURRENT FILE INPUT
#LIB04.1.3
@END




@TITLE LIB04.1.1(2D,11)

@COL 1S-3T-4T-5T-9R-10T-6R-7F
@COL 12R

@ROW 4-12

@FLOW 1-3FAIL-4NO-5ONLINE-9-10NO MESSAGE-6-7
@FLOW 3OK-12-7
@FLOW 4YES-7
@FLOW 5BATCH-6
@FLOW 10MESSAGE-3

@BOX 1.0
PROCESS MESSAGE INPUT
@BOX 3.0
READ A MESSAGE FROM
THE CORRESPONDING
INPUT CHANNEL
@BOX 4.0
FIRST SECTION OF
INPUT?
@BOX 5.0
ONLINE STREAM?
@BOX 6.0
ENTER TRAP (6, 1)
INPUT ENDED
@BOX 7.0
END
@BOX 9.0
PRINT PROMPT MESSAGE
@BOX 10.0
WAIT FOR MESSAGE
@BOX 12.0
SET UP POINTER TO MESSAGE
@BOX 1.1
PROCESS.MESSAGE.INPUT: BEGIN
INTEGER OUT.STREAM, CHAN;
@BOX 3.1
READ.MESSAGE (^MESSAGE, ^PROC.INFO, IN.CHANNEL, -1);
IF PW0 = 0
@BOX 4.1
0 => PW0;
IF SECTION.NO = 0
@BOX 5.1
IF MODE & ONLINE = 0
@BOX 6.1
ENTER.TRAP (6, 1);
@BOX 7.1
END
@BOX 9.1
IF SIZE (PROMPT.MESSAGE) > 0 THEN
   CURRENT.OUT => OUT.STREAM;
   SELECT.OUTPUT (0);
   IF PROMPT.CHAR /= 0 THEN
      OUT.CH (PROMPT.CHAR);
   FI
   CAPTION (PROMPT.MESSAGE);
   BREAK.OUTPUT (0);
   SELECT.OUTPUT (OUT.STREAM);
FI
@BOX 10.1
1 <<- IN.CHANNEL => CHAN;
WAIT (CHAN, WAIT.TIME);
IF CHAN & PW1 /= 0
@BOX 12.1
IF PW1 => SEG = 0
   OR MODE & HEADER.MODE /= 0 THEN
   SELECT.HEADER ();
ELSE
   SELECT.DOC ();
FI
@END


@TITLE LIB04.1.2(2D,11)
@COL 1S-2T-11R-5T-10R-3N-8F
@COL 9R-7R-4N

@ROW 11-9
@ROW 10-7

@FLOW 1-2FIRST-11-5OK-10-3-8
@FLOW 2-9-4-3
@FLOW 5FAIL-7-4

@BOX 1.0
PROCESS FILE INPUT
@BOX 2.0
FIRST SECTION OF INPUT?
@BOX 5.0
OPEN FILE
@BOX 7.0
ENTER TRAP (5, 7)
UNABLE TO OPEN FILE
@BOX 8.0
END
@BOX 9.0
ENTER TRAP (6, 1)
INPUT ENDED
@BOX 10.0
SELECT DOC
@BOX 11.0
DETERMINE ACCESS
RIGHTS REQUIRED
@BOX 1.1
PROCESS.FILE.INPUT: BEGIN
LOGICAL ACCESS;
@BOX 2.1
IF SECTION.NO /= 0
@BOX 5.1
OPEN.FILE (IO.FILE, NAME1, -1, ACCESS);
IF PW0 /= 0
@BOX 7.1
ENTER.TRAP (5, 7);
@BOX 8.1
END
@BOX 9.1
ENTER.TRAP (6, 1);
@BOX 10.1
PW1 => SEG;
SELECT.DOC ();
@BOX 11.1
MODE & EXCLUSIVE ! %C => ACCESS;
IF MODE & DIRECT.ACCESS /= 0 THEN
   2 !> ACCESS;
FI
IF NAME1 = 0 THEN
   %10 !> ACCESS;
FI
@END



@TITLE LIB04.1.3(2D,11)

@COL 1S-2T-3R-4R-5F
@COL 6R

@ROW 3-6

@FLOW 1-2NO-3-4-5
@FLOW 2YES-6-5

@BOX 1.0
PROCESS CURRENT FILE INPUT
@BOX 2.0
HAS CURRENT FILE
ALREADY BEEN READ?
@BOX 3.0
ASSIGN CURRENT FILE TO
INPUT STREAM
@BOX 4.0
SELECT DOC
@BOX 5.0
END
@BOX 6.0
ENTER TRAP (6, 1)
INPUT ENDED
@BOX 1.1
PROCESS.CURRENT.FILE.INPUT: BEGIN
@BOX 2.1
IF SECTION.NO /= 0
@BOX 3.1
LIB07.GET.CURRENT.FILE () => SEG;
@BOX 4.1
SELECT.DOC ();
@BOX 5.1
END
@BOX 6.1
ENTER.TRAP (6, 1);
@END


@TITLE LIB04.2(2D,11)

@COL 1S-2R-3T-4T-5R-6R-7T-8T-9R-10T-11R-12R-13F
@COL 14R

@ROW 5-14

@FLOW 1-2-3NO-4NO-5-6-7NO-8NO-9-10NO-11-12-13
@FLOW 3YES-12
@FLOW 4YES-14-12
@FLOW 7YES-12
@FLOW 8YES-10YES-12

@BOX 1.0
BREAK OUTPUT (STREAM)
@BOX 2.0
SET POINTERS FOR
REQUIRED STREAM
@BOX 3.0
IS STREAM UNDEFINED?
@BOX 4.0
SECTION LIMIT EXCEEDED?
@BOX 5.0
SET POINTERS TO SHOW
NO OUTPUT
@BOX 6.0
SET SECTION NUMBER AND POSITION
FOR NEW SECTION
@BOX 7.0
IS STREAM OF TYPE "STRING"?
@BOX 8.0
START OF FIRST SECTION?
@BOX 9.0
DISPATCH DOCUMENT
#LIB04.2.1
@BOX 10.0
IS IT LAST SECTION?
@BOX 11.0
GENERATE NEXT SECTION
#LIB04.2.2
@BOX 12.0
RESTORE POINTERS FOR
CURRENTLY SELECTED STREAM
@BOX 13.0
END
@BOX 14.0
ENTER TRAP (6, 3)
NO OF SECTIONS EXCEEDED
@BOX 1.1
PROC BREAK.OUTPUT (STREAM);
INTEGER CURRENT.STREAM, AREA;
@BOX 2.1
CURRENT.OUT => CURRENT.STREAM;
IF STREAM >= 0 THEN
   SELECT.OUTPUT (STREAM);
FI
@BOX 3.1
IF O.STREAM [CURRENT.OUT] => AREA = NO.OF.STREAMS
@BOX 4.1
SELECT OUTPUT^;
IF SECTION.NO > 0 AND
   DOC.TYPE < 2
@BOX 5.1
NIL => BYTE.PTR;
PTR => PTR.END;
@BOX 6.1
1 +> SECTION.NO;
@BOX 7.1
IF MODE & STRING.IO /= 0
@BOX 8.1
IF SECTION.NO = 0
@BOX 9.1
::DISPATCH DOCUMENT
#LIB04.2.1
@BOX 10.1
IF SECTION.NO /= 0 AND
   DOC.TYPE < 2
@BOX 11.1
::GENERATE NEXT SECTION
#LIB04.2.2
@BOX 12.1
SELECT.OUTPUT (CURRENT.STREAM);
@BOX 13.1
END
@BOX 14.1
RELEASE.STREAM (CURRENT.OUT, ^O.STREAM);
ENTER.TRAP (6, 3);
@END


@TITLE LIB04.2.1(2D,11)

@COL 1S-3R-4R-19R-2T-7T-8T-9R-24T-12R-13N-14F
@COL 18N-16R-22N-20R-21R-17R-23N

@ROW 7-18
@ROW 8-22
@ROW 12-17
@ROW 13-23

@FLOW 1-3-4-19-2NO-7NO-8FILE-9-24NO-12-13-14
@FLOW 2YES-12
@FLOW 7YES-18-16-23-13
@FLOW 8MESSAGE-22-20-21-24
@FLOW 24YES-17-23

@BOX 1.0
DISPATCH DOCUMENT
@BOX 2.0
OUTPUT TO BE DISCARDED?
@BOX 3.0
COMPLETE LAST RECORD
IF NECESSARY
@BOX 4.0
WRITE FINAL RECORD MARKER
IF AT END OF DOCUMENT
@BOX 7.0
CURRENT FILE STREAM?
@BOX 8.0
MESSAGE STREAM?
@BOX 9.0
FILE THE BUFFER
@BOX 12.0
RELEASE THE BUFFER SEGMENT
@BOX 14.0
END
@BOX 15.0
RELEASE THE BUFFER SEGMENT
@BOX 16.0
MAKE CURRENT FILE
[LIB07]
@BOX 17.0
ENTER TRAP (6, 5)
UNABLE TO DISPATCH OUTPUT
@BOX 19.0
CHANGE SIZE OF SEGMENT
@BOX 20.0
FIND DESTINATION IF
REPLY STREAM
@BOX 21.0
SEND MESSAGE
@BOX 24.0
FAILED TO DISPATCH DOCUMENT?
@BOX 1.1
DISPATCH.DOCUMENT: BEGIN
INTEGER32 FILE.SIZE;
ADDR [INTEGER] DEST;
@BOX 2.1
IF REC.START = 0 OR DOC.TYPE = 5
@BOX 3.1
IF PTR.START + PTR > REC.START + 4 THEN
   OUT.REC ();
FI
@BOX 4.1
IF REC.START >= SECTION.SIZE THEN
   SET.BPOS (OUTPUT, REC.START);
   OUT.BIN (%FFFFFFFF, 4);
   REC.START + 4 => SECTION.SIZE;
FI
@BOX 7.1
IF DOC.TYPE = 0
@BOX 8.1
IF DOC.TYPE /= 1
@BOX 9.1
IF DIRECT.ACCESS ! %40 & MODE = DIRECT.ACCESS THEN
   SECURE.SEGMENT (SEG);
ELSE
   FILE (IO.FILE, NAME1, SEG);
FI
@BOX 12.1
IF SEG /= 0 THEN
   RELEASE.SEGMENT (SEG);
   0 => SEG => BLOCK => PW0;
FI
@BOX 14.1
END
@BOX 15.1
RELEASE.SEGMENT (SEG);
0 => SEG;
@BOX 16.1
LIB07.MAKE.CURRENT.FILE (SEG);
0 => SEG => BLOCK;
@BOX 17.1
RELEASE.STREAM (CURRENT.OUT, ^O.STREAM);
ENTER.TRAP (6, 5);
@BOX 19.1
IF BUF >= 0 THEN
   COPY.BLOCK (IO.CONTROL.SEG, BUF + IO.BUFFER.BLOCK, SEG, BLOCK);
   NO.OF.STREAMS => BUFFER [BUF];
   -1 => BUF;
FI
IF SEG /= 0 THEN
   SECTION.SIZE + SYS14.PAGE.SIZE - 1 ->> SYS14.PAGE.SHIFT => FILE.SIZE;
   IF SEG.STATUS & %40 /= 0 THEN
      FILE.SIZE => SECTION.SIZE;
   FI
   CHANGE.SIZE (SEG, SECTION.SIZE);
FI
@BOX 20.1
IF DOC.TYPE = 3 THEN
   ^PROC.INFO OF IO.CONTROL [I.STREAM [REPLY.TO.STREAM]] => DEST;
ELSE
   ^PROC.INFO => DEST;
FI
@BOX 21.1
SEND.MESSAGE (HEADER, DEST, OUT.CHANNEL, SECTION.NO, SEG, %1E);
@BOX 24.1
IF PW0 /= 0
@END




@TITLE LIB04.2.2(2D,11)

@COL 1S-4T-5T-6T-7T-8R-10R-11T-12R-13R-20T-14R-2N-16F
@COL 17R-19R-3N

@ROW 8-17
@ROW 14-19
@ROW 2-3

@FLOW 1-4MESSAGE-5FIRST-6NO-7-8-10-11NO-12-13-20OK-14-2-16
@FLOW 20FAIL-19-3-2
@FLOW 4OTHER-13
@FLOW 5-10
@FLOW 6YES-10
@FLOW 7FAIL-17-3
@FLOW 11YES-2

@BOX 1.0
GENERATE NEXT SECTION
@BOX 4.0
MESSAGE OUTPUT?
@BOX 5.0
FIRST SECTION OF MESSAGE?
@BOX 6.0
IS OUTPUT A REPLY
TO AN INPUT STREAM?
@BOX 7.0
LOOK UP PROCESS
@BOX 8.0
NOTE DESTINATION INFORMATION
AND SET REPLY CHANNEL
@BOX 10.0
SET POINTERS TO SHORT MESSAGE
@BOX 11.0
IS STREAM UNBUFFERED?
@BOX 12.0
GENERATE HEADER IF
MESSAGE STREAM
@BOX 13.0
CREATE BUFFER
@BOX 14.0
INITIALISE POINTERS FOR
FIRST RECORD
@BOX 16.0
END
@BOX 17.0
ENTER TRAP (6, 6)
DESTINATION PROCESS
DOES NOT EXIST
@BOX 19.0
ENTER TRAP (6, 4)
FAILED TO CREATE BUFFER SEGMENT
@BOX 20.0
CREATE FAILED?
@BOX 1.1
GENERATE.NEXT.SECTION: BEGIN
INTEGER SEG.SIZE;
@BOX 4.1
IF DOC.TYPE /= 2 /= 3
@BOX 5.1
IF SECTION.NO /= 0
@BOX 6.1
MODE ->> 11 & %1F => OUT.CHANNEL;
^MESSAGE => HEADER;
IF DOC.TYPE = 3
@BOX 7.1
LOOK.UP.PROCESS (NAME1, NAME2);
IF PW0 /= 0
@BOX 8.1
PW1 => PROC.INFO [0];
PW2 => PROC.INFO [1];
MODE ->> 16 & %7 ! %8 => PROC.INFO [2];
0 => PROC.INFO [3];
@BOX 10.1
1 => HDR;
4 => PTR.START;
0 => REC.START => PTR;
SIZE (^MESSAGE) - 4 => REC.END - 4 => PTR.END;
MAKE (LOGICAL8, PTR.END, BYTE (^MESSAGE) + 4) => BYTE.PTR;
@BOX 11.1
IF MODE & SHORT.MSSGE /= 0
@BOX 12.1
NAMES ();
OUT.NAME (PWW1);
SPACES (2);
OUT.NAME (PWW3);
SPACES (2);
OUT.TIME ();
SPACES (2);
OUT.DATE ();
CAPTION (%"  STREAM");
OUT.I (CURRENT.OUT, 3);
CAPTION (%"  SECTION");
OUT.I (SECTION.NO, 3);
OUT.CH ("$L");
OUT.BIN (%FFFFFFFF, 4);
PTR => MESSAGE [0];
@BOX 13.1
MAX.SECTION.SIZE + SYS14.PAGE.SIZE - 1 ->> SYS14.PAGE.SHIFT => SEG.SIZE;
IF DOC.TYPE > 1 THEN
   CREATE.X.SEGMENT (SEG.SIZE);
ELSE
   CREATE.FILE.X.SEGMENT (SEG.SIZE, IO.FILE, NAME1);
FI
@BOX 14.1
READ.SEGMENT.STATUS (PW1 => SEG);
PW2 => SEG.STATUS;
0 => BLOCK => HDR;
GET.BUFFER (AREA);
0 => REC.START;
END.POS ();
@BOX 16.1
END
@BOX 17.1
RELEASE.STREAM (CURRENT.OUT, ^O.STREAM);
ENTER.TRAP (6, 6);
@BOX 19.1
ENTER.TRAP (6, 4);
@BOX 20.1
IF PW0 /= 0
@END


@TITLE LIB04.3(2D,11)

@COL 1S-2R-3F

@FLOW 1-2-3

@BOX 1.0
PROMPT (PROMPT MESSAGE)
@BOX 2.0
SAVE POINTER TO
PROMPT MESSAGE
@BOX 3.0
END
@BOX 1.1
PROC PROMPT (PROMPT.MESS);
@BOX 2.1
PROMPT.MESS => PROMPT.MESSAGE OF INPUT^;
@BOX 3.1
END
@END


@TITLE LIB04.4(2D,11)

@COL 1S-2T-4R-5F
@COL 6R

@ROW 4-6

@FLOW 1-2NO-4-5
@FLOW 2YES-6-5

@BOX 1.0
SELECT HEADER ()
@BOX 2.0
IS STREAM UNDEFINED?
@BOX 4.0
INITIALISE POINTERS
@BOX 5.0
END
@BOX 6.0
ENTER TRAP (5, 4)
STREAM UNDEFINED
@BOX 1.1
PROC SELECT.HEADER;
@BOX 2.1
IF I.STREAM [CURRENT.IN] = NO.OF.STREAMS
@BOX 4.1
SELECT INPUT^;
MESSAGE [0] => PTR.END + 4 => REC.END;
4 => PTR.START;
0 => REC.START => PTR;
MAKE (LOGICAL8, PTR.END, BYTE (^MESSAGE) + 4) => BYTE.PTR;
1 => HDR;
@BOX 5.1
END
@BOX 6.1
ENTER.TRAP (5, 4);
@END


@TITLE LIB04.5(2D,11)

@COL 7R
@COL 1S-2T-3T-4R-6F
@COL 8R

@ROW 3-8
@ROW 7-4

@FLOW 1-2NO-3NO-4-6
@FLOW 2YES-8-6
@FLOW 3YES-7-6

@BOX 1.0
SELECT DOC ()
@BOX 2.0
IS STREAM UNDEFINED?
@BOX 3.0
DOCUMENT NOT BUFFERED?
@BOX 4.0
SET POINTERS TO DOCUMENT
@BOX 6.0
END
@BOX 7.0
SELECT HEADER
@BOX 8.0
ENTER TRAP (5, 4)
STREAM UNDEFINED
@BOX 1.1
PROC SELECT.DOC ;
@BOX 2.1
IF I.STREAM [CURRENT.IN] = NO.OF.STREAMS
@BOX 3.1
SELECT INPUT^;
IF SEG = 0
@BOX 4.1
READ.SEGMENT.STATUS (SEG);
IF PW2 => SEG.STATUS & %40 = 0 THEN
   PW1 => MAX.SECTION.SIZE;
ELSE
   PW1 <<- SYS14.PAGE.SHIFT => MAX.SECTION.SIZE;
FI
0 => BLOCK => HDR;
GET.BUFFER (I.STREAM [CURRENT.IN]);
SET.I.REC (0);
@BOX 6.1
END
@BOX 7.1
SELECT.HEADER ();
@BOX 8.1
ENTER.TRAP (5, 4);
@END



@TITLE LIB04.6(2D,11)

@COL 1S-2R-3F

@FLOW 1-2-3

@BOX 1.0
OUT HDR (STRING)
@BOX 2.0
CHANGE HEADER TO STRING
@BOX 3.0
END
@BOX 1.1
PROC OUT.HDR (STRING);
SELECT OUTPUT^;
@BOX 2.1
IF SEG /= 0 THEN
   STRING => HEADER;
FI
@BOX 3.1
END
@END


@TITLE LIB04.7(2D,11)

@COL 1S-2R-3F

@FLOW 1-2-3

@BOX 1.0
WIND
@BOX 2.0
POSITION POINTERS
AT END OF DOCUMENT
@BOX 3.0
END
@BOX 1.1
PROC WIND;
@BOX 2.1
SELECT INPUT^;
IF REC.END - 4 >= REC.START THEN
   WHILE IN.REC () >= 0 DO OD
FI
@BOX 3.1
END
@END

@TITLE LIB04.8(2D,11)

@COL 1S-2R-3F

@FLOW 1-2-3

@BOX 1.0
PROMPT CH (CHAR)
@BOX 2.0
SET PROMPT WARNING CHARACTER
@BOX 3.0
END
@BOX 1.1
PROC PROMPT.CH (CH);
@BOX 2.1
CH => PROMPT.CHAR;
@BOX 3.1
END
@END


@TITLE LIB04.9(2D,11)

@COL 1S-2R-3F

@FLOW 1-2-3

@BOX 1.0
END POS ()
@BOX 2.0
SET SIZE OF OUTPUT DOCUMENT
@BOX 3.0
END
@BOX 1.1
PROC END.POS;
SELECT OUTPUT^;
@BOX 2.1
REC.START + 4 => REC.END => SECTION.SIZE;
SET.BPOS (OUTPUT, REC.START);
OUT.BIN (%FFFFFFFF, 4);
SET.OREC (REC.START);
@BOX 3.1
END
@END







