[ipxe-devel] [PATCH 1/2] [core] vsnprintf: support %lld for formatting 64-bit integers

Johannes Thoma johannes at johannesthoma.com
Tue Jan 22 19:14:46 UTC 2019


In order to support sanboot-ing images larger than 2GB over http
we need to be able to format numbers larger than 2 ** 31 (for the
http range parameter).

Signed-off-by: Johannes Thoma <johannes at johannesthoma.com>
---
 src/core/vsprintf.c       | 8 +++++---
 src/tests/vsprintf_test.c | 3 +++
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/core/vsprintf.c b/src/core/vsprintf.c
index 9d3a97c2..fc52842b 100644
--- a/src/core/vsprintf.c
+++ b/src/core/vsprintf.c
@@ -130,7 +130,7 @@ static char * format_hex ( char *end, unsigned long long num, int width,
  * There must be enough space in the buffer to contain the largest
  * number that this function can format.
  */
-static char * format_decimal ( char *end, signed long num, int width,
+static char * format_decimal ( char *end, signed long long num, int width,
 			       int flags ) {
 	char *ptr = end;
 	int negative = 0;
@@ -283,9 +283,11 @@ size_t vcprintf ( struct printf_context *ctx, const char *fmt, va_list args ) {
 			}
 			ptr = format_hex ( ptr, hex, width, flags );
 		} else if ( ( *fmt == 'd' ) || ( *fmt == 'i' ) ){
-			signed long decimal;
+			signed long long decimal;
 
-			if ( *length >= sizeof ( signed long ) ) {
+			if ( *length >= sizeof ( signed long long ) ) {
+				decimal = va_arg ( args, signed long long );
+			} else if ( *length >= sizeof ( signed long ) ) {
 				decimal = va_arg ( args, signed long );
 			} else {
 				decimal = va_arg ( args, signed int );
diff --git a/src/tests/vsprintf_test.c b/src/tests/vsprintf_test.c
index f388b3de..9ffec798 100644
--- a/src/tests/vsprintf_test.c
+++ b/src/tests/vsprintf_test.c
@@ -100,6 +100,9 @@ static void vsprintf_test_exec ( void ) {
 	snprintf_ok ( 16, "-072", "%04d", -72 );
 	snprintf_ok ( 16, "4", "%zd", sizeof ( uint32_t ) );
 	snprintf_ok ( 16, "123456789", "%d", 123456789 );
+	snprintf_ok ( 64, "123456789123456789", "%lld", 123456789123456789LL );
+	snprintf_ok ( 64, "-123456789123456789", "%lld",
+			   -123456789123456789LL );
 
 	/* Realistic combinations */
 	snprintf_ok ( 64, "DBG 0x1234 thingy at 0x0003f0c0+0x5c\n",
-- 
2.17.0




More information about the ipxe-devel mailing list