7a8e62af3c37bdf21e309de3d3ce261d9df0d664
[bertos.git] / mware / sprintf.c
1 /*!
2  * \file
3  * <!--
4  * Copyright (C) 2002,2004 Develer S.r.l. (http://www.develer.com/)
5  * All Rights Reserved.
6  * -->
7  *
8  * \version $Id$
9  *
10  * \author Bernardo Innocenti <bernie@develer.com>
11  *
12  * \brief Simple sprintf() implementation based on _formatted_write()
13  */
14
15 /*
16  * $Log$
17  * Revision 1.1  2004/05/23 15:43:16  bernie
18  * Import mware modules.
19  *
20  * Revision 1.4  2004/04/03 20:42:27  aleph
21  * Remove duplicated defines
22  *
23  * Revision 1.3  2004/03/24 15:48:53  bernie
24  * Remove Copyright messages from Doxygen output
25  *
26  * Revision 1.2  2004/03/19 16:51:30  bernie
27  * Add PROGMEM kludge.
28  *
29  * Revision 1.1  2004/02/23 09:45:09  aleph
30  * Add missing library functions.
31  *
32  * Revision 1.1  2003/11/13 16:56:37  aleph
33  * Add first implementation of dsp firmware
34  *
35  */
36
37 #include "compiler.h"
38 #include "formatwr.h"
39 #include <stdio.h>
40
41
42 static void __str_put_char(char c, void *ptr)
43 {
44         /*
45          * This Does not work on Code Warrior. Hmm...
46          *      *(*((char **)ptr))++ = c;
47          */
48
49         **((char **)ptr) = c;
50         (*((char **)ptr))++;
51 }
52
53 static void __null_put_char(UNUSED(char c), UNUSED(void *ptr))
54 {
55         /* nop */
56 }
57
58
59 int PGM_FUNC(vsprintf)(char * str, const char * PGM_ATTR fmt, va_list ap)
60 {
61         int result;
62
63         result = PGM_FUNC(_formatted_write)(
64                         fmt, (str ? __str_put_char : __null_put_char), &str, ap);
65
66         /* terminate string */
67         *str = '\0';
68
69         return result;
70 }
71
72 /* FIXME: sprintf_P is incorrectly declared in <stdio.h> */
73 int PGM_FUNC(sprintf)(char *str, const char * fmt, ...)
74 {
75         int result;
76         va_list ap;
77
78         va_start(ap, fmt);
79         result = PGM_FUNC(vsprintf)(str, fmt, ap);
80         va_end(ap);
81
82         /* terminate string */
83         *str = '\0';
84
85         return result;
86 }