(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); "########################### # CARDS(VAR OK: BOOLEAN) # ###########################" "INSERT PREFIX HERE" TYPE TWICE10 = ARRAY (.1..2, 1..10.) OF CHAR; TWICE20 = ARRAY (.1..2, 1..20.) OF CHAR; TWICE40 = ARRAY (.1..2, 1..40.) OF CHAR; SEQ80 = ARRAY (.1..80.) OF CHAR; SEQ52 = ARRAY (.1..52.) OF CHAR; IMAGE = RECORD TEXT: SEQ80; TAIL: SEQ52 END; VAR CARD: IMAGE; FIRST: CHAR; LIMIT: 1..80; EOF: BOOLEAN; PROCEDURE INITIALIZE; BEGIN IDENTIFY('CARDS: (:10:)'); EOF:= FALSE; END; PROCEDURE TERMINATE; BEGIN WITH PARAM(.1.) DO BEGIN TAG:= BOOLTYPE; BOOL:= TRUE END; END; PROCEDURE ELIMINATE10(VAR TEXT: UNIV TWICE10); BEGIN IF TEXT(.2.) = ' ' THEN LIMIT:= LIMIT - 10; END; PROCEDURE ELIMINATE20(VAR TEXT: UNIV TWICE20); BEGIN IF TEXT(.2.) = ' ' THEN BEGIN LIMIT:= LIMIT - 20; ELIMINATE10(TEXT(.1.)); END ELSE ELIMINATE10(TEXT(.2.)); END; PROCEDURE ELIMINATE40(VAR TEXT: UNIV TWICE40); BEGIN IF TEXT(.2.) = ' ' THEN BEGIN LIMIT:= LIMIT - 40; ELIMINATE20(TEXT(.1.)); END ELSE ELIMINATE20(TEXT(.2.)); END; PROCEDURE ELIMINATEBLANKS; BEGIN WITH CARD DO BEGIN FIRST:= TEXT(.1.); TEXT(.1.):= '#'; LIMIT:= 80; ELIMINATE40(TEXT); WHILE TEXT(.LIMIT.) = ' ' DO LIMIT:= PRED(LIMIT); END; END; FUNCTION START: INTEGER; BEGIN WITH CARD DO IF LIMIT < 10 THEN START:= 2 ELSE BEGIN WRITE(TEXT(.2.)); WRITE(TEXT(.3.)); WRITE(TEXT(.4.)); WRITE(TEXT(.5.)); WRITE(TEXT(.6.)); WRITE(TEXT(.7.)); WRITE(TEXT(.8.)); WRITE(TEXT(.9.)); WRITE(TEXT(.10.)); IF LIMIT < 20 THEN START:= 11 ELSE BEGIN WRITE(TEXT(.11.)); WRITE(TEXT(.12.)); WRITE(TEXT(.13.)); WRITE(TEXT(.14.)); WRITE(TEXT(.15.)); WRITE(TEXT(.16.)); WRITE(TEXT(.17.)); WRITE(TEXT(.18.)); WRITE(TEXT(.19.)); WRITE(TEXT(.20.)); IF LIMIT < 30 THEN START:= 21 ELSE BEGIN WRITE(TEXT(.21.)); WRITE(TEXT(.22.)); WRITE(TEXT(.23.)); WRITE(TEXT(.24.)); WRITE(TEXT(.25.)); WRITE(TEXT(.26.)); WRITE(TEXT(.27.)); WRITE(TEXT(.28.)); WRITE(TEXT(.29.)); WRITE(TEXT(.30.)); IF LIMIT < 40 THEN START:= 31 ELSE BEGIN WRITE(TEXT(.31.)); WRITE(TEXT(.32.)); WRITE(TEXT(.33.)); WRITE(TEXT(.34.)); WRITE(TEXT(.35.)); WRITE(TEXT(.36.)); WRITE(TEXT(.37.)); WRITE(TEXT(.38.)); WRITE(TEXT(.39.)); WRITE(TEXT(.40.)); START:= 41; END; END; END; END; END; PROCEDURE WRITECARD; VAR I: INTEGER; BEGIN ELIMINATEBLANKS; IF LIMIT > 1 THEN WITH CARD DO BEGIN WRITE(FIRST); FOR I:= START TO LIMIT DO WRITE(TEXT(.I.)); WRITE(NL); END ELSE IF FIRST = ' ' THEN WRITE(NL) ELSE IF FIRST = '#' THEN BEGIN WRITE(EM); EOF:= TRUE END ELSE BEGIN WRITE(FIRST); WRITE(NL) END; END; BEGIN IF TASK = INPUTTASK THEN BEGIN INITIALIZE; REPEAT READLINE(CARD); WRITECARD; UNTIL EOF; TERMINATE; END; END.