diff options
-rw-r--r-- | src/library.js | 20 | ||||
-rw-r--r-- | tests/printf/output.txt | 3 | ||||
-rw-r--r-- | tests/printf/output_i64_1.txt | 3 | ||||
-rw-r--r-- | tests/printf/test.c | 3 |
4 files changed, 25 insertions, 4 deletions
diff --git a/src/library.js b/src/library.js index 995fa2ab..2faa40d7 100644 --- a/src/library.js +++ b/src/library.js @@ -1974,6 +1974,7 @@ LibraryManager.library = { var flagLeftAlign = false; var flagAlternative = false; var flagZeroPad = false; + var flagPadSign = false; flagsLoop: while (1) { switch (next) { case {{{ charCode('+') }}}: @@ -1992,6 +1993,9 @@ LibraryManager.library = { flagZeroPad = true; break; } + case {{{ charCode(' ') }}}: + flagPadSign = true; + break; default: break flagsLoop; } @@ -2158,8 +2162,12 @@ LibraryManager.library = { } // Add sign if needed - if (flagAlwaysSigned && currArg >= 0) { - prefix = '+' + prefix; + if (currArg >= 0) { + if (flagAlwaysSigned) { + prefix = '+' + prefix; + } else if (flagPadSign) { + prefix = ' ' + prefix; + } } // Move sign to prefix so we zero-pad after the sign @@ -2250,8 +2258,12 @@ LibraryManager.library = { if (next == {{{ charCode('E') }}}) argText = argText.toUpperCase(); // Add sign. - if (flagAlwaysSigned && currArg >= 0) { - argText = '+' + argText; + if (currArg >= 0) { + if (flagAlwaysSigned) { + argText = '+' + argText; + } else if (flagPadSign) { + argText = ' ' + argText; + } } } diff --git a/tests/printf/output.txt b/tests/printf/output.txt index 7ca4d88c..0155f0da 100644 --- a/tests/printf/output.txt +++ b/tests/printf/output.txt @@ -6,9 +6,12 @@ Decimals: 1977 650000 12 4 Preceding with blanks: 1977 -1977 Preceding with zeros: 0000001977 -000001977 Force sign: +1977 -1977 +1977 -1977 +Force sign or space: 1977 -1977 1977 -1977 +Sign overrides space: +1977 -1977 +1977 -1977 Some different radixes: 100 64 144 0x64 0144 floats: 3.14 +3e+00 3.141600E+00 00003.14 negative floats: -3.14 -3e+00 -3.141600E+00 -0003.14 +Force sign or space: 3.14 -3.14 3.14 -3.14 Width trick: 10 A string % Null string: (null) diff --git a/tests/printf/output_i64_1.txt b/tests/printf/output_i64_1.txt index 9cd8ed98..e38fb78f 100644 --- a/tests/printf/output_i64_1.txt +++ b/tests/printf/output_i64_1.txt @@ -6,9 +6,12 @@ Decimals: 1977 650000 12 4 Preceding with blanks: 1977 -1977 Preceding with zeros: 0000001977 -000001977 Force sign: +1977 -1977 +1977 -1977 +Force sign or space: 1977 -1977 1977 -1977 +Sign overrides space: +1977 -1977 +1977 -1977 Some different radixes: 100 64 144 0x64 0144 floats: 3.14 +3e+00 3.141600E+00 00003.14 negative floats: -3.14 -3e+00 -3.141600E+00 -0003.14 +Force sign or space: 3.14 -3.14 3.14 -3.14 Width trick: 10 A string % Null string: (null) diff --git a/tests/printf/test.c b/tests/printf/test.c index b01a99db..1c8ad9f7 100644 --- a/tests/printf/test.c +++ b/tests/printf/test.c @@ -11,9 +11,12 @@ int main() { printf("Preceding with blanks: %10d %10d\n", 1977, -1977); printf("Preceding with zeros: %010d %010d\n", 1977, -1977); printf("Force sign: %+d %+d %+6d %+6d\n", 1977, -1977, 1977, -1977); + printf("Force sign or space: % d % d % 6d % 6d\n", 1977, -1977, 1977, -1977); + printf("Sign overrides space: % +d % +d % +6d % +6d\n", 1977, -1977, 1977, -1977); printf("Some different radixes: %d %x %o %#x %#o\n", 100, 100, 100, 100, 100); printf("floats: %4.2f %+.0e %E %08.2f\n", 3.1416, 3.1416, 3.1416, 3.1416); printf("negative floats: %4.2f %+.0e %E %08.2f\n", -3.1416, -3.1416, -3.1416, -3.1416); + printf("Force sign or space: % .2f % .2f % 6.2f % 6.2f\n", 3.1416, -3.1416, 3.1416, -3.1416); printf("Width trick: %*d\n", 5, 10); printf("%s %%\n", "A string"); printf("Null string: %7s\n", NULL); |