15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The "printf" code that follows dates from the 1980's.  It is in
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the public domain.  The original comments are included here for
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** completeness.  They are very out-of-date but might be useful as
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** an historical reference.  Most of the "enhancements" have been backed
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** out so that the functionality is now the same as standard printf().
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**************************************************************************
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following modules is an enhanced replacement for the "printf" subroutines
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** found in the standard C library.  The following enhancements are
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** supported:
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**      +  Additional functions.  The standard set of "printf" functions
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**         includes printf, fprintf, sprintf, vprintf, vfprintf, and
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**         vsprintf.  This module adds the following:
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**           *  snprintf -- Works like sprintf, but has an extra argument
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**                          which is the size of the buffer written to.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**           *  mprintf --  Similar to sprintf.  Writes output to memory
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**                          obtained from malloc.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**           *  xprintf --  Calls a function to dispose of output.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**           *  nprintf --  No output, but returns the number of characters
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**                          that would have been output by printf.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**           *  A v- version (ex: vsnprintf) of every function is also
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**              supplied.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**      +  A few extensions to the formatting notation are supported:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**           *  The "=" flag (similar to "-") causes the output to be
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**              be centered in the appropriately sized field.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**           *  The %b field outputs an integer in binary notation.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**           *  The %c field now accepts a precision.  The character output
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**              is repeated by the number of times the precision specifies.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**           *  The %' field works like %c, but takes as its character the
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**              next character of the format string, instead of the next
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**              argument.  For example,  printf("%.78'-")  prints 78 minus
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**              signs, the same as  printf("%.78c",'-').
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**      +  When compiled using GCC on a SPARC, this version of printf is
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**         faster than the library printf for SUN OS 4.1.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**      +  All functions are fully reentrant.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqliteInt.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Conversion types fall into various categories as defined by the
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** following enumeration.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define etRADIX       1 /* Integer types.  %d, %x, %o, and so forth */
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define etFLOAT       2 /* Floating point.  %f */
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define etEXP         3 /* Exponentional notation. %e and %E */
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define etGENERIC     4 /* Floating or exponential, depending on exponent. %g */
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define etSIZE        5 /* Return number of characters processed so far. %n */
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define etSTRING      6 /* Strings. %s */
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define etDYNSTRING   7 /* Dynamically allocated strings. %z */
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define etPERCENT     8 /* Percent symbol. %% */
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define etCHARX       9 /* Characters. %c */
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The rest are extensions, not normally found in printf() */
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define etSQLESCAPE  10 /* Strings with '\'' doubled.  %q */
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define etSQLESCAPE2 11 /* Strings with '\'' doubled and enclosed in '',
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          NULL pointers replaced by SQL NULL.  %Q */
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define etTOKEN      12 /* a pointer to a Token structure */
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define etSRCLIST    13 /* a pointer to a SrcList */
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define etPOINTER    14 /* The %p conversion */
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define etSQLESCAPE3 15 /* %w -> Strings with '\"' doubled */
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define etORDINAL    16 /* %r -> 1st, 2nd, 3rd, 4th, etc.  English only */
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define etINVALID     0 /* Any unrecognized conversion type */
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** An "etByte" is an 8-bit unsigned value.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned char etByte;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Each builtin conversion character (ex: the 'd' in "%d") is described
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** by an instance of the following structure
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct et_info {   /* Information about each format field */
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char fmttype;            /* The format field code letter */
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  etByte base;             /* The base for radix conversion */
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  etByte flags;            /* One or more of FLAG_ constants below */
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  etByte type;             /* Conversion paradigm */
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  etByte charset;          /* Offset into aDigits[] of the digits string */
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  etByte prefix;           /* Offset into aPrefix[] of the prefix string */
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} et_info;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Allowed values for et_info.flags
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FLAG_SIGNED  1     /* True if the value to convert is signed */
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FLAG_INTERN  2     /* True if for internal use only */
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FLAG_STRING  4     /* Allow infinity precision */
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following table is searched linearly, so it is good to put the
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** most frequently used conversion types first.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char aDigits[] = "0123456789ABCDEF0123456789abcdef";
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char aPrefix[] = "-x0\000X0";
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const et_info fmtinfo[] = {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  'd', 10, 1, etRADIX,      0,  0 },
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  's',  0, 4, etSTRING,     0,  0 },
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  'g',  0, 1, etGENERIC,    30, 0 },
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  'z',  0, 4, etDYNSTRING,  0,  0 },
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  'q',  0, 4, etSQLESCAPE,  0,  0 },
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  'Q',  0, 4, etSQLESCAPE2, 0,  0 },
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  'w',  0, 4, etSQLESCAPE3, 0,  0 },
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  'c',  0, 0, etCHARX,      0,  0 },
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  'o',  8, 0, etRADIX,      0,  2 },
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  'u', 10, 0, etRADIX,      0,  0 },
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  'x', 16, 0, etRADIX,      16, 1 },
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  'X', 16, 0, etRADIX,      0,  4 },
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FLOATING_POINT
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  'f',  0, 1, etFLOAT,      0,  0 },
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  'e',  0, 1, etEXP,        30, 0 },
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  'E',  0, 1, etEXP,        14, 0 },
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  'G',  0, 1, etGENERIC,    14, 0 },
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  'i', 10, 1, etRADIX,      0,  0 },
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  'n',  0, 0, etSIZE,       0,  0 },
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  '%',  0, 0, etPERCENT,    0,  0 },
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  'p', 16, 0, etPOINTER,    0,  1 },
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* All the rest have the FLAG_INTERN bit set and are thus for internal
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** use only */
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  'T',  0, 2, etTOKEN,      0,  0 },
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  'S',  0, 2, etSRCLIST,    0,  0 },
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {  'r', 10, 3, etORDINAL,    0,  0 },
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If SQLITE_OMIT_FLOATING_POINT is defined, then none of the floating point
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** conversions will work.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FLOATING_POINT
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** "*val" is a double such that 0.1 <= *val < 10.0
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the ascii code for the leading digit of *val, then
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** multiply "*val" by 10.0 to renormalize.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Example:
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     input:     *val = 3.14159
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     output:    *val = 1.4159    function return = '3'
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The counter *cnt is incremented each time.  After counter exceeds
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 16 (the number of significant digits in a 64-bit float) '0' is
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** always returned.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char et_getdigit(LONGDOUBLE_TYPE *val, int *cnt){
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int digit;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LONGDOUBLE_TYPE d;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (*cnt)++ >= 16 ) return '0';
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  digit = (int)*val;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d = digit;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  digit += '0';
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *val = (*val - d)*10.0;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (char)digit;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_FLOATING_POINT */
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Append N space characters to the given string buffer.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void appendSpace(StrAccum *pAccum, int N){
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char zSpaces[] = "                             ";
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while( N>=(int)sizeof(zSpaces)-1 ){
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3StrAccumAppend(pAccum, zSpaces, sizeof(zSpaces)-1);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    N -= sizeof(zSpaces)-1;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( N>0 ){
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3StrAccumAppend(pAccum, zSpaces, N);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** On machines with a small stack size, you can redefine the
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLITE_PRINT_BUF_SIZE to be less than 350.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_PRINT_BUF_SIZE
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(SQLITE_SMALL_STACK)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   define SQLITE_PRINT_BUF_SIZE 50
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   define SQLITE_PRINT_BUF_SIZE 350
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define etBUFSIZE SQLITE_PRINT_BUF_SIZE  /* Size of the output buffer */
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The root program.  All variations call this core.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** INPUTS:
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   func   This is a pointer to a function taking three arguments
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**            1. A pointer to anything.  Same as the "arg" parameter.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**            2. A pointer to the list of characters to be output
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**               (Note, this list is NOT null terminated.)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**            3. An integer number of characters to be output.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**               (Note: This number might be zero.)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   arg    This is the pointer to anything which will be passed as the
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**          first argument to "func".  Use it for whatever you like.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   fmt    This is the format string, as in the usual print.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   ap     This is a pointer to a list of arguments.  Same as in
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**          vfprint.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** OUTPUTS:
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**          The return value is the total number of characters sent to
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**          the function "func".  Returns -1 on a error.
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Note that the order in which automatic variables are declared below
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** seems to make a big difference in determining how fast this beast
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** will run.
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VXPrintf(
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StrAccum *pAccum,                  /* Accumulate results here */
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int useExtended,                   /* Allow extended %-conversions */
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *fmt,                   /* Format string */
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list ap                         /* arguments */
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int c;                     /* Next character in the format string */
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *bufpt;               /* Pointer to the conversion buffer */
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int precision;             /* Precision of the current field */
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int length;                /* Length of the field */
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int idx;                   /* A general purpose loop counter */
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int width;                 /* Width of the current field */
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  etByte flag_leftjustify;   /* True if "-" flag is present */
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  etByte flag_plussign;      /* True if "+" flag is present */
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  etByte flag_blanksign;     /* True if " " flag is present */
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  etByte flag_alternateform; /* True if "#" flag is present */
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  etByte flag_altform2;      /* True if "!" flag is present */
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  etByte flag_zeropad;       /* True if field width constant starts with zero */
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  etByte flag_long;          /* True if "l" flag is present */
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  etByte flag_longlong;      /* True if the "ll" flag is present */
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  etByte done;               /* Loop termination flag */
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite_uint64 longvalue;   /* Value for integer types */
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LONGDOUBLE_TYPE realvalue; /* Value for real types */
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const et_info *infop;      /* Pointer to the appropriate info structure */
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buf[etBUFSIZE];       /* Conversion buffer */
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char prefix;               /* Prefix character.  "+" or "-" or " " or '\0'. */
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  etByte xtype = 0;          /* Conversion paradigm */
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zExtra;              /* Extra memory used for etTCLESCAPE conversions */
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FLOATING_POINT
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int  exp, e2;              /* exponent of real numbers */
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double rounder;            /* Used for rounding floating point values */
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  etByte flag_dp;            /* True if decimal point should be shown */
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  etByte flag_rtz;           /* True if trailing zeros should be removed */
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  etByte flag_exp;           /* True to force display of the exponent */
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nsd;                   /* Number of significant digits returned */
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  length = 0;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bufpt = 0;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(; (c=(*fmt))!=0; ++fmt){
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( c!='%' ){
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int amt;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bufpt = (char *)fmt;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      amt = 1;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while( (c=(*++fmt))!='%' && c!=0 ) amt++;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3StrAccumAppend(pAccum, bufpt, amt);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( c==0 ) break;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( (c=(*++fmt))==0 ){
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3StrAccumAppend(pAccum, "%", 1);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Find out what flags are present */
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flag_leftjustify = flag_plussign = flag_blanksign =
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     flag_alternateform = flag_altform2 = flag_zeropad = 0;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    done = 0;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do{
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch( c ){
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case '-':   flag_leftjustify = 1;     break;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case '+':   flag_plussign = 1;        break;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case ' ':   flag_blanksign = 1;       break;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case '#':   flag_alternateform = 1;   break;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case '!':   flag_altform2 = 1;        break;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case '0':   flag_zeropad = 1;         break;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:    done = 1;                 break;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }while( !done && (c=(*++fmt))!=0 );
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Get the field width */
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    width = 0;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( c=='*' ){
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      width = va_arg(ap,int);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( width<0 ){
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        flag_leftjustify = 1;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        width = -width;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c = *++fmt;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while( c>='0' && c<='9' ){
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        width = width*10 + c - '0';
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        c = *++fmt;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( width > etBUFSIZE-10 ){
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      width = etBUFSIZE-10;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Get the precision */
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( c=='.' ){
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      precision = 0;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c = *++fmt;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( c=='*' ){
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        precision = va_arg(ap,int);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( precision<0 ) precision = -precision;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        c = *++fmt;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        while( c>='0' && c<='9' ){
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          precision = precision*10 + c - '0';
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          c = *++fmt;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      precision = -1;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Get the conversion type modifier */
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( c=='l' ){
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flag_long = 1;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c = *++fmt;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( c=='l' ){
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        flag_longlong = 1;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        c = *++fmt;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        flag_longlong = 0;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flag_long = flag_longlong = 0;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Fetch the info entry for the field */
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    infop = &fmtinfo[0];
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xtype = etINVALID;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(idx=0; idx<ArraySize(fmtinfo); idx++){
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( c==fmtinfo[idx].fmttype ){
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        infop = &fmtinfo[idx];
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( useExtended || (infop->flags & FLAG_INTERN)==0 ){
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          xtype = infop->type;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }else{
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zExtra = 0;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Limit the precision to prevent overflowing buf[] during conversion */
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( precision>etBUFSIZE-40 && (infop->flags & FLAG_STRING)==0 ){
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      precision = etBUFSIZE-40;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** At this point, variables are initialized as follows:
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **   flag_alternateform          TRUE if a '#' is present.
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **   flag_altform2               TRUE if a '!' is present.
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **   flag_plussign               TRUE if a '+' is present.
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **   flag_leftjustify            TRUE if a '-' is present or if the
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **                               field width was negative.
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **   flag_zeropad                TRUE if the width began with 0.
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **   flag_long                   TRUE if the letter 'l' (ell) prefixed
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **                               the conversion character.
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **   flag_longlong               TRUE if the letter 'll' (ell ell) prefixed
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **                               the conversion character.
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **   flag_blanksign              TRUE if a ' ' is present.
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **   width                       The specified field width.  This is
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **                               always non-negative.  Zero is the default.
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **   precision                   The specified precision.  The default
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **                               is -1.
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **   xtype                       The class of the conversion.
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **   infop                       Pointer to the appropriate info struct.
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch( xtype ){
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case etPOINTER:
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        flag_longlong = sizeof(char*)==sizeof(i64);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        flag_long = sizeof(char*)==sizeof(long int);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* Fall through into the next case */
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case etORDINAL:
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case etRADIX:
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( infop->flags & FLAG_SIGNED ){
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          i64 v;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( flag_longlong ){
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            v = va_arg(ap,i64);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }else if( flag_long ){
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            v = va_arg(ap,long int);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }else{
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            v = va_arg(ap,int);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( v<0 ){
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if( v==SMALLEST_INT64 ){
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              longvalue = ((u64)1)<<63;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }else{
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              longvalue = -v;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            prefix = '-';
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }else{
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            longvalue = v;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if( flag_plussign )        prefix = '+';
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else if( flag_blanksign )  prefix = ' ';
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else                       prefix = 0;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }else{
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( flag_longlong ){
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            longvalue = va_arg(ap,u64);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }else if( flag_long ){
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            longvalue = va_arg(ap,unsigned long int);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }else{
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            longvalue = va_arg(ap,unsigned int);
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          prefix = 0;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( longvalue==0 ) flag_alternateform = 0;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( flag_zeropad && precision<width-(prefix!=0) ){
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          precision = width-(prefix!=0);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bufpt = &buf[etBUFSIZE-1];
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( xtype==etORDINAL ){
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          static const char zOrd[] = "thstndrd";
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          int x = (int)(longvalue % 10);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( x>=4 || (longvalue/10)%10==1 ){
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            x = 0;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          buf[etBUFSIZE-3] = zOrd[x*2];
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          buf[etBUFSIZE-2] = zOrd[x*2+1];
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          bufpt -= 2;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          register const char *cset;      /* Use registers for speed */
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          register int base;
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          cset = &aDigits[infop->charset];
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base = infop->base;
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          do{                                           /* Convert to ascii */
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *(--bufpt) = cset[longvalue%base];
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            longvalue = longvalue/base;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }while( longvalue>0 );
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        length = (int)(&buf[etBUFSIZE-1]-bufpt);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for(idx=precision-length; idx>0; idx--){
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          *(--bufpt) = '0';                             /* Zero pad */
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( prefix ) *(--bufpt) = prefix;               /* Add sign */
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( flag_alternateform && infop->prefix ){      /* Add "0" or "0x" */
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          const char *pre;
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          char x;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pre = &aPrefix[infop->prefix];
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          for(; (x=(*pre))!=0; pre++) *(--bufpt) = x;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        length = (int)(&buf[etBUFSIZE-1]-bufpt);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case etFLOAT:
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case etEXP:
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case etGENERIC:
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        realvalue = va_arg(ap,double);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_FLOATING_POINT
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        length = 0;
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( precision<0 ) precision = 6;         /* Set default precision */
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( precision>etBUFSIZE/2-10 ) precision = etBUFSIZE/2-10;
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( realvalue<0.0 ){
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          realvalue = -realvalue;
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          prefix = '-';
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }else{
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( flag_plussign )          prefix = '+';
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          else if( flag_blanksign )    prefix = ' ';
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          else                         prefix = 0;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( xtype==etGENERIC && precision>0 ) precision--;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* Rounding works like BSD when the constant 0.4999 is used.  Wierd! */
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for(idx=precision, rounder=0.4999; idx>0; idx--, rounder*=0.1);
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* It makes more sense to use 0.5 */
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for(idx=precision, rounder=0.5; idx>0; idx--, rounder*=0.1){}
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( xtype==etFLOAT ) realvalue += rounder;
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* Normalize realvalue to within 10.0 > realvalue >= 1.0 */
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        exp = 0;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( sqlite3IsNaN((double)realvalue) ){
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          bufpt = "NaN";
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          length = 3;
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( realvalue>0.0 ){
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          while( realvalue>=1e32 && exp<=350 ){ realvalue *= 1e-32; exp+=32; }
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          while( realvalue>=1e8 && exp<=350 ){ realvalue *= 1e-8; exp+=8; }
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          while( realvalue>=10.0 && exp<=350 ){ realvalue *= 0.1; exp++; }
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          while( realvalue<1e-8 ){ realvalue *= 1e8; exp-=8; }
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          while( realvalue<1.0 ){ realvalue *= 10.0; exp--; }
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( exp>350 ){
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if( prefix=='-' ){
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              bufpt = "-Inf";
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }else if( prefix=='+' ){
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              bufpt = "+Inf";
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }else{
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              bufpt = "Inf";
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            length = sqlite3Strlen30(bufpt);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bufpt = buf;
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /*
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** If the field type is etGENERIC, then convert to either etEXP
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** or etFLOAT, as appropriate.
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        */
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        flag_exp = xtype==etEXP;
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( xtype!=etFLOAT ){
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          realvalue += rounder;
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( realvalue>=10.0 ){ realvalue *= 0.1; exp++; }
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( xtype==etGENERIC ){
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          flag_rtz = !flag_alternateform;
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( exp<-4 || exp>precision ){
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xtype = etEXP;
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }else{
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            precision = precision - exp;
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            xtype = etFLOAT;
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }else{
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          flag_rtz = 0;
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( xtype==etEXP ){
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          e2 = 0;
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }else{
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          e2 = exp;
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        nsd = 0;
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        flag_dp = (precision>0 ?1:0) | flag_alternateform | flag_altform2;
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* The sign in front of the number */
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( prefix ){
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          *(bufpt++) = prefix;
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* Digits prior to the decimal point */
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( e2<0 ){
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          *(bufpt++) = '0';
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }else{
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          for(; e2>=0; e2--){
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *(bufpt++) = et_getdigit(&realvalue,&nsd);
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* The decimal point */
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( flag_dp ){
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          *(bufpt++) = '.';
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* "0" digits after the decimal point but before the first
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** significant digit of the number */
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for(e2++; e2<0; precision--, e2++){
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          assert( precision>0 );
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          *(bufpt++) = '0';
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* Significant digits after the decimal point */
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        while( (precision--)>0 ){
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          *(bufpt++) = et_getdigit(&realvalue,&nsd);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* Remove trailing zeros and the "." if no digits follow the "." */
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( flag_rtz && flag_dp ){
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          while( bufpt[-1]=='0' ) *(--bufpt) = 0;
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          assert( bufpt>buf );
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( bufpt[-1]=='.' ){
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if( flag_altform2 ){
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              *(bufpt++) = '0';
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }else{
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              *(--bufpt) = 0;
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* Add the "eNNN" suffix */
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( flag_exp || xtype==etEXP ){
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          *(bufpt++) = aDigits[infop->charset];
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( exp<0 ){
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *(bufpt++) = '-'; exp = -exp;
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }else{
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *(bufpt++) = '+';
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( exp>=100 ){
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *(bufpt++) = (char)((exp/100)+'0');        /* 100's digit */
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            exp %= 100;
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          *(bufpt++) = (char)(exp/10+'0');             /* 10's digit */
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          *(bufpt++) = (char)(exp%10+'0');             /* 1's digit */
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *bufpt = 0;
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* The converted number is in buf[] and zero terminated. Output it.
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** Note that the number is in the usual order, not reversed as with
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** integer conversions. */
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        length = (int)(bufpt-buf);
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bufpt = buf;
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* Special case:  Add leading zeros if the flag_zeropad flag is
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** set and we are not left justified */
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( flag_zeropad && !flag_leftjustify && length < width){
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          int i;
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          int nPad = width - length;
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          for(i=width; i>=nPad; i--){
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            bufpt[i] = bufpt[i-nPad];
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          i = prefix!=0;
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          while( nPad-- ) bufpt[i++] = '0';
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          length = width;
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* !defined(SQLITE_OMIT_FLOATING_POINT) */
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case etSIZE:
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *(va_arg(ap,int*)) = pAccum->nChar;
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        length = width = 0;
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case etPERCENT:
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        buf[0] = '%';
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bufpt = buf;
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        length = 1;
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case etCHARX:
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        c = va_arg(ap,int);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        buf[0] = (char)c;
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( precision>=0 ){
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          for(idx=1; idx<precision; idx++) buf[idx] = (char)c;
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          length = precision;
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }else{
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          length =1;
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bufpt = buf;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case etSTRING:
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case etDYNSTRING:
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bufpt = va_arg(ap,char*);
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( bufpt==0 ){
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          bufpt = "";
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }else if( xtype==etDYNSTRING ){
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          zExtra = bufpt;
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( precision>=0 ){
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          for(length=0; length<precision && bufpt[length]; length++){}
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }else{
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          length = sqlite3Strlen30(bufpt);
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case etSQLESCAPE:
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case etSQLESCAPE2:
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case etSQLESCAPE3: {
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int i, j, k, n, isnull;
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int needQuote;
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        char ch;
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        char q = ((xtype==etSQLESCAPE3)?'"':'\'');   /* Quote character */
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        char *escarg = va_arg(ap,char*);
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        isnull = escarg==0;
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( isnull ) escarg = (xtype==etSQLESCAPE2 ? "NULL" : "(NULL)");
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        k = precision;
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for(i=n=0; k!=0 && (ch=escarg[i])!=0; i++, k--){
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( ch==q )  n++;
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        needQuote = !isnull && xtype==etSQLESCAPE2;
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        n += i + 1 + needQuote*2;
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( n>etBUFSIZE ){
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          bufpt = zExtra = sqlite3Malloc( n );
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( bufpt==0 ){
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pAccum->mallocFailed = 1;
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return;
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }else{
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          bufpt = buf;
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        j = 0;
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( needQuote ) bufpt[j++] = q;
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        k = i;
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for(i=0; i<k; i++){
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          bufpt[j++] = ch = escarg[i];
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( ch==q ) bufpt[j++] = ch;
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( needQuote ) bufpt[j++] = q;
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bufpt[j] = 0;
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        length = j;
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* The precision in %q and %Q means how many input characters to
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** consume, not the length of the output...
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** if( precision>=0 && precision<length ) length = precision; */
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case etTOKEN: {
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Token *pToken = va_arg(ap, Token*);
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( pToken ){
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          sqlite3StrAccumAppend(pAccum, (const char*)pToken->z, pToken->n);
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        length = width = 0;
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case etSRCLIST: {
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SrcList *pSrc = va_arg(ap, SrcList*);
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int k = va_arg(ap, int);
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        struct SrcList_item *pItem = &pSrc->a[k];
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( k>=0 && k<pSrc->nSrc );
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( pItem->zDatabase ){
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          sqlite3StrAccumAppend(pAccum, pItem->zDatabase, -1);
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          sqlite3StrAccumAppend(pAccum, ".", 1);
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3StrAccumAppend(pAccum, pItem->zName, -1);
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        length = width = 0;
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default: {
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( xtype==etINVALID );
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }/* End switch over the format type */
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** The text of the conversion is pointed to by "bufpt" and is
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** "length" characters long.  The field width is "width".  Do
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** the output.
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !flag_leftjustify ){
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      register int nspace;
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nspace = width-length;
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( nspace>0 ){
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        appendSpace(pAccum, nspace);
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( length>0 ){
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3StrAccumAppend(pAccum, bufpt, length);
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( flag_leftjustify ){
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      register int nspace;
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nspace = width-length;
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( nspace>0 ){
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        appendSpace(pAccum, nspace);
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( zExtra ){
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_free(zExtra);
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }/* End for loop over the format string */
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} /* End of function */
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Append N bytes of text from z to the StrAccum object.
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( z!=0 || N==0 );
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->tooBig | p->mallocFailed ){
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testcase(p->tooBig);
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testcase(p->mallocFailed);
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( N<0 ){
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    N = sqlite3Strlen30(z);
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( N==0 || NEVER(z==0) ){
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->nChar+N >= p->nAlloc ){
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *zNew;
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !p->useMalloc ){
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->tooBig = 1;
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      N = p->nAlloc - p->nChar - 1;
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( N<=0 ){
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      char *zOld = (p->zText==p->zBase ? 0 : p->zText);
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      i64 szNew = p->nChar;
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      szNew += N + 1;
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( szNew > p->mxAlloc ){
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3StrAccumReset(p);
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p->tooBig = 1;
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p->nAlloc = (int)szNew;
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( p->useMalloc==1 ){
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zNew = sqlite3DbRealloc(p->db, zOld, p->nAlloc);
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zNew = sqlite3_realloc(zOld, p->nAlloc);
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( zNew ){
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( zOld==0 ) memcpy(zNew, p->zText, p->nChar);
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p->zText = zNew;
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p->mallocFailed = 1;
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3StrAccumReset(p);
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(&p->zText[p->nChar], z, N);
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->nChar += N;
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Finish off a string by making sure it is zero-terminated.
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return a pointer to the resulting string.  Return a NULL
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pointer if any kind of error was encountered.
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char *sqlite3StrAccumFinish(StrAccum *p){
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->zText ){
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->zText[p->nChar] = 0;
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->useMalloc && p->zText==p->zBase ){
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( p->useMalloc==1 ){
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p->zText = sqlite3DbMallocRaw(p->db, p->nChar+1 );
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p->zText = sqlite3_malloc(p->nChar+1);
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( p->zText ){
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        memcpy(p->zText, p->zBase, p->nChar+1);
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p->mallocFailed = 1;
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return p->zText;
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Reset an StrAccum string.  Reclaim all malloced memory.
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3StrAccumReset(StrAccum *p){
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->zText!=p->zBase ){
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->useMalloc==1 ){
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3DbFree(p->db, p->zText);
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_free(p->zText);
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->zText = 0;
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Initialize a string accumulator
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3StrAccumInit(StrAccum *p, char *zBase, int n, int mx){
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->zText = p->zBase = zBase;
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->db = 0;
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->nChar = 0;
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->nAlloc = n;
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->mxAlloc = mx;
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->useMalloc = 1;
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->tooBig = 0;
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->mallocFailed = 0;
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Print into memory obtained from sqliteMalloc().  Use the internal
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** %-conversion extensions.
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char *sqlite3VMPrintf(sqlite3 *db, const char *zFormat, va_list ap){
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *z;
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char zBase[SQLITE_PRINT_BUF_SIZE];
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StrAccum acc;
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( db!=0 );
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3StrAccumInit(&acc, zBase, sizeof(zBase),
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      db->aLimit[SQLITE_LIMIT_LENGTH]);
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  acc.db = db;
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VXPrintf(&acc, 1, zFormat, ap);
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  z = sqlite3StrAccumFinish(&acc);
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( acc.mallocFailed ){
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db->mallocFailed = 1;
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return z;
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Print into memory obtained from sqliteMalloc().  Use the internal
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** %-conversion extensions.
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char *sqlite3MPrintf(sqlite3 *db, const char *zFormat, ...){
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list ap;
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *z;
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_start(ap, zFormat);
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  z = sqlite3VMPrintf(db, zFormat, ap);
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_end(ap);
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return z;
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Like sqlite3MPrintf(), but call sqlite3DbFree() on zStr after formatting
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the string and before returnning.  This routine is intended to be used
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to modify an existing string.  For example:
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**       x = sqlite3MPrintf(db, x, "prefix %s suffix", x);
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char *sqlite3MAppendf(sqlite3 *db, char *zStr, const char *zFormat, ...){
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list ap;
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *z;
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_start(ap, zFormat);
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  z = sqlite3VMPrintf(db, zFormat, ap);
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_end(ap);
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(db, zStr);
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return z;
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Print into memory obtained from sqlite3_malloc().  Omit the internal
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** %-conversion extensions.
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char *sqlite3_vmprintf(const char *zFormat, va_list ap){
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *z;
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char zBase[SQLITE_PRINT_BUF_SIZE];
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StrAccum acc;
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTOINIT
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3_initialize() ) return 0;
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3StrAccumInit(&acc, zBase, sizeof(zBase), SQLITE_MAX_LENGTH);
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  acc.useMalloc = 2;
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VXPrintf(&acc, 0, zFormat, ap);
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  z = sqlite3StrAccumFinish(&acc);
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return z;
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Print into memory obtained from sqlite3_malloc()().  Omit the internal
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** %-conversion extensions.
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char *sqlite3_mprintf(const char *zFormat, ...){
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list ap;
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *z;
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTOINIT
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3_initialize() ) return 0;
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_start(ap, zFormat);
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  z = sqlite3_vmprintf(zFormat, ap);
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_end(ap);
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return z;
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_snprintf() works like snprintf() except that it ignores the
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** current locale settings.  This is important for SQLite because we
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are not able to use a "," as the decimal point in place of "." as
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** specified by some locales.
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Oops:  The first two arguments of sqlite3_snprintf() are backwards
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** from the snprintf() standard.  Unfortunately, it is too late to change
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** this without breaking compatibility, so we just have to live with the
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** mistake.
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_vsnprintf() is the varargs version.
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char *sqlite3_vsnprintf(int n, char *zBuf, const char *zFormat, va_list ap){
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StrAccum acc;
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( n<=0 ) return zBuf;
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3StrAccumInit(&acc, zBuf, n, 0);
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  acc.useMalloc = 0;
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VXPrintf(&acc, 0, zFormat, ap);
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sqlite3StrAccumFinish(&acc);
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char *sqlite3_snprintf(int n, char *zBuf, const char *zFormat, ...){
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *z;
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list ap;
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_start(ap,zFormat);
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  z = sqlite3_vsnprintf(n, zBuf, zFormat, ap);
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_end(ap);
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return z;
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This is the routine that actually formats the sqlite3_log() message.
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** We house it in a separate routine from sqlite3_log() to avoid using
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** stack space on small-stack systems when logging is disabled.
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_log() must render into a static buffer.  It cannot dynamically
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** allocate memory because it might be called while the memory allocator
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** mutex is held.
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void renderLogMsg(int iErrCode, const char *zFormat, va_list ap){
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StrAccum acc;                          /* String accumulator */
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char zMsg[SQLITE_PRINT_BUF_SIZE*3];    /* Complete log message */
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3StrAccumInit(&acc, zMsg, sizeof(zMsg), 0);
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  acc.useMalloc = 0;
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VXPrintf(&acc, 0, zFormat, ap);
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3GlobalConfig.xLog(sqlite3GlobalConfig.pLogArg, iErrCode,
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           sqlite3StrAccumFinish(&acc));
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Format and write a message to the log if logging is enabled.
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3_log(int iErrCode, const char *zFormat, ...){
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list ap;                             /* Vararg list */
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3GlobalConfig.xLog ){
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_start(ap, zFormat);
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    renderLogMsg(iErrCode, zFormat, ap);
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    va_end(ap);
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(SQLITE_DEBUG)
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A version of printf() that understands %lld.  Used for debugging.
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The printf() built into some versions of windows does not understand %lld
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and segfaults if you give it a long long int.
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3DebugPrintf(const char *zFormat, ...){
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list ap;
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StrAccum acc;
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char zBuf[500];
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3StrAccumInit(&acc, zBuf, sizeof(zBuf), 0);
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  acc.useMalloc = 0;
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_start(ap,zFormat);
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VXPrintf(&acc, 0, zFormat, ap);
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_end(ap);
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3StrAccumFinish(&acc);
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fprintf(stdout,"%s", zBuf);
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fflush(stdout);
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_TRACE
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** variable-argument wrapper around sqlite3VXPrintf().
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3XPrintf(StrAccum *p, const char *zFormat, ...){
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list ap;
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_start(ap,zFormat);
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VXPrintf(p, 1, zFormat, ap);
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_end(ap);
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1030