aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--src/library.js292
-rw-r--r--src/parseTools.js2
-rw-r--r--tests/printf/output.txt8008
-rw-r--r--tests/printf/test.c8014
-rw-r--r--tests/runner.py62
6 files changed, 16337 insertions, 43 deletions
diff --git a/.gitignore b/.gitignore
index e0f0efc7..c9848df5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,2 @@
*.diff
-
+*.pyc
diff --git a/src/library.js b/src/library.js
index 083bf29c..54256c44 100644
--- a/src/library.js
+++ b/src/library.js
@@ -63,10 +63,10 @@ var Library = {
},
sscanf: '_scanString',
- _formatString__deps: ['$STDIO'],
+ _formatString__deps: ['$STDIO', 'isdigit'],
_formatString: function() {
function isFloatArg(type) {
- return String.fromCharCode(type) in Runtime.set('f', 'e', 'g');
+ return String.fromCharCode(type).toLowerCase() in Runtime.set('f', 'e', 'g');
}
var cStyle = false;
var textIndex = arguments[0];
@@ -101,66 +101,250 @@ var Library = {
if (curr === 0) break;
next = {{{ makeGetValue(0, 'textIndex+1', 'i8') }}};
if (curr == '%'.charCodeAt(0)) {
- // Handle very very simply formatting, namely only %.X[f|d|u|etc.]
- var precision = -1;
+ // Handle flags.
+ var flagAlwaysSigned = false;
+ var flagLeftAlign = false;
+ var flagAlternative = false;
+ var flagZeroPad = false;
+ flagsLoop: while (1) {
+ switch (next) {
+ case '+'.charCodeAt(0):
+ flagAlwaysSigned = true;
+ break;
+ case '-'.charCodeAt(0):
+ flagLeftAlign = true;
+ break;
+ case '#'.charCodeAt(0):
+ flagAlternative = true;
+ break;
+ case '0'.charCodeAt(0):
+ if (flagZeroPad) {
+ break flagsLoop;
+ } else {
+ flagZeroPad = true;
+ break;
+ }
+ default:
+ break flagsLoop;
+ }
+ textIndex++;
+ next = {{{ makeGetValue(0, 'textIndex+1', 'i8') }}};
+ }
+
+ // Handle width.
+ var width = 0;
+ if (next == '*'.charCodeAt(0)) {
+ width = getNextArg('i');
+ textIndex++;
+ next = {{{ makeGetValue(0, 'textIndex+1', 'i8') }}};
+ } else {
+ while (_isdigit(next)) {
+ width = width * 10 + (next - '0'.charCodeAt(0));
+ textIndex++;
+ next = {{{ makeGetValue(0, 'textIndex+1', 'i8') }}};
+ }
+ }
+
+ // Handle precision.
+ var precisionSet = false;
if (next == '.'.charCodeAt(0)) {
+ var precision = 0;
+ precisionSet = true;
textIndex++;
- precision = 0;
- while(1) {
- var precisionChr = {{{ makeGetValue(0, 'textIndex+1', 'i8') }}};
- if (!(precisionChr >= '0'.charCodeAt(0) && precisionChr <= '9'.charCodeAt(0))) break;
- precision *= 10;
- precision += precisionChr - '0'.charCodeAt(0);
+ next = {{{ makeGetValue(0, 'textIndex+1', 'i8') }}};
+ if (next == '*'.charCodeAt(0)) {
+ precision = getNextArg('i');
textIndex++;
+ } else {
+ while(1) {
+ var precisionChr = {{{ makeGetValue(0, 'textIndex+1', 'i8') }}};
+ if (!_isdigit(precisionChr)) break;
+ precision = precision * 10 + (precisionChr - '0'.charCodeAt(0));
+ textIndex++;
+ }
}
next = {{{ makeGetValue(0, 'textIndex+1', 'i8') }}};
+ } else {
+ var precision = 6; // Standard default.
}
- if (next == 'l'.charCodeAt(0) || next == 'L'.charCodeAt(0)) {
+
+ // Handle (ignore) integer sizes.
+ if (next == 'l'.charCodeAt(0) && {{{ makeGetValue(0, 'textIndex+2', 'i8') }}} == 'l'.charCodeAt(0) ||
+ next == 'h'.charCodeAt(0) && {{{ makeGetValue(0, 'textIndex+2', 'i8') }}} == 'h'.charCodeAt(0)) {
+ textIndex += 2;
+ next = {{{ makeGetValue(0, 'textIndex+1', 'i8') }}};
+ } else if (next == 'l'.charCodeAt(0) || next == 'L'.charCodeAt(0) ||
+ next == 'h'.charCodeAt(0) || next == 'z'.charCodeAt(0) ||
+ next == 'j'.charCodeAt(0) || next == 't'.charCodeAt(0)) {
textIndex++;
next = {{{ makeGetValue(0, 'textIndex+1', 'i8') }}};
}
- if (isFloatArg(next)) {
- next = 'f'.charCodeAt(0); // no support for 'e'
- }
- if (['d', 'i', 'u', 'p', 'f'].indexOf(String.fromCharCode(next)) != -1) {
- var currArg;
+
+ // Handle type specifier.
+ if (['d', 'i', 'u', 'o', 'x', 'X', 'p'].indexOf(String.fromCharCode(next)) != -1) {
+ // Integer.
+ var currArg = +getNextArg(next); // +: boolean=>int
+ var currAbsArg = Math.abs(currArg);
var argText;
- currArg = getNextArg(next);
- argText = String(+currArg); // +: boolean=>int
- if (next == 'u'.charCodeAt(0)) {
- argText = String(unSign(currArg, 32));
+ var prefix = '';
+ if (next == 'd'.charCodeAt(0) || next == 'i'.charCodeAt(0)) {
+ argText = currAbsArg.toString(10);
+ } else if (next == 'u'.charCodeAt(0)) {
+ argText = unSign(currArg, 32).toString(10);
+ currArg = Math.abs(currArg);
+ } else if (next == 'o'.charCodeAt(0)) {
+ argText = (flagAlternative ? '0' : '') + currAbsArg.toString(8);
+ } else if (next == 'x'.charCodeAt(0)) {
+ prefix = flagAlternative ? '0x' : '';
+ argText = currAbsArg.toString(16);
+ } else if (next == 'X'.charCodeAt(0)) {
+ prefix = flagAlternative ? '0X' : '';
+ argText = currAbsArg.toString(16).toUpperCase();
} else if (next == 'p'.charCodeAt(0)) {
- argText = '0x' + currArg.toString(16);
- } else {
- argText = String(+currArg); // +: boolean=>int
+ prefix = '0x';
+ argText = currAbsArg.toString(16);
}
- if (precision >= 0) {
- if (isFloatArg(next)) {
- argText = (Math.round(currArg*Math.pow(10,precision))/Math.pow(10,precision)).toString();
- var dotIndex = argText.indexOf('.');
- if (dotIndex == -1 && next == 'f'.charCodeAt(0)) {
- dotIndex = argText.length;
- argText += '.';
- }
- argText += '00000000000'; // padding
- argText = argText.substr(0, dotIndex+1+precision);
+ if (precisionSet) {
+ while (argText.length < precision) {
+ argText = '0' + argText;
+ }
+ }
+
+ // Add sign.
+ if (currArg < 0) {
+ prefix = '-' + prefix;
+ } else if (flagAlwaysSigned) {
+ prefix = '+' + prefix;
+ }
+
+ // Add padding.
+ while (prefix.length + argText.length < width) {
+ if (flagLeftAlign) {
+ argText += ' ';
} else {
- while (argText.length < precision) {
+ if (flagZeroPad) {
argText = '0' + argText;
+ } else {
+ prefix = ' ' + prefix;
+ }
+ }
+ }
+
+ argText = prefix + argText;
+ argText.split('').forEach(function(chr) {
+ ret.push(chr.charCodeAt(0));
+ });
+ textIndex += 2;
+ } else if (['f', 'F', 'e', 'E', 'g', 'G'].indexOf(String.fromCharCode(next)) != -1) {
+ // Float.
+ var currArg = +getNextArg(next); // +: boolean=>int
+ var argText;
+
+ if (isNaN(currArg)) {
+ argText = 'nan';
+ } else if (!isFinite(currArg)) {
+ argText = (currArg < 0 ? '-' : '') + 'inf';
+ } else {
+ var isGeneral = false;
+ var effectivePrecision = Math.min(precision, 20);
+
+ // Convert g/G to f/F or e/E, as per:
+ // http://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html
+ if (next == 'g'.charCodeAt(0) || next == 'G'.charCodeAt(0)) {
+ isGeneral = true;
+ precision = precision || 1;
+ var exponent = parseInt(currArg.toExponential(effectivePrecision).split('e')[1], 10);
+ if (precision > exponent && exponent >= -4) {
+ next = ((next == 'g'.charCodeAt(0)) ? 'f' : 'F').charCodeAt(0);
+ precision -= exponent + 1;
+ } else {
+ next = ((next == 'g'.charCodeAt(0)) ? 'e' : 'E').charCodeAt(0);
+ precision--;
+ }
+ effectivePrecision = Math.min(precision, 20);
+ }
+
+ if (next == 'e'.charCodeAt(0) || next == 'E'.charCodeAt(0)) {
+ argText = currArg.toExponential(effectivePrecision);
+ // Make sure the exponent has at least 2 digits.
+ if (/[eE][-+]\d$/.test(argText)) {
+ argText = argText.slice(0, -1) + '0' + argText.slice(-1);
+ }
+ } else if (next == 'f'.charCodeAt(0) || next == 'F'.charCodeAt(0)) {
+ argText = currArg.toFixed(effectivePrecision);
+ }
+
+ var parts = argText.split('e');
+ if (isGeneral && !flagAlternative) {
+ // Discard trailing zeros and periods.
+ while (parts[0].length > 1 && (parts[0].slice(-1) == '0' || parts[0].slice(-1) == '.')) {
+ parts[0] = parts[0].slice(0, -1);
+ }
+ } else {
+ // Make sure we have a period in alternative mode.
+ if (flagAlternative && argText.indexOf('.') == -1) parts[0] += '.';
+ // Zero pad until required precision.
+ while (precision > effectivePrecision++) parts[0] += '0';
+ }
+ argText = parts[0] + (parts.length > 1 ? 'e' + parts[1] : '');
+
+ // Capitalize 'E' if needed.
+ if (next == 'E'.charCodeAt(0)) argText = argText.toUpperCase();
+
+ // Add sign.
+ if (flagAlwaysSigned && currArg >= 0) {
+ argText = '+' + argText;
+ }
+
+ // Add padding.
+ while (argText.length < width) {
+ if (flagLeftAlign) {
+ argText += ' ';
+ } else {
+ if (flagZeroPad && (argText[0] == '-' || argText[0] == '+')) {
+ argText = argText[0] + '0' + argText.slice(1);
+ } else {
+ argText = (flagZeroPad ? '0' : ' ') + argText;
+ }
}
}
}
+ if (next < 'a'.charCodeAt(0)) argText = argText.toUpperCase();
argText.split('').forEach(function(chr) {
ret.push(chr.charCodeAt(0));
});
textIndex += 2;
} else if (next == 's'.charCodeAt(0)) {
- ret = ret.concat(String_copy(getNextArg(next)));
+ // String.
+ var copiedString = String_copy(getNextArg(next));
+ if (precisionSet && copiedString.length > precision) {
+ copiedString = copiedString.slice(0, precision);
+ }
+ if (!flagLeftAlign) {
+ while (copiedString.length < width--) {
+ ret.push(' '.charCodeAt(0));
+ }
+ }
+ ret = ret.concat(copiedString);
+ if (flagLeftAlign) {
+ while (copiedString.length < width--) {
+ ret.push(' '.charCodeAt(0));
+ }
+ }
textIndex += 2;
} else if (next == 'c'.charCodeAt(0)) {
- ret = ret.concat(getNextArg(next));
+ if (flagLeftAlign) ret = ret.concat(getNextArg(next));
+ while (--width > 0) {
+ ret.push(' '.charCodeAt(0));
+ }
+ if (!flagLeftAlign) ret = ret.concat(getNextArg(next));
+ textIndex += 2;
+ } else if (next == 'n'.charCodeAt(0)) {
+ // TODO: Implement. Requires arguments to be passed in C-style.
+ // {{{ makeSetValue('argIndex', '0', 'ret.length', 'i32') }}}
textIndex += 2;
} else {
+ // TODO: Add support for a/A specifiers (hex float).
ret.push(next);
textIndex += 2; // not sure what to do with this %, so print it
}
@@ -643,19 +827,24 @@ var Library = {
strtod__deps: ['isspace', 'isdigit'],
strtod: function(str, endptr) {
- // FIXME handles only whitespace + |[0-9]+(.[0.9]+)?|, no e+
+ // Skip space.
while (_isspace(str)) str++;
+
var chr;
var ret = 0;
+
+ // Get whole part.
while(1) {
chr = {{{ makeGetValue('str', 0, 'i8') }}};
if (!_isdigit(chr)) break;
ret = ret*10 + chr - '0'.charCodeAt(0);
str++;
}
+
+ // Get fractional part.
if ({{{ makeGetValue('str', 0, 'i8') }}} == '.'.charCodeAt(0)) {
str++;
- var mul=1/10;
+ var mul = 1/10;
while(1) {
chr = {{{ makeGetValue('str', 0, 'i8') }}};
if (!_isdigit(chr)) break;
@@ -664,9 +853,36 @@ var Library = {
str++;
}
}
+
+ // Get exponent part.
+ chr = {{{ makeGetValue('str', 0, 'i8') }}};
+ if (chr == 'e'.charCodeAt(0) || chr == 'E'.charCodeAt(0)) {
+ str++;
+ var exponent = 0;
+ var expNegative = false;
+ chr = {{{ makeGetValue('str', 0, 'i8') }}};
+ if (chr == '-'.charCodeAt(0)) {
+ expNegative = true;
+ str++;
+ } else if (chr == '+'.charCodeAt(0)) {
+ str++;
+ }
+ chr = {{{ makeGetValue('str', 0, 'i8') }}};
+ while(1) {
+ if (!_isdigit(chr)) break;
+ exponent = exponent*10 + chr - '0'.charCodeAt(0);
+ str++;
+ chr = {{{ makeGetValue('str', 0, 'i8') }}};
+ }
+ if (expNegative) exponent = -exponent;
+ ret *= Math.pow(10, exponent);
+ }
+
+ // Set end pointer.
if (endptr) {
{{{ makeSetValue('endptr', 0, 'str', '*') }}}
}
+
return ret;
},
diff --git a/src/parseTools.js b/src/parseTools.js
index 530bf54b..3855c633 100644
--- a/src/parseTools.js
+++ b/src/parseTools.js
@@ -477,7 +477,7 @@ function IEEEUnHex(stringy) {
a = a & 0xfffff;
if (e === 0x7ff) {
if (a == 0 && b == 0) {
- return 'Infinity';
+ return neg ? '-Infinity' : 'Infinity';
} else {
return 'NaN';
}
diff --git a/tests/printf/output.txt b/tests/printf/output.txt
new file mode 100644
index 00000000..bdf9d0bc
--- /dev/null
+++ b/tests/printf/output.txt
@@ -0,0 +1,8008 @@
+
+Characters: a A
+Decimals: 1977 650000 12 4
+Preceding with blanks: 1977
+Preceding with zeros: 0000001977
+Some different radixes: 100 64 144 0x64 0144
+floats: 3.14 +3e+00 3.141600E+00
+Width trick: 10
+A string %
+inf
+INF
+-inf
+-INF
+nan
+NAN
+0
+0
+0.0
+0.00
+0.00000
+1
+1
+1.0
+1.00
+1.00000
+1
+12
+123
+1234
+12345
+123456
+1.23457e+06
+1.23457e+07
+1.23457e+08
+1.23457e+09
+1.23457e+10
+1.23457e+11
+1.23457e+12
+1.23457e+13
+1.23457e+14
+1.23457e+15
+1.23457e+16
+1.23457e+17
+1.23457e+26
+1.12346
+12.1235
+123.123
+1234.12
+12345.1
+123456
+1.23457e+06
+1.23457e+07
+1.23457e+17
+ 1
+ 12
+ 123
+ 1234
+ 12345
+1.2346e+05
+1.2346e+06
+1.2346e+07
+1.2346e+08
+1.2346e+09
+1.2346e+10
+1.2346e+11
+1.2346e+12
+1.2346e+13
+1.2346e+14
+1.2346e+15
+1.2346e+16
+1.2346e+17
+1.2346e+26
+ 1.1235
+ 12.123
+ 123.12
+ 1234.1
+ 12345
+1.2346e+05
+1.2346e+06
+1.2346e+07
+1.2346e+17
+1.
+1.e+01
+1.e+02
+1.e+03
+1.e+04
+1.e+05
+1.e+06
+1.e+07
+1.e+08
+1.e+09
+1.e+10
+1.e+11
+1.e+12
+1.e+13
+1.e+14
+1.e+15
+1.e+16
+1.e+17
+1.e+26
+1.
+1.e+01
+1.e+02
+1.e+03
+1.e+04
+1.e+05
+1.e+06
+1.e+07
+1.e+17
+1e-10
+1.2e-09
+1.23e-08
+1.234e-07
+1.2345e-06
+1.23456e-05
+0.000123457
+0.00123457
+0.0123457
+ 1e-10
+ 1.2e-09
+ 1.23e-08
+ 1.234e-07
+1.2345e-06
+1.2346e-05
+0.00012346
+ 0.0012346
+ 0.012346
+1.e-10
+1.e-09
+1.e-08
+1.e-07
+1.e-06
+1.e-05
+0.0001
+0.001
+0
+0.123
+0.123457
+ 0
+ 0.123
+ 0.12346
+0.
+0.1
+0.1
+
+%+d : +8127534
+%+.d : +8127534
+%+.0d : +8127534
+%+.1d : +8127534
+%+.2d : +8127534
+%+.5d : +8127534
+%+.10d : +0008127534
+%+.30d : +000000000000000000000008127534
+%+0d : +8127534
+%+1d : +8127534
+%+1.d : +8127534
+%+1.0d : +8127534
+%+1.1d : +8127534
+%+1.2d : +8127534
+%+1.5d : +8127534
+%+1.10d : +0008127534
+%+1.30d : +000000000000000000000008127534
+%+2d : +8127534
+%+2.d : +8127534
+%+2.0d : +8127534
+%+2.1d : +8127534
+%+2.2d : +8127534
+%+2.5d : +8127534
+%+2.10d : +0008127534
+%+2.30d : +000000000000000000000008127534
+%+5d : +8127534
+%+5.d : +8127534
+%+5.0d : +8127534
+%+5.1d : +8127534
+%+5.2d : +8127534
+%+5.5d : +8127534
+%+5.10d : +0008127534
+%+5.30d : +000000000000000000000008127534
+%+10d : +8127534
+%+10.d : +8127534
+%+10.0d : +8127534
+%+10.1d : +8127534
+%+10.2d : +8127534
+%+10.5d : +8127534
+%+10.10d : +0008127534
+%+10.30d : +000000000000000000000008127534
+%+30d : +8127534
+%+30.d : +8127534
+%+30.0d : +8127534
+%+30.1d : +8127534
+%+30.2d : +8127534
+%+30.5d : +8127534
+%+30.10d : +0008127534
+%+30.30d : +000000000000000000000008127534
+%-d : 8127534
+%-.d : 8127534
+%-.0d : 8127534
+%-.1d : 8127534
+%-.2d : 8127534
+%-.5d : 8127534
+%-.10d : 0008127534
+%-.30d : 000000000000000000000008127534
+%-1d : 8127534
+%-1.d : 8127534
+%-1.0d : 8127534
+%-1.1d : 8127534
+%-1.2d : 8127534
+%-1.5d : 8127534
+%-1.10d : 0008127534
+%-1.30d : 000000000000000000000008127534
+%-2d : 8127534
+%-2.d : 8127534
+%-2.0d : 8127534
+%-2.1d : 8127534
+%-2.2d : 8127534
+%-2.5d : 8127534
+%-2.10d : 0008127534
+%-2.30d : 000000000000000000000008127534
+%-5d : 8127534
+%-5.d : 8127534
+%-5.0d : 8127534
+%-5.1d : 8127534
+%-5.2d : 8127534
+%-5.5d : 8127534
+%-5.10d : 0008127534
+%-5.30d : 000000000000000000000008127534
+%-10d : 8127534
+%-10.d : 8127534
+%-10.0d : 8127534
+%-10.1d : 8127534
+%-10.2d : 8127534
+%-10.5d : 8127534
+%-10.10d : 0008127534
+%-10.30d : 000000000000000000000008127534
+%-30d : 8127534
+%-30.d : 8127534
+%-30.0d : 8127534
+%-30.1d : 8127534
+%-30.2d : 8127534
+%-30.5d : 8127534
+%-30.10d : 0008127534
+%-30.30d : 000000000000000000000008127534
+%0d : 8127534
+%01d : 8127534
+%02d : 8127534
+%05d : 8127534
+%010d : 0008127534
+%030d : 000000000000000000000008127534
+%-+d : +8127534
+%-+.d : +8127534
+%-+.0d : +8127534
+%-+.1d : +8127534
+%-+.2d : +8127534
+%-+.5d : +8127534
+%-+.10d : +0008127534
+%-+.30d : +000000000000000000000008127534
+%-+1d : +8127534
+%-+1.d : +8127534
+%-+1.0d : +8127534
+%-+1.1d : +8127534
+%-+1.2d : +8127534
+%-+1.5d : +8127534
+%-+1.10d : +0008127534
+%-+1.30d : +000000000000000000000008127534
+%-+2d : +8127534
+%-+2.d : +8127534
+%-+2.0d : +8127534
+%-+2.1d : +8127534
+%-+2.2d : +8127534
+%-+2.5d : +8127534
+%-+2.10d : +0008127534
+%-+2.30d : +000000000000000000000008127534
+%-+5d : +8127534
+%-+5.d : +8127534
+%-+5.0d : +8127534
+%-+5.1d : +8127534
+%-+5.2d : +8127534
+%-+5.5d : +8127534
+%-+5.10d : +0008127534
+%-+5.30d : +000000000000000000000008127534
+%-+10d : +8127534
+%-+10.d : +8127534
+%-+10.0d : +8127534
+%-+10.1d : +8127534
+%-+10.2d : +8127534
+%-+10.5d : +8127534
+%-+10.10d : +0008127534
+%-+10.30d : +000000000000000000000008127534
+%-+30d : +8127534
+%-+30.d : +8127534
+%-+30.0d : +8127534
+%-+30.1d : +8127534
+%-+30.2d : +8127534
+%-+30.5d : +8127534
+%-+30.10d : +0008127534
+%-+30.30d : +000000000000000000000008127534
+%+0d : +8127534
+%+01d : +8127534
+%+02d : +8127534
+%+05d : +8127534
+%+010d : +008127534
+%+030d : +00000000000000000000008127534
+%+-d : +8127534
+%+-.d : +8127534
+%+-.0d : +8127534
+%+-.1d : +8127534
+%+-.2d : +8127534
+%+-.5d : +8127534
+%+-.10d : +0008127534
+%+-.30d : +000000000000000000000008127534
+%+-1d : +8127534
+%+-1.d : +8127534
+%+-1.0d : +8127534
+%+-1.1d : +8127534
+%+-1.2d : +8127534
+%+-1.5d : +8127534
+%+-1.10d : +0008127534
+%+-1.30d : +000000000000000000000008127534
+%+-2d : +8127534
+%+-2.d : +8127534
+%+-2.0d : +8127534
+%+-2.1d : +8127534
+%+-2.2d : +8127534
+%+-2.5d : +8127534
+%+-2.10d : +0008127534
+%+-2.30d : +000000000000000000000008127534
+%+-5d : +8127534
+%+-5.d : +8127534
+%+-5.0d : +8127534
+%+-5.1d : +8127534
+%+-5.2d : +8127534
+%+-5.5d : +8127534
+%+-5.10d : +0008127534
+%+-5.30d : +000000000000000000000008127534
+%+-10d : +8127534
+%+-10.d : +8127534
+%+-10.0d : +8127534
+%+-10.1d : +8127534
+%+-10.2d : +8127534
+%+-10.5d : +8127534
+%+-10.10d : +0008127534
+%+-10.30d : +000000000000000000000008127534
+%+-30d : +8127534
+%+-30.d : +8127534
+%+-30.0d : +8127534
+%+-30.1d : +8127534
+%+-30.2d : +8127534
+%+-30.5d : +8127534
+%+-30.10d : +0008127534
+%+-30.30d : +000000000000000000000008127534
+%+0d : +8127534
+%+01d : +8127534
+%+02d : +8127534
+%+05d : +8127534
+%+010d : +008127534
+%+030d : +00000000000000000000008127534
+%+i : +8127534
+%+.i : +8127534
+%+.0i : +8127534
+%+.1i : +8127534
+%+.2i : +8127534
+%+.5i : +8127534
+%+.10i : +0008127534
+%+.30i : +000000000000000000000008127534
+%+0i : +8127534
+%+1i : +8127534
+%+1.i : +8127534
+%+1.0i : +8127534
+%+1.1i : +8127534
+%+1.2i : +8127534
+%+1.5i : +8127534
+%+1.10i : +0008127534
+%+1.30i : +000000000000000000000008127534
+%+2i : +8127534
+%+2.i : +8127534
+%+2.0i : +8127534
+%+2.1i : +8127534
+%+2.2i : +8127534
+%+2.5i : +8127534
+%+2.10i : +0008127534
+%+2.30i : +000000000000000000000008127534
+%+5i : +8127534
+%+5.i : +8127534
+%+5.0i : +8127534
+%+5.1i : +8127534
+%+5.2i : +8127534
+%+5.5i : +8127534
+%+5.10i : +0008127534
+%+5.30i : +000000000000000000000008127534
+%+10i : +8127534
+%+10.i : +8127534
+%+10.0i : +8127534
+%+10.1i : +8127534
+%+10.2i : +8127534
+%+10.5i : +8127534
+%+10.10i : +0008127534
+%+10.30i : +000000000000000000000008127534
+%+30i : +8127534
+%+30.i : +8127534
+%+30.0i : +8127534
+%+30.1i : +8127534
+%+30.2i : +8127534
+%+30.5i : +8127534
+%+30.10i : +0008127534
+%+30.30i : +000000000000000000000008127534
+%-i : 8127534
+%-.i : 8127534
+%-.0i : 8127534
+%-.1i : 8127534
+%-.2i : 8127534
+%-.5i : 8127534
+%-.10i : 0008127534
+%-.30i : 000000000000000000000008127534
+%-1i : 8127534
+%-1.i : 8127534
+%-1.0i : 8127534
+%-1.1i : 8127534
+%-1.2i : 8127534
+%-1.5i : 8127534
+%-1.10i : 0008127534
+%-1.30i : 000000000000000000000008127534
+%-2i : 8127534
+%-2.i : 8127534
+%-2.0i : 8127534
+%-2.1i : 8127534
+%-2.2i : 8127534
+%-2.5i : 8127534
+%-2.10i : 0008127534
+%-2.30i : 000000000000000000000008127534
+%-5i : 8127534
+%-5.i : 8127534
+%-5.0i : 8127534
+%-5.1i : 8127534
+%-5.2i : 8127534
+%-5.5i : 8127534
+%-5.10i : 0008127534
+%-5.30i : 000000000000000000000008127534
+%-10i : 8127534
+%-10.i : 8127534
+%-10.0i : 8127534
+%-10.1i : 8127534
+%-10.2i : 8127534
+%-10.5i : 8127534
+%-10.10i : 0008127534
+%-10.30i : 000000000000000000000008127534
+%-30i : 8127534
+%-30.i : 8127534
+%-30.0i : 8127534
+%-30.1i : 8127534
+%-30.2i : 8127534
+%-30.5i : 8127534
+%-30.10i : 0008127534
+%-30.30i : 000000000000000000000008127534
+%0i : 8127534
+%01i : 8127534
+%02i : 8127534
+%05i : 8127534
+%010i : 0008127534
+%030i : 000000000000000000000008127534
+%-+i : +8127534
+%-+.i : +8127534
+%-+.0i : +8127534
+%-+.1i : +8127534
+%-+.2i : +8127534
+%-+.5i : +8127534
+%-+.10i : +0008127534
+%-+.30i : +000000000000000000000008127534
+%-+1i : +8127534
+%-+1.i : +8127534
+%-+1.0i : +8127534
+%-+1.1i : +8127534
+%-+1.2i : +8127534
+%-+1.5i : +8127534
+%-+1.10i : +0008127534
+%-+1.30i : +000000000000000000000008127534
+%-+2i : +8127534
+%-+2.i : +8127534
+%-+2.0i : +8127534
+%-+2.1i : +8127534
+%-+2.2i : +8127534
+%-+2.5i : +8127534
+%-+2.10i : +0008127534
+%-+2.30i : +000000000000000000000008127534
+%-+5i : +8127534
+%-+5.i : +8127534
+%-+5.0i : +8127534
+%-+5.1i : +8127534
+%-+5.2i : +8127534
+%-+5.5i : +8127534
+%-+5.10i : +0008127534
+%-+5.30i : +000000000000000000000008127534
+%-+10i : +8127534
+%-+10.i : +8127534
+%-+10.0i : +8127534
+%-+10.1i : +8127534
+%-+10.2i : +8127534
+%-+10.5i : +8127534
+%-+10.10i : +0008127534
+%-+10.30i : +000000000000000000000008127534
+%-+30i : +8127534
+%-+30.i : +8127534
+%-+30.0i : +8127534
+%-+30.1i : +8127534
+%-+30.2i : +8127534
+%-+30.5i : +8127534
+%-+30.10i : +0008127534
+%-+30.30i : +000000000000000000000008127534
+%+0i : +8127534
+%+01i : +8127534
+%+02i : +8127534
+%+05i : +8127534
+%+010i : +008127534
+%+030i : +00000000000000000000008127534
+%+-i : +8127534
+%+-.i : +8127534
+%+-.0i : +8127534
+%+-.1i : +8127534
+%+-.2i : +8127534
+%+-.5i : +8127534
+%+-.10i : +0008127534
+%+-.30i : +000000000000000000000008127534
+%+-1i : +8127534
+%+-1.i : +8127534
+%+-1.0i : +8127534
+%+-1.1i : +8127534
+%+-1.2i : +8127534
+%+-1.5i : +8127534
+%+-1.10i : +0008127534
+%+-1.30i : +000000000000000000000008127534
+%+-2i : +8127534
+%+-2.i : +8127534
+%+-2.0i : +8127534
+%+-2.1i : +8127534
+%+-2.2i : +8127534
+%+-2.5i : +8127534
+%+-2.10i : +0008127534
+%+-2.30i : +000000000000000000000008127534
+%+-5i : +8127534
+%+-5.i : +8127534
+%+-5.0i : +8127534
+%+-5.1i : +8127534
+%+-5.2i : +8127534
+%+-5.5i : +8127534
+%+-5.10i : +0008127534
+%+-5.30i : +000000000000000000000008127534
+%+-10i : +8127534
+%+-10.i : +8127534
+%+-10.0i : +8127534
+%+-10.1i : +8127534
+%+-10.2i : +8127534
+%+-10.5i : +8127534
+%+-10.10i : +0008127534
+%+-10.30i : +000000000000000000000008127534
+%+-30i : +8127534
+%+-30.i : +8127534
+%+-30.0i : +8127534
+%+-30.1i : +8127534
+%+-30.2i : +8127534
+%+-30.5i : +8127534
+%+-30.10i : +0008127534
+%+-30.30i : +000000000000000000000008127534
+%+0i : +8127534
+%+01i : +8127534
+%+02i : +8127534
+%+05i : +8127534
+%+010i : +008127534
+%+030i : +00000000000000000000008127534
+%-u : 8127534
+%-.u : 8127534
+%-.0u : 8127534
+%-.1u : 8127534
+%-.2u : 8127534
+%-.5u : 8127534
+%-.10u : 0008127534
+%-.30u : 000000000000000000000008127534
+%-1u : 8127534
+%-1.u : 8127534
+%-1.0u : 8127534
+%-1.1u : 8127534
+%-1.2u : 8127534
+%-1.5u : 8127534
+%-1.10u : 0008127534
+%-1.30u : 000000000000000000000008127534
+%-2u : 8127534
+%-2.u : 8127534
+%-2.0u : 8127534
+%-2.1u : 8127534
+%-2.2u : 8127534
+%-2.5u : 8127534
+%-2.10u : 0008127534
+%-2.30u : 000000000000000000000008127534
+%-5u : 8127534
+%-5.u : 8127534
+%-5.0u : 8127534
+%-5.1u : 8127534
+%-5.2u : 8127534
+%-5.5u : 8127534
+%-5.10u : 0008127534
+%-5.30u : 000000000000000000000008127534
+%-10u : 8127534
+%-10.u : 8127534
+%-10.0u : 8127534
+%-10.1u : 8127534
+%-10.2u : 8127534
+%-10.5u : 8127534
+%-10.10u : 0008127534
+%-10.30u : 000000000000000000000008127534
+%-30u : 8127534
+%-30.u : 8127534
+%-30.0u : 8127534
+%-30.1u : 8127534
+%-30.2u : 8127534
+%-30.5u : 8127534
+%-30.10u : 0008127534
+%-30.30u : 000000000000000000000008127534
+%0u : 8127534
+%01u : 8127534
+%02u : 8127534
+%05u : 8127534
+%010u : 0008127534
+%030u : 000000000000000000000008127534
+%+ld : +8127534
+%+.ld : +8127534
+%+.0ld : +8127534
+%+.1ld : +8127534
+%+.2ld : +8127534
+%+.5ld : +8127534
+%+.10ld : +0008127534
+%+.30ld : +000000000000000000000008127534
+%+0ld : +8127534
+%+1ld : +8127534
+%+1.ld : +8127534
+%+1.0ld : +8127534
+%+1.1ld : +8127534
+%+1.2ld : +8127534
+%+1.5ld : +8127534
+%+1.10ld : +0008127534
+%+1.30ld : +000000000000000000000008127534
+%+2ld : +8127534
+%+2.ld : +8127534
+%+2.0ld : +8127534
+%+2.1ld : +8127534
+%+2.2ld : +8127534
+%+2.5ld : +8127534
+%+2.10ld : +0008127534
+%+2.30ld : +000000000000000000000008127534
+%+5ld : +8127534
+%+5.ld : +8127534
+%+5.0ld : +8127534
+%+5.1ld : +8127534
+%+5.2ld : +8127534
+%+5.5ld : +8127534
+%+5.10ld : +0008127534
+%+5.30ld : +000000000000000000000008127534
+%+10ld : +8127534
+%+10.ld : +8127534
+%+10.0ld : +8127534
+%+10.1ld : +8127534
+%+10.2ld : +8127534
+%+10.5ld : +8127534
+%+10.10ld : +0008127534
+%+10.30ld : +000000000000000000000008127534
+%+30ld : +8127534
+%+30.ld : +8127534
+%+30.0ld : +8127534
+%+30.1ld : +8127534
+%+30.2ld : +8127534
+%+30.5ld : +8127534
+%+30.10ld : +0008127534
+%+30.30ld : +000000000000000000000008127534
+%-ld : 8127534
+%-.ld : 8127534
+%-.0ld : 8127534
+%-.1ld : 8127534
+%-.2ld : 8127534
+%-.5ld : 8127534
+%-.10ld : 0008127534
+%-.30ld : 000000000000000000000008127534
+%-1ld : 8127534
+%-1.ld : 8127534
+%-1.0