(NUMBER) "PER BRINCH HANSEN INFORMATION SCIENCE CALIFORNIA INSTITUTE OF TECHNOLOGY UTILITY PROGRAMS FOR THE SOLO SYSTEM 18 MAY 1975" "########### # PREFIX # ###########" CONST NL = '(:10:)'; FF = '(:12:)'; CR = '(:13:)'; EM = '(:25:)'; CONST PAGELENGTH = 512; TYPE PAGE = ARRAY (.1..PAGELENGTH.) OF CHAR; CONST LINELENGTH = 132; TYPE LINE = ARRAY (.1..LINELENGTH.) OF CHAR; CONST IDLENGTH = 12; TYPE IDENTIFIER = ARRAY (.1..IDLENGTH.) OF CHAR; TYPE FILE = 1..2; TYPE FILEKIND = (EMPTY, SCRATCH, ASCII, SEQCODE, CONCODE); TYPE FILEATTR = RECORD KIND: FILEKIND; ADDR: INTEGER; PROTECTED: BOOLEAN; NOTUSED: ARRAY (.1..5.) OF INTEGER END; TYPE IODEVICE = (TYPEDEVICE, DISKDEVICE, TAPEDEVICE, PRINTDEVICE, CARDDEVICE); TYPE IOOPERATION = (INPUT, OUTPUT, MOVE, CONTROL); TYPE IOARG = (WRITEEOF, REWIND, UPSPACE, BACKSPACE); TYPE IORESULT = (COMPLETE, INTERVENTION, TRANSMISSION, FAILURE, ENDFILE, ENDMEDIUM, STARTMEDIUM); TYPE IOPARAM = RECORD OPERATION: IOOPERATION; STATUS: IORESULT; ARG: IOARG END; TYPE TASKKIND = (INPUTTASK, JOBTASK, OUTPUTTASK); TYPE ARGTAG = (NILTYPE, BOOLTYPE, INTTYPE, IDTYPE, PTRTYPE); TYPE POINTER = @BOOLEAN; TYPE ARGTYPE = RECORD CASE TAG: ARGTAG OF NILTYPE, BOOLTYPE: (BOOL: BOOLEAN); INTTYPE: (INT: INTEGER); IDTYPE: (ID: IDENTIFIER); PTRTYPE: (PTR: POINTER) END; CONST MAXARG = 10; TYPE ARGLIST = ARRAY (.1..MAXARG.) OF ARGTYPE; TYPE ARGSEQ = (INP, OUT); TYPE PROGRESULT = (TERMINATED, OVERFLOW, POINTERERROR, RANGEERROR, VARIANTERROR, HEAPLIMIT, STACKLIMIT, CODELIMIT, TIMELIMIT, CALLERROR); PROCEDURE READ(VAR C: CHAR); PROCEDURE WRITE(C: CHAR); PROCEDURE OPEN(F: FILE; ID: IDENTIFIER; VAR FOUND: BOOLEAN); PROCEDURE CLOSE(F: FILE); PROCEDURE GET(F: FILE; P: INTEGER; VAR BLOCK: UNIV PAGE); PROCEDURE PUT(F: FILE; P: INTEGER; VAR BLOCK: UNIV PAGE); FUNCTION LENGTH(F: FILE): INTEGER; PROCEDURE MARK(VAR TOP: INTEGER); PROCEDURE RELEASE(TOP: INTEGER); PROCEDURE IDENTIFY(HEADER: LINE); PROCEDURE ACCEPT(VAR C: CHAR); PROCEDURE DISPLAY(C: CHAR); PROCEDURE READPAGE(VAR BLOCK: UNIV PAGE; VAR EOF: BOOLEAN); PROCEDURE WRITEPAGE(BLOCK: UNIV PAGE; EOF: BOOLEAN); PROCEDURE READLINE(VAR TEXT: UNIV LINE); PROCEDURE WRITELINE(TEXT: UNIV LINE); PROCEDURE READARG(S: ARGSEQ; VAR ARG: ARGTYPE); PROCEDURE WRITEARG(S: ARGSEQ; ARG: ARGTYPE); PROCEDURE LOOKUP(ID: IDENTIFIER; VAR ATTR: FILEATTR; VAR FOUND: BOOLEAN); PROCEDURE IOTRANSFER (DEVICE: IODEVICE; VAR PARAM: IOPARAM; VAR BLOCK: UNIV PAGE); PROCEDURE IOMOVE(DEVICE: IODEVICE; VAR PARAM: IOPARAM); FUNCTION TASK: TASKKIND; PROCEDURE RUN(ID: IDENTIFIER; VAR PARAM: ARGLIST; VAR LINE: INTEGER; VAR RESULT: PROGRESULT); PROGRAM P(VAR PARAM: ARGLIST); "############################# # PRINTER(VAR OK: BOOLEAN) # #############################" "INSERT PREFIX HERE" CONST FIRSTCHAR = 24; LASTCHAR = 109; "(< 132)" FIRSTLINE = 2; LASTLINE = 61; FIRSTPAGE = 2; LASTPAGE = 101; AFTERFILE = 0; VAR CONTROLCHAR: SET OF CHAR; C: CHAR; TEXT: LINE; PROCEDURE INITIALIZE; BEGIN IDENTIFY('PRINTER: (:10:)'); END; PROCEDURE TERMINATE; BEGIN WITH PARAM(.1.) DO BEGIN TAG:= BOOLTYPE; BOOL:= TRUE END; END; PROCEDURE SETMARGIN; VAR I: INTEGER; BEGIN FOR I:= 1 TO FIRSTCHAR - 1 DO TEXT(.I.):= ' '; TEXT(.LASTCHAR + 1.):= NL; CONTROLCHAR:= (.CR, NL, FF, EM.); END; PROCEDURE PRINTLINE; VAR ENDLINE: BOOLEAN; CHARNO: INTEGER; BEGIN ENDLINE:= FALSE; CHARNO:= FIRSTCHAR; REPEAT READ(C); TEXT(.CHARNO.):= C; IF C IN CONTROLCHAR THEN BEGIN IF C = EM THEN TEXT(.CHARNO.):= NL; TEXT(.CHARNO + 1.):= ' '; ENDLINE:= TRUE; END ELSE IF CHARNO = LASTCHAR THEN BEGIN C:= NL; ENDLINE:= TRUE END ELSE CHARNO:= SUCC(CHARNO); UNTIL ENDLINE; WRITELINE(TEXT); END; PROCEDURE PRINTNL; BEGIN TEXT(.FIRSTCHAR.):= NL; TEXT(.FIRSTCHAR + 1.):= ' '; WRITELINE(TEXT); END; PROCEDURE PRINTFF; BEGIN TEXT(.FIRSTCHAR.):= FF; TEXT(.FIRSTCHAR + 1.):= ' '; WRITELINE(TEXT); END; PROCEDURE PRINTPAGE; VAR ENDPAGE: BOOLEAN; LINENO: INTEGER; BEGIN ENDPAGE:= FALSE; FOR LINENO:= 1 TO FIRSTLINE - 1 DO PRINTNL; LINENO:= FIRSTLINE; REPEAT PRINTLINE; CASE C OF CR: ; NL: IF LINENO = LASTLINE THEN BEGIN PRINTFF; ENDPAGE:= TRUE; END ELSE LINENO:= LINENO + 1; FF, EM: ENDPAGE:= TRUE END UNTIL ENDPAGE; END; PROCEDURE PRINTFILE; VAR ENDFILE: BOOLEAN; PAGENO: INTEGER; BEGIN SETMARGIN; ENDFILE:= FALSE; FOR PAGENO:= 1 TO FIRSTPAGE - 1 DO PRINTFF; PAGENO:= FIRSTPAGE; REPEAT PRINTPAGE; IF (C = EM) OR (PAGENO = LASTPAGE) THEN ENDFILE:= TRUE ELSE PAGENO:= PAGENO + 1; UNTIL ENDFILE; FOR PAGENO:= PAGENO TO PAGENO + AFTERFILE - 1 DO PRINTFF; END; BEGIN IF TASK = OUTPUTTASK THEN BEGIN INITIALIZE; PRINTFILE; TERMINATE; END; END. ER; VAR BLOCK: UNIV PAGE);