summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Philippe Bernardy <jeanphilippe.bernardy@gmail.com>2005-01-23 23:08:07 +0000
committerJean-Philippe Bernardy <jeanphilippe.bernardy@gmail.com>2005-01-23 23:08:07 +0000
commitfc0372b209d21cb6317078f63774aa4bef6dff29 (patch)
treec63574bd1073fcd16e003ed0d014e5a272f859bf
parent2e41950fcf98b4f5eee95e2e5e72681557eca585 (diff)
downloadrockbox-fc0372b209d21cb6317078f63774aa4bef6dff29.tar.gz
rockbox-fc0372b209d21cb6317078f63774aa4bef6dff29.zip
Support for %l* plus __attribute__ printf support
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@5641 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/common/sprintf.c38
-rw-r--r--firmware/include/sprintf.h13
2 files changed, 48 insertions, 3 deletions
diff --git a/firmware/common/sprintf.c b/firmware/common/sprintf.c
index 6542c9d993..a92681e736 100644
--- a/firmware/common/sprintf.c
+++ b/firmware/common/sprintf.c
@@ -43,7 +43,9 @@ static int format(
43 char *str; 43 char *str;
44 char tmpbuf[12], pad; 44 char tmpbuf[12], pad;
45 int ch, width, val, sign; 45 int ch, width, val, sign;
46 long lval;
46 unsigned int uval; 47 unsigned int uval;
48 unsigned long ulval;
47 bool ok = true; 49 bool ok = true;
48 50
49 tmpbuf[sizeof tmpbuf - 1] = '\0'; 51 tmpbuf[sizeof tmpbuf - 1] = '\0';
@@ -99,7 +101,41 @@ static int format(
99 } 101 }
100 while (uval); 102 while (uval);
101 break; 103 break;
102 104
105 case 'l':
106 ch = *fmt++;
107 switch(ch) {
108 case 'x':
109 case 'X':
110 ulval = va_arg (ap, long);
111 do
112 {
113 *--str = hexdigit[ulval & 0xf];
114 ulval >>= 4;
115 }
116 while (ulval);
117 break;
118 case 'd':
119 lval = sign = va_arg (ap, long);
120 if (lval < 0)
121 lval = -lval;
122 do
123 {
124 *--str = (lval % 10) + '0';
125 lval /= 10;
126 }
127 while (lval > 0);
128 if (sign < 0)
129 *--str = '-';
130 break;
131
132 default:
133 *--str = 'l';
134 *--str = ch;
135 }
136
137 break;
138
103 default: 139 default:
104 *--str = ch; 140 *--str = ch;
105 break; 141 break;
diff --git a/firmware/include/sprintf.h b/firmware/include/sprintf.h
index 61a5f5139f..d68647ee72 100644
--- a/firmware/include/sprintf.h
+++ b/firmware/include/sprintf.h
@@ -23,8 +23,17 @@
23#include <stddef.h> 23#include <stddef.h>
24#include <stdarg.h> 24#include <stdarg.h>
25 25
26int snprintf (char *buf, size_t size, const char *fmt, ...); 26#ifdef __GNUC__
27#define ATTRIBUTE_PRINTF(fmt, arg1) __attribute__ ( ( format( printf, fmt, arg1 ) ) )
28#else
29#define ATTRIBUTE_PRINTF(fmt, arg1)
30#endif
31
32int snprintf (char *buf, size_t size, const char *fmt, ...)
33 ATTRIBUTE_PRINTF(3, 4);
34
27int vsnprintf (char *buf, int size, const char *fmt, va_list ap); 35int vsnprintf (char *buf, int size, const char *fmt, va_list ap);
28int fprintf (int fd, const char *fmt, ...); 36int fprintf (int fd, const char *fmt, ...)
37 ATTRIBUTE_PRINTF(2, 3);
29 38
30#endif /* __SPRINTF_H__ */ 39#endif /* __SPRINTF_H__ */