|
DataMuseum.dkPresents historical artifacts from the history of: MIKADOS |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about MIKADOS Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 17888 (0x45e0) Notes: Mikados TextFile, Mikados_K Names: »PXREF«
└─⟦89d8689a3⟧ Bits:30003591 MIKADOS Pascal compiler (01.02.1982 E) └─ ⟦this⟧ »PXREF«
PROGRAM PXREF; (* Based on program in Peter Grogono : "Programming in PASCAL" Modified for DDE use DI - 811207 PASCAL Cross Reference program *) CONST MAXLINES = 1999; MAXWORDLEN = 20; MAXLINELEN = 79; MAXONPAGE = 61; MAXPAGES = 99; HEADINGSIZE = 3; ENTRYGAP = 0; NUMBERGAP = 2; RADIX = 10; MAXKEYWORD = 36; BLANK = ' '; HEADING = 'Pascal cross-reference list of : '; TYPE PARMARRAY = PACKED ARRAY (1..40) OF CHAR; CLOCKRECORD = RECORD DATE: PACKED ARRAY (1..10) OF CHAR; TIME: PACKED ARRAY (1..8) OF CHAR END; COUNTER = 1 .. MAXLINES; WORDINDEX = 1 .. MAXWORDLEN; PAGEINDEX = 1 .. MAXONPAGE; PAGENUMBER = 1 .. MAXPAGES; LINEINDEX = 1 .. MAXLINELEN; WORDTYPE = STRING(MAXWORDLEN); QUEUEPOINTER = ^QUEUEITEM; QUEUEITEM = RECORD LINENUMBER: COUNTER; NEXTINQUEUE: QUEUEPOINTER END; ENTRYTYPE = RECORD WORDVALUE: WORDTYPE; FIRSTINQUEUE,LASTINQUEUE: QUEUEPOINTER END; TREEPOINTER = ^NODE; NODE = RECORD ENTRY: ENTRYTYPE; LEFT, RIGHT: TREEPOINTER END; VAR PARM: ^PARMARRAY; CLOCK: ^CLOCKRECORD; WORDTREE: TREEPOINTER; LETTERS, TALOGTEGN: SET OF CHAR; INDFIL: TEXT; FILNAVN: STRING(20); JANEJ: STRING(1); SMÅTILSTORE: BOOLEAN; KEYWORDLIST: ARRAY (1..MAXKEYWORD) OF STRING(9); KEYWORD: BOOLEAN; POINTLIST: BOOLEAN; (* point list on terminal *) I: INTEGER; INCLUDEFIL: TEXT; (* include file *) INCLUDENAME: STRING(20); INCLUDE: BOOLEAN; PROCEDURE SLUT; BEGIN WRITELN('Cross-reference of ',FILNAVN,' aborted'); EXIT(PXREF) END; PROCEDURE LÆSKEYWORD; BEGIN KEYWORDLIST(01) := 'AND'; KEYWORDLIST(02) := 'ARRAY'; KEYWORDLIST(03) := 'BEGIN'; KEYWORDLIST(04) := 'CASE'; KEYWORDLIST(05) := 'CONST'; KEYWORDLIST(06) := 'DIV'; KEYWORDLIST(07) := 'DO'; KEYWORDLIST(08) := 'DOWNTO'; KEYWORDLIST(09) := 'ELSE'; KEYWORDLIST(10) := 'END'; KEYWORDLIST(11) := 'FILE'; KEYWORDLIST(12) := 'FOR'; KEYWORDLIST(13) := 'FUNCTION'; KEYWORDLIST(14) := 'GOTO'; KEYWORDLIST(15) := 'IF'; KEYWORDLIST(16) := 'IN'; KEYWORDLIST(17) := 'LABEL'; KEYWORDLIST(18) := 'MOD'; KEYWORDLIST(19) := 'NIL'; KEYWORDLIST(20) := 'NOT'; KEYWORDLIST(21) := 'OF'; KEYWORDLIST(22) := 'OR'; KEYWORDLIST(23) := 'OTHERWISE'; KEYWORDLIST(24) := 'PACKED'; KEYWORDLIST(25) := 'PROCEDURE'; KEYWORDLIST(26) := 'PROGRAM'; KEYWORDLIST(27) := 'RECORD'; KEYWORDLIST(28) := 'REPEAT'; KEYWORDLIST(29) := 'SET'; KEYWORDLIST(30) := 'THEN'; KEYWORDLIST(31) := 'TO'; KEYWORDLIST(32) := 'TYPE'; KEYWORDLIST(33) := 'UNTIL'; KEYWORDLIST(34) := 'VAR'; KEYWORDLIST(35) := 'WHILE'; KEYWORDLIST(36) := 'WITH'; END; PROCEDURE SØGKEYWORD(SØGEORD: WORDTYPE); VAR FIRST, LAST,I: 1 .. MAXKEYWORD; BEGIN FIRST:=1; LAST:=MAXKEYWORD; WHILE FIRST<LAST DO BEGIN I:=(LAST+FIRST) DIV 2; IF SØGEORD > KEYWORDLIST(I) THEN BEGIN FIRST:=I+1; IF FIRST>LAST THEN FIRST:=LAST; END ELSE IF SØGEORD < KEYWORDLIST(I) THEN BEGIN LAST:=I-1; IF FIRST>LAST THEN LAST:=FIRST; END ELSE BEGIN LAST:=I; FIRST:=LAST; END; END; KEYWORD:= SØGEORD = KEYWORDLIST(FIRST); IF NOT KEYWORD THEN END; PROCEDURE BUILDTREE( VAR TREE: TREEPOINTER); VAR CURRENTWORD: WORDTYPE; CURRENTLINE: COUNTER; TILSTAND: INTEGER; PROCEDURE GETWORD ( VAR WORD: WORDTYPE; VAR LINE: COUNTER); VAR CURRENTCHAR: CHAR; INDEX, BLANKINDEX: 0 .. MAXWORDLEN; PROCEDURE GETCHAR ( VAR CH: CHAR; VAR LIN: COUNTER); BEGIN (* GETCHAR *) IF EOF(OUTPUT) THEN SLUT; IF INCLUDE THEN BEGIN IF EOF(INCLUDEFIL) THEN BEGIN INCLUDE:=FALSE; CLOSE(INCLUDEFIL); CH := BLANK; END ELSE IF ((EOLN(INCLUDEFIL)) AND (CH IN LETTERS+TALOGTEGN)) THEN CH:=BLANK ELSE IF EOLN(INCLUDEFIL) THEN BEGIN CH := BLANK; LIN := LIN +1; IF POINTLIST THEN BEGIN WRITE('.'); IF (LIN MOD 50) = 0 THEN BEGIN WRITELN; WRITE('<><',LIN:4,'>'); END; END; READLN(INCLUDEFIL) END ELSE READ(INCLUDEFIL,CH); END ELSE IF EOF(INDFIL) THEN CH := BLANK ELSE IF ((EOLN(INDFIL)) AND (CH IN LETTERS+TALOGTEGN)) THEN CH:=BLANK ELSE IF EOLN(INDFIL) THEN BEGIN CH := BLANK; LIN := LIN +1; IF POINTLIST THEN BEGIN WRITE('.'); IF (LIN MOD 50) = 0 THEN BEGIN WRITELN; WRITE('<><',LIN:4,'>'); END; END; READLN(INDFIL) END ELSE READ(INDFIL,CH); IF (CH IN (. 'a'..'å' .)) AND SMÅTILSTORE THEN CH := CHR( ORD(CH) - (ORD('a') - ORD('A'))); END; (* GETCHAR *) BEGIN (* GETWORD *) INCLUDENAME:=''; WORD:=' '; TILSTAND:=1; REPEAT GETCHAR(CURRENTCHAR,LINE); CASE TILSTAND OF (* Normal *) 1: IF (CURRENTCHAR = '''') THEN TILSTAND := 2 ELSE IF (CURRENTCHAR = '(') THEN TILSTAND := 3; (* After ' *) 2: IF (CURRENTCHAR = '''') THEN TILSTAND := 1; (* After ( *) 3: IF (CURRENTCHAR = '*') THEN TILSTAND := 4 ELSE IF (CURRENTCHAR = '''') THEN TILSTAND := 2 ELSE TILSTAND := 1; (* After (* *) 4: IF (CURRENTCHAR = '$') THEN TILSTAND := 7 ELSE TILSTAND := 5; (* Comment *) 5: IF (CURRENTCHAR = '*') THEN TILSTAND := 6; (* After * *) 6: IF (CURRENTCHAR = ')') THEN TILSTAND := 1 ELSE TILSTAND := 5; (* Option *) 7: IF (CURRENTCHAR = 'I') THEN TILSTAND := 9 ELSE TILSTAND := 8; (* Op.not I *) 8: IF (CURRENTCHAR = ',') THEN TILSTAND := 7 ELSE IF (CURRENTCHAR = '*') THEN TILSTAND := 6; (* Include *) 9: IF (CURRENTCHAR = '*') THEN BEGIN INCLUDE:=TRUE; RESET(INCLUDEFIL,INCLUDENAME); READLN(INCLUDEFILE); TILSTAND:=1; LINE:=LINE+1; END ELSE BEGIN (*$R-*) INCLUDENAME(0):= CHR(ORD(INCLUDENAME(0))+1); (*$R+*) INCLUDENAME(LENGTH(INCLUDENAME)):=CURRENTCHAR; END; END; UNTIL ((CURRENTCHAR IN LETTERS) AND (TILSTAND = 1)) OR EOF(INDFIL); IF NOT EOF(INDFIL) THEN BEGIN INDEX := 0; WHILE CURRENTCHAR IN LETTERS+TALOGTEGN DO BEGIN IF INDEX < MAXWORDLEN THEN BEGIN INDEX := INDEX +1; WORD(INDEX) := CURRENTCHAR; END; IF EOF(INDFIL) THEN CURRENTCHAR := BLANK ELSE GETCHAR(CURRENTCHAR,LINE) END; (* WHILE *) (*$R-*) WORD(0):=CHR(INDEX); (*$R+*) END END; (* GETWORD *) PROCEDURE ENTERTREE ( VAR SUBTREE: TREEPOINTER; WORD: WORDTYPE; LINE: COUNTER); VAR NEXTITEM: QUEUEPOINTER; BEGIN (* ENTERTREE *) IF SUBTREE = NIL THEN BEGIN (* CREATE NEW ENTRY *) NEW(SUBTREE); WITH SUBTREE^ DO BEGIN LEFT := NIL; RIGHT := NIL; WITH ENTRY DO BEGIN WORDVALUE := WORD; NEW(FIRSTINQUEUE); LASTINQUEUE := FIRSTINQUEUE; WITH FIRSTINQUEUE^ DO BEGIN LINENUMBER := LINE; NEXTINQUEUE := NIL END (* WITH FIRSTINQUEUE^ *) END (* WITH ENTRY *) END (* WITH SUBTREE^ *) END ELSE (* APPEND A LIST ITEM *) WITH SUBTREE^,ENTRY DO IF WORD = WORDVALUE THEN BEGIN IF LASTINQUEUE^.LINENUMBER <> LINE THEN BEGIN NEW(NEXTITEM); WITH NEXTITEM^ DO BEGIN LINENUMBER := LINE; NEXTINQUEUE := NIL END; (* WITH NEXTITEM^ *) LASTINQUEUE^.NEXTINQUEUE := NEXTITEM; LASTINQUEUE := NEXTITEM END END ELSE IF WORD < WORDVALUE THEN ENTERTREE(LEFT,WORD,LINE) ELSE ENTERTREE(RIGHT,WORD,LINE) END; (* ENTERTREE *) BEGIN (* BUILDTREE *) CURRENTLINE := 1; WHILE NOT EOF(INDFIL) DO BEGIN GETWORD(CURRENTWORD,CURRENTLINE); SØGKEYWORD(CURRENTWORD); IF NOT EOF(INDFIL) AND (NOT KEYWORD) THEN ENTERTREE(TREE,CURRENTWORD,CURRENTLINE) END (* WHILE *) END; (* BUILDTREE *) PROCEDURE PRINTTREE ( TREE: TREEPOINTER); VAR PAGEPOSITION: PAGEINDEX; NUMBERWIDTH, MAXONLINE: LINEINDEX; PAGECOUNTER: PAGENUMBER; PROCEDURE PRINTENTRY ( SUBTREE: TREEPOINTER; VAR POSITION: PAGEINDEX); VAR INDEX: WORDINDEX; ITEMCOUNT: 0 .. MAXLINELEN; ITEMPTR: QUEUEPOINTER; PROCEDURE PRINTLINE ( VAR CURRENTPOSITION: PAGEINDEX; NEWLINES: PAGEINDEX); VAR LINECOUNTER: PAGEINDEX; BEGIN (* PRINTLINE *) IF CURRENTPOSITION + NEWLINES < MAXONPAGE THEN BEGIN FOR LINECOUNTER := 1 TO NEWLINES DO WRITELN(LIST); CURRENTPOSITION := CURRENTPOSITION + NEWLINES END ELSE BEGIN WRITELN(LIST); IF PAGECOUNTER > 1 THEN PAGE( LIST ); WRITE(LIST,HEADING,FILNAVN:12,'DATE: ':15,CLOCK^.DATE); WRITELN(LIST,' - PAGE ',PAGECOUNTER); FOR LINECOUNTER := 1 TO HEADINGSIZE - 1 DO WRITELN(LIST); CURRENTPOSITION := HEADINGSIZE + 1; PAGECOUNTER := PAGECOUNTER + 1 END END; (* PRINTLINE *) BEGIN (* PRINTENTRY *) IF EOF(OUTPUT) THEN SLUT; IF SUBTREE <> NIL THEN WITH SUBTREE^ DO BEGIN PRINTENTRY(LEFT,POSITION); PRINTLINE(POSITION,ENTRYGAP + 1); WITH ENTRY DO BEGIN WRITE(LIST,WORDVALUE,'':(MAXWORDLEN-LENGTH(WORDVALUE))); ITEMCOUNT := 0; ITEMPTR := FIRSTINQUEUE; WHILE ITEMPTR <> NIL DO BEGIN ITEMCOUNT := ITEMCOUNT + 1; IF ITEMCOUNT > MAXONLINE THEN BEGIN PRINTLINE(POSITION,1); WRITE(LIST,BLANK : MAXWORDLEN); ITEMCOUNT := 1 END; WRITE(LIST,ITEMPTR^.LINENUMBER : NUMBERWIDTH); ITEMPTR := ITEMPTR^.NEXTINQUEUE END (* WHILE *) END; (* WITH ENTRY *) PRINTENTRY(RIGHT,POSITION) END (* WITH SUBTREE *) END; (* PRINTENTRY *) BEGIN (* PRINTTREE *) NUMBERWIDTH := TRUNC(LN(MAXLINES)/LN(RADIX)) + 1 + NUMBERGAP; MAXONLINE := (MAXLINELEN - MAXWORDLEN) DIV NUMBERWIDTH; PAGEPOSITION := MAXONPAGE; PAGECOUNTER := 1; PRINTENTRY(TREE,PAGEPOSITION); WRITELN(LIST); PAGE( LIST ) END; (* PRINTTREE *) BEGIN (* PXREF *) WRITELN; WRITELN('Pascal cross-reference program initiated'); LÆSKEYWORD; IF PARM^(1) <> ' ' THEN BEGIN FILNAVN:=' '; I:=1; WHILE (PARM^(I)<> ' ') AND (PARM^(I)<>',') DO BEGIN FILNAVN(I):=PARM^(I); I:=I+1; END; (*$R-*) FILNAVN(0):=CHR(I-1); (*$R+*) RESET( INDFIL,FILNAVN ); IF IORESULT = 1 THEN BEGIN WRITELN('File not found'); SLUT; END; READLN( INDFIL ); POINTLIST := FALSE; IF PARM^(I) = ',' THEN POINTLIST:= PARM^(I+1) = 'L'; SMÅTILSTORE := TRUE; LETTERS := (. 'A'..'Å' .); END ELSE BEGIN WRITELN; FILNAVN := ' '; WRITE('Enter file name: '); READLN; READ(FILNAVN); IF EOF THEN SLUT; RESET( INDFIL,FILNAVN ); IF IORESULT = 1 THEN BEGIN WRITELN('File not found'); SLUT; END; READLN( INDFIL ); POINTLIST:=TRUE; JANEJ := 'Y'; WRITE('Convert small letters ? '); EDIT( JANEJ ); IF EOF THEN SLUT; IF JANEJ(1) IN (. 'y','Y' .) THEN BEGIN SMÅTILSTORE := TRUE; LETTERS := (. 'A'..'Å' .); END ELSE BEGIN LETTERS := (. 'A'..'Å','a'..'å' .); SMÅTILSTORE := FALSE; END; END; IF POINTLIST THEN WRITE('<>< 0>.'); INCLUDE:=FALSE; TALOGTEGN := (. '0'..'9','^','_' .); WORDTREE := NIL; BUILDTREE(WORDTREE); IF POINTLIST THEN WRITELN; PRINTTREE(WORDTREE); CLOSE(INDFIL); WRITELN('Cross-reference of ',FILNAVN,' completed'); END. (* PXREF *)