comparison packages/language/c/libc/current/src/stdio/common/vsnprintf.cxx @ 0:3111d98ba7b3 ecos-v1_1-release

Initial commit of eCos version 1.1
author jlarmour
date Tue, 11 May 1999 11:16:07 +0000
parents
children 443894e2e912
comparison
equal deleted inserted replaced
-1:000000000000 0:3111d98ba7b3
1 //===========================================================================
2 //
3 // vsnprintf.cxx
4 //
5 // ANSI Stdio vsnprintf() function
6 //
7 //===========================================================================
8 //####COPYRIGHTBEGIN####
9 //
10 // -------------------------------------------
11 // The contents of this file are subject to the Cygnus eCos Public License
12 // Version 1.0 (the "License"); you may not use this file except in
13 // compliance with the License. You may obtain a copy of the License at
14 // http://sourceware.cygnus.com/ecos
15 //
16 // Software distributed under the License is distributed on an "AS IS"
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
18 // License for the specific language governing rights and limitations under
19 // the License.
20 //
21 // The Original Code is eCos - Embedded Cygnus Operating System, released
22 // September 30, 1998.
23 //
24 // The Initial Developer of the Original Code is Cygnus. Portions created
25 // by Cygnus are Copyright (C) 1998 Cygnus Solutions. All Rights Reserved.
26 // -------------------------------------------
27 //
28 //####COPYRIGHTEND####
29 //===========================================================================
30 //#####DESCRIPTIONBEGIN####
31 //
32 // Author(s): jlarmour
33 // Contributors: jlarmour@cygnus.co.uk
34 // Date: 1998-02-13
35 // Purpose:
36 // Description:
37 // Usage:
38 //
39 //####DESCRIPTIONEND####
40 //
41 //===========================================================================
42
43 // CONFIGURATION
44
45 #include <pkgconf/libc.h> // Configuration header
46
47 // Include the C library? And do we want the stdio stuff?
48 #if defined(CYGPKG_LIBC) && defined(CYGPKG_LIBC_STDIO)
49
50 // INCLUDES
51
52 #include <cyg/infra/cyg_type.h> // Common project-wide type definitions
53 #include <stddef.h> // NULL and size_t from compiler
54 #include <stdio.h> // header for this file
55 #include <errno.h> // error codes
56 #include <cyg/devs/common/table.h> // Device table stuff
57 #include <cyg/devs/common/iorb.h> // IORBs
58 #include "clibincl/stdiosupp.hxx" // Support functions for stdio
59 #include "clibincl/stream.hxx" // Cyg_StdioStream
60
61
62 // EXPORTED SYMBOLS
63
64 externC int
65 vsnprintf( char *, size_t, const char *, va_list )
66 CYGPRI_LIBC_WEAK_ALIAS("_vsnprintf");
67
68 // FUNCTIONS
69
70
71 static Cyg_ErrNo
72 str_write( CYG_ADDRWORD cookie, Cyg_IORB *iorb )
73 {
74 cyg_uint8 **str_p = (cyg_uint8 **) cookie;
75 cyg_ucount32 i=0;
76
77 // I suspect most strings passed to vsnprintf will be relatively short,
78 // so we just take the simple approach rather than have the overhead
79 // of calling memcpy etc.
80
81 // simply copy string until we run out of user space
82
83 for (i=0; i < iorb->buffer_length; i++, (*str_p)++ )
84 {
85 **str_p = *((char *)iorb->buffer + i);
86 } // for
87
88 iorb->xferred_length = i;
89
90 return ENOERR;
91
92 } // str_write()
93
94
95 externC int
96 _vsnprintf( char *s, size_t size, const char *format, va_list arg )
97 {
98 int rc;
99 // construct a fake device with the address of the string we've
100 // been passed as its private data. This way we can use the data
101 // directly
102 struct Cyg_Device_Table_t strdev = { "strdev",
103 (CYG_ADDRWORD) &s,
104 NULL, // open
105 NULL, // read_cancel
106 NULL, // write_cancel
107 NULL, // read_blocking
108 &str_write, // write_blocking
109 NULL, // read_asynchronous
110 NULL, // write_asynchronous
111 NULL, // close
112 0 }; // ioctl
113 Cyg_StdioStream my_stream( &strdev, Cyg_StdioStream::CYG_STREAM_WRITE,
114 false, false, _IONBF, 0, NULL );
115
116 rc = _vfnprintf( (FILE *)&my_stream, size, format, arg );
117
118 // Null-terminate it, but note that s has been changed by str_write(), so
119 // that it now points to the end of the string
120 s[0] = '\0';
121
122 return rc;
123
124 } // _vsnprintf()
125
126 #endif // if defined(CYGPKG_LIBC) && defined(CYGPKG_LIBC_STDIO)
127
128 // EOF vsnprintf.cxx