GenerateDFClosure.mesa
Copyright Ó 1985, 1992 by Xerox Corporation. All rights reserved.
Russ Atkinson (RRA) June 25, 1985 2:28:21 pm PDT
DIRECTORY
DFUtilities USING [Date],
IO USING [STREAM],
Rope USING [ROPE];
GenerateDFClosure: CEDAR DEFINITIONS
= BEGIN
Externally defined types
Date: TYPE = DFUtilities.Date;
ROPE: TYPE = Rope.ROPE;
STREAM: TYPE = IO.STREAM;
Locally defined types
ActionKind: TYPE = {file, notFound, syntaxError};
= file for a file in the closure
= notFound for a DF file that was not found
= syntaxError for a DF file with a syntax error
ActionProc: TYPE = PROC [data: REF, kind: ActionKind, name: ROPE, date: Date, from: ROPE];
When using GenerateClosureToProc, the user's action procedure is called for every file in the DF closure.
data is as given to GenerateClosureToProc
kind = file for a file in the closure, = notFound for a DF file that could not be opened
name is the full name of the file as given by the DF file
date is the creation date of the file as given in the parent DF file
from is the name of the parent DF file
ClosureInfo: TYPE = RECORD [files: INT, dfFiles: INT, notFound: INT];
The information returned from GenerateClosureToProc or GenerateClosureToStream indicates the number of files in the closure, the number of DF files opened, and the number of DF files not found (although mentioned).
Options: TYPE = RECORD [
messages: BOOL ¬ TRUE,
determines whether or not progress messages go to the message window
toFork: NAT ¬ 0,
determines how many helping processes to fork
followImports: BOOL ¬ TRUE,
determines whether closure includes Imported items
serverRetries: NAT ¬ 10
determines how many times to retry a server problem
];
Operations
GenerateClosureToProc: PROC
[dfName: ROPE, errs: STREAM, action: ActionProc, data: REF, options: Options ¬ []]
RETURNS [info: ClosureInfo];
... generates the closure of files mentioned by the given DF file. Files may appear in the closure twice, although this is not frequent for well-structured DF files. For each file in the closure, the caller's action routine is invoked with the file name and other information (see above). The action routine may be invoked from as many as 1+options.toFork processes, so the client may need to be careful about concurrent actions.
GenerateClosureToStream: PROC
[dfName: ROPE, errs: STREAM, out: STREAM, options: Options ¬ [], verbose: BOOL ¬ FALSE]
RETURNS [info: ClosureInfo];
... performs roughly the same actions as GenerateClosureToProc, except that the closure so generated is written to the given output stream (which is left open at the end). If verbose = TRUE, then information about IMPORTS and INCLUDES is also written to the file.
END.