(NUMBER) "############## # JOBOUTPUT # ##############" CONST PAGELENGTH = 512; TYPE PAGE = ARRAY (.1..PAGELENGTH.) OF CHAR; CONST LINELENGTH = 132; TYPE LINE = ARRAY (.1..LINELENGTH.) OF CHAR; FUNCTION PREFIXLENGTH: INTEGER; PROCEDURE READPREFIX(PAGENO: INTEGER; VAR BLOCK: PAGE); PROCEDURE READSTREAM(VAR BLOCK: PAGE); PROCEDURE WRITELINE(TEXT: LINE); PROGRAM JOBOUTPUT; CONST NL = '(:10:)'; FF = '(:12:)'; CR = '(:13:)'; EM = '(:25:)'; FIRSTCHAR = 24; LASTCHAR = 109; FIRSTLINE = 2; LASTLINE = 61; VAR PREFIXPAGES: INTEGER; BLOCK: PAGE; BLOCKLENGTH, INITLENGTH: INTEGER; IMAGE: LINE; CONTROLCHAR: SET OF CHAR; PROCEDURE INITPREFIX; VAR FOUND: BOOLEAN; C: CHAR; PAGENO, CHARNO, CHARS: INTEGER; BEGIN CHARS:= 0; FOR PAGENO:= 1 TO PREFIXLENGTH DO BEGIN READPREFIX(PAGENO, BLOCK); CHARNO:= 0; REPEAT CHARNO:= CHARNO + 1; C:= BLOCK(.CHARNO.); IF C = NL THEN CHARS:= CHARS + 5; UNTIL (CHARNO = PAGELENGTH) OR (C = EM); CHARS:= CHARS + CHARNO; END; PREFIXPAGES:= (CHARS + PAGELENGTH - 1) DIV PAGELENGTH; INITLENGTH:= (CHARS - 1) MOD PAGELENGTH; END; PROCEDURE SKIPPREFIX; VAR PAGENO: INTEGER; BEGIN FOR PAGENO:= 1 TO PREFIXPAGES DO READSTREAM(BLOCK); BLOCKLENGTH:= INITLENGTH; END; PROCEDURE INITLINE; VAR CHARNO: INTEGER; BEGIN FOR CHARNO:= 1 TO FIRSTCHAR - 1 DO IMAGE(.CHARNO.):= ' '; IMAGE(.LASTCHAR + 1.):= NL; CONTROLCHAR:= (.CR, NL, FF, EM.); END; PROCEDURE PRINTCHAR(C: CHAR); BEGIN IMAGE(.FIRSTCHAR.):= C; WRITELINE(IMAGE); END; PROCEDURE PRINTLINE(VAR ENDPAGE, ENDFILE: BOOLEAN); VAR CHARNO: INTEGER; C: CHAR; BEGIN CHARNO:= PRED(FIRSTCHAR); REPEAT IF BLOCKLENGTH = PAGELENGTH THEN BEGIN READSTREAM(BLOCK); BLOCKLENGTH:= 0; END; BLOCKLENGTH:= SUCC(BLOCKLENGTH); C:= BLOCK(.BLOCKLENGTH.); CHARNO:= SUCC(CHARNO); IMAGE(.CHARNO.):= C; UNTIL (C IN CONTROLCHAR) OR (CHARNO = LASTCHAR); IF C = FF THEN BEGIN WRITELINE(IMAGE); ENDPAGE:= TRUE END ELSE IF C = EM THEN BEGIN ENDPAGE:= TRUE; ENDFILE:= TRUE END ELSE WRITELINE(IMAGE); END; PROCEDURE PRINTPAGE(VAR ENDFILE: BOOLEAN); VAR LINENO: INTEGER; ENDPAGE: BOOLEAN; BEGIN ENDPAGE:= FALSE; FOR LINENO:= 1 TO FIRSTLINE - 1 DO PRINTCHAR(NL); LINENO:= FIRSTLINE - 1; REPEAT LINENO:= SUCC(LINENO); PRINTLINE(ENDPAGE, ENDFILE); UNTIL (LINENO = LASTLINE) OR ENDPAGE; PRINTCHAR(FF); END; PROCEDURE PRINTFILE; VAR PAGENO: INTEGER; ENDFILE: BOOLEAN; BEGIN ENDFILE:= FALSE; REPEAT PRINTPAGE(ENDFILE) UNTIL ENDFILE; END; BEGIN INITPREFIX; INITLINE; REPEAT SKIPPREFIX; PRINTFILE; UNTIL FALSE; END.