(NUMBER) "############### # JOBSERVICE # ###############" 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 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 PROGRESULT = (TERMINATED, OVERFLOW, POINTERERROR, RANGEERROR, VARIANTERROR, HEAPLIMIT, STACKLIMIT, CODELIMIT, TIMELIMIT, CALLERROR); PROCEDURE READ(VAR C: CHAR); PROCEDURE WRITE(C: CHAR); PROCEDURE WRITEINT(VALUE, LENGTH: INTEGER); PROCEDURE WRITETEXT(TEXT: LINE); PROCEDURE OPEN(FILENO: FILE; ID: IDENTIFIER; VAR FOUND: BOOLEAN); PROCEDURE CLOSE(FILENO: FILE); PROCEDURE GET(FILENO: FILE; PAGENO: INTEGER; VAR BLOCK: PAGE); PROCEDURE PUT(FILENO: INTEGER; PAGENO: INTEGER; BLOCK: PAGE); FUNCTION LENGTH(FILENO: FILE): INTEGER; PROCEDURE RUNPASS(ID: IDENTIFIER; VAR PARAM: ARGLIST; VAR LINENO: INTEGER; VAR RESULT: PROGRESULT); PROCEDURE RUNJOB(VAR LINENO: INTEGER; VAR RESULT: PROGRESULT); PROGRAM JOBSERVICE; CONST TEMP1 = 'TEMP1 '; TEMP2 = 'TEMP2 '; PASS1 = 'SPASS1 '; PASS2 = 'SPASS2 '; PASS3 = 'SPASS3 '; PASS4 = 'SPASS4 '; PASS5 = 'SPASS5 '; PASS6 = 'SPASS6 '; PASS7 = 'SPASS7 '; JOB = 'JOB '; NL = '(:10:)'; EM = '(:25:)'; VAR OK: BOOLEAN; LIST: ARGLIST; PROCEDURE WRITEID(ID: IDENTIFIER); VAR CHARNO: INTEGER; BEGIN FOR CHARNO:= 1 TO IDLENGTH DO IF ID(.CHARNO.) <> ' ' THEN WRITE(ID(.CHARNO.)); END; PROCEDURE WRITERESULT(RESULT: PROGRESULT); BEGIN CASE RESULT OF TERMINATED: WRITETEXT('TERMINATED #'); OVERFLOW: WRITETEXT('OVERFLOW #'); POINTERERROR: WRITETEXT('POINTER ERROR#'); RANGEERROR: WRITETEXT('RANGE ERROR#'); VARIANTERROR: WRITETEXT('VARIANT ERROR#'); HEAPLIMIT: WRITETEXT('HEAP LIMIT #'); STACKLIMIT: WRITETEXT('STACK LIMIT#'); CODELIMIT: WRITETEXT('CODE LIMIT #'); TIMELIMIT: WRITETEXT('TIME LIMIT #'); CALLERROR: WRITETEXT('SYSTEM ERROR #') END; END; PROCEDURE WRITEERROR(ID: IDENTIFIER; LINENO: INTEGER; RESULT: PROGRESULT); BEGIN WRITE(NL); WRITEID(ID); WRITETEXT(': LINE #'); WRITEINT(LINENO, 4); WRITE(' '); WRITERESULT(RESULT); WRITE(NL); OK:= (RESULT = TERMINATED); END; PROCEDURE INITIALIZE; BEGIN OPEN(1, TEMP1, OK); IF OK THEN OPEN(2, TEMP2, OK); WITH LIST(.1.) DO BEGIN TAG:= BOOLTYPE; BOOL:= FALSE END; WITH LIST(.2.) DO BEGIN TAG:= PTRTYPE; PTR:= NIL END; WITH LIST(.3.) DO BEGIN TAG:= INTTYPE; INT:= 0 END; END; PROCEDURE TERMINATE; BEGIN CLOSE(1); CLOSE(2) END; PROCEDURE CALLPASS(ID: IDENTIFIER); VAR LINENO: INTEGER; RESULT: PROGRESULT; BEGIN RUNPASS(ID, LIST, LINENO, RESULT); IF RESULT <> TERMINATED THEN WRITEERROR(ID, LINENO, RESULT) ELSE OK:= LIST(.1.).BOOL; END; PROCEDURE CALLJOB; VAR LINENO: INTEGER; RESULT: PROGRESULT; BEGIN RUNJOB(LINENO, RESULT); IF RESULT <> TERMINATED THEN WRITEERROR(JOB, LINENO, RESULT); END; BEGIN INITIALIZE; IF OK THEN CALLPASS(PASS1); IF OK THEN CALLPASS(PASS2); IF OK THEN CALLPASS(PASS3); IF OK THEN CALLPASS(PASS4); IF OK THEN CALLPASS(PASS5); IF OK THEN CALLPASS(PASS6); IF OK THEN CALLPASS(PASS7); IF OK THEN OPEN(2, JOB, OK); IF OK THEN CALLPASS(PASS7); IF OK THEN CALLJOB; TERMINATE; END. ).BOOL; END; PROCEDURE CALLJOB; VAR LINENO: INTEGER; RESULT: PROGRESULT; BEGIN RUNJOB(LINENO, RESULT); IF RESULT <> TERMINATED THEN WRITEERROR(JOB, LINENO, RESULT); END; BEGIN INITIALIZE; IF OK THEN CALLPASS(PASS1); IF OK THEN CALLPASS(PASS2); IF OK THEN CALLPASS(PASS3); IF OK THEN CALLPASS(PASS4); IF OK THEN CALLPASS(PASS5); IF OK THEN