aboutsummaryrefslogtreecommitdiff
path: root/gcc/m2/gm2-compiler/PathName.mod
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/m2/gm2-compiler/PathName.mod')
-rw-r--r--gcc/m2/gm2-compiler/PathName.mod279
1 files changed, 279 insertions, 0 deletions
diff --git a/gcc/m2/gm2-compiler/PathName.mod b/gcc/m2/gm2-compiler/PathName.mod
new file mode 100644
index 0000000..6fc7612
--- /dev/null
+++ b/gcc/m2/gm2-compiler/PathName.mod
@@ -0,0 +1,279 @@
+IMPLEMENTATION MODULE PathName ;
+
+FROM Storage IMPORT ALLOCATE, DEALLOCATE ;
+FROM DynamicStrings IMPORT InitString, ConCat, ConCatChar, char, Dup,
+ KillString, Length, EqualArray, Equal, Mark ;
+FROM SFIO IMPORT Exists ;
+FROM FIO IMPORT StdErr ;
+FROM M2Printf IMPORT fprintf0, fprintf1, fprintf2 ;
+FROM FormatStrings IMPORT Sprintf1 ;
+
+FROM DynamicPath IMPORT InitPathList, FindFileName ;
+
+IMPORT DynamicPath ;
+
+
+CONST
+ Debugging = FALSE ;
+
+TYPE
+ NamedPath = POINTER TO RECORD
+ pathList: PathList ;
+ name : String ;
+ tail,
+ next : NamedPath ;
+ END ;
+
+
+VAR
+ FreeList,
+ NamedPathHead: NamedPath ;
+
+
+
+(*
+ AddSystem -
+*)
+
+PROCEDURE AddSystem (named, directory: String) ;
+BEGIN
+ IF NamedPathHead = NIL
+ THEN
+ (* Empty dictionary add single entry. *)
+ SetNamedPath (InitNamedPath (named, InitPathList (directory)))
+ ELSIF Equal (NamedPathHead^.tail^.name, named)
+ THEN
+ NamedPathHead^.tail^.pathList := DynamicPath.Cons (NamedPathHead^.tail^.pathList,
+ directory)
+ ELSE
+ SetNamedPath (ConsList (NamedPathHead,
+ InitNamedPath (named, InitPathList (directory))))
+ END
+END AddSystem ;
+
+
+(*
+ AddUser -
+*)
+
+PROCEDURE AddUser (named, directory: String) ;
+BEGIN
+ IF NamedPathHead = NIL
+ THEN
+ (* Empty dictionary add single entry. *)
+ SetNamedPath (InitNamedPath (named, InitPathList (directory)))
+ ELSIF EqualArray (NamedPathHead^.name, '')
+ THEN
+ (* Found user node. *)
+ NamedPathHead^.pathList := DynamicPath.Cons (NamedPathHead^.pathList,
+ directory)
+ ELSE
+ (* No user node yet, so we will create one. *)
+ NamedPathHead := ConsList (InitNamedPath (named, InitPathList (directory)),
+ NamedPathHead) ;
+ SetNamedPath (NamedPathHead)
+ END
+END AddUser ;
+
+
+(*
+ AddInclude - adds include path to the named path. If named path
+ is the same as the previous call then the include path
+ is appended to the named path PathList otherwise a new
+ named path is created and placed at the end of the
+ named path list.
+*)
+
+PROCEDURE AddInclude (named, directory: String) ;
+BEGIN
+ IF Debugging
+ THEN
+ fprintf2 (StdErr, "named = %s, directory =%s\n",
+ named, directory)
+ END ;
+ IF (named = NIL) OR EqualArray (named, '')
+ THEN
+ AddUser (named, directory) ;
+ IF Debugging
+ THEN
+ DumpPathName ('User pathname')
+ END
+ ELSE
+ AddSystem (named, directory) ;
+ IF Debugging
+ THEN
+ DumpPathName ('System pathname')
+ END
+ END
+END AddInclude ;
+
+
+(*
+ SetNamedPath - assigns the named path to the default path.
+*)
+
+PROCEDURE SetNamedPath (named: NamedPath) ;
+BEGIN
+ NamedPathHead := named
+END SetNamedPath ;
+
+
+(*
+ GetNamedPath - returns the default named path.
+*)
+
+PROCEDURE GetNamedPath () : NamedPath ;
+BEGIN
+ RETURN NamedPathHead
+END GetNamedPath ;
+
+
+(*
+ KillNamedPath - places list np onto the freelist.
+ Postcondition: np will be NIL.
+*)
+
+PROCEDURE KillNamedPath (VAR np: NamedPath) ;
+BEGIN
+ IF np # NIL
+ THEN
+ np^.tail^.next := FreeList ;
+ FreeList := np ;
+ np := NIL
+ END
+END KillNamedPath ;
+
+
+(*
+ ConsList - concatenates named path left and right together.
+*)
+
+PROCEDURE ConsList (left, right: NamedPath) : NamedPath ;
+BEGIN
+ IF right # NIL
+ THEN
+ left^.tail^.next := right ;
+ left^.tail := right^.tail
+ END ;
+ RETURN left
+END ConsList ;
+
+
+(*
+ Cons - appends pl to the end of a named path.
+ If np is NIL a new list is created and returned
+ containing named and pl.
+*)
+
+PROCEDURE Cons (np: NamedPath; named: String; pl: PathList) : NamedPath ;
+BEGIN
+ IF np = NIL
+ THEN
+ np := InitNamedPath (named, pl)
+ ELSE
+ np := ConsList (np, InitNamedPath (named, pl))
+ END ;
+ RETURN np
+END Cons ;
+
+
+(*
+ Stash - returns np before setting np to NIL.
+*)
+
+PROCEDURE Stash (VAR np: NamedPath) : NamedPath ;
+VAR
+ old: NamedPath ;
+BEGIN
+ old := np ;
+ np := NIL ;
+ RETURN old
+END Stash ;
+
+
+(*
+ InitNamedPath - creates a new path name with an associated pathlist.
+*)
+
+PROCEDURE InitNamedPath (name: String; pl: PathList) : NamedPath ;
+VAR
+ np: NamedPath ;
+BEGIN
+ NEW (np) ;
+ IF np = NIL
+ THEN
+ HALT
+ ELSE
+ np^.pathList := pl ;
+ np^.name := Dup (name) ;
+ np^.next := NIL ;
+ np^.tail := np
+ END ;
+ RETURN np
+END InitNamedPath ;
+
+
+(*
+ FindNamedPathFile - Post-condition: returns NIL if a file cannot be found otherwise
+ it returns the path including the filename.
+ It also returns a new string the name of the path.
+ Pre-condition: if name = NIL then it searches
+ user path first, followed by any
+ named path.
+ elsif name = ''
+ then
+ search user path
+ else
+ search named path
+ fi
+*)
+
+PROCEDURE FindNamedPathFile (filename: String; VAR name: String) : String ;
+VAR
+ foundFile: String ;
+ np : NamedPath ;
+BEGIN
+ np := NamedPathHead ;
+ WHILE np # NIL DO
+ IF (name = NIL) OR Equal (np^.name, name)
+ THEN
+ foundFile := FindFileName (filename, np^.pathList) ;
+ IF foundFile # NIL
+ THEN
+ name := Dup (np^.name) ;
+ RETURN foundFile
+ END
+ END ;
+ np := np^.next
+ END ;
+ name := NIL ;
+ RETURN NIL
+END FindNamedPathFile ;
+
+
+(*
+ DumpPathName - display the dictionary of names and all path entries.
+*)
+
+PROCEDURE DumpPathName (name: ARRAY OF CHAR) ;
+VAR
+ np : NamedPath ;
+ leader: String ;
+BEGIN
+ fprintf0 (StdErr, name) ;
+ fprintf0 (StdErr, " = {\n") ;
+ np := NamedPathHead ;
+ WHILE np # NIL DO
+ leader := Sprintf1 (Mark (InitString (" %s")), np^.name) ;
+ DynamicPath.DumpPath (leader, np^.pathList) ;
+ leader := KillString (leader) ;
+ np := np^.next
+ END ;
+ fprintf0 (StdErr, "}\n")
+END DumpPathName ;
+
+
+BEGIN
+ NamedPathHead := NIL ;
+ FreeList := NIL
+END PathName.