-C Fix\sa\sbad\sassert()\sin\sthe\sprevious\scheck-in.
-D 2026-02-16T17:22:17.815
+C Simplifications\sto\ssqlite3AtoF(),\sresulting\sin\sslightly\sfaster\sperformance\nand\sslightly\ssmaller\ssize.
+D 2026-02-16T23:52:51.130
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F src/update.c 3e5e7ff66fa19ebe4d1b113d480639a24cc1175adbefabbd1a948a07f28e37cf
F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1
F src/utf.c 7267c3fb9e2467020507601af3354c2446c61f444387e094c779dccd5ca62165
-F src/util.c 16c7fcce87e43c612dd579c87d11a085ce5243565b7c324806f4a506c5e696a4
+F src/util.c 06313141ca1d9cf6a80961a6a2084e1f682dfecc741b5c2f527f257f47d61b0a
F src/vacuum.c d3d35d8ae893d419ade5fa196d761a83bddcbb62137a1a157ae751ef38b26e82
F src/vdbe.c 5328c99dd256ee8132383565a86e253543a85daccfd7477c52f20bac6b385a7f
F src/vdbe.h 966d0677a540b7ea6549b7c4e1312fc0d830fce3a235a58c801f2cc31cf5ecf9
F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P 67c7c72e9bdf04c920d77006538a202c923fa74b47c81dc3014c2929dac7277d
-R 94ab950169198f260c23800402fd70a5
+P a4540582b5b704af13b570b3dc609dbacada719302372a038cf74eee3688d5e7
+R b9f18dca12593a3b130cb73988b798a1
U drh
-Z c0318b1fd81a3ec64d379bf447b9b4ea
+Z c47bffdb8f799c234ea9ad61d838f43a
# Remove this line to create a well-formed Fossil manifest.
int sqlite3AtoF(const char *z, double *pResult){
#ifndef SQLITE_OMIT_FLOATING_POINT
/* sign * significand * (10 ^ (esign * exponent)) */
- int sign = 1; /* sign of significand */
- u64 s = 0; /* significand */
- int d = 0; /* adjust exponent for shifting decimal point */
- int esign = 1; /* sign of exponent */
- int e = 0; /* exponent */
- int eValid = 1; /* True exponent is either not used or is well-formed */
+ int neg = 0; /* True for a negative value */
+ u64 s = 0; /* mantissa */
+ int d = 0; /* Value is s * pow(10,d) */
int nDigit = 0; /* Number of digits processed */
int eType = 1; /* 1: pure integer, 2+: fractional */
/* get sign of significand */
if( *z=='-' ){
- sign = -1;
+ neg = 1;
z++;
}else if( *z=='+' ){
z++;
/* if exponent is present */
if( *z=='e' || *z=='E' ){
+ int esign = 1; /* sign of exponent */
z++;
- eValid = 0;
eType++;
/* get sign of exponent */
z++;
}
/* copy digits to exponent */
- while( sqlite3Isdigit(*z) ){
- e = e<10000 ? (e*10 + (*z - '0')) : 10000;
+ if( sqlite3Isdigit(*z) ){
+ int exp = *z - '0';
z++;
- eValid = 1;
+ while( sqlite3Isdigit(*z) ){
+ exp = exp<10000 ? (exp*10 + (*z - '0')) : 10000;
+ z++;
+ }
+ d += esign*exp;
+ }else{
+ eType = -1;
}
}
/* Zero is a special case */
if( s==0 ){
- *pResult = sign<0 ? -0.0 : +0.0;
- goto atofz_return;
+ *pResult = neg ? -0.0 : +0.0;
+ }else{
+ *pResult = sqlite3Fp10Convert2(s,d);
+ if( neg ) *pResult = -*pResult;
+ assert( !sqlite3IsNaN(*pResult) );
}
- /* adjust exponent by d, and update sign */
- e = (e*esign) + d;
-
- *pResult = sqlite3Fp10Convert2(s,e);
- if( sign<0 ) *pResult = -*pResult;
- assert( !sqlite3IsNaN(*pResult) );
-
-atofz_return:
/* return true if number and no extra non-whitespace characters after */
- if( z[0]==0 && nDigit>0 && eValid ){
+ if( z[0]==0 && nDigit>0 ){
return eType;
- }else if( eType>=2 && (eType==3 || eValid) && nDigit>0 ){
+ }else if( eType>=2 && nDigit>0 ){
return -1;
}else{
return 0;