-- $Source: /home/harp/1/proto/monoBANK/winnt/win32-crt-stdio.ads,v $ 
-- $Revision: 1.3 $ $Date: 96/09/30 09:20:30 $ $Author: mg $ 
-- See end of file for Copyright (c) information.

with Stdarg;
with Win32;
with Win32.crt.Strings;
 
package Win32.crt.Stdio is

    use type Interfaces.C.Char_Array;
    
    BUFSIZ : constant := 512;  
    NSTREAM: constant := 40;  
    NFILE  : constant := NSTREAM;  
    EOF    : constant := -1;  

    subtype size_t is Win32.size_t;  
    subtype wchar_t is Win32.wchar_t;  
    subtype wint_t is wchar_t;  
    subtype wctype_t is wchar_t;  
    
    type FILE is
        record
            ptr     : Win32.PSTR; 
            cnt     : Win32.INT; 
            base    : Win32.PSTR; 
            flag    : Win32.INT; 
            file    : Win32.INT; 
            charbuf : Win32.INT; 
            bufsiz  : Win32.INT; 
            tmpfname: Win32.PSTR; 
        end record; 
    
    pragma Convention(C, FILE); 
    
    type FILE_Access is access all FILE;  

    P_tmpdir: constant CHAR_Array := "\" & Nul;
    
    L_tmpnam: constant := 14;                               -- P_tmpdir'Length + 12 + 1;
    
    SEEK_CUR    : constant := 1;  
    SEEK_END    : constant := 2;  
    SEEK_SET    : constant := 0;  
    FILENAME_MAX: constant := 260;  
    FOPEN_MAX   : constant := 20;  
    SYS_OPEN    : constant := 20;  
    TMP_MAX     : constant := 32767;  

    subtype fpos_t is Win32.LONG;  

    IOREAD : constant := 16#0001#;  
    IOWRT  : constant := 16#0002#;  
    IOFBF  : constant := 16#0000#;  
    IOLBF  : constant := 16#0040#;  
    IONBF  : constant := 16#0004#;  
    IOMYBUF: constant := 16#0008#;  
    IOEOF  : constant := 16#0010#;  
    IOERR  : constant := 16#0020#;  
    IOSTRG : constant := 16#0040#;  
    IORW   : constant := 16#0080#;  
    
    function filbuf (stream: FILE_Access) return Win32.INT;  
    
    function flsbuf
        (c      : in Win32.INT; 
         stream : FILE_Access)
        return Win32.INT;  
    
    function fsopen
        (filename : Win32.PCSTR;
         mode     : Win32.PCSTR;
         shflag   : in Win32.INT) return FILE_Access;  
    
    type FILE_array is array (0..NSTREAM-1) of aliased FILE;

    -- auxiliary declarations
    type Access_File_Array is access FILE_array;
    function IOB_Addr return Access_File_Array;
    pragma Import(C, IOB_Addr, "__iob_addr");
    -- end auxiliary declarations

    iob: FILE_array renames IOB_Addr.all;

    stdin : constant FILE_Access := iob(0)'access;
    stdout: constant FILE_Access := iob(1)'access;
    stderr: constant FILE_Access := iob(2)'access;
    
    procedure clearerr (stream : FILE_Access);  
    
    function fclose
        (stream : in FILE_Access) return Win32.INT;  
    
    function fcloseall return Win32.INT;  
    
    function fdopen
        (handle : in Win32.INT;
         mode   : Win32.PCSTR) return FILE_Access;  
    
    function fflush
        (stream : in FILE_Access) return Win32.INT;  
    
    function fgetc
        (stream : in FILE_Access) return Win32.INT;  
    
    function fgetchar return Win32.INT;  
    
    function fgetpos
        (stream : in FILE_Access;
         pos    : access fpos_t) return Win32.INT;  
    
    function fgets
        (string1 : in Win32.PSTR;
         n       : in Win32.INT;
         stream  : in FILE_Access) return Win32.PSTR;  
    
    function feof (Stream: FILE_Access) return Boolean;

    function ferror (Stream: FILE_Access) return Boolean;

    function fileno (Stream: FILE_Access) return Win32.INT;
 
    function flushall return Win32.INT;  
    
    function fopen
        (filename: Win32.PCSTR;
         mode    : Win32.PCSTR) return FILE_Access;  
    
    function fputc
        (c      : in Win32.INT;
         stream : in FILE_Access)
        return Win32.INT;  
    
    function fputchar
        (c : in Win32.INT) return Win32.INT;  
    
    function fputs
        (string : Win32.PCSTR;
         stream : in FILE_Access) return Win32.INT;  
    
    function fread
        (buffer : in Win32.PVOID;
         size   : in size_t;
         count  : in size_t;
         stream : in FILE_Access) return size_t;  
    
    function freopen
        (path   : Win32.PCSTR;
         mode   : Win32.PCSTR;
         stream : in FILE_Access) return FILE_Access;  
    
    function fsetpos
        (stream : in FILE_Access;
         pos    : access Win32.LONG) return Win32.INT;  
    
    function fseek
        (stream : in FILE_Access;
         offset : in Win32.LONG;
         origin : in Win32.INT) return Win32.INT;  
    
    function ftell
        (stream : in FILE_Access) return Win32.LONG;  
    
    function fwrite
        (buffer : in Win32.PCVOID;
         size   : in size_t;
         count  : in size_t;
         stream : in FILE_Access) return size_t;  
    
    function getc (stream : in FILE_Access) return Win32.INT;  
    
    function getchar return Win32.INT;  
    
    function gets
        (buffer : in Win32.PSTR)
        return Win32.PSTR;  
    
    function getw (stream : in FILE_Access) return Win32.INT;  
    
    procedure perror (string1: Win32.PCSTR);  
    
    function pclose
        (stream : in FILE_Access) return Win32.INT;  
    
    function popen
        (command: Win32.PCSTR;
         mode   : Win32.PCSTR) return FILE_Access;  
    
    function putc
        (c      : in Win32.INT;
         stream : in FILE_Access)
        return Win32.INT;  
    
    function putchar
        (c : in Win32.INT) return Win32.INT;  
    
    function puts
        (string1: Win32.PCSTR) return Win32.INT; 
         
    
    function putw
        (binint : in Win32.INT;
         stream : in FILE_Access)
        return Win32.INT;  
    
    function remove
        (path: Win32.PCSTR) return Win32.INT; 
         
    
    function rename
        (oldname: Win32.PCSTR;
         newname: Win32.PCSTR) return Win32.INT;  
    
    procedure rewind (stream : FILE_Access);  
    
    function rmtmp return Win32.INT;  
    
    procedure setbuf
        (stream : FILE_Access;
         buffer : Win32.PSTR);  
    
    function setvbuf
        (stream : in FILE_Access;
         buffer : in Win32.PSTR;
         mode   : in Win32.INT;
         size   : in size_t) return Win32.INT;  
    
    function tempnam
        (dir    : in Win32.PSTR;
         prefix : in Win32.PSTR)
        return Win32.PSTR;  
    
    function tmpfile return FILE_Access;  
    
    function tmpnam
        (string1 : in Win32.PSTR)
        return Win32.PSTR;  
    
    function ungetc
        (c      : in Win32.INT;
         stream : in FILE_Access)
        return Win32.INT;  
    
    function unlink 
        (filename: Win32.PCSTR) 
        return Win32.INT;  
    
    function fprintf (
        stream : FILE_Access;
        format : Win32.PCSTR;
        args   : Stdarg.ArgList := Stdarg.Empty) return Win32.INT;

    function fscanf (
        stream : FILE_Access;
        format : Win32.PCSTR;
        args   : Stdarg.ArgList := Stdarg.Empty) return Win32.INT;

    function printf (
        format : Win32.PCSTR;
        args   : Stdarg.ArgList := Stdarg.Empty) return Win32.INT;

    function scanf (
        format : Win32.PCSTR;
        args   : Stdarg.ArgList := Stdarg.Empty) return Win32.INT;

    function snprintf (
        buffer : Win32.PSTR;
        count  : size_t;
        format : Win32.PCSTR;
        args   : Stdarg.ArgList := Stdarg.Empty) return Win32.INT;

    function sprintf (
        buffer : Win32.PSTR;
        format : Win32.PCSTR;
        args   : Stdarg.ArgList := Stdarg.Empty) return Win32.INT;

    function sscanf (
        buffer : Win32.PSTR;
        format : Win32.PCSTR;
        args   : Stdarg.ArgList := Stdarg.Empty) return Win32.INT;

    function vfprintf (
        stream : FILE_Access;
        format : Win32.PCSTR;
        args   : Stdarg.ArgList := Stdarg.Empty) return Win32.INT;

    function vprintf (
        format : Win32.PCSTR;
        args   : Stdarg.ArgList := Stdarg.Empty) return Win32.INT;

    function vsnprintf (
        buffer : Win32.PSTR;
        count  : size_t;
        format : Win32.PCSTR;
        args   : Stdarg.ArgList := Stdarg.Empty) return Win32.INT;

    function vsprintf (
        buffer : Win32.PSTR;
        format : Win32.PCSTR;
        args   : Stdarg.ArgList := Stdarg.Empty) return Win32.INT;
 
private

    pragma Inline(feof);
    pragma Inline(ferror);
    pragma Inline(fileno);
 
    pragma Import(C, filbuf, "_filbuf"); 
    pragma Import(C, flsbuf, "_flsbuf"); 
    pragma Import(C, fsopen, "_fsopen"); 
    pragma Import(C, clearerr, "clearerr"); 
    pragma Import(C, fclose, "fclose"); 
    pragma Import(C, fcloseall, "_fcloseall"); 
    pragma Import(C, fdopen, "_fdopen"); 
    pragma Import(C, fflush, "fflush"); 
    pragma Import(C, fgetc, "fgetc"); 
    pragma Import(C, fgetchar, "_fgetchar"); 
    pragma Import(C, fgetpos, "fgetpos"); 
    pragma Import(C, fgets, "fgets"); 
    pragma Import(C, flushall, "_flushall"); 
    pragma Import(C, fopen, "fopen"); 
    pragma Import(C, fputc, "fputc"); 
    pragma Import(C, fputchar, "_fputchar"); 
    pragma Import(C, fputs, "fputs"); 
    pragma Import(C, fread, "fread"); 
    pragma Import(C, freopen, "freopen"); 
    pragma Import(C, fsetpos, "fsetpos"); 
    pragma Import(C, fseek, "fseek"); 
    pragma Import(C, ftell, "ftell"); 
    pragma Import(C, fwrite, "fwrite"); 
    pragma Import(C, getc, "getc"); 
    pragma Import(C, getchar, "getchar"); 
    pragma Import(C, gets, "gets"); 
    pragma Import(C, getw, "_getw"); 
    pragma Import(C, perror, "perror"); 
    pragma Import(C, pclose, "_pclose"); 
    pragma Import(C, popen, "_popen"); 
    pragma Import(C, putc, "putc"); 
    pragma Import(C, putchar, "putchar"); 
    pragma Import(C, puts, "puts"); 
    pragma Import(C, putw, "_putw"); 
    pragma Import(C, remove, "remove"); 
    pragma Import(C, rename, "rename"); 
    pragma Import(C, rewind, "rewind"); 
    pragma Import(C, rmtmp, "_rmtmp"); 
    pragma Import(C, setbuf, "setbuf"); 
    pragma Import(C, setvbuf, "setvbuf"); 
    pragma Import(C, tempnam, "_tempnam"); 
    pragma Import(C, tmpfile, "tmpfile"); 
    pragma Import(C, tmpnam, "tmpnam"); 
    pragma Import(C, ungetc, "ungetc"); 
    pragma Import(C, unlink, "_unlink"); 

-------------------------------------------------------------------------------
--
-- THIS FILE AND ANY ASSOCIATED DOCUMENTATION IS PROVIDED WITHOUT CHARGE
-- "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING
-- BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR
-- FITNESS FOR A PARTICULAR PURPOSE.  The user assumes the entire risk as to
-- the accuracy and the use of this file.  This file may be used, copied,
-- modified and distributed only by licensees of Microsoft Corporation's
-- WIN32 Software Development Kit in accordance with the terms of the 
-- licensee's End-User License Agreement for Microsoft Software for the
-- WIN32 Development Kit.
--
-- Copyright (c) Intermetrics, Inc. 1995
-- Portions (c) 1985-1994 Microsoft Corporation with permission.
-- Microsoft is a registered trademark and Windows and Windows NT are
-- trademarks of Microsoft Corporation.
--
-------------------------------------------------------------------------------

end Win32.crt.Stdio;