Performance improvement in the parsing of options to %-formats in the
printf implementation. FossilOrigin-Name: 40d8f8ae87abf928542c4e558a4c3a3eab18776a3e8db7ca1c5e5f744ca0bce3
This commit is contained in:
parent
9c46c66c46
commit
9a6d01bff5
12
manifest
12
manifest
@ -1,5 +1,5 @@
|
||||
C Ensure\sthat\sthe\sWalker.pParse\sstructure\sis\sinitialized\swhen\swalking\sthe\nsource\stree\sto\sgather\sthe\sWINDOW\sclauses\son\sa\squery\swith\swindow\sfunctions.
|
||||
D 2019-02-01T15:06:27.195
|
||||
C Performance\simprovement\sin\sthe\sparsing\sof\soptions\sto\s%-formats\sin\sthe\nprintf\simplementation.
|
||||
D 2019-02-01T18:46:41.116
|
||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||
F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4
|
||||
@ -510,7 +510,7 @@ F src/pcache1.c fffd5250a323579384a3b3904302b9fe87e186ba24602af3013f749a0234ae98
|
||||
F src/pragma.c af67dedaad8bafe9a5f9adcec32a0da6dd118617dd8220ad1d118f5a6bf83a02
|
||||
F src/pragma.h b774c8fdd63ed468ab8206b9b530d5d2523ed8889fbb72d1143d09272d5c6b2c
|
||||
F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3
|
||||
F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381
|
||||
F src/printf.c fdea5e38f20413dcef9776c12c2d0eb32ea27cb4192a0f71d193574852631c60
|
||||
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
|
||||
F src/resolve.c c8f207247472c41ac73d738e1c1a80719ad253d1dbb617ed57740492b2a6c097
|
||||
F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
|
||||
@ -1804,7 +1804,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||
P e5924939c9c8f39367900360fa294cdb1220e9f68d183e32882e0926f775869d
|
||||
R 3f33dcc0496028451e96df5961af1114
|
||||
P 4ca9d5d53d41d08fbce29f9da8cc0948df9c4c3136210af88b499cf889b5ccb8
|
||||
R 3a0fd1c7830f595fdcbdfa420aaebcd3
|
||||
U drh
|
||||
Z 6da7b9d2e40a41d8dc0b691b0532f0c7
|
||||
Z 027c010e323198cb67ddd7c2ea43d1d6
|
||||
|
@ -1 +1 @@
|
||||
4ca9d5d53d41d08fbce29f9da8cc0948df9c4c3136210af88b499cf889b5ccb8
|
||||
40d8f8ae87abf928542c4e558a4c3a3eab18776a3e8db7ca1c5e5f744ca0bce3
|
158
src/printf.c
158
src/printf.c
@ -237,6 +237,9 @@ void sqlite3_str_vappendf(
|
||||
flag_leftjustify = flag_prefix = cThousand =
|
||||
flag_alternateform = flag_altform2 = flag_zeropad = 0;
|
||||
done = 0;
|
||||
width = 0;
|
||||
flag_long = 0;
|
||||
precision = -1;
|
||||
do{
|
||||
switch( c ){
|
||||
case '-': flag_leftjustify = 1; break;
|
||||
@ -247,80 +250,93 @@ void sqlite3_str_vappendf(
|
||||
case '0': flag_zeropad = 1; break;
|
||||
case ',': cThousand = ','; break;
|
||||
default: done = 1; break;
|
||||
case 'l': {
|
||||
flag_long = 1;
|
||||
c = *++fmt;
|
||||
if( c=='l' ){
|
||||
c = *++fmt;
|
||||
flag_long = 2;
|
||||
}
|
||||
done = 1;
|
||||
break;
|
||||
}
|
||||
case '1': case '2': case '3': case '4': case '5':
|
||||
case '6': case '7': case '8': case '9': {
|
||||
unsigned wx = c - '0';
|
||||
while( (c = *++fmt)>='0' && c<='9' ){
|
||||
wx = wx*10 + c - '0';
|
||||
}
|
||||
testcase( wx>0x7fffffff );
|
||||
width = wx & 0x7fffffff;
|
||||
#ifdef SQLITE_PRINTF_PRECISION_LIMIT
|
||||
if( width>SQLITE_PRINTF_PRECISION_LIMIT ){
|
||||
width = SQLITE_PRINTF_PRECISION_LIMIT;
|
||||
}
|
||||
#endif
|
||||
if( c!='.' && c!='l' ){
|
||||
done = 1;
|
||||
}else{
|
||||
fmt--;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case '*': {
|
||||
if( bArgList ){
|
||||
width = (int)getIntArg(pArgList);
|
||||
}else{
|
||||
width = va_arg(ap,int);
|
||||
}
|
||||
if( width<0 ){
|
||||
flag_leftjustify = 1;
|
||||
width = width >= -2147483647 ? -width : 0;
|
||||
}
|
||||
#ifdef SQLITE_PRINTF_PRECISION_LIMIT
|
||||
if( width>SQLITE_PRINTF_PRECISION_LIMIT ){
|
||||
width = SQLITE_PRINTF_PRECISION_LIMIT;
|
||||
}
|
||||
#endif
|
||||
if( (c = fmt[1])!='.' && c!='l' ){
|
||||
c = *++fmt;
|
||||
done = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case '.': {
|
||||
c = *++fmt;
|
||||
if( c=='*' ){
|
||||
if( bArgList ){
|
||||
precision = (int)getIntArg(pArgList);
|
||||
}else{
|
||||
precision = va_arg(ap,int);
|
||||
}
|
||||
if( precision<0 ){
|
||||
precision = precision >= -2147483647 ? -precision : -1;
|
||||
}
|
||||
c = *++fmt;
|
||||
}else{
|
||||
unsigned px = 0;
|
||||
while( c>='0' && c<='9' ){
|
||||
px = px*10 + c - '0';
|
||||
c = *++fmt;
|
||||
}
|
||||
testcase( px>0x7fffffff );
|
||||
precision = px & 0x7fffffff;
|
||||
}
|
||||
#ifdef SQLITE_PRINTF_PRECISION_LIMIT
|
||||
if( precision>SQLITE_PRINTF_PRECISION_LIMIT ){
|
||||
precision = SQLITE_PRINTF_PRECISION_LIMIT;
|
||||
}
|
||||
#endif
|
||||
if( c=='l' ){
|
||||
--fmt;
|
||||
}else{
|
||||
done = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}while( !done && (c=(*++fmt))!=0 );
|
||||
/* Get the field width */
|
||||
if( c=='*' ){
|
||||
if( bArgList ){
|
||||
width = (int)getIntArg(pArgList);
|
||||
}else{
|
||||
width = va_arg(ap,int);
|
||||
}
|
||||
if( width<0 ){
|
||||
flag_leftjustify = 1;
|
||||
width = width >= -2147483647 ? -width : 0;
|
||||
}
|
||||
c = *++fmt;
|
||||
}else{
|
||||
unsigned wx = 0;
|
||||
while( c>='0' && c<='9' ){
|
||||
wx = wx*10 + c - '0';
|
||||
c = *++fmt;
|
||||
}
|
||||
testcase( wx>0x7fffffff );
|
||||
width = wx & 0x7fffffff;
|
||||
}
|
||||
assert( width>=0 );
|
||||
#ifdef SQLITE_PRINTF_PRECISION_LIMIT
|
||||
if( width>SQLITE_PRINTF_PRECISION_LIMIT ){
|
||||
width = SQLITE_PRINTF_PRECISION_LIMIT;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Get the precision */
|
||||
if( c=='.' ){
|
||||
c = *++fmt;
|
||||
if( c=='*' ){
|
||||
if( bArgList ){
|
||||
precision = (int)getIntArg(pArgList);
|
||||
}else{
|
||||
precision = va_arg(ap,int);
|
||||
}
|
||||
c = *++fmt;
|
||||
if( precision<0 ){
|
||||
precision = precision >= -2147483647 ? -precision : -1;
|
||||
}
|
||||
}else{
|
||||
unsigned px = 0;
|
||||
while( c>='0' && c<='9' ){
|
||||
px = px*10 + c - '0';
|
||||
c = *++fmt;
|
||||
}
|
||||
testcase( px>0x7fffffff );
|
||||
precision = px & 0x7fffffff;
|
||||
}
|
||||
}else{
|
||||
precision = -1;
|
||||
}
|
||||
assert( precision>=(-1) );
|
||||
#ifdef SQLITE_PRINTF_PRECISION_LIMIT
|
||||
if( precision>SQLITE_PRINTF_PRECISION_LIMIT ){
|
||||
precision = SQLITE_PRINTF_PRECISION_LIMIT;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* Get the conversion type modifier */
|
||||
if( c=='l' ){
|
||||
flag_long = 1;
|
||||
c = *++fmt;
|
||||
if( c=='l' ){
|
||||
flag_long = 2;
|
||||
c = *++fmt;
|
||||
}
|
||||
}else{
|
||||
flag_long = 0;
|
||||
}
|
||||
/* Fetch the info entry for the field */
|
||||
infop = &fmtinfo[0];
|
||||
xtype = etINVALID;
|
||||
|
Loading…
x
Reference in New Issue
Block a user