perm filename SORCE.SAI[PUB,TES] blob
sn#151278 filedate 1975-03-14 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00012 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002 BEGOF("SORCE")
C00005 00003 PUBLIC SIMPLE PROCEDURE SORCE! $"#
C00009 00004 PUBLIC SIMPLE PROCEDURE BURPINPUT(BOOLEAN VERBOSE) $"#
C00010 00005 PUBLIC SIMPLE PROCEDURE DREQUIRE $"#
C00011 00006 PUBLIC SIMPLE PROCEDURE GROWNESTS $"#
C00012 00007 PUBLIC STRING SIMPLE PROCEDURE RD(INTEGER BRKTBL) $"#
C00019 00008 PUBLIC SIMPLE PROCEDURE SWICH(STRING NEWINPUTSTR INTEGER NEWINPUTCHAN, ARGS) $"#
C00021 00009 PUBLIC STRING SIMPLE PROCEDURE SWICHBACK $"#
C00023 00010 PUBLIC SIMPLE PROCEDURE SWICHF(STRING FILENAME) $"#
C00024 00011 PRIVATE SIMPLE PROCEDURE SWICHFILE(STRING FILENAME INTEGER CHAN) $"#
C00026 00012 FINISHED
C00027 ENDMK
C⊗;
BEGOF("SORCE")
COMMENT
*** Variations at Different Sites ***
SWICHFILE has to ignore the directory page on TV files at SU-AI.
SORCE! differentiates file naming at TENEX sites. SORCE! also
has an optional feature presently enabled only at PARC: if there is a
file named MYPUB.DFS in the user directory, it is automatically
REQUIREd after PUBSTD.DFS.
***
Source switching and scanning module. The principal data structure
is INPUTSTR, the current string being scanned. RD scans it and also
replenishes it when exhausted. The INEST and SNEST arrays remember
sources that have been pushed down due to macro calls, REQUIRE
SOURCE!FILE, etc.
;
PROCEDURES
PUBLIC SIMPLE PROCEDURE SORCE! ;$"#
BEGIN "SORCE!"
INPUTCHAN ← -1 ;
INPUTSTR ← CRLF & "99999/99" & TB & TB &
"<<)]"&RCBRAK&"⊃>>;END""PAST EOF"";END""PASSED EOF"";" ;
S ← TEXT!BRC ← CRLF & ALTMODE & RUBOUT & VT & " -.!?" ;
WHILE FULSTR(S) DO DPB(LDB(SPCHAR(J ← LOP(S))), SPCODE(J)) ;
DEFN!BRC ← RCBRAK&"$)⊂⊃∃" & LF & LETTS ;
LDEFN!BRC ← LENGTH(DEFN!BRC) ;
SETBREAK(TO!VT!SKIP, VT, NULL, "IS") ;
SETBREAK(TO!COMMA!RPAR, ",)" & LF, CR, "IR") ;
SETBREAK(TO!TERQ!CR, RCBRAK&";),]⊂"&CRLF, NULL, "IR") ;
SETBREAK(TO!SEMI!SKIP, ";"&RCBRAK&""&LF, NULL, "IS") ;
SETBREAK(NO!CHARS, NULL, NULL, "XRL");
SETBREAK(ONE!CHAR, NULL, NULL, "XA") ;
SETBREAK(TO!TB!FF!SKIP, TB&FF, LF, "IS") ;
SETBREAK(TO!LF!TB!VT!SKIP, LF&TB&VT, FF, "ISL");
SETBREAK(TO!VISIBLE, SP&CR, NULL, "XR") ;
SETBREAK(ALPHA, LETTS&DIGS, NULL, "XR") ;
SETBREAK(DIGITA, DIGS, NULL, "XR") ;
SETBREAK(TO!QUOTE!APPD, """"&LF, NULL, "IA") ;
SETBREAK(TO!NON!SP, SP, NULL, "XR") ;
SETBREAK(TEXT!TBL, TEXT!BRC&SIG!BRC,NULL, "IS") ;
SETBREAK(TO!VBAR!SKIP, "|"&LF, CR, "IS") ;
SETBREAK(DEFN!TABLE, DEFN!BRC, NULL, "IS") ;
SETBREAK(TO!CR!SKIP, CRLF, NULL, "IS") ;
SWICH(CRLF & "9999/98" & TB & TB &
"CLOSE TEXT;AFTER TEXT⊂⊃;NEXT PAGE;END ""!MANUSCRIPT"" ",
-1, 0) ;
SWICHFILE(INFILE, INCHAN) ; comment main input file ;
IFC PARCVER OR ISIVER THENC RT01 10/25/74;
BEGIN TES 1/22/74 OPTIONAL MYPUB.DFS ON USER DIRECTORY ;
INTEGER CHAN ; EOF ← 0 ; CHAN ← GETCHAN ;
OPEN(CHAN, "DSK", 0, 2, 0, 150, BRC, EOF) ;
LOOKUP(CHAN, "MYPUB"&DFSEXT, FLAG) ;
IF FLAG THEN RELEASE(CHAN)
ELSE SWICHFILE("MYPUB"&DFSEXT,CHAN) ;
END ;
ENDC TES 1/22/74 ;
SWICH("BEGIN ""!MANUSCRIPT"" ", -1, 0) ;
PUBSTD ← TRUE ; COMMENT SUPPRESS PAGE NUMBER MONITORING ;
IFC TENEX THENC
SWICHF(LIBPPN & "PUBSTD"&DFSEXT) ;
ELSEC
SWICHF((JOBNAM&"STD")[1 TO 6]&DFSEXT&LIBPPN) ; comment standard modes and macros ;
BH 3/14/75 IF PASS1 IS NPUB.DMP, USE NPUBST.DFS;
ENDC
END "SORCE!" ;
PUBLIC SIMPLE PROCEDURE BURPINPUT(BOOLEAN VERBOSE) ;$"#
BEGIN
INTEGER L; STRING SL ;
OUTSTR("LINE/PAGE "&ERRLINE&"/"&SRCPAGE&TB&
SOMEINPUT[1 TO (IF VERBOSE THEN 300 ELSE 60)] ) ;
OUTSTR(CRLF&" - - - - - - - - - - - - - - - - - - - -"&CRLF) ;
FOR L ← LAST STEP -2 UNTIL (IF VERBOSE THEN 6 ELSE 6 MAX LAST-6) DO
BEGIN
SL ← LINESCAN(L) ;
IF CHANSCAN(L) GEQ 0 THEN OUTSTR(SCAN(SL,TO!VT!SKIP,DUMMY)) ;
OUTSTR(SP & SL & "/" & CVS(LH(DUMMY←ABS(PAGESCAN(L)))) & TB) ;
OUTSTR(STRSCAN(L)[1 TO (IF VERBOSE THEN 300 ELSE 60)]) ;
OUTSTR(CRLF&" - - - - - - - - - - - - - - - - - - - -"&CRLF) ;
END ;
END "BURPINPUT" ;
PUBLIC SIMPLE PROCEDURE DREQUIRE ;$"#
BEGIN
STRING F ;
PASS ; F ← E(NULL, "SOURCE!FILE") ;
IF NOT EQU(THISWD[1 TO 6],"SOURCE") THEN
WARN("=","REQUIRE -- SOURCE!FILE only!") ;
IF NEXTS(FILE) THEN PASS ; TES 10/22/74 DWIM ;
IF FULSTR(F) AND ON THEN SWICHF(F) ; PASS ;
END "DREQUIRE" ;
PUBLIC SIMPLE PROCEDURE GROWNESTS ;$"#
BEGIN "GROWNESTS"
GROW(INEST, INESTIDA, SIZE, 200, NULL) ; MAKEBE(INESTIDA, INEST) ;
DUMMY ← 0 ; COMMENT OTHERWISE SPURIOUS MESSAGE FROM SGROW 2/28/73 TES ;
SGROW(SNEST, SNESTIDA, DUMMY, 200, NULL) ; SMAKEBE(SNESTIDA, SNEST) ;
ZEROSTRINGS(200, SNEST[SIZE-199]) ;
END "GROWNESTS" ;
PUBLIC STRING SIMPLE PROCEDURE RD(INTEGER BRKTBL) ;$"#
BEGIN
COMMENT INPUTSTR = [ [chars] LF line-no TB ]... [chars]
All break tables should break on LF.
RD's value is as if LF line-no TB were null. ;
INTEGER PTR, BYTEWD ; STRING SPTR, RESULT, PART ;
RESULT ← NULL ;
DO BEGIN "PARTIAL"
PART ← SCAN(INPUTSTR, BRKTBL, BRC) ;
IF BRC = LF THEN
BEGIN "MACRO LINE NUMBER"
MACLINE ← SCAN(INPUTSTR, TO!TB!FF!SKIP, DUMMY) ;
IF PART[∞ FOR 1] = LF THEN comment he Appended the break character ;
PART ← IF DEFINING THEN PART & MACLINE & TB ELSE PART[1 TO ∞-1]
ELSE IF DEFINING THEN PART ← PART & LF & MACLINE & TB ;
END "MACRO LINE NUMBER"
ELSE IF BRC = 0 THEN comment, ran out of input ;
IF INPUTCHAN < 0 THEN INPUTSTR ← SWICHBACK comment, done scanning macro body ;
ELSE BEGIN "FROM FILE"
DO BEGIN comment, may be page marks or eof or more lines ;
IF TECOFILE THEN
BEGIN COMMENT CHECK FOR FF AND SUPERFLUOUS LFs ;
SRCLINE ← CVS(CVD(SRCLINE)+1) ;
INPUT(INPUTCHAN, NO!CHARS) ;
WHILE BRC = LF DO
BEGIN
INPUT(INPUTCHAN,ONE!CHAR) ;
INPUT(INPUTCHAN,NO!CHARS) ;
END ;
END
ELSE SRCLINE ← INPUT(INPUTCHAN, TO!TB!FF!SKIP) ;
IF BRC = FF THEN
BEGIN "PGMARK"
PAGEMARKS ← PAGEMARKS + 1 ;
IF TECOFILE THEN
BEGIN
INPUT(INPUTCHAN, ONE!CHAR) ;
SRCLINE ← "0" ;
END ;
WHILE INPGS AND LAST=4 AND BRC=FF AND PAGEMARKS>RH(INPG[INPGX]) DO
IF (INPGX←INPGX+1)>INPGS THEN BEGIN BRC←0 ; EOF←1 END
ELSE IF PAGEMARKS<(K←LH(INPG[INPGX])) THEN
DO BEGIN "SKIP PAGES"
DO INPUT(INPUTCHAN,TO!LF!TB!VT!SKIP)
UNTIL BRC NEQ TB;
IF BRC = LF THEN
DO BEGIN
SRCLINE←INPUT(INPUTCHAN,TO!TB!FF!SKIP);
IF BRC=FF THEN PAGEMARKS←PAGEMARKS+1 ;
END UNTIL BRC NEQ FF ;
END "SKIP PAGES"
UNTIL BRC NEQ TB OR PAGEMARKS GEQ K ;
IF NOT EOF THEN
BEGIN COMMENT COMPUTE AND DISPLAY PAGE NUMBER ;
SRCPAGE ← CVS(PAGEMARKS) ;
IF NOT PUBSTD THEN OUTSTR((
IF SWDBACK THEN SPS(LAST-3)
ELSE SP
)&SRCPAGE) ;
SWDBACK ← 0 ;
END ;
END "PGMARK" ;
END
UNTIL BRC NEQ FF ;
MACLINE ← NULL ;
IF EOF THEN INPUTSTR ← SWICHBACK comment, done scanning a SOURCE!FILE or gen-file;
ELSE BEGIN "FILE LINE"
DO BEGIN "EXPAND TABS"
INPUTSTR ← INPUTSTR & INPUT(INPUTCHAN,TO!LF!TB!VT!SKIP) ;
IF BRC=TB THEN INPUTSTR←INPUTSTR&
(IF PAGESCAN(LAST) GEQ 0 THEN
IF TABTAB=0 THEN
SPS(8-LENGTH(INPUTSTR) MOD 8)
ELSE TABTAB
ELSE TB)
ELSE IF BRC=VT THEN
IF INPUTSTR[∞ FOR 1]=RCBRAK THEN INPUTSTR←INPUTSTR&VT
ELSE
BEGIN "GENVT" COMMENT MAYBE {PAGE!} IN GEN-FILE ;
SPTR ← INPUT(INPUTCHAN, TO!VT!SKIP) ;
IF (PTR ← CVD(SPTR)) GEQ TWO(14)
AND LDB(PLIGHTWD(BYTEWD←ITBL[PTR-TWO(14)]))=2
THEN
BEGIN
BREAKSET(LOCAL!TABLE,ALTMODE,"IS");
BREAKSET(LOCAL!TABLE,NULL,"O");
S ← STBL[LDB(IXWD(BYTEWD))] ;
INPUTSTR ← INPUTSTR[1 TO ∞-6] &
SCAN(S,LOCAL!TABLE,DUMMY);
END
ELSE INPUTSTR ← INPUTSTR & VT & SPTR & VT ;
END "GENVT"
END "EXPAND TABS"
UNTIL BRC = LF OR BRC < 0 OR EOF ;
IF BRC LEQ 0 THEN
BEGIN BRC ← LF ;
IF NOT EOF THEN
WARN("=","Garbaged manuscript "&ERRLINE&"/"&SRCPAGE)
END ;
IF DEFINING THEN PART ← PART & LF & SRCLINE & "/" & SRCPAGE & TB ;
END "FILE LINE" ;
END "FROM FILE" ;
IF BRC = LF THEN
IF DEFINING THEN BEGIN BRC←0 ; IF INPUTSTR=!COMMAND!CHARACTER! THEN
BEGIN PART ← PART & TB ; LOPP(INPUTSTR) ; END END
ELSE IF INPUTSTR = !COMMAND!CHARACTER! OR INPUTSTR = TB THEN
BEGIN
LOPP(INPUTSTR) ;
BRC ← 0 ; comment, keep scanning ;
END
ELSE INPUTSTR ← (BRC ← RCBRAK) & VT & INPUTSTR ;
IF BRC THEN RETURN(IF LENGTH(RESULT)=0 THEN PART
ELSE IF LENGTH(PART)=0 THEN RESULT
ELSE RESULT & PART)
ELSE IF LENGTH(RESULT)=0 THEN RESULT ← PART
ELSE RESULT ← RESULT & PART ;
END "PARTIAL"
UNTIL FALSE ;
END "RD" ;
PUBLIC SIMPLE PROCEDURE SWICH(STRING NEWINPUTSTR; INTEGER NEWINPUTCHAN, ARGS) ;$"#
BEGIN "SWICH" comment switch to new input stream ;
IF ARGS THEN
BEGIN "SUBSTITUTE"
INTEGER BRC ; STRING NEWER ; NEWER ← NULL ; LAST ← LAST - ARGS ;
DO BEGIN "VTABS"
NEWER ← NEWER & SCAN(NEWINPUTSTR, TO!VT!SKIP, BRC) ;
IF BRC THEN NEWER ← NEWER & SNEST[LAST + LOP(NEWINPUTSTR)] ;
END "VTABS"
UNTIL BRC = 0 ;
NEWINPUTSTR ← NEWER ;
END "SUBSTITUTE" ;
IF (LAST ← LAST+2) > SIZE THEN GROWNESTS ;
STRSCAN(LAST) ← IF THATISFULL THEN LIT!ENTITY & LIT!TRAIL & INPUTSTR ELSE INPUTSTR ;
CHANSCAN(LAST) ← INPUTCHAN + (IF TECOFILE THEN 100 ELSE 0) ;
LINESCAN(LAST) ← IF INPUTCHAN < 0 THEN MACLINE ELSE THISFILE & VT & SRCLINE ;
PAGESCAN(LAST) ← LHRH(PAGEMARKS, PAGEWAS) ;
EMPTYTHIS ; EMPTYTHAT ;
INPUTSTR ← NEWINPUTSTR ; INPUTCHAN ← NEWINPUTCHAN ; TECOFILE ← 0 ;
END "SWICH" ;
PUBLIC STRING SIMPLE PROCEDURE SWICHBACK ;$"#
BEGIN "SWICHBACK"
EOF ← 0 ; IF INPUTCHAN GEQ 0 THEN
BEGIN
IF PUBSTD THEN PUBSTD ← FALSE
ELSE IF SWFLG AND NOT SWDBACK THEN BEGIN OUTSTR("."&CRLF) ; SWDBACK←TRUE END ;
RELEASE(INPUTCHAN) ;
END
ELSE IF CHANSCAN(LAST) LEQ -2 THEN RETURN(INPUTSTR←STRSCAN(LAST)) ;
PAGEMARKS ← LH(DUMMY ← ABS(PAGESCAN(LAST))) ; PAGEWAS ← RH(DUMMY) ;
SRCPAGE ← CVS(PAGEMARKS) ;
IF (INPUTCHAN ← CHANSCAN(LAST))< 0 THEN MACLINE←LINESCAN(LAST)
ELSE BEGIN SRCLINE←LINESCAN(LAST);
THISFILE←SCAN(SRCLINE,TO!VT!SKIP,DUMMY) END ;
IF TECOFILE ← INPUTCHAN > 50 THEN INPUTCHAN ← INPUTCHAN - 100 ;
INPUTSTR ← STRSCAN(LAST) ; LAST←LAST-2; RETURN(INPUTSTR) ;
END "SWICHBACK" ;
PUBLIC SIMPLE PROCEDURE SWICHF(STRING FILENAME) ;$"#
BEGIN "SWICHF"
TES 8/24/74 PROCEDURIZED AND ALLOWED DEFAULTS ;
INTEGER CHAN ;
CHAN ← OPENTOREAD(0, IF AGENFILE THEN "Generated File " ELSE "Source!file ", FILENAME, REQEXT, REQPPN) ;
SWICHFILE(FILENAME, CHAN) ;
END "SWICHF" ;
PRIVATE SIMPLE PROCEDURE SWICHFILE(STRING FILENAME ; INTEGER CHAN) ;$"#
BEGIN COMMENT FILE ALREADY OPEN ON CHAN ;
TES 1/22/74 SUBROUTINIZED ; TES 3/23/74 SIMPLIFIED ;
SWICH(NULL, CHAN, 0) ;
IF AGENFILE THEN BEGIN TECOFILE←0 ; AGENFILE←FALSE END
ELSE BEGIN INPUT(INPUTCHAN, NO!CHARS) ; TECOFILE ← BRC GEQ 0 END ;
PAGEMARKS ← PAGEWAS ← 1 ; SRCPAGE ← "1" ; SRCLINE ← IF TECOFILE THEN "0" ELSE "00000" ;
IFC SAILVER THENC
IF TECOFILE THEN
BEGIN COMMENT IF TVEDIT FILE, SKIP PAGE 1 ;
IF EQU("COMMENT ⊗", INPUT(INPUTCHAN,TO!TERQ!CR)[1 TO 9]) THEN
BEGIN
DO INPUT(INPUTCHAN, TO!TB!FF!SKIP) UNTIL BRC=FF ;
SRCPAGE ← "2" ; PAGEMARKS ← PAGEWAS ← 2 ;
END
ELSE BEGIN CLOSIN(INPUTCHAN) ; COMMENT NOT TVEDIT -- RESTART INPUT ;
LOOKUP(CHAN,FILENAME,FLAG);
END END ;
ENDC
THISFILE ← FILENAME ;
IF NOT PUBSTD THEN
BEGIN
IF LAST =4 AND SWFLG=0 THEN TES ADDED SWFLG 12/5/73 ;
BEGIN MAINFILE←THISFILE ; SWFLG ← 1 END
ELSE BEGIN IF NOT SWDBACK THEN OUTSTR(CRLF) ; OUTSTR(SPS(LAST-4)) ; END ;
OUTSTR(THISFILE&SP&SRCPAGE) ; SWDBACK ← FALSE ;
END ;
END "SWICHFILE" ;
FINISHED
ENDOF("SORCE")