?HIGHPIN ?HIGHREQUESTERS ?INSPECT,SYMBOLS LITERAL EXACT = 2; LITERAL GENERIC = 1; LITERAL APPROX = 0; LITERAL PREV = %HE000; LITERAL NEXT = %H8000; LITERAL TAL_REC_OFFSET = 2; INT AMT := 0; INT ERR := 0; INT F^NUM := -1; ! file number INT R^NUM := -1; ! receive number INT T^NUM := -1; INT .F^NAME[0:11]:= ["$DATA11 RLACSD TALFILE "]; ! file name INT .R^NAME[0:11]:= ["$RECEIVE",8*[" "]]; ! receive name INT .T^NAME[0:11]:= [" "]; ! terminal name INT ERROR; INT DONE; INT PASS; INT FAIL; INT START; INT(32) TAG := 0D; INT(32) AW^TIME := 1000D; STRUCT TAL^REC^DEF(*) FIELDALIGN (SHARED2); BEGIN INT TAL^CODE; STRUCT TAL^KEY; BEGIN STRUCT KEY^STRING; BEGIN STRING KEY^BYTE; STRUCT KEY^ODD; BEGIN STRING BYTE [1:5]; END; STRUCT KEY^EVEN; BEGIN STRING BYTE [1:6]; END; STRUCT KEY^A6; BEGIN STRING BYTE [1:6]; END; END; END; STRUCT TAL^TEST; BEGIN INT KEY^INT; INT(32) KEY^I32; FIXED(0) KEY^FIX0; FIXED(2) KEY^FIX2; INT I^INT; INT(32) I^I32; FIXED(0) I^FIX0; FIXED(2) I^FIX2; INT O^INT; INT(32) O^I32; FIXED(0) O^FIX0; FIXED(2) O^FIX2; END; STRUCT TAL^RESULTS; BEGIN STRUCT PASSED; BEGIN STRING BYTE [1:20]; END; STRUCT FAILED; BEGIN STRING BYTE [1:20]; END; STRUCT RET^ALPHA; BEGIN STRING BYTE [1:40]; END; STRUCT RET^NUMERIC; BEGIN INT RET^NUM1; INT RET^NUM2; INT RET^NUM3; INT RET^NUM4; INT RET^NUM5; INT RET^NUM6; INT RET^NUM7; END; END; END; STRUCT .TAL^REC(TAL^REC^DEF); STRUCT SQL^TAL^REC; BEGIN INT PRE^KEY; STRING KEY^COL[1:18]; STRING AFT^KEY[1:160]; END; ?PAGE "***** FORWARD DECLARATIONS *****" PROC RCV^IN^ERROR; FORWARD; PROC RCV^OUT^ERROR; FORWARD; PROC KEY^FILE^ERROR; FORWARD; PROC START^2001; FORWARD; PROC START^NEXT^2002; FORWARD; PROC START^PREV^2003; FORWARD; PROC RCV^IN^ERROR; BEGIN TAL^REC.TAL^RESULTS.RET^ALPHA ':=' "RCV-IN ERROR "; END; PROC RCV^OUT^ERROR; BEGIN TAL^REC.TAL^RESULTS.RET^ALPHA ':=' "RCV-OUT ERROR "; END; PROC KEY^FILE^ERROR; BEGIN TAL^REC.TAL^RESULTS.RET^ALPHA ':=' "KEY-FILE ERROR "; END; PROC START^2001; BEGIN CALL KEYPOSITION(F^NUM,TAL^REC.TAL^KEY, , ,EXACT); IF <> THEN BEGIN FAIL := FAIL + 1; END ELSE BEGIN PASS := PASS + 1; START := 1; END; END; PROC START^NEXT^2002; BEGIN CALL KEYPOSITION(F^NUM,TAL^REC.TAL^KEY, , ,NEXT); IF <> THEN BEGIN FAIL := FAIL + 1; END ELSE BEGIN PASS := PASS + 1; START := 2; END; END; PROC START^PREV^2003; BEGIN CALL KEYPOSITION(F^NUM,TAL^REC.TAL^KEY, , ,PREV); IF <> THEN BEGIN FAIL := FAIL + 1; END ELSE BEGIN PASS := PASS + 1; START := 3; END; END; PROC READ^2004; BEGIN IF START = 1 THEN BEGIN CALL READ(F^NUM, TAL^REC, ($LEN( TAL^REC) * $OCCURS( TAL^REC)), AMT); IF <> THEN FAIL := FAIL + 1 ELSE PASS := PASS + 1; END ELSE FAIL := FAIL + 1; END; PROC READ^NEXT^2005; BEGIN IF START = 2 THEN BEGIN CALL READ(F^NUM, TAL^REC, ($LEN( TAL^REC) * $OCCURS( TAL^REC)), AMT); IF <> THEN FAIL := FAIL + 1 ELSE PASS := PASS + 1; END ELSE FAIL := FAIL + 1; END; PROC READ^PREV^2006; BEGIN IF START = 3 THEN BEGIN CALL READ(F^NUM, TAL^REC, ($LEN( TAL^REC) * $OCCURS( TAL^REC)), AMT); IF <> THEN FAIL := FAIL + 1 ELSE PASS := PASS + 1; END ELSE FAIL := FAIL + 1; END; PROC WRITE^2007; BEGIN START := 0; CALL WRITE(F^NUM, TAL^REC, $LEN(TAL^REC), AMT); IF <> THEN FAIL := FAIL + 1 ELSE PASS := PASS + 1; END; PROC UPDATE^2008; BEGIN START := 0; CALL WRITEUPDATE(F^NUM, TAL^REC, $LEN(TAL^REC), AMT); IF <> THEN FAIL := FAIL + 1 ELSE PASS := PASS + 1; END; PROC DEL^2009; BEGIN START := 0; CALL WRITEUPDATE(F^NUM, TAL^REC, 0 , AMT); IF <> THEN FAIL := FAIL + 1 ELSE PASS := PASS + 1; END; PROC MATH^TEST^3000; BEGIN IF TAL^REC.TAL^CODE = 31 THEN BEGIN TAL^REC.TAL^TEST.O^INT := TAL^REC.TAL^TEST.KEY^INT + TAL^REC.TAL^TEST.I^INT; TAL^REC.TAL^TEST.O^I32 := TAL^REC.TAL^TEST.KEY^I32 + TAL^REC.TAL^TEST.I^I32; TAL^REC.TAL^TEST.O^FIX0:= TAL^REC.TAL^TEST.KEY^FIX0 + TAL^REC.TAL^TEST.I^FIX0; TAL^REC.TAL^TEST.O^FIX2:= TAL^REC.TAL^TEST.KEY^FIX2 + TAL^REC.TAL^TEST.I^FIX2; END ELSE IF TAL^REC.TAL^CODE = 32 THEN BEGIN TAL^REC.TAL^TEST.O^INT := TAL^REC.TAL^TEST.KEY^INT - TAL^REC.TAL^TEST.I^INT; TAL^REC.TAL^TEST.O^I32 := TAL^REC.TAL^TEST.KEY^I32 - TAL^REC.TAL^TEST.I^I32; TAL^REC.TAL^TEST.O^FIX0:= TAL^REC.TAL^TEST.KEY^FIX0 - TAL^REC.TAL^TEST.I^FIX0; TAL^REC.TAL^TEST.O^FIX2:= TAL^REC.TAL^TEST.KEY^FIX2 - TAL^REC.TAL^TEST.I^FIX2; END ELSE IF TAL^REC.TAL^CODE = 33 THEN BEGIN TAL^REC.TAL^TEST.O^INT := TAL^REC.TAL^TEST.KEY^INT * TAL^REC.TAL^TEST.I^INT; TAL^REC.TAL^TEST.O^I32 := TAL^REC.TAL^TEST.KEY^I32 * TAL^REC.TAL^TEST.I^I32; TAL^REC.TAL^TEST.O^FIX0:= TAL^REC.TAL^TEST.KEY^FIX0 * TAL^REC.TAL^TEST.I^FIX0; TAL^REC.TAL^TEST.O^FIX2:= TAL^REC.TAL^TEST.KEY^FIX2 * TAL^REC.TAL^TEST.I^FIX2; END ELSE IF TAL^REC.TAL^CODE = 34 THEN BEGIN TAL^REC.TAL^TEST.O^INT := TAL^REC.TAL^TEST.KEY^INT / TAL^REC.TAL^TEST.I^INT; TAL^REC.TAL^TEST.O^I32 := TAL^REC.TAL^TEST.KEY^I32 / TAL^REC.TAL^TEST.I^I32; TAL^REC.TAL^TEST.O^FIX0:= TAL^REC.TAL^TEST.KEY^FIX0 / TAL^REC.TAL^TEST.I^FIX0; TAL^REC.TAL^TEST.O^FIX2:= TAL^REC.TAL^TEST.KEY^FIX2 / TAL^REC.TAL^TEST.I^FIX2; END; PASS := PASS + 1; END; PROC NSK^TEST^6000; BEGIN CALL MYTERM(T^NAME); TAL^REC.TAL^RESULTS.RET^ALPHA ':=' "MYTERM = " & T^NAME FOR 14 BYTES; CALL TIME(TAL^REC.TAL^RESULTS.RET^NUMERIC.RET^NUM1); PASS := PASS + 1; END; PROC PROCESS^2000; BEGIN TAL^REC ':=' " " & TAL^REC FOR $LEN(TAL^REC) BYTES); TAL^REC.TAL^CODE := 0; PASS := 0; FAIL := 0; DO BEGIN ERR := 0; CALL READUPDATE(R^NUM,TAL^REC, ($LEN( TAL^REC) * $OCCURS( TAL^REC))); IF <> THEN BEGIN CALL FILEINFO(-1,ERR); CALL ABEND; END ELSE BEGIN CALL AWAITIO(R^NUM, , AMT, TAG, AW^TIME); IF <> THEN BEGIN CALL FILEINFO(-1,ERR); IF ERR <> 40 THEN BEGIN CALL WRITE(T^NUM, "TIMEOUT RECEIVE",15); END; END; END; END UNTIL ERR = 0; IF TAL^REC.TAL^CODE = 1 THEN BEGIN CALL START^2001; END ELSE IF TAL^REC.TAL^CODE = 2 THEN BEGIN CALL START^NEXT^2002; END ELSE IF TAL^REC.TAL^CODE = 3 THEN BEGIN CALL START^PREV^2003; END ELSE IF TAL^REC.TAL^CODE = 4 THEN BEGIN CALL READ^2004; END ELSE IF TAL^REC.TAL^CODE = 5 THEN BEGIN CALL READ^NEXT^2005; END ELSE IF TAL^REC.TAL^CODE = 6 THEN BEGIN CALL READ^PREV^2006; END ELSE IF TAL^REC.TAL^CODE = 7 THEN BEGIN CALL WRITE^2007; END ELSE IF TAL^REC.TAL^CODE = 8 THEN BEGIN CALL UPDATE^2008; END ELSE IF TAL^REC.TAL^CODE = 9 THEN BEGIN CALL DEL^2009; END ELSE IF TAL^REC.TAL^CODE > 30 AND TAL^REC.TAL^CODE < 40 THEN BEGIN CALL MATH^TEST^3000; END ELSE IF TAL^REC.TAL^CODE = 50 THEN BEGIN CALL NSK^TEST^6000; END ELSE IF TAL^REC.TAL^CODE = 99 THEN BEGIN DONE := 1; END; TAL^REC.TAL^RESULTS.PASSED ':=' "SUCCESS = XXX "; CALL NUMOUT(TAL^REC.TAL^RESULTS.PASSED.BYTE[11],PASS,10,3); TAL^REC.TAL^RESULTS.FAILED ':=' "ERRORS = XXX "; CALL NUMOUT(TAL^REC.TAL^RESULTS.FAILED.BYTE[11],FAIL,10,3); CALL REPLY(TAL^REC, ($LEN( TAL^REC) * $OCCURS( TAL^REC)),ERR); END; PROC MAIN^0000 MAIN; BEGIN CALL INITIALIZER; CALL OPEN(F^NAME,F^NUM); IF <> THEN CALL FILEINFO(-1,ERR,F^NAME); CALL OPEN(R^NAME,R^NUM,1,1); IF <> THEN CALL FILEINFO(-1,ERR,R^NAME); CALL MYTERM(T^NAME); CALL OPEN(T^NAME,T^NUM); DONE := 0; ERROR := 0; WHILE (DONE <> 1) AND (ERROR <> 1) DO BEGIN CALL PROCESS^2000; END; END;