]> git.karo-electronics.de Git - karo-tx-redboot.git/blob - packages/language/c/libc/stdio/v2_0/src/common/streambuf.cxx
Initial revision
[karo-tx-redboot.git] / packages / language / c / libc / stdio / v2_0 / src / common / streambuf.cxx
1 //===========================================================================
2 //
3 //      streambuf.cxx
4 //
5 //      C library stdio stream buffer functions
6 //
7 //===========================================================================
8 //####ECOSGPLCOPYRIGHTBEGIN####
9 // -------------------------------------------
10 // This file is part of eCos, the Embedded Configurable Operating System.
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
12 //
13 // eCos is free software; you can redistribute it and/or modify it under
14 // the terms of the GNU General Public License as published by the Free
15 // Software Foundation; either version 2 or (at your option) any later version.
16 //
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
20 // for more details.
21 //
22 // You should have received a copy of the GNU General Public License along
23 // with eCos; if not, write to the Free Software Foundation, Inc.,
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
25 //
26 // As a special exception, if other files instantiate templates or use macros
27 // or inline functions from this file, or you compile this file and link it
28 // with other works to produce a work based on this file, this file does not
29 // by itself cause the resulting work to be covered by the GNU General Public
30 // License. However the source code for this file must still be made available
31 // in accordance with section (3) of the GNU General Public License.
32 //
33 // This exception does not invalidate any other reasons why a work based on
34 // this file might be covered by the GNU General Public License.
35 //
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
37 // at http://sources.redhat.com/ecos/ecos-license/
38 // -------------------------------------------
39 //####ECOSGPLCOPYRIGHTEND####
40 //===========================================================================
41 //#####DESCRIPTIONBEGIN####
42 //
43 // Author(s):    jlarmour
44 // Contributors: 
45 // Date:         2000-04-20
46 // Purpose:     
47 // Description: 
48 // Usage:       
49 //
50 //####DESCRIPTIONEND####
51 //
52 //===========================================================================
53
54 // CONFIGURATION
55
56 #include <pkgconf/libc_stdio.h>   // Configuration header
57
58 // Include buffered I/O?
59 #if defined(CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO)
60
61
62 // INCLUDES
63
64 #include <cyg/infra/cyg_type.h>   // Common project-wide type definitions
65 #include <cyg/infra/cyg_ass.h>    // Assertion support
66 #include <errno.h>                // Cyg_ErrNo
67 #include <stdlib.h>               // malloc() and free()
68 #include <cyg/libc/stdio/streambuf.hxx> // header for this file, just in case
69
70 // FUNCTIONS
71     
72 Cyg_ErrNo
73 Cyg_StdioStreamBuffer::set_buffer( cyg_ucount32 size,
74                                    cyg_uint8 *new_buffer )
75 {
76     
77 #ifdef CYGSEM_LIBC_STDIO_DYNAMIC_SETVBUF
78     
79     // user-supplied buffer?
80     if (new_buffer != NULL) {
81         CYG_CHECK_DATA_PTR(new_buffer, "new_buffer not valid");
82 #ifdef CYGSEM_LIBC_STDIO_SETVBUF_MALLOC
83         // first check if we were responsible for the old buffer
84         if (call_free) {
85             free(buffer_bottom);
86             call_free = false;
87         }
88 #endif        
89         buffer_bottom = new_buffer;
90     }
91 #ifdef CYGSEM_LIBC_STDIO_SETVBUF_MALLOC    
92     else if ( size != buffer_size ) { // as long as its different from
93                                       // what we've got now
94         cyg_uint8 *malloced_buf;
95
96         malloced_buf = (cyg_uint8 * )malloc( size );
97         if (malloced_buf == NULL)
98             return ENOMEM;
99
100         // should the old buffer be freed? This waits till after we know
101         // whether the malloc succeeded
102         if (call_free)
103             free( buffer_bottom );
104         
105         buffer_bottom = malloced_buf;
106
107         call_free=true;
108
109     } // else if
110 #else
111     // Here we have not been given a new buffer, but have been given
112     // a new buffer size. If possible, we just shrink what we already
113     // have.
114     else if( size > buffer_size )
115         return EINVAL;
116 #endif    
117     
118 #else // ifdef CYGSEM_LIBC_STDIO_DYNAMIC_SETVBUF
119     
120     // In this config we can't use a different buffer, or set a
121     // size greater than now. We can pretend to shrink it though
122     
123     // Note on the next line we compare it with the size of static_buffer
124     // and not the current size, as that's what is the limiting factor
125     if ( (new_buffer != NULL) || (size > sizeof(static_buffer)) )
126         return EINVAL;
127     
128 #endif // ifdef CYGSEM_LIBC_STDIO_DYNAMIC_SETVBUF
129     
130     buffer_top = current_buffer_position = &buffer_bottom[0];
131     buffer_size = size;
132     
133     return ENOERR;
134     
135 } // set_buffer()
136
137
138 #endif // if defined(CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO)
139
140
141 // EOF streambuf.cxx