------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                 I N T E R F A C E S . C _ S T R E A M S                  --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
--          Copyright (C) 1995-2023, Free Software Foundation, Inc.         --
--                                                                          --
-- GNAT is free software;  you can  redistribute it  and/or modify it under --
-- terms of the  GNU General Public License as published  by the Free Soft- --
-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
--                                                                          --
-- As a special exception under Section 7 of GPL version 3, you are granted --
-- additional permissions described in the GCC Runtime Library Exception,   --
-- version 3.1, as published by the Free Software Foundation.               --
--                                                                          --
-- You should have received a copy of the GNU General Public License and    --
-- a copy of the GCC Runtime Library Exception along with this program;     --
-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
-- <http://www.gnu.org/licenses/>.                                          --
--                                                                          --
-- GNAT was originally developed  by the GNAT team at  New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
--                                                                          --
------------------------------------------------------------------------------

--  This package is a thin binding to selected functions in the C
--  library that provide a complete interface for handling C streams.

with System.CRTL;

package Interfaces.C_Streams is
   pragma Preelaborate;

   subtype chars is System.CRTL.chars;
   subtype FILEs is System.CRTL.FILEs;
   subtype int is System.CRTL.int;
   subtype long is System.CRTL.long;
   subtype size_t is System.CRTL.size_t;
   subtype ssize_t is System.CRTL.ssize_t;
   subtype int64 is System.CRTL.int64;
   subtype voids is System.Address;

   NULL_Stream : constant FILEs;
   --  Value returned (NULL in C) to indicate an fdopen/fopen/tmpfile error

   ----------------------------------
   -- Constants Defined in stdio.h --
   ----------------------------------

   EOF : constant int;
   --  Used by a number of routines to indicate error or end of file

   IOFBF : constant int;
   IOLBF : constant int;
   IONBF : constant int;
   --  Used to indicate buffering mode for setvbuf call

   L_tmpnam : constant int;
   --  Maximum length of file name that can be returned by tmpnam

   SEEK_CUR : constant int;
   SEEK_END : constant int;
   SEEK_SET : constant int;
   --  Used to indicate origin for fseek call

   function stdin  return FILEs;
   function stdout return FILEs;
   function stderr return FILEs;
   --  Streams associated with standard files

   --------------------------
   -- Standard C functions --
   --------------------------

   --  The functions selected below are ones that are available in
   --  UNIX (but not necessarily in ANSI C). These are very thin
   --  interfaces which copy exactly the C headers. For more
   --  documentation on these functions, see the Microsoft C "Run-Time
   --  Library Reference" (Microsoft Press, 1990, ISBN 1-55615-225-6),
   --  which includes useful information on system compatibility.

   procedure clearerr (stream : FILEs) renames System.CRTL.clearerr;

   function fclose (stream : FILEs) return int renames System.CRTL.fclose;

   function fdopen (handle : int; mode : chars) return FILEs
     renames System.CRTL.fdopen;

   function feof (stream : FILEs) return int;

   function ferror (stream : FILEs) return int;

   function fflush (stream : FILEs) return int renames System.CRTL.fflush;

   function fgetc (stream : FILEs) return int renames System.CRTL.fgetc;

   function fgets (strng : chars; n : int; stream : FILEs) return chars
     renames System.CRTL.fgets;

   function fileno (stream : FILEs) return int;

   function fopen
     (filename : chars;
      mode     : chars;
      encoding : System.CRTL.Filename_Encoding := System.CRTL.UTF8)
     return FILEs renames System.CRTL.fopen;
   --  Note: to maintain target independence, use text_translation_required,
   --  a boolean variable defined in sysdep.c to deal with the target
   --  dependent text translation requirement. If this variable is set,
   --  then b/t should be appended to the standard mode argument to set
   --  the text translation mode off or on as required.

   function fputc (C : int; stream : FILEs) return int
     renames System.CRTL.fputc;

   function fputwc (C : int; stream : FILEs) return int
     renames System.CRTL.fputwc;

   function fputs (Strng : chars; Stream : FILEs) return int
     renames System.CRTL.fputs;

   function fread
     (buffer : voids;
      size   : size_t;
      count  : size_t;
      stream : FILEs) return size_t;

   function fread
     (buffer : voids;
      index  : size_t;
      size   : size_t;
      count  : size_t;
      stream : FILEs) return size_t;
   --  Same as normal fread, but has a parameter 'index' that indicates
   --  the starting index for the read within 'buffer' (which must be the
   --  address of the beginning of a whole array object with an assumed
   --  zero base). This is needed for systems that do not support taking
   --  the address of an element within an array.

   function freopen
     (filename : chars;
      mode     : chars;
      stream   : FILEs;
      encoding : System.CRTL.Filename_Encoding := System.CRTL.UTF8)
     return FILEs renames System.CRTL.freopen;

   function fseek
     (stream : FILEs;
      offset : long;
      origin : int) return int
     renames System.CRTL.fseek;

   function fseek64
     (stream : FILEs;
      offset : int64;
      origin : int) return int
     renames System.CRTL.fseek64;

   function ftell (stream : FILEs) return long
     renames System.CRTL.ftell;

   function ftell64 (stream : FILEs) return int64
     renames System.CRTL.ftell64;

   function fwrite
     (buffer : voids;
      size   : size_t;
      count  : size_t;
      stream : FILEs) return size_t;

   function isatty (handle : int) return int renames System.CRTL.isatty;

   procedure mktemp (template : chars) renames System.CRTL.mktemp;
   --  The return value (which is just a pointer to template) is discarded

   procedure rewind (stream : FILEs) renames System.CRTL.rewind;

   function setvbuf
     (stream : FILEs;
      buffer : chars;
      mode   : int;
      size   : size_t) return int;

   procedure tmpnam (str : chars) renames System.CRTL.tmpnam;
   --  The parameter must be a pointer to a string buffer of at least L_tmpnam
   --  bytes (the call with a null parameter is not supported). The returned
   --  value, which is just a copy of the input argument, is discarded.

   function tmpfile return FILEs renames System.CRTL.tmpfile;

   function ungetc (c : int; stream : FILEs) return int
     renames System.CRTL.ungetc;

   function unlink (filename : chars) return int
     renames System.CRTL.unlink;

   ---------------------
   -- Extra functions --
   ---------------------

   --  These functions supply slightly thicker bindings than those above.
   --  They are derived from functions in the C Run-Time Library, but may
   --  do a bit more work than just directly calling one of the Library
   --  functions.

   function file_exists (name : chars) return int;
   --  Tests if given name corresponds to an existing file

   function is_regular_file (handle : int) return int;
   --  Tests if given handle is for a regular file (result 1) or for a
   --  non-regular file (pipe or device, result 0).

   ---------------------------------
   -- Control of Text/Binary Mode --
   ---------------------------------

   procedure set_binary_mode (handle : int);
   procedure set_text_mode   (handle : int);
   --  If text_translation_required is true, then these two functions may
   --  be used to dynamically switch a file from binary to text mode or vice
   --  versa. These functions have no effect if text_translation_required is
   --  false (e.g. in normal unix mode). Use fileno to get a stream handle.

   type Content_Encoding is (None, Default_Text, Text, U8text, Wtext, U16text);
   for Content_Encoding use (0,    1,            2,    3,      4,     5);
   pragma Convention (C, Content_Encoding);
   --  Content_Encoding describes the text encoding for file content:
   --    None         : No text encoding, this file is treated as a binary file
   --    Default_Text : A text file but not from Text_Translation form string
   --                   In this mode we are eventually using the system-wide
   --                   translation if activated.
   --    Text         : Text encoding activated
   --    Wtext        : Unicode mode
   --    U16text      : Unicode UTF-16 encoding
   --    U8text       : Unicode UTF-8 encoding
   --
   --  This encoding is system dependent and only used on Windows systems.
   --
   --  Note that modifications to Content_Encoding must be synchronized with
   --  sysdep.c:__gnat_set_mode.

   subtype Text_Content_Encoding
     is Content_Encoding range Default_Text .. U16text;

   subtype Non_Default_Text_Content_Encoding
     is Content_Encoding range Text .. U16text;

   procedure set_mode (handle : int; Mode : Content_Encoding);
   --  As above but can set the handle to any mode. On Windows this can be used
   --  to have proper 16-bit wide-string output on the console for example.

   ----------------------------
   -- Full Path Name support --
   ----------------------------

   procedure full_name (nam : chars; buffer : chars);
   --  Given a NUL terminated string representing a file name, returns in
   --  buffer a NUL terminated string representing the full path name for
   --  the file name. On systems where it is relevant the drive is also part
   --  of the full path name. It is the responsibility of the caller to
   --  pass an actual parameter for buffer that is big enough for any full
   --  path name. Use max_path_len given below as the size of buffer.

   max_path_len : constant Integer;
   --  Maximum length of an allowable full path name on the system,including a
   --  terminating NUL character. Declared as a constant to allow references
   --  from other preelaborated GNAT library packages.

private
   --  The following functions are specialized in the body depending on the
   --  operating system.

   pragma Inline (fread);
   pragma Inline (fwrite);
   pragma Inline (setvbuf);

   pragma Import (C, file_exists, "__gnat_file_exists");
   pragma Import (C, is_regular_file, "__gnat_is_regular_file_fd");

   pragma Import (C, set_binary_mode, "__gnat_set_binary_mode");
   pragma Import (C, set_text_mode, "__gnat_set_text_mode");
   pragma Import (C, set_mode, "__gnat_set_mode");

   pragma Import (C, max_path_len, "__gnat_max_path_len");
   pragma Import (C, full_name, "__gnat_full_name");

   --  The following may be implemented as macros, and so are supported
   --  via an interface function in the a-cstrea.c file.

   pragma Import (C, feof,   "__gnat_feof");
   pragma Import (C, ferror, "__gnat_ferror");
   pragma Import (C, fileno, "__gnat_fileno");

   pragma Import (C, EOF, "__gnat_constant_eof");
   pragma Import (C, IOFBF, "__gnat_constant_iofbf");
   pragma Import (C, IOLBF, "__gnat_constant_iolbf");
   pragma Import (C, IONBF, "__gnat_constant_ionbf");
   pragma Import (C, SEEK_CUR, "__gnat_constant_seek_cur");
   pragma Import (C, SEEK_END, "__gnat_constant_seek_end");
   pragma Import (C, SEEK_SET, "__gnat_constant_seek_set");
   pragma Import (C, L_tmpnam, "__gnat_constant_l_tmpnam");

   pragma Import (C, stderr, "__gnat_constant_stderr");
   pragma Import (C, stdin,  "__gnat_constant_stdin");
   pragma Import (C, stdout, "__gnat_constant_stdout");

   NULL_Stream : constant FILEs := System.Null_Address;

end Interfaces.C_Streams;
