-- Copyright (C) 1985, 1986 by Xerox Corporation. All rights reserved. -- CFormatIO.mesa -- NFS 2-Aug-85 17:10:34 -- MEW 3-Mar-86 9:02:33 -- NFS 3-Mar-86 13:25:01 -- C library formatted I/O functions. DIRECTORY Ascii USING [NUL], BucketAlloc USING [Alloc, Free], CFormatIOUtil USING [DoPrint, DoScan], CIOLib USING [], CRuntime USING [GetStdin, GetStdout], CString USING [CString, IncrBPointer, ReadByte, WriteByte], Stream USING [ defaultObject, GetByteProcedure, Handle, Object, PutByteProcedure, PutChar], VarArgs USING [VaStart, VaEnd]; CFormatIO: PROGRAM IMPORTS BucketAlloc, CFormatIOUtil, CRuntime, CString, Stream, VarArgs EXPORTS CIOLib = { ParamFrame: TYPE = LONG POINTER TO ARRAY INTEGER [0..0) OF LONG UNSPECIFIED; StringStream: TYPE = LONG POINTER TO StringStreamObject; StringStreamObject: TYPE = RECORD [ object: Stream.Object, string: CString.CString]; fscanf: PUBLIC PROCEDURE RETURNS [INTEGER] = { pf: ParamFrame ¬ VarArgs.VaStart[]; nMatch: INTEGER = CFormatIOUtil.DoScan[ LOOPHOLE[pf[0]], LOOPHOLE[pf[1]], LOOPHOLE[@pf[2]]]; [] ¬ VarArgs.VaEnd[pf]; RETURN[nMatch]; }; scanf: PUBLIC PROCEDURE RETURNS [INTEGER ¬ 0] = { pf: ParamFrame ¬ VarArgs.VaStart[]; nMatch: INTEGER = CFormatIOUtil.DoScan[ CRuntime.GetStdin[], LOOPHOLE[pf[0]], LOOPHOLE[@pf[1]]]; [] ¬ VarArgs.VaEnd[pf]; RETURN[nMatch]; }; sscanf: PUBLIC PROCEDURE RETURNS [INTEGER ¬ 0] = { pf: ParamFrame ¬ VarArgs.VaStart[]; inStream: Stream.Handle; nMatch: INTEGER; inStream ¬ LOOPHOLE[InStringStream[pf[0]]]; nMatch ¬ CFormatIOUtil.DoScan[@inStream, LOOPHOLE[pf[1]], LOOPHOLE[@pf[2]]]; BucketAlloc.Free[@inStream, SIZE[StringStreamObject]]; [] ¬ VarArgs.VaEnd[pf]; RETURN[nMatch]; }; fprintf: PUBLIC PROCEDURE RETURNS [INTEGER] = { charsPrinted: INTEGER; pf: ParamFrame ¬ VarArgs.VaStart[]; charsPrinted ¬ CFormatIOUtil.DoPrint[ LOOPHOLE[pf[0]], LOOPHOLE[pf[1]], LOOPHOLE[@pf[2]]]; [] ¬ VarArgs.VaEnd[pf]; RETURN[charsPrinted]; }; printf: PUBLIC PROCEDURE RETURNS [INTEGER] = { charsPrinted: INTEGER; pf: ParamFrame ¬ VarArgs.VaStart[]; charsPrinted ¬ CFormatIOUtil.DoPrint[ CRuntime.GetStdout[], LOOPHOLE[pf[0]], LOOPHOLE[@pf[1]]]; [] ¬ VarArgs.VaEnd[pf]; RETURN[charsPrinted]; }; sprintf: PUBLIC PROCEDURE RETURNS [CString.CString] = { -- sprintf returns the string passed in. pf: ParamFrame ¬ VarArgs.VaStart[]; charsPrinted: INTEGER; outStream: Stream.Handle; copyString: CString.CString ¬ LOOPHOLE[pf[0]]; outStream ¬ LOOPHOLE[OutStringStream[pf[0]]]; charsPrinted ¬ CFormatIOUtil.DoPrint[ @outStream, LOOPHOLE[pf[1]], LOOPHOLE[@pf[2]]]; Stream.PutChar[LOOPHOLE[outStream], Ascii.NUL]; BucketAlloc.Free[@outStream, SIZE[StringStreamObject]]; [] ¬ VarArgs.VaEnd[pf]; RETURN[copyString]; }; InStringStream: PROCEDURE [string: LONG UNSPECIFIED] RETURNS [sStream: StringStream] = { sStream ¬ BucketAlloc.Alloc[SIZE[StringStreamObject]]; sStream.object ¬ Stream.defaultObject; sStream.object.getByte ¬ ReadFromString; sStream.string ¬ LOOPHOLE[string]; }; OutStringStream: PROCEDURE [string: LONG UNSPECIFIED] RETURNS [sStream: StringStream] = { sStream ¬ BucketAlloc.Alloc[SIZE[StringStreamObject]]; sStream.object ¬ Stream.defaultObject; sStream.object.putByte ¬ WriteToString; sStream.string ¬ LOOPHOLE[string]; }; ReadFromString: Stream.GetByteProcedure = { byte ¬ CString.ReadByte[SS[sH].string]; SS[sH].string ¬ CString.IncrBPointer[SS[sH].string]; }; WriteToString: Stream.PutByteProcedure = { CString.WriteByte[byte, SS[sH].string]; SS[sH].string ¬ CString.IncrBPointer[SS[sH].string]; }; SS: PROCEDURE [sH: Stream.Handle] RETURNS [StringStream] = INLINE { RETURN[LOOPHOLE[sH]]; }; }.