MODULE MyCat1; IMPORT Args := UnixArguments, Streams, UF := UnixFiles, Read, Write, Process, Conclusions; VAR stream: Streams.Stream; file: ARRAY 256 OF CHAR; PROCEDURE List(s: Streams.Stream); VAR c: CHAR; BEGIN Read.CharS(s,c); WHILE ~ s.eof DO Write.CharS(Streams.stdout,c); Read.CharS(s,c); END; END List; BEGIN Args.Init(" { ( - | file ) } "); IF ~ Args.GetArg(file) THEN (* no argument, process stdin: *) Write.String("=========================="); Write.Ln; Write.String("From stdin: "); Write.Ln; List(Streams.stdin); ELSE (* there are args *) REPEAT IF (file[0] = "-") & (file[1] = 0X) THEN (*it's stdin*) Write.String("=========================="); Write.Ln; Write.String("From stdin: "); Write.Ln; List(Streams.stdin) ELSE IF ~ UF.Open(stream, file, UF.read, 1, NIL) THEN Write.StringS(Streams.stderr, "Can't open file "); Write.StringS(Streams.stderr, file); Write.LnS(Streams.stderr); Process.Exit(1); END; Write.String("=========================="); Write.Ln; Write.String("From file < "); Write.String(file); Write.String(" >");Write.Ln; List(stream); IF ~ Streams.Close(stream) THEN Write.StringS(Streams.stderr, "Error at close"); Write.LnS(Streams.stderr); Process.Exit(2); END; END; UNTIL ~ Args.GetArg(file); END; Process.Exit(0); END MyCat1.