IMPLISTS.MOD 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. IMPLEMENTATION MODULE ImpLists;
  2. (*
  3. * REPERTOIRE
  4. * Release 1.6
  5. * By Charles Bradford and Cole Brecheen
  6. * (c) Copyright 1985-1992 PMI
  7. * Green Bay, Wisconsin
  8. * All rights reserved
  9. * (414) 468-6040
  10. *
  11. * $Header:
  12. *)
  13. IMPORT ErrorManager;
  14. IMPORT GenLists;
  15. IMPORT M2Strings;
  16. IMPORT Parser;
  17. IMPORT PosUtils;
  18. IMPORT StrEdit;
  19. PROCEDURE ExtractImportList( VAR TextList, Imports: GenLists.GenList;
  20. VAR StartOfImpList, EndOfImpList: CARDINAL );
  21. VAR
  22. x, CurrentWord, LastWord: ARRAY [0..79] OF CHAR;
  23. Terminator: CHAR;
  24. LineCnt, ColCnt: CARDINAL;
  25. PROCEDURE LastWordWas( TheStr: ARRAY OF CHAR ): BOOLEAN;
  26. BEGIN
  27. RETURN M2Strings.CompareStr( TheStr, LastWord ) = 0;
  28. END LastWordWas;
  29. PROCEDURE CurrentWordIs( TheStr: ARRAY OF CHAR ): BOOLEAN;
  30. BEGIN
  31. RETURN M2Strings.CompareStr( TheStr, CurrentWord ) = 0;
  32. END CurrentWordIs;
  33. PROCEDURE NextWord( VAR TheStr: ARRAY OF CHAR );
  34. BEGIN
  35. Parser.GetNextWord( TextList, LineCnt, ColCnt, TheStr, Terminator );
  36. M2Strings.Assign( CurrentWord, LastWord );
  37. M2Strings.Assign( TheStr, CurrentWord );
  38. END NextWord;
  39. PROCEDURE EndOfImports(): BOOLEAN;
  40. BEGIN
  41. IF CurrentWordIs( 'CONST' ) THEN
  42. RETURN TRUE;
  43. ELSIF CurrentWordIs( 'VAR' ) THEN
  44. RETURN TRUE;
  45. ELSIF CurrentWordIs( 'EXPORT' ) THEN
  46. RETURN TRUE;
  47. ELSIF CurrentWordIs( 'PROCEDURE' ) THEN
  48. RETURN TRUE;
  49. ELSIF CurrentWordIs( 'TYPE' ) THEN
  50. RETURN TRUE;
  51. ELSIF CurrentWordIs( 'BEGIN' ) THEN
  52. RETURN TRUE;
  53. ELSIF CurrentWordIs( 'END' ) THEN
  54. RETURN TRUE;
  55. ELSIF (LineCnt >= GenLists.ListLength(TextList)) THEN
  56. RETURN TRUE;
  57. ELSE
  58. RETURN FALSE;
  59. END;
  60. END EndOfImports;
  61. PROCEDURE EndOfStatement(): BOOLEAN;
  62. BEGIN
  63. RETURN PosUtils.Equal( x, 'FROM' ) OR PosUtils.Equal( x, 'IMPORT' ) OR
  64. EndOfImports();
  65. END EndOfStatement;
  66. VAR
  67. SubList: GenLists.GenList;
  68. BEGIN
  69. StrEdit.SetLength( Parser.TheLine, 0 );
  70. GenLists.NewList( Imports );
  71. LineCnt := 1;
  72. ColCnt := 0;
  73. StartOfImpList := 0;
  74. EndOfImpList := 0;
  75. LastWord := '';
  76. CurrentWord := '';
  77. REPEAT
  78. NextWord( x );
  79. IF EndOfImports() THEN
  80. RETURN;
  81. END;
  82. UNTIL EndOfStatement();
  83. StartOfImpList := LineCnt;
  84. REPEAT
  85. NextWord( x );
  86. IF LastWordWas( 'FROM' ) THEN
  87. GenLists.ListInsert( x, GenLists.StrCode, Imports, 65535 );
  88. (* Append module name to Imports. *)
  89. GenLists.NewList( SubList );
  90. NextWord( x );
  91. (* skip the 'IMPORT' *)
  92. LOOP
  93. NextWord( x );
  94. IF EndOfStatement() THEN
  95. EXIT;
  96. ELSE
  97. GenLists.ListInsert( x, GenLists.StrCode, SubList, 65535 );
  98. END;
  99. END;
  100. GenLists.ListInsert( SubList, GenLists.ListCode, Imports, 65535 );
  101. ELSIF LastWordWas( 'IMPORT' ) THEN
  102. GenLists.ListInsert( x, GenLists.StrCode, Imports, 65535 );
  103. (* Append module name to Imports. *)
  104. GenLists.NilList( SubList );
  105. GenLists.ListInsert( SubList, GenLists.ListCode, Imports, 65535 );
  106. (* Append nil SubList to indicated that this is a
  107. FromLess import. *)
  108. REPEAT
  109. NextWord( x );
  110. UNTIL EndOfStatement();
  111. END;
  112. UNTIL EndOfImports();
  113. (*We've reached the end of the import list.*)
  114. EndOfImpList := LineCnt - 1;
  115. END ExtractImportList;
  116. END ImpLists.