zorkzero/pstack.zil

117 lines
2.9 KiB
Plaintext

"PSTACK file for NEW PARSER
Copyright (C) 1988 Infocom, Inc. All rights reserved."
<ZZPACKAGE "PSTACK">
<ENTRY ALLOCATE-PSTACK MAX-PSTACK-SIZE PUSH-PSTACK POP-PSTACK
PEEK-PSTACK PSTACK FLUSH-PSTACK PSTACK-PTR
CLEAR-PSTACK PSTACK-DATA PSTACK-EMPTY?>
<USE "NEWSTRUC">
<FILE-FLAGS ;MDL-ZIL? ;ZAP-TO-SOURCE-DIRECTORY?>
<BEGIN-SEGMENT 0>
<MSETG MAX-PSTACK-SIZE 21 ;32> ;"STATE & DATA could be 11"
<NEWTYPE PSTACK TABLE>
<DEFMAC ALLOCATE-PSTACK () <ITABLE ,MAX-PSTACK-SIZE 0>>
<DEFMAC PSTACK-PTR ('S "OPT" 'NEW)
<COND (<ASSIGNED? NEW>
<FORM ZPUT .S 0 .NEW>)
(T
<CHTYPE [<FORM ZGET .S 0> FIX] ADECL>)>>
<DEFMAC PSTACK-EMPTY? ('PSTACK)
<COND (<CHECK-VERSION? YZIP>
<FORM EQUAL? <- ,MAX-PSTACK-SIZE 1> <FORM PSTACK-PTR .PSTACK>>)
(T
<FORM 0? <FORM PSTACK-PTR .PSTACK>>)>>
<DEFMAC CLEAR-PSTACK ('S)
<COND (<CHECK-VERSION? YZIP>
<FORM PSTACK-PTR <CHTYPE [.S PSTACK] ADECL> <- ,MAX-PSTACK-SIZE 1>>)
(T
<FORM PSTACK-PTR <CHTYPE [.S PSTACK] ADECL> 0>)>>
<DEFINE20 PRINT-PSTACK (S:PSTACK "OPT" (OUTCHAN:CHANNEL .OUTCHAN)
"AUX" (P <PSTACK-PTR .S>))
<PRINT-MANY .OUTCHAN PRINC
"#PSTACK ["
.P
" [">
<REPEAT ((D <ZREST .S 2>))
<COND (<L=? .P 0> <RETURN>)>
<PRIN1 <ZGET .D 0>>
<PRINC " ">
<SET D <ZREST .D 2>>
<SET P <- .P 1>>>
<PRINC "]]">>
<COND (<CHECK-VERSION? YZIP>
<DEFMAC PUSH-PSTACK ('S 'OBJ) <FORM XPUSH .OBJ .S>>)
(T
<IF-P-DEBUGGING-PARSER
<GLOBAL PSTACK-WARN:NUMBER 20>>
<ROUTINE PUSH-PSTACK (S:PSTACK OBJ "AUX" TMP)
<SET TMP <+ 1 <PSTACK-PTR .S>>>
<COND (<L=? ,MAX-PSTACK-SIZE .TMP>
<P-NO-MEM-ROUTINE>
<RFALSE>)>
<IF-P-DEBUGGING-PARSER
<COND (<L? ,PSTACK-WARN .TMP>
<SETG PSTACK-WARN .TMP>
<PRINTI "[PSTACK: ">
<PRINTN <- ,MAX-PSTACK-SIZE .TMP>>
<PRINTI " left!]|">)>>
<PSTACK-PTR .S .TMP>
<ZPUT .S .TMP .OBJ>
.S>)>
<COND (<CHECK-VERSION? YZIP>
<DEFMAC FLUSH-PSTACK ('S "OPT" ('N 1))
<FORM FSTACK .N .S>>)
(T
<ROUTINE FLUSH-PSTACK (S:PSTACK "OPT" (N:FIX 1))
<COND (<G? 0 <SET N <- <PSTACK-PTR .S> .N>>>
<SET N 0>)>
<PSTACK-PTR .S .N>
.S>)>
<COND (<CHECK-VERSION? YZIP>
<DEFMAC POP-PSTACK ('S "OPT" ('N 1))
<COND (<1? .N>
<FORM POP .S>)
(T
<FORM FSTACK .N .S>)>>)
(T
<ROUTINE POP-PSTACK (S:PSTACK "OPT" (N:FIX 1) "AUX" (OBJ <PEEK-PSTACK .S>))
<COND (<NOT <0? .N>>
<FLUSH-PSTACK .S .N>)>
.OBJ>)>
<COND (<CHECK-VERSION? YZIP>
<ROUTINE PEEK-PSTACK (S:PSTACK "OPT" (OFFS:FIX 0) "AUX" (N 0) VAL)
<REPEAT ()
<SET VAL <POP-PSTACK .S>>
<PUSH .VAL>
<INC N>
<COND (<DLESS? OFFS 0>
<RETURN>)>>
<REPEAT ()
<COND (<DLESS? N 0>
<RETURN>)
(T
<PUSH-PSTACK .S <POP>>)>>
.VAL>)
(T
<ROUTINE PEEK-PSTACK (S:PSTACK "OPT" (OFFS:FIX 0))
<ZGET .S <- <PSTACK-PTR .S> .OFFS>>>)>
<END-SEGMENT>
<ENDPACKAGE>