(* M2Batch.def implements a queue for modules pending compilation.

Copyright (C) 2001-2025 Free Software Foundation, Inc.
Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.

This file is part of GNU Modula-2.

GNU Modula-2 is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.

GNU Modula-2 is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Modula-2; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  *)

DEFINITION MODULE M2Batch ;

(*
   Author     : Gaius Mulley
   Title      : M2Batch
   Date       : 29/5/87
   Description: Implements a queue modules pending compilation.
                MakeSource enters modules for later compilation.
                GetSource collects the next module to be compiled.
*)

FROM DynamicStrings IMPORT String ;
FROM NameKey IMPORT Name ;
EXPORT QUALIFIED MakeDefinitionSource,
                 MakeImplementationSource,
                 MakeProgramSource,
                 GetSource, GetModuleNo, IsModuleKnown,
                 AssociateDefinition, GetDefinitionModuleFile,
                 AssociateModule, GetModuleFile, Get,
                 ForeachSourceModuleDo, IsSourceSeen, IsModuleSeen,
                 LookupModule, LookupOuterModule, DisplayModules ;

TYPE
   DoProcedure = PROCEDURE (CARDINAL) ;


(*
   MakeDefinitionSource - is given a Name, n, which is used to create a Definition
                          module.
                          The Definition Module will be placed onto the
                          compilation pending queue if it has not yet been
                          compiled.
                          If the module has been compiled then no action is
                          taken. The Module Sym is returned.
*)

PROCEDURE MakeDefinitionSource (tok: CARDINAL; n: Name) : CARDINAL ;


(*
   MakeImplementationSource - is given a Name, n, which is used to create an
                              implementation module.
                              The implementation Module will be placed onto
                              the compilation pending
                              queue if it has not yet been compiled.
                              If the module has been compiled then no
                              action is taken. The Module Sym is returned.
*)

PROCEDURE MakeImplementationSource (tok: CARDINAL; n: Name) : CARDINAL ;


(*
   MakeProgramSource - is given a Name, n, which is used to create a program module.
                       The program module will be placed onto the compilation
                       pending queue if it has not yet been compiled.
                       If the module has been compiled then no action is taken.
                       The Module Sym is returned.
*)

PROCEDURE MakeProgramSource (tok: CARDINAL; n: Name) : CARDINAL ;


(*
   GetSource - returns with the symbol Sym of the next module to be compiled.
               If Sym returns with value NulSym then no module should be
               compiled.
*)

PROCEDURE GetSource () : CARDINAL ;


(*
   GetModuleNo - returns with symbol number of the module which was
                 the nth module to be read in Pass 1.
                 The modules are numbered from 1..n
*)

PROCEDURE GetModuleNo (nth: CARDINAL) : CARDINAL ;


(*
   IsModuleKnown - returns TRUE if the Name, n, matches a module.
*)

PROCEDURE IsModuleKnown (n: Name) : BOOLEAN ;


(*
   AssociateDefinition - associate the source file, filename, with the definition module,
                         Sym.
*)

PROCEDURE AssociateDefinition (filename: String; Sym: CARDINAL) : String ;


(*
   GetDefinitionModuleFile - returns the filename associated with the definition module, Sym.
                             It may return a temporary preprocessed file.
*)

PROCEDURE GetDefinitionModuleFile (Sym: CARDINAL) : String ;


(*
   AssociateModule - associate the source file, filename, with the implementation/program
                     module, Sym.
*)

PROCEDURE AssociateModule (filename: String; Sym: CARDINAL) : String ;


(*
   GetModuleFile - returns the filename associated with the implementation/program module, Sym.
                   It may return a temporary preprocessed file.
*)

PROCEDURE GetModuleFile (Sym: CARDINAL) : String ;


(*
   ForeachSourceModuleDo - call each procedure, p, for which there is a known
                           source file.
*)

PROCEDURE ForeachSourceModuleDo (p: DoProcedure) ;


(*
   IsSourceSeen - returns TRUE if the source for module, sym, has been seen.
*)

PROCEDURE IsSourceSeen (sym: CARDINAL) : BOOLEAN ;


(*
   IsModuleSeen - returns TRUE if the source for module, name, has been seen.
*)

PROCEDURE IsModuleSeen (n: Name) : BOOLEAN ;


(*
   LookupModule - looks up a module in the current scope, if a module does not exist
                  then it creates a DefImp module.
*)

PROCEDURE LookupModule (tok: CARDINAL; n: Name) : CARDINAL ;


(*
   LookupOuterModule - looks up a module in the order of: current scope, then outer scope, finally if a
                       module does not exist then it creates a DefImp module.
*)

PROCEDURE LookupOuterModule (tok: CARDINAL; n: Name) : CARDINAL ;


(*
   Get - returns the module symbol matching name, n.
*)

PROCEDURE Get (n: Name) : CARDINAL ;


(*
   DisplayModules - a debugging routine to textually emit the names of modules in the DoneQ.
*)

PROCEDURE DisplayModules ;


END M2Batch.
