Trailing-Edge
-
PDP-10 Archives
-
decuslib20-02
-
decus/20-0057/declph.sno
There are 2 other files named declph.sno in the archive. Click here to see a list.
* * * * * * * * *
* * DECLARATIONS * * * * *
* * * * * * * * *
*
* LOCAL
*
DECLARE('SNOBOL.SUBPROGRAM','DECLPH')
DECLARE('OPTION','NO.STNO')
DECLARE('PURGE.VARIABLE',ALL)
DECLARE('PURGE.LABEL',ALL)
DECLARE('EXTERNAL.FUNCTION','GETSTA,STXERR,ERRMSG,PARLIT,GETITM'
.)
DECLARE('INTEGER','I,J,K,ITSW,DFATR')
DECLARE('ENTRY.FUNCTION','INIDEC()')
DECLARE('ENTRY.FUNCTION','DECLPH()')
*
* SYSTEM COMMON
*
* TABLES AND LISTS
DECLARE('EXTERNAL.VARIABLE',
.'SYMBTB,XNAMTB,KEYWTB,CTRLTB,DECLTB,CROSTB,CONSTB,ENTFTB,DSIZTB,
.BOPRTB,UOPRTB')
DECLARE('EXTERNAL.VARIABLE',
.'ENTRLS,EXTRLS,FORTLS')
* ARRAYS
DECLARE('EXTERNAL.VARIABLE',
.'PTVRAR,PTFNAR,PRIMAR,GOTOAR,DECLAR,PROGAR,VARBAR,MACHAR,STENAR,BOPRAR,
.UOPRAR,PATRAR,EXPRAR,AROPAR,ARITAR,EACTAR')
* PARAMETERS (STRINGS,DATATYPES)
DECLARE('EXTERNAL.VARIABLE',
.'C,INDENT,SPLASH,ITNAM,ITENT,NOFAIL,SNONAM,SUBNAM,PARBLK,PRGNAM,STARTP,
.TEMLOC,P1,P2,P3,P4,P5')
* PARAMETERS (INTEGERS)
DECLARE('EXTERNAL.VARIABLE',
.'P,OBJFLG,LISTSR,INTGER,ITTYP,ITATR,PRGALV,PRGALL,PRGALF,STNFLG,HSHSIZ,
.STRTIM,DMPFLG,LISTOB,STNO,MAXTMP')
DECLARE('INTEGER',
.'P,OBJFLG,LISTSR,INTGER,ITTYP,ITATR,PRGALV,PRGALL,PRGALF,STNFLG,HSHSIZ,
.STRTIM,DMPFLG,LISTOB,STNO,MAXTMP')
DECLARE('EXTERNAL.VARIABLE',
.'XNATRB,VTATRB,VDATRB,LTATRB,FTATRB,FDATRB,TXATRB,VNATRB,VXATRB,VIATRB,
.VGATRB,LIATRB,LGATRB,FIATRB,FGATRB,FXATRB,SKATRB,SDATRB,BTATRB')
DECLARE('INTEGER',
.'XNATRB,VTATRB,VDATRB,LTATRB,FTATRB,FDATRB,TXATRB,VNATRB,VXATRB,VIATRB,
.VGATRB,LIATRB,LGATRB,FIATRB,FGATRB,FXATRB,SKATRB,SDATRB,BTATRB')
DECLARE('EXTERNAL.VARIABLE',
.'XNVATR,XNLATR,XNFATR,XNXMSK,VTVATR,VDDATR,VDPATR,VDDMSK,LTDATR,LTTMSK,
.FTFATR,FDPATR,FDIATR,FDDMSK,TXTATR,TXTMSK,VNNATR,VXXATR,VIPATR,VGGATR,
.LIPATR,LGGATR,FIPATR,FGGATR,FXXATR,FXXMSK,SKRATR,SDRATR,BTRATR')
DECLARE('INTEGER',
.'XNVATR,XNLATR,XNFATR,XNXMSK,VTVATR,VDDATR,VDPATR,VDDMSK,LTDATR,LTTMSK,
.FTFATR,FDPATR,FDIATR,FDDMSK,TXTATR,TXTMSK,VNNATR,VXXATR,VIPATR,VGGATR,
.LIPATR,LGGATR,FIPATR,FGGATR,FXXATR,FXXMSK,SKRATR,SDRATR,BTRATR')
* SPECIAL CHARACTERS,CHARACTER SEQUENCES, AND CHARACTER CLASSES
DECLARE('EXTERNAL.VARIABLE',
.'FFCHR,CRLCHR,LFCHR,CRCHR,SQCHR,DQCHR,TBCHR,LCSCHR,BLNCHR,EQLCHR,
.QTSCHR,ELTCHR,LBCHR')
* PATTERNS AND MATCHES
DECLARE('EXTERNAL.VARIABLE',
.'COMSPT,INTGPT,BLNKPT,OPBLPT,PCOMPT,PCPRMT,IDENPT,DCLCMT,RSIDPT,LABLPT,
.POPRMT,IDENMT,SQLTPT,DQLTPT,LBDCPT,IDDCPT')
*
* MINIMAL SYMBOL TABLE
*
DECLARE('UNPURGE.VARIABLE','INIDEC,DECLPH,DFI,DSB,STR1')
DECLARE('UNPURGE.LABEL','INIDEC DECLPH DFI DSB NO.STNO TIMER
. HASHSIZE= LD4 VD4 FD4 DCLEND XFF1 DD3 OPT SNO SUB PRV UPV PRL UPL
. PRF UPF STR INT REL REN GLV GLL GLF EXV ENV EXL ENL EXF ENF XFF NFF')
DECLARE('PURGE.FUNCTION','DEFINE,DATA,IDENT,DIFFER,TABLE,ARRAY,
.SUBSTR')
* * * * * * * * *
* * INITIALIZE DECLARATION PHASE * * *
* * * * * * * * *
INIDEC DEFINE('DFI()')
DEFINE('DSB(STR1)')
DATA('SYM(INAM,ATRB)')
DATA('CRS(NEXT,CRSI)') :(RETURN)
* * * * * * * * *
* * PROCESS DECLARATIONS * * * *
* * * * * * * * *
DECLPH
* DECLARATION LOOP
DCLOOP C = GETSTA() :F(NOEND)
C SPAN(BLNCHR) @P :F(RETURN)
C LEN(*P) 'DECLARE(' @P :F(RETURN)
* DECLARATION DECODING
C LEN(*P) NSPAN(BLNCHR) @P SQCHR @P @I
. SPAN('ABCDEFGHIJKLMNOPQRSTUVWXYZ.') $ DECTYP @P SQCHR @P
. NSPAN(BLNCHR) ',' NSPAN(BLNCHR) @P (SQCHR ! 'ALL') $ STR1 @P
. :F(BADDEC)
DECTYP = DECLTB[DECTYP]
(?IDENT(STR1,'ALL') ?DIFFER(SUBSTR(DECTYP,2),'PR'))
. :S(BADDEC)
P = ?IDENT(DECTYP) I :F($DECTYP)
* ERRORS
STXERR('UNKNOWN DECLARATION') :(DCLOOP)
BADDEC STXERR('BAD DECLARATION') :(DCLOOP)
BADOPT STXERR('UNKNOWN OPTION') :(DCLOOP)
BADEXT ERRMSG('MULTIPLE EXTERNAL FOR: ' ITNAM ', IGNORED')
. :($RETLAB)
BADDEF ERRMSG('REDEFINITION OF: ' ITNAM ', IGNORED') :($RETLAB)
NOEND C = :(RETURN)
* DECLARATION LOOP BOTTOM
DCLEND C DCLCMT :F(BADDEC)S(DCLOOP)
DCAEND C PCPRMT @P OPBLPT @P RPOS(0) :F(BADDEC)S(DCLOOP)
* OPTION DECLARATION
OPT C LEN(*P) ('NO.STNO' ! 'TIMER' ! 'HASHSIZE=') $ DECTYP
. @P :F(BADOPT)S($DECTYP)
NO.STNO STNFLG = -1 :(DCLEND)
TIMER STNFLG = 1 :(DCLEND)
HASHSIZE= C LEN(*P) INTGPT @P :F(BADDEC)
HSHSIZ = INTGER :(DCLEND)
* SNOBOL.MAIN DECLARATION
SNO C LEN(*P) IDENPT $ SNONAM @P :F(BADDEC)S(DCLEND)
* SNOBOL.SUBPROGRAM DECLARATION
SUB C LEN(*P) IDENPT $ SUBNAM @P :F(BADDEC)S(DCLEND)
* RENAME DECLARATION
REN C LEN(*P) IDENPT $ STR1 @P SQCHR @P PCOMPT @P SQCHR
. @P IDENPT $ STR2 @P :F(BADDEC)
STR1 = .SYMBTB[STR1]
SYMBTB[STR2] = $STR1
$STR1 = :(DCLEND)
* LABEL DECLARATIONS
* PURGE.LABEL
PRL PRGALL = ?IDENT(STR1,'ALL') LIPATR :S(DCAEND)
ITSW = 1
DFATR = 2 * LTDATR + LIPATR
LD1 ITPAT = LABLPT
LD2 ITSEP = SPAN(BLNCHR) ! @I
ITBRK = LBDCPT
ITTYP = 1
I = :(LD5)
* UNPURGE.LABEL
UPL ITSW = 2
DFATR = 2 * LTDATR :(LD1)
* GLOBAL.LABEL
GLL ITSW = 3
DFATR = 2 * LTDATR + LGGATR :(LD1)
* EXTERNAL.LABEL
EXL ITSW = 4
DFATR = LTDATR + PRGALL + XNLATR
LD3 ITPAT = RSIDPT :(LD2)
* ENTRY.LABEL
ENL ITSW = 5
DFATR = 2 * LTDATR + PRGALL + XNLATR :(LD3)
* COMMON CODE FOR LABELS
LD4 ?INE(I,P) :F(DCLEND)
LD5 STR1 = DFI() :F(BADDEC)
IDENT(STR1) :F(LD7)
LD6 ?IGE(ITSW,4) :F(LD4)
XNAMTB[INAM(ITENT)] = ITNAM
EXTRLS = ?IEQ(ITSW,4) CRS(EXTRLS,ITNAM) :S(LD4)
ENTRLS = CRS(ENTRLS,ITNAM) :(LD4)
LD7 ATRB(ITENT) = ?IEQ(LTATRB,0) OR(ITATR,DFATR) :F(LD9)
LD8 ATRB(ITENT) = ?IGE(ITSW,4) ?INE(XNATRB,0) OR(ITATR,DFATR -
. XNLATR) :F(LD6)
RETLAB = 'LD4' :(BADEXT)
LD9 ATRB(ITENT) = ?IEQ(ITSW,3) OR(ITATR,LGGATR) :S(LD4)
ATRB(ITENT) = ?IEQ(ITSW,1) OR(ITATR,LIPATR) :S(LD4)
ATRB(ITENT) = ?IEQ(ITSW,2) AND(ITATR,NOT(LIPATR)) :S(LD4)
ITATR = ITATR - LTATRB
DFATR = DFATR - PRGALL
ATRB(ITENT) = OR(ITATR,DFATR) :(LD8)
* VARIABLE DECLARATIONS
* PURGE.VARIABLE
PRV PRGALV = ?IDENT(STR1,'ALL') VIPATR :S(DCAEND)
ITSW = 1
DFATR = VTVATR + VIPATR
VD1 ITPAT = IDENPT
VD2 ITSEP = PCOMPT ! @I
ITBRK = IDDCPT
ITTYP =
I = :(VD5)
* UNPURGE.VARIABLE
UPV ITSW = 2
DFATR = VTVATR :(VD1)
* GLOBAL.VARIABLE
GLV ITSW = 3
DFATR = VTVATR + VGGATR :(VD1)
* EXTERNAL.VARIABLE
EXV ITSW = 4
DFATR = VTVATR + PRGALV + XNVATR + VXXATR
VD3 ITPAT = RSIDPT :(VD2)
* ENTRY.VARIABLE
ENV ITSW = 5
DFATR = VTVATR + PRGALV + XNVATR :(VD3)
* COMMON CODE FOR VARIABLES
VD4 ?INE(I,P) :F(DCLEND)
VD5 STR1 = DFI() :F(BADDEC)
IDENT(STR1) :F(VD7)
VD6 ?IGE(ITSW,4) :F(VD4)
XNAMTB[INAM(ITENT)] = ITNAM
EXTRLS = ?IEQ(ITSW,4) CRS(EXTRLS,ITNAM) :S(VD4)
ENTRLS = CRS(ENTRLS,ITNAM) :(VD4)
VD7 ATRB(ITENT) = ?IEQ(VTATRB,0) OR(ITATR,DFATR) :F(VD9)
VD8 ATRB(ITENT) = ?IGE(ITSW,4) ?INE(XNATRB,0) OR(ITATR,DFATR -
. XNATRB - (5 - ITSW) * VXXATR) :F(VD6)
RETLAB = 'VD4' :(BADEXT)
VD9 RETLAB = ?IEQ(VDATRB,VDPATR) 'VD4' :S(BADDEF)
ATRB(ITENT) = ?IEQ(ITSW,3) OR(ITATR,VGGATR) :S(VD4)
ATRB(ITENT) = ?IEQ(ITSW,1) OR(ITATR,VIPATR) :S(VD4)
ATRB(ITENT) = ?IEQ(ITSW,2) AND(ITATR,NOT(VIPATR)) :S(VD4)
DFATR = DFATR - PRGALV
ATRB(ITENT) = OR(ITATR,DFATR) :(VD8)
* FUNCTION DECLARATIONS
* PURGE.FUNCTION
PRF PRGALF = ?IDENT(STR1,'ALL') FIPATR :S(DCAEND)
ITSW = 1
DFATR = FTFATR + FIPATR
FD1 ITPAT = IDENPT
FD2 ITSEP = PCOMPT ! @I
ITBRK = IDDCPT
ITTYP = 7
I = :(FD5)
* UNPURGE.FUNCTION
UPF ITSW = 2
DFATR = FTFATR :(FD1)
* GLOBAL.FUNCTION
GLF ITSW = 3
DFATR = FTFATR + FGGATR :(FD1)
* EXTERNAL.FUNCTION
EXF ITSW = 4
DFATR = FTFATR + FXXATR + XNFATR
ITPAT = RSIDPT :(FD2)
* COMMON CODE FOR FUNCTIONS
FD4 ?INE(I,P) :F(DCLEND)
FD5 STR1 = DFI() :F(BADDEC)
IDENT(STR1) :F(FD7)
FD6 ?IEQ(ITSW,4) :F(FD4)
XNAMTB[INAM(ITENT)] = ITNAM
EXTRLS = CRS(EXTRLS,ITNAM) :(FD4)
FD7 ITATR = ?IEQ(ITSW,4) ?IEQ(FXATRB,FXXMSK) ITATR - FXATRB -
. TXATRB
ATRB(ITENT) = ?IEQ(FTATRB,0) OR(ITATR,DFATR) :F(FD9)
FD8 ATRB(ITENT) = ?IEQ(ITSW,8) ?INE(XNATRB,0) OR(ITATR,FTFATR)
. :F(FD6)
RETLAB = 'FD4' :(BADEXT)
FD9 RETLAB = ?IEQ(FDATRB,FDPATR) 'FD4' :S(BADDEF)
ATRB(ITENT) = ?IEQ(ITSW,3) OR(ITATR,FGGATR) :S(FD4)
ATRB(ITENT) = ?IEQ(ITSW,1) OR(ITATR,FIPATR) :S(FD4)
ATRB(ITENT) = ?IEQ(ITSW,2) AND(ITATR,NOT(FIPATR)) :S(FD4)
ATRB(ITENT) = OR(ITATR,DFATR) :(FD8)
* ENTRY.FUNCTION DECLARATION
ENF J = P
STR1 = PARLIT(SQCHR,SQLTPT) :F(BADDEC)
STR1 @K RSIDPT @K '(' @K BREAK(')') :S(ENFA)
ENFX P = J + K :(BADDEC)
ENFA STR2 =
C LEN(*(P + 1)) PCOMPT SQCHR @P :F(ENFB)
STR2 = PARLIT(SQCHR,SQLTPT) :F(BADDEC)
ENFB DFATR = FTFATR + 2 * FXXATR + XNFATR + PRGALF
ITTYP = 7
ITATR = DFATR
(?GETITM() ?IEQ(DFATR,ITATR)) :F(ENF4)
ENF1 XNAMTB[INAM(ITENT)] = ITNAM
ENTRLS = CRS(ENTRLS,ITNAM)
ENTFTB = ?IDENT(ENTFTB) TABLE(3,3)
ITPTR = .ENTFTB[INAM(ITENT)]
$ITPTR = ARRAY('4',STNO)
ITPTR = $ITPTR
ITPTR<2> = DSB(STR1)
I =
STR1 BREAK('(') @J '(' NSPAN(BLNCHR) ')' :S(ENF3)
I = 1
ENF2 STR1 LEN(*(J + 1)) BREAK(',)') @J ',' :F(ENF3)
I = I + 1 :(ENF2)
ENF3 ITPTR<4> = I
ITPTR<3> = ?IDENT(STR2) STR2 :S(DCLEND)
ITPTR<3> = DSB(STR2) :(DCLEND)
ENF4 ITATR = ?IEQ(FXATRB,FXXMSK) ITATR - FXATRB - TXATRB
ATRB(ITENT) = ?IEQ(FTATRB,0) OR(ITATR,DFATR) :F(ENF6)
ENF5 ATRB(ITENT) = ?INE(XNATRB,0) OR(ITATR,DFATR - 2 * FXXATR -
. XNFATR) :F(ENF1)
RETLAB = 'DCLEND' :(BADEXT)
ENF6 RETLAB = ?IEQ(FDATRB,FDPATR) 'DCLEND' :S(BADDEF)
DFATR = DFATR - PRGALF
ATRB(ITENT) = OR(ITATR,DFATR) :(ENF5)
* EXTERNAL.FORTRAN.FUNCTION DECLARATION
XFF ITTYP = 7
I = :(XFF2)
XFF1 ?INE(I,P) :F(DCLEND)
XFF2 J = P
STR2 = PARLIT(SQCHR,IDDCPT) :F(BADDEC)
STR2 @K RSIDPT $ STR1 @K ('=' ('INTEGER' !
. 'REAL') $ STR1 ! '') @K '(' @K INTGPT @K ')' RPOS(0) :F(ENFX)
C LEN(*P) (PCOMPT ! @I) @P :F(BADDEC)
J = FDIATR
STR1 NOTANY('IJKLMN') :F(XFF3)
J = FDDMSK
XFF3 DFATR = FTFATR + J + XNFATR + INTGER * TXTATR
ITATR = DFATR
(?GETITM() ?IEQ(DFATR,ITATR)) :F(XFF5)
XFF4 XNAMTB[INAM(ITENT)] = ITNAM
EXTRLS = CRS(EXTRLS,ITNAM) :(XFF1)
XFF5 ITATR = ?IEQ(FXATRB,FXXMSK) ITATR - FXATRB - TXATRB :F(XFF6)
TXATRB =
XFF6 RETLAB = ?INE(TXATRB,0) 'XFF1' :S(BADDEF)
ATRB(ITENT) = ?IEQ(FTATRB,0) OR(ITATR,DFATR) :F(XFF8)
XFF7 ATRB(ITENT) = ?INE(XNATRB,0) OR(ITATR,DFATR - XNFATR)
. :F(XFF4)
RETLAB = 'XFF1' :(BADEXT)
XFF8 RETLAB = ?INE(FXATRB,0) 'XFF1' :S(BADDEF)
ATRB(ITENT) = OR(ITATR,DFATR) :(XFF7)
*
* ENTRY.FORTRAN.FUNCTION DECLARATION
NFF J = P
STR1 = PARLIT(SQCHR,SQLTPT) :F(BADDEC)
STR1 @K RSIDPT @K '(' @K BREAK(')') ')' @K
. RPOS(0) :F(ENFX)
STR2 =
C LEN(*P) PCOMPT SQCHR @P :F(NFF1)
STR2 = PARLIT(SQCHR,SQLTPT) :F(BADDEC)
NFF1 FORTLS = ARRAY('5',FORTLS)
FORTLS<2> = ITNAM
FORTLS<3> = STNO
FORTLS<4> = DSB(STR1)
FORTLS<5> = ?IDENT(STR2) STR2 :S(NFF2)
FORTLS<5> = DSB(STR2)
NFF2 ENTRLS = CRS(ENTRLS,ITNAM) :(DCLEND)
* DEDICATED VARIABLE DECLARATIONS
* INTEGER
INT ITSW = 2
DD1 ITPAT = IDENPT
DD2 ITSEP = PCOMPT ! @I
DFATR = VTVATR + ITSW * VDDATR + PRGALV
ITBRK = IDDCPT
ITTYP =
I = :(DD4)
* REAL
REL ITSW = 3 :(DD1)
* STRING
STR ITSW = 1
ITPAT = IDENPT '(' INTGPT ')' :(DD2)
* COMMON CODE FOR DEDICATED VARIABLES
DD3 ?INE(I,P) :F(DCLEND)
DD4 STR1 = DFI() :F(BADDEC)
IDENT(STR1) :F(DD6)
DD5 ?IEQ(ITSW,1) :F(DD3)
DSIZTB = ?IDENT(DSIZTB) TABLE(3,3)
DSIZTB[INAM(ITENT)] = INTGER :(DD3)
DD6 ATRB(ITENT) = ?IEQ(VTATRB,0) OR(ITATR,DFATR) :S(DD5)
ATRB(ITENT) = ?IEQ(VDATRB,0) OR(ITATR,ITSW * VDDATR)
. :S(DD5)
RETLAB = 'DD3' :(BADDEF)
* * * * * * * * *
* * SUBROUTINES * * * * *
* * * * * * * * *
* DFI() DEFINE ITEM
* EXPECTS ITPAT SET TO ITEM RECOGNIZER PATTERN, ITBRK TO THE BREAK
* PATTERN THAT ENDS THE ITEM, ITSEP TO THE SEPARATOR PATTERN,
* ITTYP, DFATR TO THE DEFINING ATTRIBUTES, AND RETURNS A NON-NULL
* VALUE IF THE SYMBOL HAS ALREADY BEEN ENTERED
*
DFI PARLIT(SQCHR,ITBRK) ITPAT :F(FRETURN)
C LEN(*P) ITSEP @P :F(FRETURN)
ITATR = DFATR
DFI = ?GETITM() ?INE(ITATR,DFATR) 'OLD' :(RETURN)
* * * * * * * * *
* DSB(STR1) DEFINE STRING BLOCK
* CREATES DEFINITION FOR STRING BLOCK, RETURNS INAM
*
DSB ITTYP = 3
ITATR = SKRATR
ITNAM = STR1
GETITM()
ATRB(ITENT) = ?IEQ(SKATRB,0) OR(ITATR,SKRATR)
DSB = INAM(ITENT) :(RETURN)
* * * * * * * * *
END