(* M2Search.mod provides a mechanism to search selected directories.

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/>.  *)

IMPLEMENTATION MODULE M2Search ;


FROM M2FileName IMPORT CalculateFileName ;
FROM Assertion IMPORT Assert ;
FROM PathName IMPORT FindNamedPathFile ;

FROM DynamicStrings IMPORT InitString, InitStringChar,
                           KillString, ConCat, ConCatChar, Index, Slice,
                           Add, EqualArray, Dup, Mark,
                           PushAllocation, PopAllocationExemption,
                           InitStringDB, InitStringCharStarDB,
                           InitStringCharDB, MultDB, DupDB, SliceDB ;


CONST
   GarbageDebugging = FALSE ;
   DefaultDefExt    = '.def' ;
   DefaultModExt    = '.mod' ;

VAR
   Def, Mod: String ;

(* Internal garbage collection debugging routines.  *)

(*
#define InitString(X) InitStringDB(X, __FILE__, __LINE__)
#define InitStringCharStar(X) InitStringCharStarDB(X, __FILE__, __LINE__)
#define InitStringChar(X) InitStringCharDB(X, __FILE__, __LINE__)
#define Mult(X,Y) MultDB(X, Y, __FILE__, __LINE__)
#define Dup(X) DupDB(X, __FILE__, __LINE__)
#define Slice(X,Y,Z) SliceDB(X, Y, Z, __FILE__, __LINE__)
*)


(*
   doDSdbEnter - called when compiled with -fcpp to enable runtime garbage
                 collection debugging.
*)

(*
PROCEDURE doDSdbEnter ;
BEGIN
   PushAllocation
END doDSdbEnter ;
*)


(*
   doDSdbExit - called when compiled with -fcpp to enable runtime garbage
                collection debugging.  The parameter string s is exempt from
                garbage collection analysis.
*)

(*
PROCEDURE doDSdbExit (s: String) ;
BEGIN
   (* Check to see whether no strings have been lost since the PushAllocation.  *)
   Assert (PopAllocationExemption (TRUE, s) = s)
END doDSdbExit ;
*)


(*
   DSdbEnter - dummy nop entry code which the preprocessor replaces by
               doDSsbEnter when debugging garbage collection at runtime.
*)

(*
PROCEDURE DSdbEnter ;
BEGIN
END DSdbEnter ;
*)

(*
   DSdbExit - dummy nop exit code which the preprocessor replaces by
              doDSsbExit when debugging garbage collection at runtime.
*)

(*
PROCEDURE DSdbExit (s: String) ;
BEGIN
   IF GarbageDebugging
   THEN
      Assert (s # NIL)
   END
END DSdbExit ;
*)


(*
#define DSdbEnter doDSdbEnter
#define DSdbExit  doDSdbExit
*)


(*
   FindSourceFile - attempts to locate the source file FileName.
                    If a file is found then TRUE is returned otherwise
                    FALSE is returned.
                    The parameter FullPath is set indicating the
                    absolute location of source FileName.
                    FullPath will be totally overwritten and should
                    not be initialized by InitString before this function
                    is called.
                    FullPath is set to NIL if this function returns FALSE.
                    FindSourceFile sets FullPath to a new string if successful.
                    The string FileName is not altered.
*)

PROCEDURE FindSourceFile (FileName: String;
                          VAR FullPath, named: String) : BOOLEAN ;
BEGIN
   FullPath := FindNamedPathFile (FileName, named) ;
   RETURN FullPath # NIL
END FindSourceFile ;


(*
   FindSourceDefFile - attempts to find the definition module for
                       a module, Stem. If successful it returns
                       the full path and returns TRUE. If unsuccessful
                       then FALSE is returned and FullPath is set to NIL.
*)

PROCEDURE FindSourceDefFile (Stem: String; VAR FullPath, named: String) : BOOLEAN ;
VAR
   f: String ;
BEGIN
   IF Def # NIL
   THEN
      f := CalculateFileName (Stem, Def) ;
      IF FindSourceFile (f, FullPath, named)
      THEN
         RETURN TRUE
      END ;
      f := KillString (f)
   END ;
   (* Try the GNU Modula-2 default extension.  *)
   f := CalculateFileName (Stem, Mark (InitString (DefaultDefExt))) ;
   RETURN FindSourceFile (f, FullPath, named)
END FindSourceDefFile ;


(*
   FindSourceModFile - attempts to find the implementation module for
                       a module, Stem. If successful it returns
                       the full path and returns TRUE. If unsuccessful
                       then FALSE is returned and FullPath is set to NIL.
*)

PROCEDURE FindSourceModFile (Stem: String; VAR FullPath, named: String) : BOOLEAN ;
VAR
   f: String ;
BEGIN
   IF Mod#NIL
   THEN
      f := CalculateFileName (Stem, Mod) ;
      IF FindSourceFile (f, FullPath, named)
      THEN
         RETURN TRUE
      END ;
      f := KillString (f)
   END ;
   (* Try the GNU Modula-2 default extension.  *)
   f := CalculateFileName (Stem, Mark (InitString (DefaultModExt))) ;
   RETURN FindSourceFile (f, FullPath, named)
END FindSourceModFile ;


(*
   SetDefExtension - sets the default extension for definition modules to, ext.
                     The string, ext, should be deallocated by the caller at
                     an appropriate time.
*)

PROCEDURE SetDefExtension (ext: String) ;
BEGIN
   Def := KillString (Def) ;
   Def := Dup (ext)
END SetDefExtension ;


(*
   SetModExtension - sets the default extension for implementation and program
                     modules to, ext. The string, ext, should be deallocated
                     by the caller at an appropriate time.
*)

PROCEDURE SetModExtension (ext: String) ;
BEGIN
   Mod := KillString (Mod) ;
   Mod := Dup (ext)
END SetModExtension ;


(*
   Init - initializes the def and mod default string names to NIL.
*)

PROCEDURE Init ;
BEGIN
   Def := NIL ;
   Mod := NIL
END Init ;


BEGIN
   Init
END M2Search.
