]> git.karo-electronics.de Git - karo-tx-redboot.git/blob - packages/language/c/libc/stdio/v2_0/src/common/vsnprintf.cxx
988e1160a5f6f07ccb64a46baa2e1106101932d0
[karo-tx-redboot.git] / packages / language / c / libc / stdio / v2_0 / src / common / vsnprintf.cxx
1 //===========================================================================
2 //
3 //      vsnprintf.cxx
4 //
5 //      ANSI Stdio vsnprintf() function
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:  jlarmour
45 // Date:        1998-02-13
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 // INCLUDES
59
60 #include <cyg/infra/cyg_type.h>     // Common project-wide type definitions
61 #include <stddef.h>                 // NULL and size_t from compiler
62 #include <stdio.h>                  // header for this file
63 #include <errno.h>                  // error codes
64 #include <cyg/io/devtab.h>          // Device table
65 #include <cyg/libc/stdio/stream.hxx>// Cyg_StdioStream
66
67 #include <cyg/libc/stdio/io.inl>     // I/O system inlines
68
69 #ifndef CYGPKG_LIBC_STDIO_FILEIO
70
71 // FUNCTIONS
72
73 static Cyg_ErrNo
74 str_write(cyg_stdio_handle_t handle, const void *buf, cyg_uint32 *len)
75 {
76     cyg_devtab_entry_t *dev = (cyg_devtab_entry_t *)handle;
77     cyg_uint8 **str_p = (cyg_uint8 **)dev->priv;
78     cyg_ucount32 i;
79
80     // I suspect most strings passed to vsnprintf will be relatively short,
81     // so we just take the simple approach rather than have the overhead
82     // of calling memcpy etc.
83
84     // simply copy string until we run out of user space
85
86     for (i = 0; i < *len; i++, (*str_p)++ )
87     {
88         **str_p = *((cyg_uint8 *)buf + i);
89     } // for
90
91     *len = i;
92
93     return ENOERR;
94     
95 } // str_write()
96
97 static DEVIO_TABLE(devio_table,
98                    str_write,       // write
99                    NULL,            // read
100                    NULL,            // select
101                    NULL,            // get_config
102                    NULL);           // set_config
103
104 externC int
105 vsnprintf( char *s, size_t size, const char *format, va_list arg ) __THROW
106 {
107     int rc;
108     // construct a fake device with the address of the string we've
109     // been passed as its private data. This way we can use the data
110     // directly
111     DEVTAB_ENTRY_NO_INIT(strdev,
112                          "strdev",       // Name
113                          NULL,           // Dependent name (layered device)
114                          &devio_table,   // I/O function table
115                          NULL,           // Init
116                          NULL,           // Lookup
117                          &s);            // private
118     Cyg_StdioStream my_stream( &strdev, Cyg_StdioStream::CYG_STREAM_WRITE,
119                                false, false, _IONBF, 0, NULL );
120     
121     rc = vfnprintf( (FILE *)&my_stream, size, format, arg );
122
123     // Null-terminate it, but note that s has been changed by str_write(), so
124     // that it now points to the end of the string
125     s[0] = '\0';
126
127     return rc;
128
129 } // vsnprintf()
130
131 #else
132
133 externC int
134 vsnprintf( char *s, size_t size, const char *format, va_list arg ) __THROW
135 {
136     int rc;
137
138     Cyg_StdioStream my_stream( Cyg_StdioStream::CYG_STREAM_WRITE,
139                                size, (cyg_uint8 *)s );
140     
141     rc = vfnprintf( (FILE *)&my_stream, size, format, arg );
142
143     if( rc > 0 )
144         s[rc] = '\0';
145
146     return rc;
147
148 } // vsnprintf()
149
150 #endif
151
152 // EOF vsnprintf.cxx