(FILECREATED "23-Jan-86 10:21:06" {GOEDEL}</usr2/pds/updating/>INTERRUPTS previous date: " 1-Dec-85 13:34:16" {FLOPPY}INTERRUPTS.;1) (* Copyright (c) 1985, 1986 by Quintus Computer Systems. All rights reserved.) (PRETTYCOMPRINT INTERRUPTSCOMS) (RPAQQ INTERRUPTSCOMS ((SCCS) (* This file contains functions dealing with D-machine interrupts, including error handling.) (* QP.INTERRUPT.CHARCODES is a list of CHARCODEs of characters to cause a Prolog interrupt. QP.INTERRUPT.CHARCODES.TO.DISABLE is a list of CHARCODEs of characters that Lisp uses as interrupts, but we want turned off. This list should probably contain ↑B, at least.) (VARS (QP.INTERRUPT.CHARCODES (LIST (LIST (CHARCODE ↑C) (FUNCTION QP.INTERRUPT.HANDLER)) (LIST (CHARCODE ↑Z) (FUNCTION QP.END.OF.FILE)))) (QP.INTERRUPT.CHARCODES.TO.DISABLE NIL) QP.LISP.ERROR.TO.PROLOG.ERROR.ALIST) (GLOBALVARS QP.INTERRUPT.CHARCODES QP.INTERRUPT.CHARCODES.TO.DISABLE QP.LISP.ERROR.TO.PROLOG.ERROR.ALIST) (FNS QP.BLOCK.EVENTS QP.END.OF.FILE QP.INSTALL.HANDLERS QP.INTERRUPT.HANDLER QP.LISP.ERROR QP.PROLOG.EVENT QP.RESET.SOME.INTERRUPTS QP.TTYENTRYFN QP.TTYEXITFN QP.UNBLOCK.EVENTS) (P (QP.INSTALL.HANDLERS)))) (* %1/28/86 %@(#)INTERRUPTS 1.10 ) (* This file contains functions dealing with D-machine interrupts, including error handling.) (* QP.INTERRUPT.CHARCODES is a list of CHARCODEs of characters to cause a Prolog interrupt. QP.INTERRUPT.CHARCODES.TO.DISABLE is a list of CHARCODEs of characters that Lisp uses as interrupts, but we want turned off. This list should probably contain ↑B, at least.) (RPAQ QP.INTERRUPT.CHARCODES (LIST (LIST (CHARCODE ↑C) (FUNCTION QP.INTERRUPT.HANDLER)) (LIST (CHARCODE ↑Z) (FUNCTION QP.END.OF.FILE)))) (RPAQQ QP.INTERRUPT.CHARCODES.TO.DISABLE NIL) (RPAQQ QP.LISP.ERROR.TO.PROLOG.ERROR.ALIST ((10 . 5) (48 . 5) (49 . 5) (50 . 5))) (DECLARE: DOEVAL@COMPILE DONTCOPY (GLOBALVARS QP.INTERRUPT.CHARCODES QP.INTERRUPT.CHARCODES.TO.DISABLE QP.LISP.ERROR.TO.PROLOG.ERROR.ALIST) ) (DEFINEQ (QP.BLOCK.EVENTS (LAMBDA (X) (* edited: "10-Nov-85 15:29") (* * Start running uninterruptably. This will turn off keyboard interrupts; I'm not sure if that's good enough.) (INTERRUPTABLE NIL))) (QP.END.OF.FILE (LAMBDA NIL (* vince: "25-Nov-85 17:07") (BKSYSBUF (CONCAT (CHARACTER 4) (CHARACTER (CHARCODE EOL)))))) (QP.INSTALL.HANDLERS (LAMBDA NIL (* pds: "21-Nov-85 11:21") (for PAIR in QP.LISP.ERROR.TO.PROLOG.ERROR.ALIST unless (ASSOC (QUOTE QP.LISP.ERROR) (ASSOC (CAR PAIR) ERRORTYPELST)) do (PUTASSOC (CAR PAIR) (CONS (LIST (FUNCTION QP.LISP.ERROR) (CDR PAIR)) (CDR (ASSOC (CAR PAIR) ERRORTYPELST))) ERRORTYPELST)))) (QP.INTERRUPT.HANDLER (LAMBDA NIL (* pds: "22-Nov-85 19:29") (* * This function needs to be attached somehow to the interrupt character, so it gets run when the user hits logical control-c. What key should it be by default on d-machines?) (TERPRI T) (SELECTQ (PROG1 (RESETLST (RESETSAVE NIL (BQUOTE (QP.RESET.SOME.INTERRUPTS , (for CH in QP.INTERRUPT.CHARCODES collect (INTERRUPTCHAR CH NIL) )))) (TERPRI T) (LET ((HELPTEXT " Prolog interrupt options: continue - do nothing trace - debugger will start creeping debug - debugger will start leaping abort - cause a Prolog abort exit - irreversible exit from Prolog help - this list Prolog interruption (? for help)? ")) (ASKUSER NIL NIL "Prolog interruption (h for help)? " (QUOTE ((c "ontinue") (t "race") (d "ebug") (a "bort") (e "xit" PROMPTCONFIRMFLG T))) NIL NIL (QUOTE (CONFIRMFLG T MACROCHARS ((h PRIN1 HELPTEXT T) (H PRIN1 HELPTEXT T) (? PRIN1 HELPTEXT T) )))))) (TERPRI T) (CLEARBUF T)) (c NIL) (t (SETQ QP.TOP.TRACE.STATE 2) (SETQ QP.TRACE.STATE 2) (PRINTOUT T "[The debugger will first creep -- showing everything (trace)]" T)) (d (SETQ QP.TOP.TRACE.STATE 3) (SETQ QP.TRACE.STATE 3) (PRINTOUT T "[The debugger will first leap -- showing spypoints (debug)]" T)) (a (QP.PROLOG.EVENT 8)) (e (QP.PROLOG.EVENT 3)) (SHOULDNT)))) (QP.LISP.ERROR (LAMBDA (ERRNUM) (* pds: "21-Nov-85 11:41") (LET ((OLDPOS (STKPOS (QUOTE PROLOG) -1 ERRORPOS))) (if OLDPOS then (* * We are running under PROLOG.) (if (STKPOS (QUOTE R.call.lisp) -1 ERRORPOS OLDPOS) then (* * But it's user-called LISP under Prolog, so let someone else handle it.) (RELSTK OLDPOS) NIL else (* * LISP error in Prolog system code: call our own handler.) (RELSTK ERRORPOS) (QP.PROLOG.EVENT ERRNUM)) else (* * This has nothing to do with Prolog: pass it on.) NIL)))) (QP.PROLOG.EVENT (LAMBDA (EVENT-NUMBER) (* pds: "16-Jan-86 16:32") (* * Called when something happens within prolog, e.g., prolog evaluates an abort goal. This function corresponds very roughly to events.ih in the C world.) (RETFROM (QUOTE PROLOG) EVENT-NUMBER T))) (QP.RESET.SOME.INTERRUPTS (LAMBDA (NEWINTERRUPTS SAVECURRENT?) (* pds: "13-Nov-85 19:09") (if SAVECURRENT? then (for X in NEWINTERRUPTS collect (INTERRUPTCHAR X)) else (for X in NEWINTERRUPTS do (INTERRUPTCHAR X))))) (QP.TTYENTRYFN (LAMBDA (PROCESS) (* vince: "25-Nov-85 16:54") (* * Called each time the prolog process becomes the TTY process. Enable the interrupt key.) (if (PROCESSP PROCESS) then (PROCESSPROP PROCESS (QUOTE OLDINTERRUPTS) (NCONC (for CH in QP.INTERRUPT.CHARCODES.TO.DISABLE collect (INTERRUPTCHAR CH NIL)) (for PAIR in QP.INTERRUPT.CHARCODES collect (INTERRUPTCHAR (CAR PAIR) (CDR PAIR)))))))) (QP.TTYEXITFN (LAMBDA (PROCESS) (* vince: "25-Nov-85 15:44") (* * Called each time the prolog process ceases to be the TTY process. Undo the work of QP.TTYENTRYFN.) (if (PROCESSP PROCESS) then (for X in (PROCESSPROP PROCESS (QUOTE OLDINTERRUPTS)) do (INTERRUPTCHAR X))))) (QP.UNBLOCK.EVENTS (LAMBDA (X) (* edited: "10-Nov-85 15:29") (* * Start running interruptably again. This will turn keyboard interrupts back on; if we modify QP.BLOCK.EVENTS to turn off any other interrupts, we had certainly better modify this to turn them back on.) (INTERRUPTABLE T))) ) (QP.INSTALL.HANDLERS) (PUTPROPS INTERRUPTS COPYRIGHT ("Quintus Computer Systems" 1985 1986)) STOP