diff options
author | drh <> | 2023-07-01 15:23:24 +0000 |
---|---|---|
committer | drh <> | 2023-07-01 15:23:24 +0000 |
commit | 9ee9444a0adbf8f04081447d70d570f17c1a6e6a (patch) | |
tree | fa03bf2abe4a0407f771e5c5ff059dc7542a06fc /src/printf.c | |
parent | 42d042e602233be808084e78ccbaba1b497c69a3 (diff) | |
download | sqlite-9ee9444a0adbf8f04081447d70d570f17c1a6e6a.tar.gz sqlite-9ee9444a0adbf8f04081447d70d570f17c1a6e6a.zip |
Improved response to Infinity and NaN. Remove the termporary fpdecode()
function.
FossilOrigin-Name: 76ab8ae809a47a66688e2d50c20dc87ce946d82e9ffebb3adda55c451fad07fc
Diffstat (limited to 'src/printf.c')
-rw-r--r-- | src/printf.c | 52 |
1 files changed, 28 insertions, 24 deletions
diff --git a/src/printf.c b/src/printf.c index 78f59757d..4de06c116 100644 --- a/src/printf.c +++ b/src/printf.c @@ -482,6 +482,7 @@ void sqlite3_str_vappendf( case etEXP: case etGENERIC: { FpDecode s; + int iRound; if( bArgList ){ realvalue = getDoubleArg(pArgList); @@ -494,33 +495,36 @@ void sqlite3_str_vappendf( precision = SQLITE_FP_PRECISION_LIMIT; } #endif - switch( xtype ){ - case etFLOAT: sqlite3FpDecode(&s, realvalue, -precision); break; - case etGENERIC: sqlite3FpDecode(&s, realvalue, precision); break; - case etEXP: sqlite3FpDecode(&s, realvalue, precision+1); break; - } - if( s.isNan ){ - if( flag_zeropad ){ - bufpt = "null"; - length = 4; - }else{ - bufpt = "NaN"; - length = 3; - } - break; + if( xtype==etFLOAT ){ + iRound = -precision; + }else if( xtype==etGENERIC ){ + iRound = precision; + }else{ + iRound = precision+1; } - if( s.isInf ){ - if( s.sign=='-' ){ - bufpt = "-Inf"; - length = 4; - }else if( flag_prefix=='+' ){ - bufpt = "+Inf"; - length = 4; + sqlite3FpDecode(&s, realvalue, iRound); + if( s.isSpecial ){ + if( s.isSpecial==2 ){ + bufpt = flag_zeropad ? "null" : "NaN"; + length = sqlite3Strlen30(bufpt); + break; + }else if( flag_zeropad ){ + s.z[0] = '9'; + s.iDP = 1000; + s.n = 1; }else{ - bufpt = "Inf"; - length = 3; + memcpy(buf, "-Inf", 5); + bufpt = buf; + if( s.sign=='-' ){ + /* no-op */ + }else if( flag_prefix ){ + buf[0] = flag_prefix; + }else{ + bufpt++; + } + length = sqlite3Strlen30(bufpt); + break; } - break; } if( s.sign=='-' ){ prefix = '-'; |