source: arduino-1-6-7/trunk/fuentes/arduino-ide-amd64/hardware/arduino/avr/firmwares/wifishield/wifi_dnld/src/printf-stdarg.c @ 4837

Last change on this file since 4837 was 4837, checked in by daduve, 2 years ago

Adding new version

File size: 8.6 KB
Line 
1/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */
2
3/* This source file is part of the ATMEL AVR32-SoftwareFramework-AT32UC3A-1.4.0 Release */
4
5/*This file has been prepared for Doxygen automatic documentation generation.*/
6/*! \file *********************************************************************
7 *
8 * \brief sprintf functions to replace newlib for AVR32 UC3.
9 *
10 * - Compiler:           IAR EWAVR32 and GNU GCC for AVR32
11 * - Supported devices:  All AVR32 devices can be used.
12 * - AppNote:
13 *
14 * \author               Atmel Corporation: http://www.atmel.com \n
15 *                       Support and FAQ: http://support.atmel.no/
16 *
17 *****************************************************************************/
18
19/* Copyright (C) 2006-2008, Atmel Corporation All rights reserved.
20 *
21 * Redistribution and use in source and binary forms, with or without
22 * modification, are permitted provided that the following conditions are met:
23 *
24 * 1. Redistributions of source code must retain the above copyright notice,
25 * this list of conditions and the following disclaimer.
26 *
27 * 2. Redistributions in binary form must reproduce the above copyright notice,
28 * this list of conditions and the following disclaimer in the documentation
29 * and/or other materials provided with the distribution.
30 *
31 * 3. The name of ATMEL may not be used to endorse or promote products derived
32 * from this software without specific prior written permission.
33 *
34 * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED
35 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
36 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND
37 * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT,
38 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
39 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
40 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
41 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
42 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
43 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
44 */
45
46/*
47        Copyright 2001, 2002 Georges Menie (www.menie.org)
48        stdarg version contributed by Christian Ettinger
49
50    This program is free software; you can redistribute it and/or modify
51    it under the terms of the GNU Lesser General Public License as published by
52    the Free Software Foundation; either version 2 of the License, or
53    (at your option) any later version.
54
55    This program is distributed in the hope that it will be useful,
56    but WITHOUT ANY WARRANTY; without even the implied warranty of
57    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
58    GNU Lesser General Public License for more details.
59
60    You should have received a copy of the GNU Lesser General Public License
61    along with this program; if not, write to the Free Software
62    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
63*/
64
65/*
66        putchar is the only external dependency for this file,
67        if you have a working putchar, leave it commented out.
68        If not, uncomment the define below and
69        replace outbyte(c) by your own function call.
70
71*/
72
73
74#include <sys/reent.h>
75#include <stdarg.h>
76
77#define putchar(c) print_dbg_char(c)
78
79static void printchar(char **str, int c)
80{
81        extern int putchar(int c);
82       
83        if (str) {
84                **str = c;
85                ++(*str);
86        }
87        else (void)putchar(c);
88}
89
90#define PAD_RIGHT 1
91#define PAD_ZERO 2
92
93static int prints(char **out, const char *string, int width, int pad)
94{
95        register int pc = 0, padchar = ' ';
96
97        if (width > 0) {
98                register int len = 0;
99                register const char *ptr;
100                for (ptr = string; *ptr; ++ptr) ++len;
101                if (len >= width) width = 0;
102                else width -= len;
103                if (pad & PAD_ZERO) padchar = '0';
104        }
105        if (!(pad & PAD_RIGHT)) {
106                for ( ; width > 0; --width) {
107                        printchar (out, padchar);
108                        ++pc;
109                }
110        }
111        for ( ; *string ; ++string) {
112                printchar (out, *string);
113                ++pc;
114        }
115        for ( ; width > 0; --width) {
116                printchar (out, padchar);
117                ++pc;
118        }
119
120        return pc;
121}
122
123/* the following should be enough for 32 bit int */
124#define PRINT_BUF_LEN 12
125
126static int printi(char **out, int i, int b, int sg, int width, int pad, int letbase)
127{
128        char print_buf[PRINT_BUF_LEN];
129        register char *s;
130        register int t, neg = 0, pc = 0;
131        register unsigned int u = i;
132
133        if (i == 0) {
134                print_buf[0] = '0';
135                print_buf[1] = '\0';
136                return prints (out, print_buf, width, pad);
137        }
138
139        if (sg && b == 10 && i < 0) {
140                neg = 1;
141                u = -i;
142        }
143
144        s = print_buf + PRINT_BUF_LEN-1;
145        *s = '\0';
146
147        while (u) {
148                t = u % b;
149                if( t >= 10 )
150                        t += letbase - '0' - 10;
151                *--s = t + '0';
152                u /= b;
153        }
154
155        if (neg) {
156                if( width && (pad & PAD_ZERO) ) {
157                        printchar (out, '-');
158                        ++pc;
159                        --width;
160                }
161                else {
162                        *--s = '-';
163                }
164        }
165
166        return pc + prints (out, s, width, pad);
167}
168
169int fprintf(__FILE *stream, const char *format, ...)
170{
171return 0;
172}
173int printk_va(char **out, const char *format, va_list args )
174{
175        register int width, pad;
176        register int pc = 0;
177        char scr[2];
178
179        for (; *format != 0; ++format) {
180                if (*format == '%') {
181                        ++format;
182                        width = pad = 0;
183                        if (*format == '\0') break;
184                        if (*format == '%') goto out;
185                        if (*format == '-') {
186                                ++format;
187                                pad = PAD_RIGHT;
188                        }
189                        while (*format == '0') {
190                                ++format;
191                                pad |= PAD_ZERO;
192                        }
193                        for ( ; *format >= '0' && *format <= '9'; ++format) {
194                                width *= 10;
195                                width += *format - '0';
196                        }
197                        if( *format == 's' ) {
198                                register char *s = (char *)va_arg( args, int );
199                                pc += prints (out, s?s:"(null)", width, pad);
200                                continue;
201                        }
202                        if( *format == 'd' ) {
203                                pc += printi (out, va_arg( args, int ), 10, 1, width, pad, 'a');
204                                continue;
205                        }
206                        if( *format == 'p' ) {
207                                pad = 8;
208                                pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'a');
209                                continue;
210                        }
211                        if( *format == 'x' ) {
212                                pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'a');
213                                continue;
214                        }
215                        if( *format == 'X' ) {
216                                pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'A');
217                                continue;
218                        }
219                        if( *format == 'u' ) {
220                                pc += printi (out, va_arg( args, int ), 10, 0, width, pad, 'a');
221                                continue;
222                        }
223                        if( *format == 'c' ) {
224                                /* char are converted to int then pushed on the stack */
225                                scr[0] = (char)va_arg( args, int );
226                                scr[1] = '\0';
227                                pc += prints (out, scr, width, pad);
228                                continue;
229                        }
230                }
231                else {
232                out:
233                        printchar (out, *format);
234                        ++pc;
235                }
236        }
237        if (out) **out = '\0';
238        va_end( args );
239        return pc;
240}
241
242int printk(const char *format, ...)
243{
244        va_list args;
245       
246        va_start( args, format );
247        return printk_va( 0, format, args );
248}
249
250int sprintf(char *out, const char *format, ...)
251{
252        va_list args;
253       
254        va_start( args, format );
255        return printk_va( &out, format, args );
256}
257
258#ifdef TEST_PRINTF
259int main(void)
260{
261        char *ptr = "Hello world!";
262        char *np = 0;
263        int i = 5;
264        unsigned int bs = sizeof(int)*8;
265        int mi;
266        char buf[80];
267
268        mi = (1 << (bs-1)) + 1;
269        printf("%s\n", ptr);
270        printf("printf test\n");
271        printf("%s is null pointer\n", np);
272        printf("%d = 5\n", i);
273        printf("%d = - max int\n", mi);
274        printf("char %c = 'a'\n", 'a');
275        printf("hex %x = ff\n", 0xff);
276        printf("hex %02x = 00\n", 0);
277        printf("signed %d = unsigned %u = hex %x\n", -3, -3, -3);
278        printf("%d %s(s)%", 0, "message");
279        printf("\n");
280        printf("%d %s(s) with %%\n", 0, "message");
281        sprintf(buf, "justif: \"%-10s\"\n", "left"); printf("%s", buf);
282        sprintf(buf, "justif: \"%10s\"\n", "right"); printf("%s", buf);
283        sprintf(buf, " 3: %04d zero padded\n", 3); printf("%s", buf);
284        sprintf(buf, " 3: %-4d left justif.\n", 3); printf("%s", buf);
285        sprintf(buf, " 3: %4d right justif.\n", 3); printf("%s", buf);
286        sprintf(buf, "-3: %04d zero padded\n", -3); printf("%s", buf);
287        sprintf(buf, "-3: %-4d left justif.\n", -3); printf("%s", buf);
288        sprintf(buf, "-3: %4d right justif.\n", -3); printf("%s", buf);
289
290        return 0;
291}
292
293/*
294 * if you compile this file with
295 *   gcc -Wall $(YOUR_C_OPTIONS) -DTEST_PRINTF -c printf.c
296 * you will get a normal warning:
297 *   printf.c:214: warning: spurious trailing `%' in format
298 * this line is testing an invalid % at the end of the format string.
299 *
300 * this should display (on 32bit int machine) :
301 *
302 * Hello world!
303 * printf test
304 * (null) is null pointer
305 * 5 = 5
306 * -2147483647 = - max int
307 * char a = 'a'
308 * hex ff = ff
309 * hex 00 = 00
310 * signed -3 = unsigned 4294967293 = hex fffffffd
311 * 0 message(s)
312 * 0 message(s) with %
313 * justif: "left      "
314 * justif: "     right"
315 *  3: 0003 zero padded
316 *  3: 3    left justif.
317 *  3:    3 right justif.
318 * -3: -003 zero padded
319 * -3: -3   left justif.
320 * -3:   -3 right justif.
321 */
322
323#endif
Note: See TracBrowser for help on using the repository browser.