deferred class interface INPUT_STREAM
   -- 
   --  This abstract class is the superclass of all classes 
   --  representing an input stream of bytes. 
   -- 

feature(s) from INPUT_STREAM
   --  State of the stream :

   is_connected: BOOLEAN
      --  True when the corresponding stream is connected
      --  to some physical input device.


   end_of_input: BOOLEAN
      --  Has end-of-input been reached ?
      --  True when the last character has been read.

      require
         is_connected

feature(s) from INPUT_STREAM
   --  To read one character at a time :

   read_character
      --  Read a character and assign it to last_character.

      require
         not end_of_input
      ensure
         not push_back_flag

   last_character: CHARACTER
      --  Last character read with read_character.

      require
         is_connected

   push_back_flag: BOOLEAN
      --  True in one char is already pushed back.


   unread_character
      --  Un-read the last character read.
      -- 

      require
         not push_back_flag
      ensure
         push_back_flag

feature(s) from INPUT_STREAM
   --  Skipping separators :

   skip_separators
      --  Stop doing read_character as soon as end_of_file is reached
      --  or as soon as last_character is not is_separator.
      --  When first character is already not is_separator nothing 
      --  is done. 


   skip_separators_using (separators: STRING)
      --  Same job as skip_separators using separators.

      require
         separators /= Void

feature(s) from INPUT_STREAM
   --  To read one number at a time :

   read_integer
      --  Read an integer according to the Eiffel syntax.
      --  Make result available in last_integer.
      --  Heading separators are automatically skipped using 
      --  is_separator of class CHARACTER.
      --  Trailing separators are not skipped.

      require
         not end_of_input

   last_integer: INTEGER
      --  Last integer read using read_integer.


   read_real
      --  Read a REAL and make the result available in last_real
      --  and in last_double.
      --  The integral part is available in last_integer.

      require
         not end_of_input

   last_real: REAL
      --  Last real read with read_real.


   read_double
      --  Read a DOUBLE and make the result available in 
      --  last_double. 

      require
         not end_of_input

   last_double: DOUBLE
      --  Last double read with read_double.


feature(s) from INPUT_STREAM
   --  To read one line or one word at a time :

   last_string: STRING
      --  Access to a unique STRING to get the result computed
      --  with read_line, read_word or newline.
      --  No new STRING is allocated.


   read_line
      --  Read a complete line ended by '%N' or end_of_input. 
      --  Make the result available in last_string.
      --  Character '%N' is not added in last_string. 
      --  
      --  NOTE: the result is available in last_string without any 
      --        memory allocation.

      require
         not end_of_input

   read_word
      --  Read a word using is_separator of class CHARACTER. 
      --  Result is available in last_string (no allocation 
      --  of memory).
      --  Heading separators are automatically skipped.
      --  Trailing separators are not skipped (last_character is
      --  left on the first one).  
      --  If end_of_input is encountered, Result can be the 
      --  empty string.

      require
         not end_of_input

   newline
      --  Consume input until newline ('%N') is found.
      --  Corresponding STRING is stored in last_string.


feature(s) from INPUT_STREAM
   --  Other features :

   read_line_in (str: STRING)
      --  Same jobs as read_line but storage is directly done in str.
      -- 

      require
         not end_of_input

   read_word_using (separators: STRING)
      --  Same jobs as read_word using separators.

      require
         not end_of_input;
         separators /= Void

   read_tail_in (str: STRING)
      --  Read all remaining character of the file in str.

      require
         str /= Void
      ensure
         end_of_input


end of deferred INPUT_STREAM