<> <> <> <<>> DIRECTORY Atom, Commander, IO; XlDebug: CEDAR PROGRAM IMPORTS Atom, Commander, IO ~ BEGIN debugArrayCnt: INT = 4000; --same as in XlImplUtilities DebugArray: TYPE = ARRAY [0..debugArrayCnt) OF BYTE ¬ ALL[0]; WriteDebugInfo: Commander.CommandProc ~ { s: IO.STREAM ¬ cmd.out; cnt, idx, sequenceNumber: INT ¬ 0; fix: REF PACKED ARRAY [0..32) OF BYTE ¬ NEW[PACKED ARRAY [0..32) OF BYTE ¬ ALL[0]]; da: REF DebugArray; -- ¬ NEW[DebugArray ¬ ALL[0]]; WITH Atom.GetProp[$XlDebug, $XlDebug1] SELECT FROM ri: REF INT => sequenceNumber ¬ ri­; ENDCASE => {}; WITH Atom.GetProp[$XlDebug, $XlDebug2] SELECT FROM x: REF PACKED ARRAY [0..32) OF BYTE => fix­ ¬ x­; ENDCASE => {}; WITH Atom.GetProp[$XlDebug, $XlDebug3] SELECT FROM x: REF DebugArray => da ¬ x; ENDCASE => {}; idx ¬ (sequenceNumber MOD debugArrayCnt) + 2*debugArrayCnt; --make it positive enough that simple mod will work IF da=NIL THEN IO.PutRope[s, "no unexpected replies so far\n"] ELSE { IO.PutRope[s, "un-expected reply\ntext:"]; FOR i: INT IN [0..32) DO IO.PutF1[s, " %g", IO.int[fix[i]]] ENDLOOP; IO.PutF1[s, "\nsequencenumber %g \n", IO.int[sequenceNumber]]; IO.PutF[s, "request codes: %g %g %g\n", IO.int[da[(idx-1) MOD debugArrayCnt]], IO.int[da[idx MOD debugArrayCnt]], IO.int[da[(idx+1) MOD debugArrayCnt]]] }; WITH Atom.GetProp[$XlDebug, $XlDebugSP] SELECT FROM ri: REF INT => cnt ¬ ri­; ENDCASE => {}; IO.PutF1[s, "Count of double replies so far: %g \n", IO.int[cnt]]; }; XlDebugBlock: Commander.CommandProc ~ { Atom.PutProp[$XlDebug, $SignalReplyNotExpected, $TRUE]; }; Commander.Register["XlDebugWrite", WriteDebugInfo, "Write debug data for famous error"]; Commander.Register["XlDebugBlock", XlDebugBlock, "Block if famous error occurs"]; END. occurs