summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2017-09-29 16:54:31 -0400
committerFranklin Wei <git@fwei.tk>2017-12-23 20:55:02 -0500
commit01c6dcf6c7b9bb1ad2fa0450f99bacc5f3d3e04b (patch)
tree28064ac51c2c150bb33a3f0f53db3771fc54fd3a
parenta8423321b802bff39fe2ba22f2b0a26220a57535 (diff)
downloadrockbox-01c6dcf6c7b9bb1ad2fa0450f99bacc5f3d3e04b.tar.gz
rockbox-01c6dcf6c7b9bb1ad2fa0450f99bacc5f3d3e04b.zip
Support floating-point formatting
This is just a quick and dirty way to get %f formatting to work for some games. It works. Change-Id: I75585e0c6a0f9d6db41a87b71ca405b067d8b85d
-rw-r--r--firmware/common/vuprintf.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/firmware/common/vuprintf.c b/firmware/common/vuprintf.c
index c32b690cf8..1c0adad00e 100644
--- a/firmware/common/vuprintf.c
+++ b/firmware/common/vuprintf.c
@@ -524,6 +524,18 @@ static inline const char * format_p(const void *p,
524} 524}
525#endif /* FMT_RADIX_p */ 525#endif /* FMT_RADIX_p */
526 526
527#undef ABS
528#define ABS(x) ((x)<0?-(x):(x))
529
530static const char * format_f(double f,
531 struct fmt_buf *fmt_buf,
532 int radixchar,
533 bool *numericp)
534{
535 fmt_buf->length = snprintf(fmt_buf->buf, 24, "%d.%06d", (int)f, ABS((int)((f - (int)f)*1e6)));
536 return fmt_buf->buf;
537}
538
527/* parse fixed width or precision field */ 539/* parse fixed width or precision field */
528static const char * parse_number_spec(const char *fmt, 540static const char * parse_number_spec(const char *fmt,
529 int ch, 541 int ch,
@@ -741,6 +753,12 @@ int vuprintf(vuprintf_push_cb push, /* call 'push()' for each output letter */
741 break; 753 break;
742 #endif 754 #endif
743 755
756 case 'f':
757 case 'g':
758 buf = format_f(va_arg(ap, double), &fmt_buf, ch,
759 &numeric);
760 break;
761
744 /** signed integer **/ 762 /** signed integer **/
745 case 'd': 763 case 'd':
746 case 'i': 764 case 'i':