| Index: third_party/sqlite/src/src/printf.c
|
| diff --git a/third_party/sqlite/src/src/printf.c b/third_party/sqlite/src/src/printf.c
|
| index 969950c15484c9e4c8263923fb7b6554885688c8..ede86f12088f4b307c97d9aea9490b58e2974c9f 100644
|
| --- a/third_party/sqlite/src/src/printf.c
|
| +++ b/third_party/sqlite/src/src/printf.c
|
| @@ -15,26 +15,26 @@
|
| ** Conversion types fall into various categories as defined by the
|
| ** following enumeration.
|
| */
|
| -#define etRADIX 1 /* Integer types. %d, %x, %o, and so forth */
|
| -#define etFLOAT 2 /* Floating point. %f */
|
| -#define etEXP 3 /* Exponentional notation. %e and %E */
|
| -#define etGENERIC 4 /* Floating or exponential, depending on exponent. %g */
|
| -#define etSIZE 5 /* Return number of characters processed so far. %n */
|
| -#define etSTRING 6 /* Strings. %s */
|
| -#define etDYNSTRING 7 /* Dynamically allocated strings. %z */
|
| -#define etPERCENT 8 /* Percent symbol. %% */
|
| -#define etCHARX 9 /* Characters. %c */
|
| +#define etRADIX 0 /* Integer types. %d, %x, %o, and so forth */
|
| +#define etFLOAT 1 /* Floating point. %f */
|
| +#define etEXP 2 /* Exponentional notation. %e and %E */
|
| +#define etGENERIC 3 /* Floating or exponential, depending on exponent. %g */
|
| +#define etSIZE 4 /* Return number of characters processed so far. %n */
|
| +#define etSTRING 5 /* Strings. %s */
|
| +#define etDYNSTRING 6 /* Dynamically allocated strings. %z */
|
| +#define etPERCENT 7 /* Percent symbol. %% */
|
| +#define etCHARX 8 /* Characters. %c */
|
| /* The rest are extensions, not normally found in printf() */
|
| -#define etSQLESCAPE 10 /* Strings with '\'' doubled. %q */
|
| -#define etSQLESCAPE2 11 /* Strings with '\'' doubled and enclosed in '',
|
| +#define etSQLESCAPE 9 /* Strings with '\'' doubled. %q */
|
| +#define etSQLESCAPE2 10 /* Strings with '\'' doubled and enclosed in '',
|
| NULL pointers replaced by SQL NULL. %Q */
|
| -#define etTOKEN 12 /* a pointer to a Token structure */
|
| -#define etSRCLIST 13 /* a pointer to a SrcList */
|
| -#define etPOINTER 14 /* The %p conversion */
|
| -#define etSQLESCAPE3 15 /* %w -> Strings with '\"' doubled */
|
| -#define etORDINAL 16 /* %r -> 1st, 2nd, 3rd, 4th, etc. English only */
|
| +#define etTOKEN 11 /* a pointer to a Token structure */
|
| +#define etSRCLIST 12 /* a pointer to a SrcList */
|
| +#define etPOINTER 13 /* The %p conversion */
|
| +#define etSQLESCAPE3 14 /* %w -> Strings with '\"' doubled */
|
| +#define etORDINAL 15 /* %r -> 1st, 2nd, 3rd, 4th, etc. English only */
|
|
|
| -#define etINVALID 0 /* Any unrecognized conversion type */
|
| +#define etINVALID 16 /* Any unrecognized conversion type */
|
|
|
|
|
| /*
|
| @@ -59,7 +59,6 @@ typedef struct et_info { /* Information about each format field */
|
| ** Allowed values for et_info.flags
|
| */
|
| #define FLAG_SIGNED 1 /* True if the value to convert is signed */
|
| -#define FLAG_INTERN 2 /* True if for internal use only */
|
| #define FLAG_STRING 4 /* Allow infinity precision */
|
|
|
|
|
| @@ -93,11 +92,10 @@ static const et_info fmtinfo[] = {
|
| { '%', 0, 0, etPERCENT, 0, 0 },
|
| { 'p', 16, 0, etPOINTER, 0, 1 },
|
|
|
| -/* All the rest have the FLAG_INTERN bit set and are thus for internal
|
| -** use only */
|
| - { 'T', 0, 2, etTOKEN, 0, 0 },
|
| - { 'S', 0, 2, etSRCLIST, 0, 0 },
|
| - { 'r', 10, 3, etORDINAL, 0, 0 },
|
| + /* All the rest are undocumented and are for internal use only */
|
| + { 'T', 0, 0, etTOKEN, 0, 0 },
|
| + { 'S', 0, 0, etSRCLIST, 0, 0 },
|
| + { 'r', 10, 1, etORDINAL, 0, 0 },
|
| };
|
|
|
| /*
|
| @@ -171,7 +169,6 @@ static char *getTextArg(PrintfArguments *p){
|
| */
|
| void sqlite3VXPrintf(
|
| StrAccum *pAccum, /* Accumulate results here */
|
| - u32 bFlags, /* SQLITE_PRINTF_* flags */
|
| const char *fmt, /* Format string */
|
| va_list ap /* arguments */
|
| ){
|
| @@ -190,9 +187,8 @@ void sqlite3VXPrintf(
|
| etByte flag_long; /* True if "l" flag is present */
|
| etByte flag_longlong; /* True if the "ll" flag is present */
|
| etByte done; /* Loop termination flag */
|
| - etByte xtype = 0; /* Conversion paradigm */
|
| + etByte xtype = etINVALID; /* Conversion paradigm */
|
| u8 bArgList; /* True for SQLITE_PRINTF_SQLFUNC */
|
| - u8 useIntern; /* Ok to use internal conversions (ex: %T) */
|
| char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */
|
| sqlite_uint64 longvalue; /* Value for integer types */
|
| LONGDOUBLE_TYPE realvalue; /* Value for real types */
|
| @@ -211,13 +207,11 @@ void sqlite3VXPrintf(
|
| char buf[etBUFSIZE]; /* Conversion buffer */
|
|
|
| bufpt = 0;
|
| - if( bFlags ){
|
| - if( (bArgList = (bFlags & SQLITE_PRINTF_SQLFUNC))!=0 ){
|
| - pArgList = va_arg(ap, PrintfArguments*);
|
| - }
|
| - useIntern = bFlags & SQLITE_PRINTF_INTERNAL;
|
| + if( (pAccum->printfFlags & SQLITE_PRINTF_SQLFUNC)!=0 ){
|
| + pArgList = va_arg(ap, PrintfArguments*);
|
| + bArgList = 1;
|
| }else{
|
| - bArgList = useIntern = 0;
|
| + bArgList = 0;
|
| }
|
| for(; (c=(*fmt))!=0; ++fmt){
|
| if( c!='%' ){
|
| @@ -329,11 +323,7 @@ void sqlite3VXPrintf(
|
| for(idx=0; idx<ArraySize(fmtinfo); idx++){
|
| if( c==fmtinfo[idx].fmttype ){
|
| infop = &fmtinfo[idx];
|
| - if( useIntern || (infop->flags & FLAG_INTERN)==0 ){
|
| - xtype = infop->type;
|
| - }else{
|
| - return;
|
| - }
|
| + xtype = infop->type;
|
| break;
|
| }
|
| }
|
| @@ -702,7 +692,9 @@ void sqlite3VXPrintf(
|
| break;
|
| }
|
| case etTOKEN: {
|
| - Token *pToken = va_arg(ap, Token*);
|
| + Token *pToken;
|
| + if( (pAccum->printfFlags & SQLITE_PRINTF_INTERNAL)==0 ) return;
|
| + pToken = va_arg(ap, Token*);
|
| assert( bArgList==0 );
|
| if( pToken && pToken->n ){
|
| sqlite3StrAccumAppend(pAccum, (const char*)pToken->z, pToken->n);
|
| @@ -711,9 +703,13 @@ void sqlite3VXPrintf(
|
| break;
|
| }
|
| case etSRCLIST: {
|
| - SrcList *pSrc = va_arg(ap, SrcList*);
|
| - int k = va_arg(ap, int);
|
| - struct SrcList_item *pItem = &pSrc->a[k];
|
| + SrcList *pSrc;
|
| + int k;
|
| + struct SrcList_item *pItem;
|
| + if( (pAccum->printfFlags & SQLITE_PRINTF_INTERNAL)==0 ) return;
|
| + pSrc = va_arg(ap, SrcList*);
|
| + k = va_arg(ap, int);
|
| + pItem = &pSrc->a[k];
|
| assert( bArgList==0 );
|
| assert( k>=0 && k<pSrc->nSrc );
|
| if( pItem->zDatabase ){
|
| @@ -735,9 +731,13 @@ void sqlite3VXPrintf(
|
| ** the output.
|
| */
|
| width -= length;
|
| - if( width>0 && !flag_leftjustify ) sqlite3AppendChar(pAccum, width, ' ');
|
| - sqlite3StrAccumAppend(pAccum, bufpt, length);
|
| - if( width>0 && flag_leftjustify ) sqlite3AppendChar(pAccum, width, ' ');
|
| + if( width>0 ){
|
| + if( !flag_leftjustify ) sqlite3AppendChar(pAccum, width, ' ');
|
| + sqlite3StrAccumAppend(pAccum, bufpt, length);
|
| + if( flag_leftjustify ) sqlite3AppendChar(pAccum, width, ' ');
|
| + }else{
|
| + sqlite3StrAccumAppend(pAccum, bufpt, length);
|
| + }
|
|
|
| if( zExtra ){
|
| sqlite3DbFree(pAccum->db, zExtra);
|
| @@ -766,9 +766,9 @@ static int sqlite3StrAccumEnlarge(StrAccum *p, int N){
|
| setStrAccumError(p, STRACCUM_TOOBIG);
|
| return N;
|
| }else{
|
| - char *zOld = p->bMalloced ? p->zText : 0;
|
| + char *zOld = isMalloced(p) ? p->zText : 0;
|
| i64 szNew = p->nChar;
|
| - assert( (p->zText==0 || p->zText==p->zBase)==(p->bMalloced==0) );
|
| + assert( (p->zText==0 || p->zText==p->zBase)==!isMalloced(p) );
|
| szNew += N + 1;
|
| if( szNew+p->nChar<=p->mxAlloc ){
|
| /* Force exponential buffer size growth as long as it does not overflow,
|
| @@ -789,10 +789,10 @@ static int sqlite3StrAccumEnlarge(StrAccum *p, int N){
|
| }
|
| if( zNew ){
|
| assert( p->zText!=0 || p->nChar==0 );
|
| - if( !p->bMalloced && p->nChar>0 ) memcpy(zNew, p->zText, p->nChar);
|
| + if( !isMalloced(p) && p->nChar>0 ) memcpy(zNew, p->zText, p->nChar);
|
| p->zText = zNew;
|
| p->nAlloc = sqlite3DbMallocSize(p->db, zNew);
|
| - p->bMalloced = 1;
|
| + p->printfFlags |= SQLITE_PRINTF_MALLOCED;
|
| }else{
|
| sqlite3StrAccumReset(p);
|
| setStrAccumError(p, STRACCUM_NOMEM);
|
| @@ -810,7 +810,7 @@ void sqlite3AppendChar(StrAccum *p, int N, char c){
|
| if( p->nChar+(i64)N >= p->nAlloc && (N = sqlite3StrAccumEnlarge(p, N))<=0 ){
|
| return;
|
| }
|
| - assert( (p->zText==p->zBase)==(p->bMalloced==0) );
|
| + assert( (p->zText==p->zBase)==!isMalloced(p) );
|
| while( (N--)>0 ) p->zText[p->nChar++] = c;
|
| }
|
|
|
| @@ -828,7 +828,7 @@ static void SQLITE_NOINLINE enlargeAndAppend(StrAccum *p, const char *z, int N){
|
| memcpy(&p->zText[p->nChar], z, N);
|
| p->nChar += N;
|
| }
|
| - assert( (p->zText==0 || p->zText==p->zBase)==(p->bMalloced==0) );
|
| + assert( (p->zText==0 || p->zText==p->zBase)==!isMalloced(p) );
|
| }
|
|
|
| /*
|
| @@ -842,7 +842,7 @@ void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){
|
| assert( p->accError==0 || p->nAlloc==0 );
|
| if( p->nChar+N >= p->nAlloc ){
|
| enlargeAndAppend(p,z,N);
|
| - }else{
|
| + }else if( N ){
|
| assert( p->zText );
|
| p->nChar += N;
|
| memcpy(&p->zText[p->nChar-N], z, N);
|
| @@ -862,18 +862,23 @@ void sqlite3StrAccumAppendAll(StrAccum *p, const char *z){
|
| ** Return a pointer to the resulting string. Return a NULL
|
| ** pointer if any kind of error was encountered.
|
| */
|
| +static SQLITE_NOINLINE char *strAccumFinishRealloc(StrAccum *p){
|
| + assert( p->mxAlloc>0 && !isMalloced(p) );
|
| + p->zText = sqlite3DbMallocRaw(p->db, p->nChar+1 );
|
| + if( p->zText ){
|
| + memcpy(p->zText, p->zBase, p->nChar+1);
|
| + p->printfFlags |= SQLITE_PRINTF_MALLOCED;
|
| + }else{
|
| + setStrAccumError(p, STRACCUM_NOMEM);
|
| + }
|
| + return p->zText;
|
| +}
|
| char *sqlite3StrAccumFinish(StrAccum *p){
|
| if( p->zText ){
|
| - assert( (p->zText==p->zBase)==(p->bMalloced==0) );
|
| + assert( (p->zText==p->zBase)==!isMalloced(p) );
|
| p->zText[p->nChar] = 0;
|
| - if( p->mxAlloc>0 && p->bMalloced==0 ){
|
| - p->zText = sqlite3DbMallocRaw(p->db, p->nChar+1 );
|
| - if( p->zText ){
|
| - memcpy(p->zText, p->zBase, p->nChar+1);
|
| - p->bMalloced = 1;
|
| - }else{
|
| - setStrAccumError(p, STRACCUM_NOMEM);
|
| - }
|
| + if( p->mxAlloc>0 && !isMalloced(p) ){
|
| + return strAccumFinishRealloc(p);
|
| }
|
| }
|
| return p->zText;
|
| @@ -883,10 +888,10 @@ char *sqlite3StrAccumFinish(StrAccum *p){
|
| ** Reset an StrAccum string. Reclaim all malloced memory.
|
| */
|
| void sqlite3StrAccumReset(StrAccum *p){
|
| - assert( (p->zText==0 || p->zText==p->zBase)==(p->bMalloced==0) );
|
| - if( p->bMalloced ){
|
| + assert( (p->zText==0 || p->zText==p->zBase)==!isMalloced(p) );
|
| + if( isMalloced(p) ){
|
| sqlite3DbFree(p->db, p->zText);
|
| - p->bMalloced = 0;
|
| + p->printfFlags &= ~SQLITE_PRINTF_MALLOCED;
|
| }
|
| p->zText = 0;
|
| }
|
| @@ -912,7 +917,7 @@ void sqlite3StrAccumInit(StrAccum *p, sqlite3 *db, char *zBase, int n, int mx){
|
| p->nAlloc = n;
|
| p->mxAlloc = mx;
|
| p->accError = 0;
|
| - p->bMalloced = 0;
|
| + p->printfFlags = 0;
|
| }
|
|
|
| /*
|
| @@ -926,10 +931,11 @@ char *sqlite3VMPrintf(sqlite3 *db, const char *zFormat, va_list ap){
|
| assert( db!=0 );
|
| sqlite3StrAccumInit(&acc, db, zBase, sizeof(zBase),
|
| db->aLimit[SQLITE_LIMIT_LENGTH]);
|
| - sqlite3VXPrintf(&acc, SQLITE_PRINTF_INTERNAL, zFormat, ap);
|
| + acc.printfFlags = SQLITE_PRINTF_INTERNAL;
|
| + sqlite3VXPrintf(&acc, zFormat, ap);
|
| z = sqlite3StrAccumFinish(&acc);
|
| if( acc.accError==STRACCUM_NOMEM ){
|
| - db->mallocFailed = 1;
|
| + sqlite3OomFault(db);
|
| }
|
| return z;
|
| }
|
| @@ -966,7 +972,7 @@ char *sqlite3_vmprintf(const char *zFormat, va_list ap){
|
| if( sqlite3_initialize() ) return 0;
|
| #endif
|
| sqlite3StrAccumInit(&acc, 0, zBase, sizeof(zBase), SQLITE_MAX_LENGTH);
|
| - sqlite3VXPrintf(&acc, 0, zFormat, ap);
|
| + sqlite3VXPrintf(&acc, zFormat, ap);
|
| z = sqlite3StrAccumFinish(&acc);
|
| return z;
|
| }
|
| @@ -1011,8 +1017,9 @@ char *sqlite3_vsnprintf(int n, char *zBuf, const char *zFormat, va_list ap){
|
| }
|
| #endif
|
| sqlite3StrAccumInit(&acc, 0, zBuf, n, 0);
|
| - sqlite3VXPrintf(&acc, 0, zFormat, ap);
|
| - return sqlite3StrAccumFinish(&acc);
|
| + sqlite3VXPrintf(&acc, zFormat, ap);
|
| + zBuf[acc.nChar] = 0;
|
| + return zBuf;
|
| }
|
| char *sqlite3_snprintf(int n, char *zBuf, const char *zFormat, ...){
|
| char *z;
|
| @@ -1042,7 +1049,7 @@ static void renderLogMsg(int iErrCode, const char *zFormat, va_list ap){
|
| char zMsg[SQLITE_PRINT_BUF_SIZE*3]; /* Complete log message */
|
|
|
| sqlite3StrAccumInit(&acc, 0, zMsg, sizeof(zMsg), 0);
|
| - sqlite3VXPrintf(&acc, 0, zFormat, ap);
|
| + sqlite3VXPrintf(&acc, zFormat, ap);
|
| sqlite3GlobalConfig.xLog(sqlite3GlobalConfig.pLogArg, iErrCode,
|
| sqlite3StrAccumFinish(&acc));
|
| }
|
| @@ -1071,7 +1078,7 @@ void sqlite3DebugPrintf(const char *zFormat, ...){
|
| char zBuf[500];
|
| sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0);
|
| va_start(ap,zFormat);
|
| - sqlite3VXPrintf(&acc, 0, zFormat, ap);
|
| + sqlite3VXPrintf(&acc, zFormat, ap);
|
| va_end(ap);
|
| sqlite3StrAccumFinish(&acc);
|
| fprintf(stdout,"%s", zBuf);
|
| @@ -1084,9 +1091,9 @@ void sqlite3DebugPrintf(const char *zFormat, ...){
|
| ** variable-argument wrapper around sqlite3VXPrintf(). The bFlags argument
|
| ** can contain the bit SQLITE_PRINTF_INTERNAL enable internal formats.
|
| */
|
| -void sqlite3XPrintf(StrAccum *p, u32 bFlags, const char *zFormat, ...){
|
| +void sqlite3XPrintf(StrAccum *p, const char *zFormat, ...){
|
| va_list ap;
|
| va_start(ap,zFormat);
|
| - sqlite3VXPrintf(p, bFlags, zFormat, ap);
|
| + sqlite3VXPrintf(p, zFormat, ap);
|
| va_end(ap);
|
| }
|
|
|