Mercurial > ecos-v2_0-branch
diff packages/language/c/libc/stdio/current/include/stream.hxx @ 115:6ed91473a1cd ecos-sw-2000-08-21
Merge from eCos master repository on 2000-08-21-22:40:54-BST
| author | jlarmour |
|---|---|
| date | Fri, 25 Aug 2000 17:32:38 +0000 |
| parents | |
| children | b939e9cada46 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/language/c/libc/stdio/current/include/stream.hxx @@ -0,0 +1,310 @@ +#ifndef CYGONCE_LIBC_STDIO_STREAM_HXX +#define CYGONCE_LIBC_STDIO_STREAM_HXX +//======================================================================== +// +// stream.hxx +// +// Internal C library stdio stream interface definitions +// +//======================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//======================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): jlarmour +// Contributors: +// Date: 2000-04-19 +// Purpose: +// Description: +// Usage: #include <cyg/libc/stdio/stream.hxx> +// +//####DESCRIPTIONEND#### +// +//======================================================================== + +// CONFIGURATION + +#include <pkgconf/libc_stdio.h> // Configuration header + +// INCLUDES + +#include <cyg/infra/cyg_type.h> // Common project-wide type definitions +#include <cyg/infra/cyg_ass.h> // Get assertion macros, as appropriate +#include <errno.h> // Cyg_ErrNo +#include <stdio.h> // fpos_t and IOBUF defines +#include <cyg/libc/stdio/io.hxx> // Physical IO support +#include <cyg/libc/stdio/streambuf.hxx> // Stdio stream file buffers + +#ifdef CYGSEM_LIBC_STDIO_THREAD_SAFE_STREAMS +#include <pkgconf/kernel.h> +#include <cyg/kernel/mutex.hxx> // Cyg_Mutex +#endif + +// TYPE DEFINITIONS + +class Cyg_StdioStream +{ + friend int setvbuf( FILE *, char *, int, size_t ); + +private: + + // error status for this file + Cyg_ErrNo error; + + + cyg_stdio_handle_t my_device; + +#ifdef CYGFUN_LIBC_STDIO_ungetc + cyg_uint8 unread_char_buf; +#endif + +#ifdef CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO + Cyg_StdioStreamBuffer io_buf; // read/write buffer +#endif + cyg_uint8 readbuf_char; // a one character emergency "buffer" + // only used when configured to not buffer + // (i.e. !CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO) + // or set at runtime to not buffer (i.e. + // buffering mode is _IONBF) + + // some flags indicating the state of the file. Some of it is internal + // state, which should not be public. Use bitfields to save + // space, which means using "unsigned int" rather than cyg_uintX + struct { + unsigned int at_eof : 1; // Have we reached eof? + + unsigned int opened_for_read : 1; // opened_for_read and + + unsigned int opened_for_write : 1; // opened_for_write can + // be set simultaneously + + unsigned int binary : 1; // opened for binary or + // text mode? + +#ifdef CYGFUN_LIBC_STDIO_ungetc + unsigned int unread_char_buf_in_use : 1; // unget buf in use? +#endif + +#ifdef CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO + unsigned int buffering : 1; // Is this file buffered? + + unsigned int line_buffering : 1; // If so, is it line + // buffered? If it is + // buffered, but NOT line + // buffered, it must be + // fully buffered + + unsigned int last_buffer_op_was_read : 1; // did we last read from + // the buffer. If not we + // must have written +#endif + unsigned int readbuf_char_in_use : 1; // is the above + // readbuf_char in use? + + } flags; + + // current position for reading/writing + fpos_t position; + +#ifdef CYGSEM_LIBC_STDIO_THREAD_SAFE_STREAMS + Cyg_Mutex stream_lock; // used for locking this stream +#endif // ifdef CYGSEM_LIBC_STDIO_THREAD_SAFE_STREAMS + +#ifdef CYGDBG_USE_ASSERTS + // a value to check that this class is hopefully valid + cyg_ucount32 magic_validity_word; +#endif + +public: + // different modes when constructing (i.e. opening). + typedef enum { + CYG_STREAM_READ, + CYG_STREAM_WRITE, + CYG_STREAM_READWRITE + } OpenMode; + + // CONSTRUCTORS + + // This constructs the stream - effectively opens the file. This is + // used for static initialisation, and actually calls construct below + // + // dev is a valid Cyg_Device_Table_t, although it does not have to + // be a member of the device table object itself + // + // open_mode is one of CYG_STREAM_READ, CYG_STREAM_WRITE or + // CYG_STREAM_READWRITE + // + // append is true if the file position should be set at EOF on opening + // + // binary is true if this is a binary stream. Otherwise it is a text + // stream and character conversions (especially newline) may occur + // + // buffer_mode is one of _IONBF, _IOLBF, _IOFBF (from <stdio.h>) + // If buffer_mode is _IONBF, buffer_size should still be set to 0 + // and buffer_addr to NULL. If buffering is not configured, none + // of buffer_mode, buffer_size and buffer_addr have any effect + // + // buffer_size is the size of buffer to use + // + // buffer_addr is the address of a user supplied buffer. By default + // (when NULL) a system one is provided. + // + // The "return code" is set by assignment to the error member of this + // stream - use the get_error() method to check + + Cyg_StdioStream( cyg_stdio_handle_t dev, OpenMode open_mode, + cyg_bool append, cyg_bool binary, int buffer_mode, + cyg_ucount32 buffer_size=BUFSIZ, + cyg_uint8 *buffer_addr=NULL ); + + Cyg_StdioStream( OpenMode open_mode, + cyg_ucount32 buffer_size=BUFSIZ, + cyg_uint8 *buffer_addr=NULL ); + +private: + void initialize( cyg_stdio_handle_t dev, OpenMode open_mode, + cyg_bool append, cyg_bool binary, int buffer_mode, + cyg_ucount32 buffer_size=BUFSIZ, + cyg_uint8 *buffer_addr=NULL ); +public: + + // DESTRUCTOR + + ~Cyg_StdioStream(); + + + // MEMBER FUNCTIONS + + // Close the stream. This should be called before the destructor, + // so we can see and report any errors produced. + Cyg_ErrNo close(); + + // Refill read buffer from the stream - note this blocks until + // something arrives on the stream + Cyg_ErrNo + refill_read_buffer( void ); + + + // Read not more than buffer_length bytes from the read buffer into the + // user buffer. + // The number of bytes put into the user buffer is written + // into *bytes_read + Cyg_ErrNo + read( cyg_uint8 *user_buffer, cyg_ucount32 buffer_length, + cyg_ucount32 *bytes_read ); + + + // Read a single byte from the stream. Returns EAGAIN if no character + // available or EEOF if end of file (as well as setting the EOF state) + Cyg_ErrNo + read_byte( cyg_uint8 *c ); + + // Read a single byte from the stream, but don't remove it. Returns + // EAGAIN if no character available or EEOF if end of file (as well + // as setting the EOF state) + Cyg_ErrNo + peek_byte( cyg_uint8 *c ); + + + // Return a byte into the stream - basically the same as ungetc() + Cyg_ErrNo + unread_byte( cyg_uint8 c ); + + // the number of bytes available to read without needing to refill the + // buffer + cyg_ucount32 + bytes_available_to_read( void ); + + Cyg_ErrNo + write( const cyg_uint8 *buffer, cyg_ucount32 buffer_length, + cyg_ucount32 *bytes_written ); + + Cyg_ErrNo + write_byte( cyg_uint8 c ); + + + Cyg_ErrNo + flush_output( void ); + + Cyg_ErrNo + flush_output_unlocked( void ); + + // prevent multiple access in thread safe mode + + // lock_me() returns false if it couldn't be locked, which could + // happen if the file descriptor is bad + + cyg_bool + lock_me( void ); + + // trylock_me() returns false if it couldn't be locked, probably + // because it is already locked + cyg_bool + trylock_me( void ); + + void + unlock_me( void ); + + // get error status for this file + Cyg_ErrNo + get_error( void ); + + // set error status for this file. + void + set_error( Cyg_ErrNo errno_to_set ); + +public: + // are we at EOF? true means we are, false means no + cyg_bool + get_eof_state( void ); + +private: + + // Set whether we are at EOF. + void + set_eof_state( cyg_bool eof_to_set ); + +public: + // retrieve position + Cyg_ErrNo + get_position( fpos_t *pos ); + + // set absolute position. whence is SEEK_SET, SEEK_CUR, or SEEK_END + Cyg_ErrNo + set_position( fpos_t pos, int whence ); + + // Return my_device + cyg_stdio_handle_t get_dev() { return my_device; }; + + CYGDBG_DEFINE_CHECK_THIS +}; + +// INLINE FUNCTIONS + +#include <cyg/libc/stdio/stream.inl> + +#endif CYGONCE_LIBC_STDIO_STREAM_HXX multiple inclusion protection + +// EOF stream.hxx
