-- StdioImpl.mesa -- last edited by Suzuki: August 24, 1981 12:25 PM DIRECTORY AltoFileDefs USING [FP], DirectoryDefs USING [DirectoryLookup], ImageDefs, IODefs, stdio, StreamDefs, StringDefs, Real; StdioImpl: PROGRAM IMPORTS DirectoryDefs, ImageDefs, IODefs, Real, StreamDefs, StringDefs EXPORTS stdio = { OPEN stdio, StreamDefs; stderr: PUBLIC FILE ← IODefs.GetOutputStream[]; stdin: PUBLIC FILE ← IODefs.GetInputStream[]; stdout: PUBLIC FILE ← IODefs.GetOutputStream[]; atof: PUBLIC PROC[s: STRING] RETURNS[REAL] = { RETURN[Real.StringToReal[s]]}; atoi: PUBLIC PROC[s: STRING] RETURNS[INTEGER] = { RETURN[StringDefs.StringToDecimal[s]]}; putc: PUBLIC PROC[c: CHARACTER, out: FILE] = { out.put[out, c]}; getch: PUBLIC PROC[in: FILE] RETURNS [CHARACTER] = { RETURN[in.get[in]]}; extRead: PUBLIC PROC[FILE] = {}; extWrite: PUBLIC PROC[FILE] = {}; fopen: PUBLIC PROC[name: STRING, access: STRING] RETURNS [FILE] = { fp: AltoFileDefs.FP; IF access[0]='r THEN IF DirectoryDefs.DirectoryLookup[@fp, name, FALSE] THEN RETURN[StreamDefs.NewByteStream[name, Read]] ELSE RETURN[NIL] ELSE RETURN[StreamDefs.NewByteStream[name, ReadWriteAppend]]}; fclose: PUBLIC PROC[file: FILE] = { file.destroy[file]}; fflush: PUBLIC PROC[FILE] = {}; fgets: PUBLIC PROC[s: STRING, n: CARDINAL, iop: FILE] RETURNS [STRING] = { c: CHARACTER; i: CARDINAL ← 177777B; get: PROCEDURE [StreamHandle] RETURNS [UNSPECIFIED] ← iop.get; ReadN: PROC[char: CHARACTER] RETURNS [BOOLEAN] = { IF n=0 THEN RETURN[TRUE]; n ← n-1; IF char=15C THEN RETURN[TRUE] ELSE RETURN[FALSE]}; WITH iop SELECT FROM Keyboard => {c ← IODefs.ReadEditedString[s, ReadN, TRUE]; StringDefs.AppendChar[s, c]; stdout.put[stdout, c]; RETURN[s]}; Disk => IF iop.endof[iop] THEN RETURN[NIL]; ENDCASE => ERROR; WHILE (n←n-1)>0 DO IF (c ← get[iop !StreamDefs.StreamError => EXIT])=15C THEN GOTO CarriageReturn; s[i ← i+1] ← c; REPEAT CarriageReturn => s[i ← i+1] ← c; ENDLOOP; s.length ← i; RETURN[s]}; exit: PUBLIC PROC[INTEGER] = { ImageDefs.StopMesa[]}; }.