MODULE PZMapChain EXPORTS Main; (* Reads a PZLR3Chain.T from standard input, applies a 4x4 matrix to it, writes the resulting PZLR3Chain.T to standard output *) IMPORT PZLR3Chain, PZMatrix; IMPORT ParseParams, Process, FileRd, Wr, FileWr, OSError, Thread, Stdio; FROM Stdio IMPORT stderr; <* FATAL Wr.Failure, Thread.Alerted, OSError.E *> TYPE Options = RECORD inFile: TEXT; matrix: TEXT; outFile: TEXT; change : BOOLEAN; (* TRUE to change PZLR3Chain.T *) END; PROCEDURE Main() = VAR BEGIN WITH o = GetOptions(), m = PZMatrix.Read(FileRd.Open(o.matrix & ".matrix")), ra = PZLR3Chain.Read(FileRd.Open(o.inFile & ".flc")), a = ra.c^ DO IF o.change THEN PZLR3Chain.Reverse(a) END; PZMatrix.Write(stderr, m); WITH b = PZLR3Chain.Map(a ,m)^ DO PZLR3Chain.Write( wr := FileWr.Open(o.outFile & ".flc"), cmt := " ", c := b, unit := ra.unit ); END; END END Main; PROCEDURE GetOptions(): Options = VAR o: Options; BEGIN WITH pp = NEW(ParseParams.T).init(stderr) DO TRY pp.getKeyword("-inFile"); o.inFile := pp.getNext(); pp.getKeyword("-matrix"); o.matrix := pp.getNext(); pp.getKeyword("-outFile"); o.outFile := pp.getNext(); IF pp.keywordPresent("-yes") THEN o.change := TRUE ELSIF pp.keywordPresent("-no") THEN o.change := FALSE ELSE o.change := FALSE END; pp.finish(); EXCEPT | ParseParams.Error => Wr.PutText(stderr, "Usage: PZMapChain \\\n"); Wr.PutText(stderr, "-inFile \\\n"); Wr.PutText(stderr, "-matrix \\\n"); Wr.PutText(stderr, "-outFile \\\n"); Wr.PutText(stderr, " [ -yes | -no ] \n"); Process.Exit(1); END; END; RETURN o END GetOptions; BEGIN Main() END PZMapChain.