IMPLEMENTATION MODULE ImpLists; (* * REPERTOIRE * Release 1.6 * By Charles Bradford and Cole Brecheen * (c) Copyright 1985-1992 PMI * Green Bay, Wisconsin * All rights reserved * (414) 468-6040 * * $Header: *) IMPORT ErrorManager; IMPORT GenLists; IMPORT M2Strings; IMPORT Parser; IMPORT PosUtils; IMPORT StrEdit; PROCEDURE ExtractImportList( VAR TextList, Imports: GenLists.GenList; VAR StartOfImpList, EndOfImpList: CARDINAL ); VAR x, CurrentWord, LastWord: ARRAY [0..79] OF CHAR; Terminator: CHAR; LineCnt, ColCnt: CARDINAL; PROCEDURE LastWordWas( TheStr: ARRAY OF CHAR ): BOOLEAN; BEGIN RETURN M2Strings.CompareStr( TheStr, LastWord ) = 0; END LastWordWas; PROCEDURE CurrentWordIs( TheStr: ARRAY OF CHAR ): BOOLEAN; BEGIN RETURN M2Strings.CompareStr( TheStr, CurrentWord ) = 0; END CurrentWordIs; PROCEDURE NextWord( VAR TheStr: ARRAY OF CHAR ); BEGIN Parser.GetNextWord( TextList, LineCnt, ColCnt, TheStr, Terminator ); M2Strings.Assign( CurrentWord, LastWord ); M2Strings.Assign( TheStr, CurrentWord ); END NextWord; PROCEDURE EndOfImports(): BOOLEAN; BEGIN IF CurrentWordIs( 'CONST' ) THEN RETURN TRUE; ELSIF CurrentWordIs( 'VAR' ) THEN RETURN TRUE; ELSIF CurrentWordIs( 'EXPORT' ) THEN RETURN TRUE; ELSIF CurrentWordIs( 'PROCEDURE' ) THEN RETURN TRUE; ELSIF CurrentWordIs( 'TYPE' ) THEN RETURN TRUE; ELSIF CurrentWordIs( 'BEGIN' ) THEN RETURN TRUE; ELSIF CurrentWordIs( 'END' ) THEN RETURN TRUE; ELSIF (LineCnt >= GenLists.ListLength(TextList)) THEN RETURN TRUE; ELSE RETURN FALSE; END; END EndOfImports; PROCEDURE EndOfStatement(): BOOLEAN; BEGIN RETURN PosUtils.Equal( x, 'FROM' ) OR PosUtils.Equal( x, 'IMPORT' ) OR EndOfImports(); END EndOfStatement; VAR SubList: GenLists.GenList; BEGIN StrEdit.SetLength( Parser.TheLine, 0 ); GenLists.NewList( Imports ); LineCnt := 1; ColCnt := 0; StartOfImpList := 0; EndOfImpList := 0; LastWord := ''; CurrentWord := ''; REPEAT NextWord( x ); IF EndOfImports() THEN RETURN; END; UNTIL EndOfStatement(); StartOfImpList := LineCnt; REPEAT NextWord( x ); IF LastWordWas( 'FROM' ) THEN GenLists.ListInsert( x, GenLists.StrCode, Imports, 65535 ); (* Append module name to Imports. *) GenLists.NewList( SubList ); NextWord( x ); (* skip the 'IMPORT' *) LOOP NextWord( x ); IF EndOfStatement() THEN EXIT; ELSE GenLists.ListInsert( x, GenLists.StrCode, SubList, 65535 ); END; END; GenLists.ListInsert( SubList, GenLists.ListCode, Imports, 65535 ); ELSIF LastWordWas( 'IMPORT' ) THEN GenLists.ListInsert( x, GenLists.StrCode, Imports, 65535 ); (* Append module name to Imports. *) GenLists.NilList( SubList ); GenLists.ListInsert( SubList, GenLists.ListCode, Imports, 65535 ); (* Append nil SubList to indicated that this is a FromLess import. *) REPEAT NextWord( x ); UNTIL EndOfStatement(); END; UNTIL EndOfImports(); (*We've reached the end of the import list.*) EndOfImpList := LineCnt - 1; END ExtractImportList; END ImpLists.