diff options
author | Jean-Philippe Bernardy <jeanphilippe.bernardy@gmail.com> | 2005-01-23 23:08:07 +0000 |
---|---|---|
committer | Jean-Philippe Bernardy <jeanphilippe.bernardy@gmail.com> | 2005-01-23 23:08:07 +0000 |
commit | fc0372b209d21cb6317078f63774aa4bef6dff29 (patch) | |
tree | c63574bd1073fcd16e003ed0d014e5a272f859bf /firmware | |
parent | 2e41950fcf98b4f5eee95e2e5e72681557eca585 (diff) | |
download | rockbox-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
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/common/sprintf.c | 38 | ||||
-rw-r--r-- | firmware/include/sprintf.h | 13 |
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 | ||
26 | int 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 | |||
32 | int snprintf (char *buf, size_t size, const char *fmt, ...) | ||
33 | ATTRIBUTE_PRINTF(3, 4); | ||
34 | |||
27 | int vsnprintf (char *buf, int size, const char *fmt, va_list ap); | 35 | int vsnprintf (char *buf, int size, const char *fmt, va_list ap); |
28 | int fprintf (int fd, const char *fmt, ...); | 36 | int fprintf (int fd, const char *fmt, ...) |
37 | ATTRIBUTE_PRINTF(2, 3); | ||
29 | 38 | ||
30 | #endif /* __SPRINTF_H__ */ | 39 | #endif /* __SPRINTF_H__ */ |