ZU ;SF/JLI,RWF - For GT.M, TIE ALL TERMINALS TO THIS ROUTINE!! ;11/24/2003 11:34
;;8.0;KERNEL;**275,419**;Jul 10, 1995;Build 5
; for GT.M for VMS & Unix, version 4.3
;
;The env var ZINTRRUPT should be set to catch all interrupts.
EN ;See that escape processing is off, Conflict with Screenman
U $P:(NOCENABLE:NOESCAPE)
N $ESTACK,$ETRAP S $ETRAP="D ERR^ZU Q:$QUIT -9 Q"
S $ZINTERRUPT="I $$JOBEXAM^ZU($ZPOSITION)"
D:+$G(^%ZTSCH("LOGRSRC")) LOGRSRC^%ZOSV("$LOGIN$")
D COUNT^XUSCNT(1)
G ^XUS
;
;
ERR ;Come here on error
; handle stack overflow errors specifically
I $P($ZS,",",3)["STACKCRIT"!("STACKOFLOW"[$P($ZS,",",3)) S $ET="Q:$ST>"_($ST-8)_" G ERR2^ZU" Q
;
ERR2 ;
S $ETRAP="D UNWIND^ZU" L ;Backup Trap
U $P:NOCENABLE
Q:$ECODE["<PROG>"
I $P($ZS,",",2,3)["^XUS1A:2, %GTM-E-IOWRITERR" G HALT
;
D ^%ZTER K %ZT ; Capture symbol table first!
;
I $G(IO)]"",$D(IO(1,IO)),$E($G(IOST))="P" D
. U IO
. W @$S($D(IOF):IOF,1:"#")
I $G(IO(0))]"" D
. U IO(0)
. W !!,"RECORDING THAT AN ERROR OCCURRED ---"
. W !!?15,"Sorry 'bout that"
. W !,*7
. W !?10,"$STACK=",$STACK," $ECODE=",$ECODE
. W !?10,"$ZSTATUS=",$ZSTATUS
;
;
I $G(DUZ)'>0 G HALT
S $ET="D HALT^ZU"
;
I $P($ZS,",",3)'["-CTRLC" S XUERF="" G ^XUSCLEAN ;419
CTRLC U $P
W !,"--Interrupt Acknowledged",!
D KILL1^XUSCLEAN ;Clean up symbol table
S $ECODE=",<<POP>>,"
Q
;
UNWIND ;Unwind the stack
Q:$ESTACK>1 G CTRLC2:$ECODE["<<POP>>"
S $ECODE=""
Q
;
CTRLC2 S $ECODE="" G:$G(^XUTL("XQ",$J,"T"))<2 ^XUSCLEAN
S ^XUTL("XQ",$J,"T")=1,XQY=$G(^(1)),XQY0=$P(XQY,"^",2,99)
G:$P(XQY0,"^",4)'="M" HALT
S XQPSM=$P(XQY,"^",1),XQY=+XQPSM,XQPSM=$P(XQPSM,XQY,2,3)
G:'XQY ^XUSCLEAN
S $ECODE="",$ETRAP="D ERR^ZU Q:$QUIT 0 Q"
U $P:NOESCAPE
G M1^XQ
;
HALT I $D(^XUTL("XQ",$J)) D:$G(DUZ)>0 BYE^XUSCLEAN
D COUNT^XUSCNT(-1)
D:+$G(^%ZTSCH("LOGRSRC")) LOGRSRC^%ZOSV("$LOGOUT$")
HALT
;
JOBEXAM(%ZPOS) ;
N %reference S %reference=$REFERENCE
S ^XUTL("XUSYS",$J,0)=$H,^XUTL("XUSYS",$J,"INTERRUPT")=$G(%ZPOS)
I %ZPOS["^" S ^XUTL("XUSYS",$J,"codeline")=$T(@%ZPOS)
K ^XUTL("XUSYS",$J,"JE")
I $G(^XUTL("XUSYS","COMMAND"))'="EXAM" ZSHOW "SD":^XUTL("XUSYS",$J,"JE")
I $G(^XUTL("XUSYS","COMMAND"))="EXAM" ZSHOW "*":^XUTL("XUSYS",$J,"JE")
I $G(^XUTL("XUSYS",$J,"CMD"))="HALT" ;To do.
Q 1
;
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HZUGTM 2340 printed Dec 13, 2024@02:16:41 Page 2
ZU ;SF/JLI,RWF - For GT.M, TIE ALL TERMINALS TO THIS ROUTINE!! ;11/24/2003 11:34
+1 ;;8.0;KERNEL;**275,419**;Jul 10, 1995;Build 5
+2 ; for GT.M for VMS & Unix, version 4.3
+3 ;
+4 ;The env var ZINTRRUPT should be set to catch all interrupts.
EN ;See that escape processing is off, Conflict with Screenman
+1 USE $PRINCIPAL:(NOCENABLE:NOESCAPE)
+2 NEW $ESTACK,$ETRAP
SET $ETRAP="D ERR^ZU Q:$QUIT -9 Q"
+3 SET $ZINTERRUPT="I $$JOBEXAM^ZU($ZPOSITION)"
+4 if +$GET(^%ZTSCH("LOGRSRC"))
DO LOGRSRC^%ZOSV("$LOGIN$")
+5 DO COUNT^XUSCNT(1)
+6 GOTO ^XUS
+7 ;
+8 ;
ERR ;Come here on error
+1 ; handle stack overflow errors specifically
+2 IF $PIECE($ZS,",",3)["STACKCRIT"!("STACKOFLOW"[$PIECE($ZS,",",3))
SET $ETRAP="Q:$ST>"_($STACK-8)_" G ERR2^ZU"
QUIT
+3 ;
ERR2 ;
+1 ;Backup Trap
SET $ETRAP="D UNWIND^ZU"
LOCK
+2 USE $PRINCIPAL:NOCENABLE
+3 if $ECODE["<PROG>"
QUIT
+4 IF $PIECE($ZS,",",2,3)["^XUS1A:2, %GTM-E-IOWRITERR"
GOTO HALT
+5 ;
+6 ; Capture symbol table first!
DO ^%ZTER
KILL %ZT
+7 ;
+8 IF $GET(IO)]""
IF $DATA(IO(1,IO))
IF $EXTRACT($GET(IOST))="P"
Begin DoDot:1
+9 USE IO
+10 WRITE @$SELECT($DATA(IOF):IOF,1:"#")
End DoDot:1
+11 IF $GET(IO(0))]""
Begin DoDot:1
+12 USE IO(0)
+13 WRITE !!,"RECORDING THAT AN ERROR OCCURRED ---"
+14 WRITE !!?15,"Sorry 'bout that"
+15 WRITE !,*7
+16 WRITE !?10,"$STACK=",$STACK," $ECODE=",$ECODE
+17 WRITE !?10,"$ZSTATUS=",$ZSTATUS
End DoDot:1
+18 ;
+19 ;
+20 IF $GET(DUZ)'>0
GOTO HALT
+21 SET $ETRAP="D HALT^ZU"
+22 ;
+23 ;419
IF $PIECE($ZS,",",3)'["-CTRLC"
SET XUERF=""
GOTO ^XUSCLEAN
CTRLC USE $PRINCIPAL
+1 WRITE !,"--Interrupt Acknowledged",!
+2 ;Clean up symbol table
DO KILL1^XUSCLEAN
+3 SET $ECODE=",<<POP>>,"
+4 QUIT
+5 ;
UNWIND ;Unwind the stack
+1 if $ESTACK>1
QUIT
if $ECODE["<<POP>>"
GOTO CTRLC2
+2 SET $ECODE=""
+3 QUIT
+4 ;
CTRLC2 SET $ECODE=""
if $GET(^XUTL("XQ",$JOB,"T"))<2
GOTO ^XUSCLEAN
+1 SET ^XUTL("XQ",$JOB,"T")=1
SET XQY=$GET(^(1))
SET XQY0=$PIECE(XQY,"^",2,99)
+2 if $PIECE(XQY0,"^",4)'="M"
GOTO HALT
+3 SET XQPSM=$PIECE(XQY,"^",1)
SET XQY=+XQPSM
SET XQPSM=$PIECE(XQPSM,XQY,2,3)
+4 if 'XQY
GOTO ^XUSCLEAN
+5 SET $ECODE=""
SET $ETRAP="D ERR^ZU Q:$QUIT 0 Q"
+6 USE $PRINCIPAL:NOESCAPE
+7 GOTO M1^XQ
+8 ;
HALT IF $DATA(^XUTL("XQ",$JOB))
if $GET(DUZ)>0
DO BYE^XUSCLEAN
+1 DO COUNT^XUSCNT(-1)
+2 if +$GET(^%ZTSCH("LOGRSRC"))
DO LOGRSRC^%ZOSV("$LOGOUT$")
+3 HALT
+4 ;
JOBEXAM(%ZPOS) ;
+1 NEW %reference