-- Copyright (C) 1986  by Xerox Corporation. All rights reserved. 
-- CIOLib.mesa
-- NFS    11-Feb-86 17:02:35

-- C I/O library

DIRECTORY
  CBasics USING [FilePtr],
  CString USING [CString],
  Stream USING [
    Byte, DeleteProcedure, GetProcedure, GetByteProcedure, PutProcedure,
    PutByteProcedure, SetPositionProcedure];
CIOLib: DEFINITIONS = {

  EOF: INTEGER = -1;
  success: INTEGER = 0;
  failure: INTEGER = -1;

  -- constants for the fseek parameter ptrname
  seekSet: INTEGER = 0;
  seekCur: INTEGER = 1;
  seekEnd: INTEGER = 2;

  FilePtr: TYPE = CBasics.FilePtr;

  -- file operations  
  fopen: PROCEDURE [filename, type: CString.CString] RETURNS [FilePtr];
  fclose: PROCEDURE [stream: FilePtr] RETURNS [INTEGER];
  freopen: PROCEDURE [filename, type: CString.CString, stream: FilePtr]
    RETURNS [FilePtr];
  fflush: PROCEDURE [stream: FilePtr] RETURNS [INTEGER];
  tmpfile: PROCEDURE RETURNS [FilePtr];
  rename: PROCEDURE [old, new: CString.CString] RETURNS [INTEGER];

  -- character i/o (getc, putc, getchar, and putchar are macros)
  fgetc: PROCEDURE [stream: FilePtr] RETURNS [INTEGER];
  fputc: PROCEDURE [c: INTEGER, stream: FilePtr] RETURNS [INTEGER];
  ungetc: PROCEDURE [c: INTEGER, stream: FilePtr] RETURNS [INTEGER];

  -- formatted i/o
  fscanf: PROCEDURE RETURNS [INTEGER];
  sscanf: PROCEDURE RETURNS [INTEGER];
  scanf: PROCEDURE RETURNS [INTEGER];
  fprintf: PROCEDURE RETURNS [INTEGER];
  sprintf: PROCEDURE RETURNS [CString.CString];
  printf: PROCEDURE RETURNS [INTEGER];

  -- string i/o
  fgets: PROCEDURE [s: CString.CString, n: INTEGER, stream: FilePtr]
    RETURNS [CString.CString];
  gets: PROCEDURE [s: CString.CString] RETURNS [CString.CString];
  fputs: PROCEDURE [s: CString.CString, stream: FilePtr] RETURNS [c: INTEGER];
  puts: PROCEDURE [s: CString.CString] RETURNS [INTEGER];

  -- direct i/o
  fread: PROCEDURE [ptr: CString.CString, size, count: CARDINAL, iop: FilePtr]
    RETURNS [itemsRead: INTEGER];
  fwrite: PROCEDURE [ptr: CString.CString, size, count: CARDINAL, iop: FilePtr]
    RETURNS [itemsWritten: INTEGER];

  -- random access functions
  fseek: PROCEDURE [stream: FilePtr, offset: LONG INTEGER, ptrname: INTEGER]
    RETURNS [INTEGER];
  ftell: PROCEDURE [stream: FilePtr] RETURNS [LONG INTEGER];
  rewind: PROCEDURE [stream: FilePtr] RETURNS [INTEGER];

  -- stream status
  feof: PROCEDURE [stream: FilePtr] RETURNS [INTEGER];

  -- standard streams
  GetStdin: PROCEDURE RETURNS [sH: FilePtr];
  GetStdout: PROCEDURE RETURNS [sH: FilePtr];
  GetStderr: PROCEDURE RETURNS [sH: FilePtr];
  SetStdin: PROCEDURE [sH: FilePtr] RETURNS [INTEGER];
  SetStdout: PROCEDURE [sH: FilePtr] RETURNS [INTEGER];
  SetStderr: PROCEDURE [sH: FilePtr] RETURNS [INTEGER];

  unlink: PROCEDURE [path: CString.CString] RETURNS [INTEGER];

  <<RestoreStreamAndPut is in an interface for testing if the unget() function
    has been called on a stream, and the original stream procs. have not yet
    been restored.>>
  RestoreStreamAndPut: Stream.PutByteProcedure;

  <<ClientDataObject is what the clienData field of a Stream.Object
     points to after an ungetc is called and before the stream is restored.>>
  ClientDataObject: TYPE = MACHINE DEPENDENT RECORD [
    oldClientData: LONG POINTER,
    c: Stream.Byte,
    blank: Stream.Byte,  -- to fill up word --
    oldGetByteProc: Stream.GetByteProcedure,
    oldPutByteProc: Stream.PutByteProcedure,
    oldSetPositionProc: Stream.SetPositionProcedure,
    oldDeleteProc: Stream.DeleteProcedure,
    oldGetProc: Stream.GetProcedure,
    oldPutProc: Stream.PutProcedure];

  }.