/ Hex Artifact Content
Login

Artifact ecbec6fce896305839ca1420ae09ef845dcb832d:


0000: 2f 2a 0a 2a 2a 20 54 68 65 20 22 70 72 69 6e 74  /*.** The "print
0010: 66 22 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c  f" code that fol
0020: 6c 6f 77 73 20 64 61 74 65 73 20 66 72 6f 6d 20  lows dates from 
0030: 74 68 65 20 31 39 38 30 27 73 2e 20 20 49 74 20  the 1980's.  It 
0040: 69 73 20 69 6e 0a 2a 2a 20 74 68 65 20 70 75 62  is in.** the pub
0050: 6c 69 63 20 64 6f 6d 61 69 6e 2e 20 20 54 68 65  lic domain.  The
0060: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6d 6d 65 6e   original commen
0070: 74 73 20 61 72 65 20 69 6e 63 6c 75 64 65 64 20  ts are included 
0080: 68 65 72 65 20 66 6f 72 0a 2a 2a 20 63 6f 6d 70  here for.** comp
0090: 6c 65 74 65 6e 65 73 73 2e 20 20 54 68 65 79 20  leteness.  They 
00a0: 61 72 65 20 76 65 72 79 20 6f 75 74 2d 6f 66 2d  are very out-of-
00b0: 64 61 74 65 20 62 75 74 20 6d 69 67 68 74 20 62  date but might b
00c0: 65 20 75 73 65 66 75 6c 20 61 73 0a 2a 2a 20 61  e useful as.** a
00d0: 6e 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 66  n historical ref
00e0: 65 72 65 6e 63 65 2e 20 20 4d 6f 73 74 20 6f 66  erence.  Most of
00f0: 20 74 68 65 20 22 65 6e 68 61 6e 63 65 6d 65 6e   the "enhancemen
0100: 74 73 22 20 68 61 76 65 20 62 65 65 6e 20 62 61  ts" have been ba
0110: 63 6b 65 64 0a 2a 2a 20 6f 75 74 20 73 6f 20 74  cked.** out so t
0120: 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  hat the function
0130: 61 6c 69 74 79 20 69 73 20 6e 6f 77 20 74 68 65  ality is now the
0140: 20 73 61 6d 65 20 61 73 20 73 74 61 6e 64 61 72   same as standar
0150: 64 20 70 72 69 6e 74 66 28 29 2e 0a 2a 2a 0a 2a  d printf()..**.*
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
01a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
01b0: 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69  This file contai
01c0: 6e 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73 65  ns code for a se
01d0: 74 20 6f 66 20 22 70 72 69 6e 74 66 22 2d 6c 69  t of "printf"-li
01e0: 6b 65 20 72 6f 75 74 69 6e 65 73 2e 20 20 54 68  ke routines.  Th
01f0: 65 73 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20  ese.** routines 
0200: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 73 20 6d  format strings m
0210: 75 63 68 20 6c 69 6b 65 20 74 68 65 20 70 72 69  uch like the pri
0220: 6e 74 66 28 29 20 66 72 6f 6d 20 74 68 65 20 73  ntf() from the s
0230: 74 61 6e 64 61 72 64 20 43 0a 2a 2a 20 6c 69 62  tandard C.** lib
0240: 72 61 72 79 2c 20 74 68 6f 75 67 68 20 74 68 65  rary, though the
0250: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
0260: 68 65 72 65 20 68 61 73 20 65 6e 68 61 6e 63 65  here has enhance
0270: 6d 65 6e 74 73 20 74 6f 20 73 75 70 70 6f 72 74  ments to support
0280: 0a 2a 2a 20 53 51 4c 6c 69 74 65 2e 0a 2a 2f 0a  .** SQLlite..*/.
0290: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
02a0: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 49 66  Int.h"../*.** If
02b0: 20 74 68 65 20 73 74 72 63 68 72 6e 75 6c 28 29   the strchrnul()
02c0: 20 6c 69 62 72 61 72 79 20 66 75 6e 63 74 69 6f   library functio
02d0: 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  n is available, 
02e0: 74 68 65 6e 20 73 65 74 0a 2a 2a 20 48 41 56 45  then set.** HAVE
02f0: 5f 53 54 52 43 48 52 4e 55 4c 2e 20 20 49 66 20  _STRCHRNUL.  If 
0300: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20  that routine is 
0310: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 74  not available, t
0320: 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 77 69  his module.** wi
0330: 6c 6c 20 73 75 70 70 6c 79 20 69 74 73 20 6f 77  ll supply its ow
0340: 6e 2e 20 20 54 68 65 20 62 75 69 6c 74 2d 69 6e  n.  The built-in
0350: 20 76 65 72 73 69 6f 6e 20 69 73 20 73 6c 6f 77   version is slow
0360: 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 67  er than.** the g
0370: 6c 69 62 63 20 76 65 72 73 69 6f 6e 20 73 6f 20  libc version so 
0380: 74 68 65 20 67 6c 69 62 63 20 76 65 72 73 69 6f  the glibc versio
0390: 6e 20 69 73 20 64 65 66 69 6e 69 74 65 6c 79 20  n is definitely 
03a0: 70 72 65 66 65 72 72 65 64 2e 0a 2a 2f 0a 23 69  preferred..*/.#i
03b0: 66 20 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f  f !defined(HAVE_
03c0: 53 54 52 43 48 52 4e 55 4c 29 0a 23 20 69 66 20  STRCHRNUL).# if 
03d0: 64 65 66 69 6e 65 64 28 6c 69 6e 75 78 29 0a 23  defined(linux).#
03e0: 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f 53 54    define HAVE_ST
03f0: 52 43 48 52 4e 55 4c 20 31 0a 23 20 65 6c 73 65  RCHRNUL 1.# else
0400: 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f  .#  define HAVE_
0410: 53 54 52 43 48 52 4e 55 4c 20 30 0a 23 20 65 6e  STRCHRNUL 0.# en
0420: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  dif.#endif.../*.
0430: 2a 2a 20 43 6f 6e 76 65 72 73 69 6f 6e 20 74 79  ** Conversion ty
0440: 70 65 73 20 66 61 6c 6c 20 69 6e 74 6f 20 76 61  pes fall into va
0450: 72 69 6f 75 73 20 63 61 74 65 67 6f 72 69 65 73  rious categories
0460: 20 61 73 20 64 65 66 69 6e 65 64 20 62 79 20 74   as defined by t
0470: 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
0480: 65 6e 75 6d 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  enumeration..*/.
0490: 23 64 65 66 69 6e 65 20 65 74 52 41 44 49 58 20  #define etRADIX 
04a0: 20 20 20 20 20 20 31 20 2f 2a 20 49 6e 74 65 67        1 /* Integ
04b0: 65 72 20 74 79 70 65 73 2e 20 20 25 64 2c 20 25  er types.  %d, %
04c0: 78 2c 20 25 6f 2c 20 61 6e 64 20 73 6f 20 66 6f  x, %o, and so fo
04d0: 72 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65  rth */.#define e
04e0: 74 46 4c 4f 41 54 20 20 20 20 20 20 20 32 20 2f  tFLOAT       2 /
04f0: 2a 20 46 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * Floating point
0500: 2e 20 20 25 66 20 2a 2f 0a 23 64 65 66 69 6e 65  .  %f */.#define
0510: 20 65 74 45 58 50 20 20 20 20 20 20 20 20 20 33   etEXP         3
0520: 20 2f 2a 20 45 78 70 6f 6e 65 6e 74 69 6f 6e 61   /* Exponentiona
0530: 6c 20 6e 6f 74 61 74 69 6f 6e 2e 20 25 65 20 61  l notation. %e a
0540: 6e 64 20 25 45 20 2a 2f 0a 23 64 65 66 69 6e 65  nd %E */.#define
0550: 20 65 74 47 45 4e 45 52 49 43 20 20 20 20 20 34   etGENERIC     4
0560: 20 2f 2a 20 46 6c 6f 61 74 69 6e 67 20 6f 72 20   /* Floating or 
0570: 65 78 70 6f 6e 65 6e 74 69 61 6c 2c 20 64 65 70  exponential, dep
0580: 65 6e 64 69 6e 67 20 6f 6e 20 65 78 70 6f 6e 65  ending on expone
0590: 6e 74 2e 20 25 67 20 2a 2f 0a 23 64 65 66 69 6e  nt. %g */.#defin
05a0: 65 20 65 74 53 49 5a 45 20 20 20 20 20 20 20 20  e etSIZE        
05b0: 35 20 2f 2a 20 52 65 74 75 72 6e 20 6e 75 6d 62  5 /* Return numb
05c0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
05d0: 20 70 72 6f 63 65 73 73 65 64 20 73 6f 20 66 61   processed so fa
05e0: 72 2e 20 25 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  r. %n */.#define
05f0: 20 65 74 53 54 52 49 4e 47 20 20 20 20 20 20 36   etSTRING      6
0600: 20 2f 2a 20 53 74 72 69 6e 67 73 2e 20 25 73 20   /* Strings. %s 
0610: 2a 2f 0a 23 64 65 66 69 6e 65 20 65 74 44 59 4e  */.#define etDYN
0620: 53 54 52 49 4e 47 20 20 20 37 20 2f 2a 20 44 79  STRING   7 /* Dy
0630: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
0640: 74 65 64 20 73 74 72 69 6e 67 73 2e 20 25 7a 20  ted strings. %z 
0650: 2a 2f 0a 23 64 65 66 69 6e 65 20 65 74 50 45 52  */.#define etPER
0660: 43 45 4e 54 20 20 20 20 20 38 20 2f 2a 20 50 65  CENT     8 /* Pe
0670: 72 63 65 6e 74 20 73 79 6d 62 6f 6c 2e 20 25 25  rcent symbol. %%
0680: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65 74 43 48   */.#define etCH
0690: 41 52 58 20 20 20 20 20 20 20 39 20 2f 2a 20 43  ARX       9 /* C
06a0: 68 61 72 61 63 74 65 72 73 2e 20 25 63 20 2a 2f  haracters. %c */
06b0: 0a 2f 2a 20 54 68 65 20 72 65 73 74 20 61 72 65  ./* The rest are
06c0: 20 65 78 74 65 6e 73 69 6f 6e 73 2c 20 6e 6f 74   extensions, not
06d0: 20 6e 6f 72 6d 61 6c 6c 79 20 66 6f 75 6e 64 20   normally found 
06e0: 69 6e 20 70 72 69 6e 74 66 28 29 20 2a 2f 0a 23  in printf() */.#
06f0: 64 65 66 69 6e 65 20 65 74 53 51 4c 45 53 43 41  define etSQLESCA
0700: 50 45 20 20 31 30 20 2f 2a 20 53 74 72 69 6e 67  PE  10 /* String
0710: 73 20 77 69 74 68 20 27 5c 27 27 20 64 6f 75 62  s with '\'' doub
0720: 6c 65 64 2e 20 20 25 71 20 2a 2f 0a 23 64 65 66  led.  %q */.#def
0730: 69 6e 65 20 65 74 53 51 4c 45 53 43 41 50 45 32  ine etSQLESCAPE2
0740: 20 31 31 20 2f 2a 20 53 74 72 69 6e 67 73 20 77   11 /* Strings w
0750: 69 74 68 20 27 5c 27 27 20 64 6f 75 62 6c 65 64  ith '\'' doubled
0760: 20 61 6e 64 20 65 6e 63 6c 6f 73 65 64 20 69 6e   and enclosed in
0770: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20   '',.           
0780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
0790: 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 72 65 70  ULL pointers rep
07a0: 6c 61 63 65 64 20 62 79 20 53 51 4c 20 4e 55 4c  laced by SQL NUL
07b0: 4c 2e 20 20 25 51 20 2a 2f 0a 23 64 65 66 69 6e  L.  %Q */.#defin
07c0: 65 20 65 74 54 4f 4b 45 4e 20 20 20 20 20 20 31  e etTOKEN      1
07d0: 32 20 2f 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  2 /* a pointer t
07e0: 6f 20 61 20 54 6f 6b 65 6e 20 73 74 72 75 63 74  o a Token struct
07f0: 75 72 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65  ure */.#define e
0800: 74 53 52 43 4c 49 53 54 20 20 20 20 31 33 20 2f  tSRCLIST    13 /
0810: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * a pointer to a
0820: 20 53 72 63 4c 69 73 74 20 2a 2f 0a 23 64 65 66   SrcList */.#def
0830: 69 6e 65 20 65 74 50 4f 49 4e 54 45 52 20 20 20  ine etPOINTER   
0840: 20 31 34 20 2f 2a 20 54 68 65 20 25 70 20 63 6f   14 /* The %p co
0850: 6e 76 65 72 73 69 6f 6e 20 2a 2f 0a 23 64 65 66  nversion */.#def
0860: 69 6e 65 20 65 74 53 51 4c 45 53 43 41 50 45 33  ine etSQLESCAPE3
0870: 20 31 35 20 2f 2a 20 25 77 20 2d 3e 20 53 74 72   15 /* %w -> Str
0880: 69 6e 67 73 20 77 69 74 68 20 27 5c 22 27 20 64  ings with '\"' d
0890: 6f 75 62 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e  oubled */.#defin
08a0: 65 20 65 74 4f 52 44 49 4e 41 4c 20 20 20 20 31  e etORDINAL    1
08b0: 36 20 2f 2a 20 25 72 20 2d 3e 20 31 73 74 2c 20  6 /* %r -> 1st, 
08c0: 32 6e 64 2c 20 33 72 64 2c 20 34 74 68 2c 20 65  2nd, 3rd, 4th, e
08d0: 74 63 2e 20 20 45 6e 67 6c 69 73 68 20 6f 6e 6c  tc.  English onl
08e0: 79 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 65 74  y */..#define et
08f0: 49 4e 56 41 4c 49 44 20 20 20 20 20 30 20 2f 2a  INVALID     0 /*
0900: 20 41 6e 79 20 75 6e 72 65 63 6f 67 6e 69 7a 65   Any unrecognize
0910: 64 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 79 70  d conversion typ
0920: 65 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  e */.../*.** An 
0930: 22 65 74 42 79 74 65 22 20 69 73 20 61 6e 20 38  "etByte" is an 8
0940: 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 76 61  -bit unsigned va
0950: 6c 75 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  lue..*/.typedef 
0960: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 74  unsigned char et
0970: 42 79 74 65 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  Byte;../*.** Eac
0980: 68 20 62 75 69 6c 74 69 6e 20 63 6f 6e 76 65 72  h builtin conver
0990: 73 69 6f 6e 20 63 68 61 72 61 63 74 65 72 20 28  sion character (
09a0: 65 78 3a 20 74 68 65 20 27 64 27 20 69 6e 20 22  ex: the 'd' in "
09b0: 25 64 22 29 20 69 73 20 64 65 73 63 72 69 62 65  %d") is describe
09c0: 64 0a 2a 2a 20 62 79 20 61 6e 20 69 6e 73 74 61  d.** by an insta
09d0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
09e0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a  wing structure.*
09f0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0a00: 20 65 74 5f 69 6e 66 6f 20 7b 20 20 20 2f 2a 20   et_info {   /* 
0a10: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
0a20: 74 20 65 61 63 68 20 66 6f 72 6d 61 74 20 66 69  t each format fi
0a30: 65 6c 64 20 2a 2f 0a 20 20 63 68 61 72 20 66 6d  eld */.  char fm
0a40: 74 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  ttype;          
0a50: 20 20 2f 2a 20 54 68 65 20 66 6f 72 6d 61 74 20    /* The format 
0a60: 66 69 65 6c 64 20 63 6f 64 65 20 6c 65 74 74 65  field code lette
0a70: 72 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 62 61  r */.  etByte ba
0a80: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
0a90: 2f 2a 20 54 68 65 20 62 61 73 65 20 66 6f 72 20  /* The base for 
0aa0: 72 61 64 69 78 20 63 6f 6e 76 65 72 73 69 6f 6e  radix conversion
0ab0: 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 66 6c 61   */.  etByte fla
0ac0: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs;            /
0ad0: 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  * One or more of
0ae0: 20 46 4c 41 47 5f 20 63 6f 6e 73 74 61 6e 74 73   FLAG_ constants
0af0: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 65 74 42 79   below */.  etBy
0b00: 74 65 20 74 79 70 65 3b 20 20 20 20 20 20 20 20  te type;        
0b10: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 73 69       /* Conversi
0b20: 6f 6e 20 70 61 72 61 64 69 67 6d 20 2a 2f 0a 20  on paradigm */. 
0b30: 20 65 74 42 79 74 65 20 63 68 61 72 73 65 74 3b   etByte charset;
0b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
0b50: 73 65 74 20 69 6e 74 6f 20 61 44 69 67 69 74 73  set into aDigits
0b60: 5b 5d 20 6f 66 20 74 68 65 20 64 69 67 69 74 73  [] of the digits
0b70: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 65 74 42   string */.  etB
0b80: 79 74 65 20 70 72 65 66 69 78 3b 20 20 20 20 20  yte prefix;     
0b90: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
0ba0: 69 6e 74 6f 20 61 50 72 65 66 69 78 5b 5d 20 6f  into aPrefix[] o
0bb0: 66 20 74 68 65 20 70 72 65 66 69 78 20 73 74 72  f the prefix str
0bc0: 69 6e 67 20 2a 2f 0a 7d 20 65 74 5f 69 6e 66 6f  ing */.} et_info
0bd0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
0be0: 20 76 61 6c 75 65 73 20 66 6f 72 20 65 74 5f 69   values for et_i
0bf0: 6e 66 6f 2e 66 6c 61 67 73 0a 2a 2f 0a 23 64 65  nfo.flags.*/.#de
0c00: 66 69 6e 65 20 46 4c 41 47 5f 53 49 47 4e 45 44  fine FLAG_SIGNED
0c10: 20 20 31 20 20 20 20 20 2f 2a 20 54 72 75 65 20    1     /* True 
0c20: 69 66 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  if the value to 
0c30: 63 6f 6e 76 65 72 74 20 69 73 20 73 69 67 6e 65  convert is signe
0c40: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4c 41  d */.#define FLA
0c50: 47 5f 49 4e 54 45 52 4e 20 20 32 20 20 20 20 20  G_INTERN  2     
0c60: 2f 2a 20 54 72 75 65 20 69 66 20 66 6f 72 20 69  /* True if for i
0c70: 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f 6e 6c 79  nternal use only
0c80: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4c 41 47   */.#define FLAG
0c90: 5f 53 54 52 49 4e 47 20 20 34 20 20 20 20 20 2f  _STRING  4     /
0ca0: 2a 20 41 6c 6c 6f 77 20 69 6e 66 69 6e 69 74 79  * Allow infinity
0cb0: 20 70 72 65 63 69 73 69 6f 6e 20 2a 2f 0a 0a 0a   precision */...
0cc0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
0cd0: 69 6e 67 20 74 61 62 6c 65 20 69 73 20 73 65 61  ing table is sea
0ce0: 72 63 68 65 64 20 6c 69 6e 65 61 72 6c 79 2c 20  rched linearly, 
0cf0: 73 6f 20 69 74 20 69 73 20 67 6f 6f 64 20 74 6f  so it is good to
0d00: 20 70 75 74 20 74 68 65 0a 2a 2a 20 6d 6f 73 74   put the.** most
0d10: 20 66 72 65 71 75 65 6e 74 6c 79 20 75 73 65 64   frequently used
0d20: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 79 70 65   conversion type
0d30: 73 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74  s first..*/.stat
0d40: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 61 44  ic const char aD
0d50: 69 67 69 74 73 5b 5d 20 3d 20 22 30 31 32 33 34  igits[] = "01234
0d60: 35 36 37 38 39 41 42 43 44 45 46 30 31 32 33 34  56789ABCDEF01234
0d70: 35 36 37 38 39 61 62 63 64 65 66 22 3b 0a 73 74  56789abcdef";.st
0d80: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
0d90: 61 50 72 65 66 69 78 5b 5d 20 3d 20 22 2d 78 30  aPrefix[] = "-x0
0da0: 5c 30 30 30 58 30 22 3b 0a 73 74 61 74 69 63 20  \000X0";.static 
0db0: 63 6f 6e 73 74 20 65 74 5f 69 6e 66 6f 20 66 6d  const et_info fm
0dc0: 74 69 6e 66 6f 5b 5d 20 3d 20 7b 0a 20 20 7b 20  tinfo[] = {.  { 
0dd0: 20 27 64 27 2c 20 31 30 2c 20 31 2c 20 65 74 52   'd', 10, 1, etR
0de0: 41 44 49 58 2c 20 20 20 20 20 20 30 2c 20 20 30  ADIX,      0,  0
0df0: 20 7d 2c 0a 20 20 7b 20 20 27 73 27 2c 20 20 30   },.  {  's',  0
0e00: 2c 20 34 2c 20 65 74 53 54 52 49 4e 47 2c 20 20  , 4, etSTRING,  
0e10: 20 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20 7b 20     0,  0 },.  { 
0e20: 20 27 67 27 2c 20 20 30 2c 20 31 2c 20 65 74 47   'g',  0, 1, etG
0e30: 45 4e 45 52 49 43 2c 20 20 20 20 33 30 2c 20 30  ENERIC,    30, 0
0e40: 20 7d 2c 0a 20 20 7b 20 20 27 7a 27 2c 20 20 30   },.  {  'z',  0
0e50: 2c 20 34 2c 20 65 74 44 59 4e 53 54 52 49 4e 47  , 4, etDYNSTRING
0e60: 2c 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20 7b 20  ,  0,  0 },.  { 
0e70: 20 27 71 27 2c 20 20 30 2c 20 34 2c 20 65 74 53   'q',  0, 4, etS
0e80: 51 4c 45 53 43 41 50 45 2c 20 20 30 2c 20 20 30  QLESCAPE,  0,  0
0e90: 20 7d 2c 0a 20 20 7b 20 20 27 51 27 2c 20 20 30   },.  {  'Q',  0
0ea0: 2c 20 34 2c 20 65 74 53 51 4c 45 53 43 41 50 45  , 4, etSQLESCAPE
0eb0: 32 2c 20 30 2c 20 20 30 20 7d 2c 0a 20 20 7b 20  2, 0,  0 },.  { 
0ec0: 20 27 77 27 2c 20 20 30 2c 20 34 2c 20 65 74 53   'w',  0, 4, etS
0ed0: 51 4c 45 53 43 41 50 45 33 2c 20 30 2c 20 20 30  QLESCAPE3, 0,  0
0ee0: 20 7d 2c 0a 20 20 7b 20 20 27 63 27 2c 20 20 30   },.  {  'c',  0
0ef0: 2c 20 30 2c 20 65 74 43 48 41 52 58 2c 20 20 20  , 0, etCHARX,   
0f00: 20 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20 7b 20     0,  0 },.  { 
0f10: 20 27 6f 27 2c 20 20 38 2c 20 30 2c 20 65 74 52   'o',  8, 0, etR
0f20: 41 44 49 58 2c 20 20 20 20 20 20 30 2c 20 20 32  ADIX,      0,  2
0f30: 20 7d 2c 0a 20 20 7b 20 20 27 75 27 2c 20 31 30   },.  {  'u', 10
0f40: 2c 20 30 2c 20 65 74 52 41 44 49 58 2c 20 20 20  , 0, etRADIX,   
0f50: 20 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20 7b 20     0,  0 },.  { 
0f60: 20 27 78 27 2c 20 31 36 2c 20 30 2c 20 65 74 52   'x', 16, 0, etR
0f70: 41 44 49 58 2c 20 20 20 20 20 20 31 36 2c 20 31  ADIX,      16, 1
0f80: 20 7d 2c 0a 20 20 7b 20 20 27 58 27 2c 20 31 36   },.  {  'X', 16
0f90: 2c 20 30 2c 20 65 74 52 41 44 49 58 2c 20 20 20  , 0, etRADIX,   
0fa0: 20 20 20 30 2c 20 20 34 20 7d 2c 0a 23 69 66 6e     0,  4 },.#ifn
0fb0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0fc0: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
0fd0: 20 7b 20 20 27 66 27 2c 20 20 30 2c 20 31 2c 20   {  'f',  0, 1, 
0fe0: 65 74 46 4c 4f 41 54 2c 20 20 20 20 20 20 30 2c  etFLOAT,      0,
0ff0: 20 20 30 20 7d 2c 0a 20 20 7b 20 20 27 65 27 2c    0 },.  {  'e',
1000: 20 20 30 2c 20 31 2c 20 65 74 45 58 50 2c 20 20    0, 1, etEXP,  
1010: 20 20 20 20 20 20 33 30 2c 20 30 20 7d 2c 0a 20        30, 0 },. 
1020: 20 7b 20 20 27 45 27 2c 20 20 30 2c 20 31 2c 20   {  'E',  0, 1, 
1030: 65 74 45 58 50 2c 20 20 20 20 20 20 20 20 31 34  etEXP,        14
1040: 2c 20 30 20 7d 2c 0a 20 20 7b 20 20 27 47 27 2c  , 0 },.  {  'G',
1050: 20 20 30 2c 20 31 2c 20 65 74 47 45 4e 45 52 49    0, 1, etGENERI
1060: 43 2c 20 20 20 20 31 34 2c 20 30 20 7d 2c 0a 23  C,    14, 0 },.#
1070: 65 6e 64 69 66 0a 20 20 7b 20 20 27 69 27 2c 20  endif.  {  'i', 
1080: 31 30 2c 20 31 2c 20 65 74 52 41 44 49 58 2c 20  10, 1, etRADIX, 
1090: 20 20 20 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20       0,  0 },.  
10a0: 7b 20 20 27 6e 27 2c 20 20 30 2c 20 30 2c 20 65  {  'n',  0, 0, e
10b0: 74 53 49 5a 45 2c 20 20 20 20 20 20 20 30 2c 20  tSIZE,       0, 
10c0: 20 30 20 7d 2c 0a 20 20 7b 20 20 27 25 27 2c 20   0 },.  {  '%', 
10d0: 20 30 2c 20 30 2c 20 65 74 50 45 52 43 45 4e 54   0, 0, etPERCENT
10e0: 2c 20 20 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20  ,    0,  0 },.  
10f0: 7b 20 20 27 70 27 2c 20 31 36 2c 20 30 2c 20 65  {  'p', 16, 0, e
1100: 74 50 4f 49 4e 54 45 52 2c 20 20 20 20 30 2c 20  tPOINTER,    0, 
1110: 20 31 20 7d 2c 0a 0a 2f 2a 20 41 6c 6c 20 74 68   1 },../* All th
1120: 65 20 72 65 73 74 20 68 61 76 65 20 74 68 65 20  e rest have the 
1130: 46 4c 41 47 5f 49 4e 54 45 52 4e 20 62 69 74 20  FLAG_INTERN bit 
1140: 73 65 74 20 61 6e 64 20 61 72 65 20 74 68 75 73  set and are thus
1150: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   for internal.**
1160: 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7b   use only */.  {
1170: 20 20 27 54 27 2c 20 20 30 2c 20 32 2c 20 65 74    'T',  0, 2, et
1180: 54 4f 4b 45 4e 2c 20 20 20 20 20 20 30 2c 20 20  TOKEN,      0,  
1190: 30 20 7d 2c 0a 20 20 7b 20 20 27 53 27 2c 20 20  0 },.  {  'S',  
11a0: 30 2c 20 32 2c 20 65 74 53 52 43 4c 49 53 54 2c  0, 2, etSRCLIST,
11b0: 20 20 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20 7b      0,  0 },.  {
11c0: 20 20 27 72 27 2c 20 31 30 2c 20 33 2c 20 65 74    'r', 10, 3, et
11d0: 4f 52 44 49 4e 41 4c 2c 20 20 20 20 30 2c 20 20  ORDINAL,    0,  
11e0: 30 20 7d 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49  0 },.};../*.** I
11f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
1200: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 20 69 73 20  OATING_POINT is 
1210: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6e 6f  defined, then no
1220: 6e 65 20 6f 66 20 74 68 65 20 66 6c 6f 61 74 69  ne of the floati
1230: 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 63 6f 6e 76  ng point.** conv
1240: 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20 77 6f 72  ersions will wor
1250: 6b 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  k..*/.#ifndef SQ
1260: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1270: 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 22  NG_POINT./*.** "
1280: 2a 76 61 6c 22 20 69 73 20 61 20 64 6f 75 62 6c  *val" is a doubl
1290: 65 20 73 75 63 68 20 74 68 61 74 20 30 2e 31 20  e such that 0.1 
12a0: 3c 3d 20 2a 76 61 6c 20 3c 20 31 30 2e 30 0a 2a  <= *val < 10.0.*
12b0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 73 63  * Return the asc
12c0: 69 69 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ii code for the 
12d0: 6c 65 61 64 69 6e 67 20 64 69 67 69 74 20 6f 66  leading digit of
12e0: 20 2a 76 61 6c 2c 20 74 68 65 6e 0a 2a 2a 20 6d   *val, then.** m
12f0: 75 6c 74 69 70 6c 79 20 22 2a 76 61 6c 22 20 62  ultiply "*val" b
1300: 79 20 31 30 2e 30 20 74 6f 20 72 65 6e 6f 72 6d  y 10.0 to renorm
1310: 61 6c 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  alize..**.** Exa
1320: 6d 70 6c 65 3a 0a 2a 2a 20 20 20 20 20 69 6e 70  mple:.**     inp
1330: 75 74 3a 20 20 20 20 20 2a 76 61 6c 20 3d 20 33  ut:     *val = 3
1340: 2e 31 34 31 35 39 0a 2a 2a 20 20 20 20 20 6f 75  .14159.**     ou
1350: 74 70 75 74 3a 20 20 20 20 2a 76 61 6c 20 3d 20  tput:    *val = 
1360: 31 2e 34 31 35 39 20 20 20 20 66 75 6e 63 74 69  1.4159    functi
1370: 6f 6e 20 72 65 74 75 72 6e 20 3d 20 27 33 27 0a  on return = '3'.
1380: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 75 6e 74 65  **.** The counte
1390: 72 20 2a 63 6e 74 20 69 73 20 69 6e 63 72 65 6d  r *cnt is increm
13a0: 65 6e 74 65 64 20 65 61 63 68 20 74 69 6d 65 2e  ented each time.
13b0: 20 20 41 66 74 65 72 20 63 6f 75 6e 74 65 72 20    After counter 
13c0: 65 78 63 65 65 64 73 0a 2a 2a 20 31 36 20 28 74  exceeds.** 16 (t
13d0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 67  he number of sig
13e0: 6e 69 66 69 63 61 6e 74 20 64 69 67 69 74 73 20  nificant digits 
13f0: 69 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  in a 64-bit floa
1400: 74 29 20 27 30 27 20 69 73 0a 2a 2a 20 61 6c 77  t) '0' is.** alw
1410: 61 79 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  ays returned..*/
1420: 0a 73 74 61 74 69 63 20 63 68 61 72 20 65 74 5f  .static char et_
1430: 67 65 74 64 69 67 69 74 28 4c 4f 4e 47 44 4f 55  getdigit(LONGDOU
1440: 42 4c 45 5f 54 59 50 45 20 2a 76 61 6c 2c 20 69  BLE_TYPE *val, i
1450: 6e 74 20 2a 63 6e 74 29 7b 0a 20 20 69 6e 74 20  nt *cnt){.  int 
1460: 64 69 67 69 74 3b 0a 20 20 4c 4f 4e 47 44 4f 55  digit;.  LONGDOU
1470: 42 4c 45 5f 54 59 50 45 20 64 3b 0a 20 20 69 66  BLE_TYPE d;.  if
1480: 28 20 28 2a 63 6e 74 29 3c 3d 30 20 29 20 72 65  ( (*cnt)<=0 ) re
1490: 74 75 72 6e 20 27 30 27 3b 0a 20 20 28 2a 63 6e  turn '0';.  (*cn
14a0: 74 29 2d 2d 3b 0a 20 20 64 69 67 69 74 20 3d 20  t)--;.  digit = 
14b0: 28 69 6e 74 29 2a 76 61 6c 3b 0a 20 20 64 20 3d  (int)*val;.  d =
14c0: 20 64 69 67 69 74 3b 0a 20 20 64 69 67 69 74 20   digit;.  digit 
14d0: 2b 3d 20 27 30 27 3b 0a 20 20 2a 76 61 6c 20 3d  += '0';.  *val =
14e0: 20 28 2a 76 61 6c 20 2d 20 64 29 2a 31 30 2e 30   (*val - d)*10.0
14f0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 63 68 61 72  ;.  return (char
1500: 29 64 69 67 69 74 3b 0a 7d 0a 23 65 6e 64 69 66  )digit;.}.#endif
1510: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1520: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 20 2a  FLOATING_POINT *
1530: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  /../*.** Set the
1540: 20 53 74 72 41 63 63 75 6d 20 6f 62 6a 65 63 74   StrAccum object
1550: 20 74 6f 20 61 6e 20 65 72 72 6f 72 20 6d 6f 64   to an error mod
1560: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1570: 64 20 73 65 74 53 74 72 41 63 63 75 6d 45 72 72  d setStrAccumErr
1580: 6f 72 28 53 74 72 41 63 63 75 6d 20 2a 70 2c 20  or(StrAccum *p, 
1590: 75 38 20 65 45 72 72 6f 72 29 7b 0a 20 20 70 2d  u8 eError){.  p-
15a0: 3e 61 63 63 45 72 72 6f 72 20 3d 20 65 45 72 72  >accError = eErr
15b0: 6f 72 3b 0a 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20  or;.  p->nAlloc 
15c0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  = 0;.}../*.** Ex
15d0: 74 72 61 20 61 72 67 75 6d 65 6e 74 20 76 61 6c  tra argument val
15e0: 75 65 73 20 66 72 6f 6d 20 61 20 50 72 69 6e 74  ues from a Print
15f0: 66 41 72 67 75 6d 65 6e 74 73 20 6f 62 6a 65 63  fArguments objec
1600: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  t.*/.static sqli
1610: 74 65 33 5f 69 6e 74 36 34 20 67 65 74 49 6e 74  te3_int64 getInt
1620: 41 72 67 28 50 72 69 6e 74 66 41 72 67 75 6d 65  Arg(PrintfArgume
1630: 6e 74 73 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  nts *p){.  if( p
1640: 2d 3e 6e 41 72 67 3c 3d 70 2d 3e 6e 55 73 65 64  ->nArg<=p->nUsed
1650: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
1660: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 76 61  eturn sqlite3_va
1670: 6c 75 65 5f 69 6e 74 36 34 28 70 2d 3e 61 70 41  lue_int64(p->apA
1680: 72 67 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 29 3b  rg[p->nUsed++]);
1690: 0a 7d 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65  .}.static double
16a0: 20 67 65 74 44 6f 75 62 6c 65 41 72 67 28 50 72   getDoubleArg(Pr
16b0: 69 6e 74 66 41 72 67 75 6d 65 6e 74 73 20 2a 70  intfArguments *p
16c0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 41 72 67  ){.  if( p->nArg
16d0: 3c 3d 70 2d 3e 6e 55 73 65 64 20 29 20 72 65 74  <=p->nUsed ) ret
16e0: 75 72 6e 20 30 2e 30 3b 0a 20 20 72 65 74 75 72  urn 0.0;.  retur
16f0: 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  n sqlite3_value_
1700: 64 6f 75 62 6c 65 28 70 2d 3e 61 70 41 72 67 5b  double(p->apArg[
1710: 70 2d 3e 6e 55 73 65 64 2b 2b 5d 29 3b 0a 7d 0a  p->nUsed++]);.}.
1720: 73 74 61 74 69 63 20 63 68 61 72 20 2a 67 65 74  static char *get
1730: 54 65 78 74 41 72 67 28 50 72 69 6e 74 66 41 72  TextArg(PrintfAr
1740: 67 75 6d 65 6e 74 73 20 2a 70 29 7b 0a 20 20 69  guments *p){.  i
1750: 66 28 20 70 2d 3e 6e 41 72 67 3c 3d 70 2d 3e 6e  f( p->nArg<=p->n
1760: 55 73 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  Used ) return 0;
1770: 0a 20 20 72 65 74 75 72 6e 20 28 63 68 61 72 2a  .  return (char*
1780: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
1790: 65 78 74 28 70 2d 3e 61 70 41 72 67 5b 70 2d 3e  ext(p->apArg[p->
17a0: 6e 55 73 65 64 2b 2b 5d 29 3b 0a 7d 0a 0a 0a 2f  nUsed++]);.}.../
17b0: 2a 0a 2a 2a 20 4f 6e 20 6d 61 63 68 69 6e 65 73  *.** On machines
17c0: 20 77 69 74 68 20 61 20 73 6d 61 6c 6c 20 73 74   with a small st
17d0: 61 63 6b 20 73 69 7a 65 2c 20 79 6f 75 20 63 61  ack size, you ca
17e0: 6e 20 72 65 64 65 66 69 6e 65 20 74 68 65 0a 2a  n redefine the.*
17f0: 2a 20 53 51 4c 49 54 45 5f 50 52 49 4e 54 5f 42  * SQLITE_PRINT_B
1800: 55 46 5f 53 49 5a 45 20 74 6f 20 62 65 20 73 6f  UF_SIZE to be so
1810: 6d 65 74 68 69 6e 67 20 73 6d 61 6c 6c 65 72 2c  mething smaller,
1820: 20 69 66 20 64 65 73 69 72 65 64 2e 0a 2a 2f 0a   if desired..*/.
1830: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 50  #ifndef SQLITE_P
1840: 52 49 4e 54 5f 42 55 46 5f 53 49 5a 45 0a 23 20  RINT_BUF_SIZE.# 
1850: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 50 52  define SQLITE_PR
1860: 49 4e 54 5f 42 55 46 5f 53 49 5a 45 20 37 30 0a  INT_BUF_SIZE 70.
1870: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 65  #endif.#define e
1880: 74 42 55 46 53 49 5a 45 20 53 51 4c 49 54 45 5f  tBUFSIZE SQLITE_
1890: 50 52 49 4e 54 5f 42 55 46 5f 53 49 5a 45 20 20  PRINT_BUF_SIZE  
18a0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f  /* Size of the o
18b0: 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
18c0: 0a 2f 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 61 20  ./*.** Render a 
18d0: 73 74 72 69 6e 67 20 67 69 76 65 6e 20 62 79 20  string given by 
18e0: 22 66 6d 74 22 20 69 6e 74 6f 20 74 68 65 20 53  "fmt" into the S
18f0: 74 72 41 63 63 75 6d 20 6f 62 6a 65 63 74 2e 0a  trAccum object..
1900: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
1910: 58 50 72 69 6e 74 66 28 0a 20 20 53 74 72 41 63  XPrintf(.  StrAc
1920: 63 75 6d 20 2a 70 41 63 63 75 6d 2c 20 20 20 20  cum *pAccum,    
1930: 20 20 20 20 20 20 2f 2a 20 41 63 63 75 6d 75 6c        /* Accumul
1940: 61 74 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ate results here
1950: 20 2a 2f 0a 20 20 75 33 32 20 62 46 6c 61 67 73   */.  u32 bFlags
1960: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1970: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 49 4e 54   /* SQLITE_PRINT
1980: 46 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63  F_* flags */.  c
1990: 6f 6e 73 74 20 63 68 61 72 20 2a 66 6d 74 2c 20  onst char *fmt, 
19a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
19b0: 6d 61 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  mat string */.  
19c0: 76 61 5f 6c 69 73 74 20 61 70 20 20 20 20 20 20  va_list ap      
19d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 72             /* ar
19e0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
19f0: 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20 20 20  int c;          
1a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1a10: 78 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  xt character in 
1a20: 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  the format strin
1a30: 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 62 75 66  g */.  char *buf
1a40: 70 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pt;             
1a50: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1a60: 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 62  the conversion b
1a70: 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  uffer */.  int p
1a80: 72 65 63 69 73 69 6f 6e 3b 20 20 20 20 20 20 20  recision;       
1a90: 20 20 20 20 20 20 2f 2a 20 50 72 65 63 69 73 69        /* Precisi
1aa0: 6f 6e 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  on of the curren
1ab0: 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74  t field */.  int
1ac0: 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20   length;        
1ad0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
1ae0: 68 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20 2a  h of the field *
1af0: 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20  /.  int idx;    
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b10: 2a 20 41 20 67 65 6e 65 72 61 6c 20 70 75 72 70  * A general purp
1b20: 6f 73 65 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ose loop counter
1b30: 20 2a 2f 0a 20 20 69 6e 74 20 77 69 64 74 68 3b   */.  int width;
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 20 2f 2a 20 57 69 64 74 68 20 6f 66 20 74 68 65   /* Width of the
1b60: 20 63 75 72 72 65 6e 74 20 66 69 65 6c 64 20 2a   current field *
1b70: 2f 0a 20 20 65 74 42 79 74 65 20 66 6c 61 67 5f  /.  etByte flag_
1b80: 6c 65 66 74 6a 75 73 74 69 66 79 3b 20 20 20 2f  leftjustify;   /
1b90: 2a 20 54 72 75 65 20 69 66 20 22 2d 22 20 66 6c  * True if "-" fl
1ba0: 61 67 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  ag is present */
1bb0: 0a 20 20 65 74 42 79 74 65 20 66 6c 61 67 5f 70  .  etByte flag_p
1bc0: 6c 75 73 73 69 67 6e 3b 20 20 20 20 20 20 2f 2a  lussign;      /*
1bd0: 20 54 72 75 65 20 69 66 20 22 2b 22 20 66 6c 61   True if "+" fla
1be0: 67 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  g is present */.
1bf0: 20 20 65 74 42 79 74 65 20 66 6c 61 67 5f 62 6c    etByte flag_bl
1c00: 61 6e 6b 73 69 67 6e 3b 20 20 20 20 20 2f 2a 20  anksign;     /* 
1c10: 54 72 75 65 20 69 66 20 22 20 22 20 66 6c 61 67  True if " " flag
1c20: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
1c30: 20 65 74 42 79 74 65 20 66 6c 61 67 5f 61 6c 74   etByte flag_alt
1c40: 65 72 6e 61 74 65 66 6f 72 6d 3b 20 2f 2a 20 54  ernateform; /* T
1c50: 72 75 65 20 69 66 20 22 23 22 20 66 6c 61 67 20  rue if "#" flag 
1c60: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
1c70: 65 74 42 79 74 65 20 66 6c 61 67 5f 61 6c 74 66  etByte flag_altf
1c80: 6f 72 6d 32 3b 20 20 20 20 20 20 2f 2a 20 54 72  orm2;      /* Tr
1c90: 75 65 20 69 66 20 22 21 22 20 66 6c 61 67 20 69  ue if "!" flag i
1ca0: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 65  s present */.  e
1cb0: 74 42 79 74 65 20 66 6c 61 67 5f 7a 65 72 6f 70  tByte flag_zerop
1cc0: 61 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ad;       /* Tru
1cd0: 65 20 69 66 20 66 69 65 6c 64 20 77 69 64 74 68  e if field width
1ce0: 20 63 6f 6e 73 74 61 6e 74 20 73 74 61 72 74 73   constant starts
1cf0: 20 77 69 74 68 20 7a 65 72 6f 20 2a 2f 0a 20 20   with zero */.  
1d00: 65 74 42 79 74 65 20 66 6c 61 67 5f 6c 6f 6e 67  etByte flag_long
1d10: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
1d20: 75 65 20 69 66 20 22 6c 22 20 66 6c 61 67 20 69  ue if "l" flag i
1d30: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 65  s present */.  e
1d40: 74 42 79 74 65 20 66 6c 61 67 5f 6c 6f 6e 67 6c  tByte flag_longl
1d50: 6f 6e 67 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  ong;      /* Tru
1d60: 65 20 69 66 20 74 68 65 20 22 6c 6c 22 20 66 6c  e if the "ll" fl
1d70: 61 67 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  ag is present */
1d80: 0a 20 20 65 74 42 79 74 65 20 64 6f 6e 65 3b 20  .  etByte done; 
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1da0: 20 4c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f   Loop terminatio
1db0: 6e 20 66 6c 61 67 20 2a 2f 0a 20 20 65 74 42 79  n flag */.  etBy
1dc0: 74 65 20 78 74 79 70 65 20 3d 20 30 3b 20 20 20  te xtype = 0;   
1dd0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72         /* Conver
1de0: 73 69 6f 6e 20 70 61 72 61 64 69 67 6d 20 2a 2f  sion paradigm */
1df0: 0a 20 20 75 38 20 62 41 72 67 4c 69 73 74 3b 20  .  u8 bArgList; 
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e10: 20 54 72 75 65 20 66 6f 72 20 53 51 4c 49 54 45   True for SQLITE
1e20: 5f 50 52 49 4e 54 46 5f 53 51 4c 46 55 4e 43 20  _PRINTF_SQLFUNC 
1e30: 2a 2f 0a 20 20 75 38 20 75 73 65 49 6e 74 65 72  */.  u8 useInter
1e40: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1e50: 2f 2a 20 4f 6b 20 74 6f 20 75 73 65 20 69 6e 74  /* Ok to use int
1e60: 65 72 6e 61 6c 20 63 6f 6e 76 65 72 73 69 6f 6e  ernal conversion
1e70: 73 20 28 65 78 3a 20 25 54 29 20 2a 2f 0a 20 20  s (ex: %T) */.  
1e80: 63 68 61 72 20 70 72 65 66 69 78 3b 20 20 20 20  char prefix;    
1e90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
1ea0: 65 66 69 78 20 63 68 61 72 61 63 74 65 72 2e 20  efix character. 
1eb0: 20 22 2b 22 20 6f 72 20 22 2d 22 20 6f 72 20 22   "+" or "-" or "
1ec0: 20 22 20 6f 72 20 27 5c 30 27 2e 20 2a 2f 0a 20   " or '\0'. */. 
1ed0: 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 6c   sqlite_uint64 l
1ee0: 6f 6e 67 76 61 6c 75 65 3b 20 20 20 2f 2a 20 56  ongvalue;   /* V
1ef0: 61 6c 75 65 20 66 6f 72 20 69 6e 74 65 67 65 72  alue for integer
1f00: 20 74 79 70 65 73 20 2a 2f 0a 20 20 4c 4f 4e 47   types */.  LONG
1f10: 44 4f 55 42 4c 45 5f 54 59 50 45 20 72 65 61 6c  DOUBLE_TYPE real
1f20: 76 61 6c 75 65 3b 20 2f 2a 20 56 61 6c 75 65 20  value; /* Value 
1f30: 66 6f 72 20 72 65 61 6c 20 74 79 70 65 73 20 2a  for real types *
1f40: 2f 0a 20 20 63 6f 6e 73 74 20 65 74 5f 69 6e 66  /.  const et_inf
1f50: 6f 20 2a 69 6e 66 6f 70 3b 20 20 20 20 20 20 2f  o *infop;      /
1f60: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
1f70: 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 66   appropriate inf
1f80: 6f 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  o structure */. 
1f90: 20 63 68 61 72 20 2a 7a 4f 75 74 3b 20 20 20 20   char *zOut;    
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1fb0: 65 6e 64 65 72 69 6e 67 20 62 75 66 66 65 72 20  endering buffer 
1fc0: 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 3b 20 20  */.  int nOut;  
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72  /* Size of the r
1ff0: 65 6e 64 65 72 69 6e 67 20 62 75 66 66 65 72 20  endering buffer 
2000: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72  */.  char *zExtr
2010: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
2020: 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f  /* Malloced memo
2030: 72 79 20 75 73 65 64 20 62 79 20 73 6f 6d 65 20  ry used by some 
2040: 63 6f 6e 76 65 72 73 69 6f 6e 20 2a 2f 0a 23 69  conversion */.#i
2050: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2060: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
2070: 0a 20 20 69 6e 74 20 20 65 78 70 2c 20 65 32 3b  .  int  exp, e2;
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2090: 20 65 78 70 6f 6e 65 6e 74 20 6f 66 20 72 65 61   exponent of rea
20a0: 6c 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 69  l numbers */.  i
20b0: 6e 74 20 6e 73 64 3b 20 20 20 20 20 20 20 20 20  nt nsd;         
20c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20d0: 62 65 72 20 6f 66 20 73 69 67 6e 69 66 69 63 61  ber of significa
20e0: 6e 74 20 64 69 67 69 74 73 20 72 65 74 75 72 6e  nt digits return
20f0: 65 64 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72  ed */.  double r
2100: 6f 75 6e 64 65 72 3b 20 20 20 20 20 20 20 20 20  ounder;         
2110: 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 72     /* Used for r
2120: 6f 75 6e 64 69 6e 67 20 66 6c 6f 61 74 69 6e 67  ounding floating
2130: 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f   point values */
2140: 0a 20 20 65 74 42 79 74 65 20 66 6c 61 67 5f 64  .  etByte flag_d
2150: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
2160: 20 54 72 75 65 20 69 66 20 64 65 63 69 6d 61 6c   True if decimal
2170: 20 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 62 65   point should be
2180: 20 73 68 6f 77 6e 20 2a 2f 0a 20 20 65 74 42 79   shown */.  etBy
2190: 74 65 20 66 6c 61 67 5f 72 74 7a 3b 20 20 20 20  te flag_rtz;    
21a0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
21b0: 66 20 74 72 61 69 6c 69 6e 67 20 7a 65 72 6f 73  f trailing zeros
21c0: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76   should be remov
21d0: 65 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 50  ed */.#endif.  P
21e0: 72 69 6e 74 66 41 72 67 75 6d 65 6e 74 73 20 2a  rintfArguments *
21f0: 70 41 72 67 4c 69 73 74 20 3d 20 30 3b 20 2f 2a  pArgList = 0; /*
2200: 20 41 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 53   Arguments for S
2210: 51 4c 49 54 45 5f 50 52 49 4e 54 46 5f 53 51 4c  QLITE_PRINTF_SQL
2220: 46 55 4e 43 20 2a 2f 0a 20 20 63 68 61 72 20 62  FUNC */.  char b
2230: 75 66 5b 65 74 42 55 46 53 49 5a 45 5d 3b 20 20  uf[etBUFSIZE];  
2240: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 73 69       /* Conversi
2250: 6f 6e 20 62 75 66 66 65 72 20 2a 2f 0a 0a 20 20  on buffer */..  
2260: 62 75 66 70 74 20 3d 20 30 3b 0a 20 20 69 66 28  bufpt = 0;.  if(
2270: 20 62 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69   bFlags ){.    i
2280: 66 28 20 28 62 41 72 67 4c 69 73 74 20 3d 20 28  f( (bArgList = (
2290: 62 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  bFlags & SQLITE_
22a0: 50 52 49 4e 54 46 5f 53 51 4c 46 55 4e 43 29 29  PRINTF_SQLFUNC))
22b0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 41 72  !=0 ){.      pAr
22c0: 67 4c 69 73 74 20 3d 20 76 61 5f 61 72 67 28 61  gList = va_arg(a
22d0: 70 2c 20 50 72 69 6e 74 66 41 72 67 75 6d 65 6e  p, PrintfArgumen
22e0: 74 73 2a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ts*);.    }.    
22f0: 75 73 65 49 6e 74 65 72 6e 20 3d 20 62 46 6c 61  useIntern = bFla
2300: 67 73 20 26 20 53 51 4c 49 54 45 5f 50 52 49 4e  gs & SQLITE_PRIN
2310: 54 46 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d  TF_INTERNAL;.  }
2320: 65 6c 73 65 7b 0a 20 20 20 20 62 41 72 67 4c 69  else{.    bArgLi
2330: 73 74 20 3d 20 75 73 65 49 6e 74 65 72 6e 20 3d  st = useIntern =
2340: 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 20   0;.  }.  for(; 
2350: 28 63 3d 28 2a 66 6d 74 29 29 21 3d 30 3b 20 2b  (c=(*fmt))!=0; +
2360: 2b 66 6d 74 29 7b 0a 20 20 20 20 69 66 28 20 63  +fmt){.    if( c
2370: 21 3d 27 25 27 20 29 7b 0a 20 20 20 20 20 20 62  !='%' ){.      b
2380: 75 66 70 74 20 3d 20 28 63 68 61 72 20 2a 29 66  ufpt = (char *)f
2390: 6d 74 3b 0a 23 69 66 20 48 41 56 45 5f 53 54 52  mt;.#if HAVE_STR
23a0: 43 48 52 4e 55 4c 0a 20 20 20 20 20 20 66 6d 74  CHRNUL.      fmt
23b0: 20 3d 20 73 74 72 63 68 72 6e 75 6c 28 66 6d 74   = strchrnul(fmt
23c0: 2c 20 27 25 27 29 3b 0a 23 65 6c 73 65 0a 20 20  , '%');.#else.  
23d0: 20 20 20 20 64 6f 7b 20 66 6d 74 2b 2b 3b 20 7d      do{ fmt++; }
23e0: 77 68 69 6c 65 28 20 2a 66 6d 74 20 26 26 20 2a  while( *fmt && *
23f0: 66 6d 74 20 21 3d 20 27 25 27 20 29 3b 0a 23 65  fmt != '%' );.#e
2400: 6e 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74  ndif.      sqlit
2410: 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
2420: 28 70 41 63 63 75 6d 2c 20 62 75 66 70 74 2c 20  (pAccum, bufpt, 
2430: 28 69 6e 74 29 28 66 6d 74 20 2d 20 62 75 66 70  (int)(fmt - bufp
2440: 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 2a  t));.      if( *
2450: 66 6d 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  fmt==0 ) break;.
2460: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 63      }.    if( (c
2470: 3d 28 2a 2b 2b 66 6d 74 29 29 3d 3d 30 20 29 7b  =(*++fmt))==0 ){
2480: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74  .      sqlite3St
2490: 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 41 63  rAccumAppend(pAc
24a0: 63 75 6d 2c 20 22 25 22 2c 20 31 29 3b 0a 20 20  cum, "%", 1);.  
24b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
24c0: 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74  .    /* Find out
24d0: 20 77 68 61 74 20 66 6c 61 67 73 20 61 72 65 20   what flags are 
24e0: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 20 20 66  present */.    f
24f0: 6c 61 67 5f 6c 65 66 74 6a 75 73 74 69 66 79 20  lag_leftjustify 
2500: 3d 20 66 6c 61 67 5f 70 6c 75 73 73 69 67 6e 20  = flag_plussign 
2510: 3d 20 66 6c 61 67 5f 62 6c 61 6e 6b 73 69 67 6e  = flag_blanksign
2520: 20 3d 20 0a 20 20 20 20 20 66 6c 61 67 5f 61 6c   = .     flag_al
2530: 74 65 72 6e 61 74 65 66 6f 72 6d 20 3d 20 66 6c  ternateform = fl
2540: 61 67 5f 61 6c 74 66 6f 72 6d 32 20 3d 20 66 6c  ag_altform2 = fl
2550: 61 67 5f 7a 65 72 6f 70 61 64 20 3d 20 30 3b 0a  ag_zeropad = 0;.
2560: 20 20 20 20 64 6f 6e 65 20 3d 20 30 3b 0a 20 20      done = 0;.  
2570: 20 20 64 6f 7b 0a 20 20 20 20 20 20 73 77 69 74    do{.      swit
2580: 63 68 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20  ch( c ){.       
2590: 20 63 61 73 65 20 27 2d 27 3a 20 20 20 66 6c 61   case '-':   fla
25a0: 67 5f 6c 65 66 74 6a 75 73 74 69 66 79 20 3d 20  g_leftjustify = 
25b0: 31 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  1;     break;.  
25c0: 20 20 20 20 20 20 63 61 73 65 20 27 2b 27 3a 20        case '+': 
25d0: 20 20 66 6c 61 67 5f 70 6c 75 73 73 69 67 6e 20    flag_plussign 
25e0: 3d 20 31 3b 20 20 20 20 20 20 20 20 62 72 65 61  = 1;        brea
25f0: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
2600: 27 20 27 3a 20 20 20 66 6c 61 67 5f 62 6c 61 6e  ' ':   flag_blan
2610: 6b 73 69 67 6e 20 3d 20 31 3b 20 20 20 20 20 20  ksign = 1;      
2620: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2630: 63 61 73 65 20 27 23 27 3a 20 20 20 66 6c 61 67  case '#':   flag
2640: 5f 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d 20 3d  _alternateform =
2650: 20 31 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20   1;   break;.   
2660: 20 20 20 20 20 63 61 73 65 20 27 21 27 3a 20 20       case '!':  
2670: 20 66 6c 61 67 5f 61 6c 74 66 6f 72 6d 32 20 3d   flag_altform2 =
2680: 20 31 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b   1;        break
2690: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  ;.        case '
26a0: 30 27 3a 20 20 20 66 6c 61 67 5f 7a 65 72 6f 70  0':   flag_zerop
26b0: 61 64 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ad = 1;         
26c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64  break;.        d
26d0: 65 66 61 75 6c 74 3a 20 20 20 20 64 6f 6e 65 20  efault:    done 
26e0: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
26f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2700: 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20    }.    }while( 
2710: 21 64 6f 6e 65 20 26 26 20 28 63 3d 28 2a 2b 2b  !done && (c=(*++
2720: 66 6d 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  fmt))!=0 );.    
2730: 2f 2a 20 47 65 74 20 74 68 65 20 66 69 65 6c 64  /* Get the field
2740: 20 77 69 64 74 68 20 2a 2f 0a 20 20 20 20 77 69   width */.    wi
2750: 64 74 68 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  dth = 0;.    if(
2760: 20 63 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20   c=='*' ){.     
2770: 20 69 66 28 20 62 41 72 67 4c 69 73 74 20 29 7b   if( bArgList ){
2780: 0a 20 20 20 20 20 20 20 20 77 69 64 74 68 20 3d  .        width =
2790: 20 28 69 6e 74 29 67 65 74 49 6e 74 41 72 67 28   (int)getIntArg(
27a0: 70 41 72 67 4c 69 73 74 29 3b 0a 20 20 20 20 20  pArgList);.     
27b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27c0: 77 69 64 74 68 20 3d 20 76 61 5f 61 72 67 28 61  width = va_arg(a
27d0: 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  p,int);.      }.
27e0: 20 20 20 20 20 20 69 66 28 20 77 69 64 74 68 3c        if( width<
27f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  0 ){.        fla
2800: 67 5f 6c 65 66 74 6a 75 73 74 69 66 79 20 3d 20  g_leftjustify = 
2810: 31 3b 0a 20 20 20 20 20 20 20 20 77 69 64 74 68  1;.        width
2820: 20 3d 20 2d 77 69 64 74 68 3b 0a 20 20 20 20 20   = -width;.     
2830: 20 7d 0a 20 20 20 20 20 20 63 20 3d 20 2a 2b 2b   }.      c = *++
2840: 66 6d 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fmt;.    }else{.
2850: 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 3e 3d        while( c>=
2860: 27 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29 7b  '0' && c<='9' ){
2870: 0a 20 20 20 20 20 20 20 20 77 69 64 74 68 20 3d  .        width =
2880: 20 77 69 64 74 68 2a 31 30 20 2b 20 63 20 2d 20   width*10 + c - 
2890: 27 30 27 3b 0a 20 20 20 20 20 20 20 20 63 20 3d  '0';.        c =
28a0: 20 2a 2b 2b 66 6d 74 3b 0a 20 20 20 20 20 20 7d   *++fmt;.      }
28b0: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65  .    }.    /* Ge
28c0: 74 20 74 68 65 20 70 72 65 63 69 73 69 6f 6e 20  t the precision 
28d0: 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2e  */.    if( c=='.
28e0: 27 20 29 7b 0a 20 20 20 20 20 20 70 72 65 63 69  ' ){.      preci
28f0: 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  sion = 0;.      
2900: 63 20 3d 20 2a 2b 2b 66 6d 74 3b 0a 20 20 20 20  c = *++fmt;.    
2910: 20 20 69 66 28 20 63 3d 3d 27 2a 27 20 29 7b 0a    if( c=='*' ){.
2920: 20 20 20 20 20 20 20 20 69 66 28 20 62 41 72 67          if( bArg
2930: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
2940: 20 20 70 72 65 63 69 73 69 6f 6e 20 3d 20 28 69    precision = (i
2950: 6e 74 29 67 65 74 49 6e 74 41 72 67 28 70 41 72  nt)getIntArg(pAr
2960: 67 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  gList);.        
2970: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2980: 20 70 72 65 63 69 73 69 6f 6e 20 3d 20 76 61 5f   precision = va_
2990: 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
29a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
29b0: 66 28 20 70 72 65 63 69 73 69 6f 6e 3c 30 20 29  f( precision<0 )
29c0: 20 70 72 65 63 69 73 69 6f 6e 20 3d 20 2d 70 72   precision = -pr
29d0: 65 63 69 73 69 6f 6e 3b 0a 20 20 20 20 20 20 20  ecision;.       
29e0: 20 63 20 3d 20 2a 2b 2b 66 6d 74 3b 0a 20 20 20   c = *++fmt;.   
29f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a00: 20 20 77 68 69 6c 65 28 20 63 3e 3d 27 30 27 20    while( c>='0' 
2a10: 26 26 20 63 3c 3d 27 39 27 20 29 7b 0a 20 20 20  && c<='9' ){.   
2a20: 20 20 20 20 20 20 20 70 72 65 63 69 73 69 6f 6e         precision
2a30: 20 3d 20 70 72 65 63 69 73 69 6f 6e 2a 31 30 20   = precision*10 
2a40: 2b 20 63 20 2d 20 27 30 27 3b 0a 20 20 20 20 20  + c - '0';.     
2a50: 20 20 20 20 20 63 20 3d 20 2a 2b 2b 66 6d 74 3b       c = *++fmt;
2a60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a70: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2a80: 20 20 20 20 70 72 65 63 69 73 69 6f 6e 20 3d 20      precision = 
2a90: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  -1;.    }.    /*
2aa0: 20 47 65 74 20 74 68 65 20 63 6f 6e 76 65 72 73   Get the convers
2ab0: 69 6f 6e 20 74 79 70 65 20 6d 6f 64 69 66 69 65  ion type modifie
2ac0: 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d  r */.    if( c==
2ad0: 27 6c 27 20 29 7b 0a 20 20 20 20 20 20 66 6c 61  'l' ){.      fla
2ae0: 67 5f 6c 6f 6e 67 20 3d 20 31 3b 0a 20 20 20 20  g_long = 1;.    
2af0: 20 20 63 20 3d 20 2a 2b 2b 66 6d 74 3b 0a 20 20    c = *++fmt;.  
2b00: 20 20 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 29      if( c=='l' )
2b10: 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 5f 6c  {.        flag_l
2b20: 6f 6e 67 6c 6f 6e 67 20 3d 20 31 3b 0a 20 20 20  onglong = 1;.   
2b30: 20 20 20 20 20 63 20 3d 20 2a 2b 2b 66 6d 74 3b       c = *++fmt;
2b40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2b50: 20 20 20 20 20 20 66 6c 61 67 5f 6c 6f 6e 67 6c        flag_longl
2b60: 6f 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ong = 0;.      }
2b70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b80: 20 20 66 6c 61 67 5f 6c 6f 6e 67 20 3d 20 66 6c    flag_long = fl
2b90: 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 20 3d 20 30 3b  ag_longlong = 0;
2ba0: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 46 65  .    }.    /* Fe
2bb0: 74 63 68 20 74 68 65 20 69 6e 66 6f 20 65 6e 74  tch the info ent
2bc0: 72 79 20 66 6f 72 20 74 68 65 20 66 69 65 6c 64  ry for the field
2bd0: 20 2a 2f 0a 20 20 20 20 69 6e 66 6f 70 20 3d 20   */.    infop = 
2be0: 26 66 6d 74 69 6e 66 6f 5b 30 5d 3b 0a 20 20 20  &fmtinfo[0];.   
2bf0: 20 78 74 79 70 65 20 3d 20 65 74 49 4e 56 41 4c   xtype = etINVAL
2c00: 49 44 3b 0a 20 20 20 20 66 6f 72 28 69 64 78 3d  ID;.    for(idx=
2c10: 30 3b 20 69 64 78 3c 41 72 72 61 79 53 69 7a 65  0; idx<ArraySize
2c20: 28 66 6d 74 69 6e 66 6f 29 3b 20 69 64 78 2b 2b  (fmtinfo); idx++
2c30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  ){.      if( c==
2c40: 66 6d 74 69 6e 66 6f 5b 69 64 78 5d 2e 66 6d 74  fmtinfo[idx].fmt
2c50: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 20 20  type ){.        
2c60: 69 6e 66 6f 70 20 3d 20 26 66 6d 74 69 6e 66 6f  infop = &fmtinfo
2c70: 5b 69 64 78 5d 3b 0a 20 20 20 20 20 20 20 20 69  [idx];.        i
2c80: 66 28 20 75 73 65 49 6e 74 65 72 6e 20 7c 7c 20  f( useIntern || 
2c90: 28 69 6e 66 6f 70 2d 3e 66 6c 61 67 73 20 26 20  (infop->flags & 
2ca0: 46 4c 41 47 5f 49 4e 54 45 52 4e 29 3d 3d 30 20  FLAG_INTERN)==0 
2cb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 74 79  ){.          xty
2cc0: 70 65 20 3d 20 69 6e 66 6f 70 2d 3e 74 79 70 65  pe = infop->type
2cd0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2ce0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2cf0: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
2d00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2d10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 45    }.    }.    zE
2d20: 78 74 72 61 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  xtra = 0;..    /
2d30: 2a 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73  *.    ** At this
2d40: 20 70 6f 69 6e 74 2c 20 76 61 72 69 61 62 6c 65   point, variable
2d50: 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
2d60: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
2d70: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 66 6c    **.    **   fl
2d80: 61 67 5f 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d  ag_alternateform
2d90: 20 20 20 20 20 20 20 20 20 20 54 52 55 45 20 69            TRUE i
2da0: 66 20 61 20 27 23 27 20 69 73 20 70 72 65 73 65  f a '#' is prese
2db0: 6e 74 2e 0a 20 20 20 20 2a 2a 20 20 20 66 6c 61  nt..    **   fla
2dc0: 67 5f 61 6c 74 66 6f 72 6d 32 20 20 20 20 20 20  g_altform2      
2dd0: 20 20 20 20 20 20 20 20 20 54 52 55 45 20 69 66           TRUE if
2de0: 20 61 20 27 21 27 20 69 73 20 70 72 65 73 65 6e   a '!' is presen
2df0: 74 2e 0a 20 20 20 20 2a 2a 20 20 20 66 6c 61 67  t..    **   flag
2e00: 5f 70 6c 75 73 73 69 67 6e 20 20 20 20 20 20 20  _plussign       
2e10: 20 20 20 20 20 20 20 20 54 52 55 45 20 69 66 20          TRUE if 
2e20: 61 20 27 2b 27 20 69 73 20 70 72 65 73 65 6e 74  a '+' is present
2e30: 2e 0a 20 20 20 20 2a 2a 20 20 20 66 6c 61 67 5f  ..    **   flag_
2e40: 6c 65 66 74 6a 75 73 74 69 66 79 20 20 20 20 20  leftjustify     
2e50: 20 20 20 20 20 20 20 54 52 55 45 20 69 66 20 61         TRUE if a
2e60: 20 27 2d 27 20 69 73 20 70 72 65 73 65 6e 74 20   '-' is present 
2e70: 6f 72 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a  or if the.    **
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
2ea0: 69 65 6c 64 20 77 69 64 74 68 20 77 61 73 20 6e  ield width was n
2eb0: 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2a 20  egative..    ** 
2ec0: 20 20 66 6c 61 67 5f 7a 65 72 6f 70 61 64 20 20    flag_zeropad  
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 52                TR
2ee0: 55 45 20 69 66 20 74 68 65 20 77 69 64 74 68 20  UE if the width 
2ef0: 62 65 67 61 6e 20 77 69 74 68 20 30 2e 0a 20 20  began with 0..  
2f00: 20 20 2a 2a 20 20 20 66 6c 61 67 5f 6c 6f 6e 67    **   flag_long
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f20: 20 20 20 54 52 55 45 20 69 66 20 74 68 65 20 6c     TRUE if the l
2f30: 65 74 74 65 72 20 27 6c 27 20 28 65 6c 6c 29 20  etter 'l' (ell) 
2f40: 70 72 65 66 69 78 65 64 0a 20 20 20 20 2a 2a 20  prefixed.    ** 
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
2f70: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 63 68 61  e conversion cha
2f80: 72 61 63 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20  racter..    **  
2f90: 20 66 6c 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 20 20   flag_longlong  
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 52 55               TRU
2fb0: 45 20 69 66 20 74 68 65 20 6c 65 74 74 65 72 20  E if the letter 
2fc0: 27 6c 6c 27 20 28 65 6c 6c 20 65 6c 6c 29 20 70  'll' (ell ell) p
2fd0: 72 65 66 69 78 65 64 0a 20 20 20 20 2a 2a 20 20  refixed.    **  
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
3000: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 63 68 61 72   conversion char
3010: 61 63 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20  acter..    **   
3020: 66 6c 61 67 5f 62 6c 61 6e 6b 73 69 67 6e 20 20  flag_blanksign  
3030: 20 20 20 20 20 20 20 20 20 20 20 20 54 52 55 45              TRUE
3040: 20 69 66 20 61 20 27 20 27 20 69 73 20 70 72 65   if a ' ' is pre
3050: 73 65 6e 74 2e 0a 20 20 20 20 2a 2a 20 20 20 77  sent..    **   w
3060: 69 64 74 68 20 20 20 20 20 20 20 20 20 20 20 20  idth            
3070: 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20 73             The s
3080: 70 65 63 69 66 69 65 64 20 66 69 65 6c 64 20 77  pecified field w
3090: 69 64 74 68 2e 20 20 54 68 69 73 20 69 73 0a 20  idth.  This is. 
30a0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c0: 20 20 20 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 6e      always non-n
30d0: 65 67 61 74 69 76 65 2e 20 20 5a 65 72 6f 20 69  egative.  Zero i
30e0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20  s the default.. 
30f0: 20 20 20 2a 2a 20 20 20 70 72 65 63 69 73 69 6f     **   precisio
3100: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
3110: 20 20 20 20 54 68 65 20 73 70 65 63 69 66 69 65      The specifie
3120: 64 20 70 72 65 63 69 73 69 6f 6e 2e 20 20 54 68  d precision.  Th
3130: 65 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  e default.    **
3140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
3160: 73 20 2d 31 2e 0a 20 20 20 20 2a 2a 20 20 20 78  s -1..    **   x
3170: 74 79 70 65 20 20 20 20 20 20 20 20 20 20 20 20  type            
3180: 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20 63             The c
3190: 6c 61 73 73 20 6f 66 20 74 68 65 20 63 6f 6e 76  lass of the conv
31a0: 65 72 73 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20 20  ersion..    **  
31b0: 20 69 6e 66 6f 70 20 20 20 20 20 20 20 20 20 20   infop          
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 6f 69               Poi
31d0: 6e 74 65 72 20 74 6f 20 74 68 65 20 61 70 70 72  nter to the appr
31e0: 6f 70 72 69 61 74 65 20 69 6e 66 6f 20 73 74 72  opriate info str
31f0: 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  uct..    */.    
3200: 73 77 69 74 63 68 28 20 78 74 79 70 65 20 29 7b  switch( xtype ){
3210: 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 50 4f  .      case etPO
3220: 49 4e 54 45 52 3a 0a 20 20 20 20 20 20 20 20 66  INTER:.        f
3230: 6c 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 20 3d 20 73  lag_longlong = s
3240: 69 7a 65 6f 66 28 63 68 61 72 2a 29 3d 3d 73 69  izeof(char*)==si
3250: 7a 65 6f 66 28 69 36 34 29 3b 0a 20 20 20 20 20  zeof(i64);.     
3260: 20 20 20 66 6c 61 67 5f 6c 6f 6e 67 20 3d 20 73     flag_long = s
3270: 69 7a 65 6f 66 28 63 68 61 72 2a 29 3d 3d 73 69  izeof(char*)==si
3280: 7a 65 6f 66 28 6c 6f 6e 67 20 69 6e 74 29 3b 0a  zeof(long int);.
3290: 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20          /* Fall 
32a0: 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 74 68 65  through into the
32b0: 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20   next case */.  
32c0: 20 20 20 20 63 61 73 65 20 65 74 4f 52 44 49 4e      case etORDIN
32d0: 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 65  AL:.      case e
32e0: 74 52 41 44 49 58 3a 0a 20 20 20 20 20 20 20 20  tRADIX:.        
32f0: 69 66 28 20 69 6e 66 6f 70 2d 3e 66 6c 61 67 73  if( infop->flags
3300: 20 26 20 46 4c 41 47 5f 53 49 47 4e 45 44 20 29   & FLAG_SIGNED )
3310: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20  {.          i64 
3320: 76 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  v;.          if(
3330: 20 62 41 72 67 4c 69 73 74 20 29 7b 0a 20 20 20   bArgList ){.   
3340: 20 20 20 20 20 20 20 20 20 76 20 3d 20 67 65 74           v = get
3350: 49 6e 74 41 72 67 28 70 41 72 67 4c 69 73 74 29  IntArg(pArgList)
3360: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
3370: 65 20 69 66 28 20 66 6c 61 67 5f 6c 6f 6e 67 6c  e if( flag_longl
3380: 6f 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ong ){.         
3390: 20 20 20 76 20 3d 20 76 61 5f 61 72 67 28 61 70     v = va_arg(ap
33a0: 2c 69 36 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ,i64);.         
33b0: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 5f   }else if( flag_
33c0: 6c 6f 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  long ){.        
33d0: 20 20 20 20 76 20 3d 20 76 61 5f 61 72 67 28 61      v = va_arg(a
33e0: 70 2c 6c 6f 6e 67 20 69 6e 74 29 3b 0a 20 20 20  p,long int);.   
33f0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
3400: 20 20 20 20 20 20 20 20 20 20 76 20 3d 20 76 61            v = va
3410: 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20  _arg(ap,int);.  
3420: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3430: 20 20 20 20 69 66 28 20 76 3c 30 20 29 7b 0a 20      if( v<0 ){. 
3440: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76             if( v
3450: 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ==SMALLEST_INT64
3460: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3470: 20 20 6c 6f 6e 67 76 61 6c 75 65 20 3d 20 28 28    longvalue = ((
3480: 75 36 34 29 31 29 3c 3c 36 33 3b 0a 20 20 20 20  u64)1)<<63;.    
3490: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 6e               lon
34b0: 67 76 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20  gvalue = -v;.   
34c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
34d0: 20 20 20 20 20 20 20 70 72 65 66 69 78 20 3d 20         prefix = 
34e0: 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  '-';.          }
34f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
3500: 20 20 6c 6f 6e 67 76 61 6c 75 65 20 3d 20 76 3b    longvalue = v;
3510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
3520: 20 66 6c 61 67 5f 70 6c 75 73 73 69 67 6e 20 29   flag_plussign )
3530: 20 20 20 20 20 20 20 20 70 72 65 66 69 78 20 3d          prefix =
3540: 20 27 2b 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '+';.          
3550: 20 20 65 6c 73 65 20 69 66 28 20 66 6c 61 67 5f    else if( flag_
3560: 62 6c 61 6e 6b 73 69 67 6e 20 29 20 20 70 72 65  blanksign )  pre
3570: 66 69 78 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  fix = ' ';.     
3580: 20 20 20 20 20 20 20 65 6c 73 65 20 20 20 20 20         else     
3590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a0: 20 20 70 72 65 66 69 78 20 3d 20 30 3b 0a 20 20    prefix = 0;.  
35b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
35d0: 20 20 20 69 66 28 20 62 41 72 67 4c 69 73 74 20     if( bArgList 
35e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  ){.            l
35f0: 6f 6e 67 76 61 6c 75 65 20 3d 20 28 75 36 34 29  ongvalue = (u64)
3600: 67 65 74 49 6e 74 41 72 67 28 70 41 72 67 4c 69  getIntArg(pArgLi
3610: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  st);.          }
3620: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 5f 6c 6f  else if( flag_lo
3630: 6e 67 6c 6f 6e 67 20 29 7b 0a 20 20 20 20 20 20  nglong ){.      
3640: 20 20 20 20 20 20 6c 6f 6e 67 76 61 6c 75 65 20        longvalue 
3650: 3d 20 76 61 5f 61 72 67 28 61 70 2c 75 36 34 29  = va_arg(ap,u64)
3660: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
3670: 65 20 69 66 28 20 66 6c 61 67 5f 6c 6f 6e 67 20  e if( flag_long 
3680: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  ){.            l
3690: 6f 6e 67 76 61 6c 75 65 20 3d 20 76 61 5f 61 72  ongvalue = va_ar
36a0: 67 28 61 70 2c 75 6e 73 69 67 6e 65 64 20 6c 6f  g(ap,unsigned lo
36b0: 6e 67 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  ng int);.       
36c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36d0: 20 20 20 20 20 20 6c 6f 6e 67 76 61 6c 75 65 20        longvalue 
36e0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 75 6e 73 69  = va_arg(ap,unsi
36f0: 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20  gned int);.     
3700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3710: 20 70 72 65 66 69 78 20 3d 20 30 3b 0a 20 20 20   prefix = 0;.   
3720: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
3730: 66 28 20 6c 6f 6e 67 76 61 6c 75 65 3d 3d 30 20  f( longvalue==0 
3740: 29 20 66 6c 61 67 5f 61 6c 74 65 72 6e 61 74 65  ) flag_alternate
3750: 66 6f 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  form = 0;.      
3760: 20 20 69 66 28 20 66 6c 61 67 5f 7a 65 72 6f 70    if( flag_zerop
3770: 61 64 20 26 26 20 70 72 65 63 69 73 69 6f 6e 3c  ad && precision<
3780: 77 69 64 74 68 2d 28 70 72 65 66 69 78 21 3d 30  width-(prefix!=0
3790: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
37a0: 72 65 63 69 73 69 6f 6e 20 3d 20 77 69 64 74 68  recision = width
37b0: 2d 28 70 72 65 66 69 78 21 3d 30 29 3b 0a 20 20  -(prefix!=0);.  
37c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37d0: 69 66 28 20 70 72 65 63 69 73 69 6f 6e 3c 65 74  if( precision<et
37e0: 42 55 46 53 49 5a 45 2d 31 30 20 29 7b 0a 20 20  BUFSIZE-10 ){.  
37f0: 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 65          nOut = e
3800: 74 42 55 46 53 49 5a 45 3b 0a 20 20 20 20 20 20  tBUFSIZE;.      
3810: 20 20 20 20 7a 4f 75 74 20 3d 20 62 75 66 3b 0a      zOut = buf;.
3820: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
3830: 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20           nOut = 
3840: 70 72 65 63 69 73 69 6f 6e 20 2b 20 31 30 3b 0a  precision + 10;.
3850: 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 20 3d            zOut =
3860: 20 7a 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65   zExtra = sqlite
3870: 33 4d 61 6c 6c 6f 63 28 20 6e 4f 75 74 20 29 3b  3Malloc( nOut );
3880: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
3890: 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Out==0 ){.      
38a0: 20 20 20 20 20 20 73 65 74 53 74 72 41 63 63 75        setStrAccu
38b0: 6d 45 72 72 6f 72 28 70 41 63 63 75 6d 2c 20 53  mError(pAccum, S
38c0: 54 52 41 43 43 55 4d 5f 4e 4f 4d 45 4d 29 3b 0a  TRACCUM_NOMEM);.
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
38e0: 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rn;.          }.
38f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3900: 20 20 62 75 66 70 74 20 3d 20 26 7a 4f 75 74 5b    bufpt = &zOut[
3910: 6e 4f 75 74 2d 31 5d 3b 0a 20 20 20 20 20 20 20  nOut-1];.       
3920: 20 69 66 28 20 78 74 79 70 65 3d 3d 65 74 4f 52   if( xtype==etOR
3930: 44 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  DINAL ){.       
3940: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
3950: 63 68 61 72 20 7a 4f 72 64 5b 5d 20 3d 20 22 74  char zOrd[] = "t
3960: 68 73 74 6e 64 72 64 22 3b 0a 20 20 20 20 20 20  hstndrd";.      
3970: 20 20 20 20 69 6e 74 20 78 20 3d 20 28 69 6e 74      int x = (int
3980: 29 28 6c 6f 6e 67 76 61 6c 75 65 20 25 20 31 30  )(longvalue % 10
3990: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
39a0: 20 78 3e 3d 34 20 7c 7c 20 28 6c 6f 6e 67 76 61   x>=4 || (longva
39b0: 6c 75 65 2f 31 30 29 25 31 30 3d 3d 31 20 29 7b  lue/10)%10==1 ){
39c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 20 3d  .            x =
39d0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
39e0: 20 20 20 20 20 20 20 20 20 20 2a 28 2d 2d 62 75            *(--bu
39f0: 66 70 74 29 20 3d 20 7a 4f 72 64 5b 78 2a 32 2b  fpt) = zOrd[x*2+
3a00: 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28  1];.          *(
3a10: 2d 2d 62 75 66 70 74 29 20 3d 20 7a 4f 72 64 5b  --bufpt) = zOrd[
3a20: 78 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  x*2];.        }.
3a30: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
3a40: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
3a50: 63 73 65 74 20 3d 20 26 61 44 69 67 69 74 73 5b  cset = &aDigits[
3a60: 69 6e 66 6f 70 2d 3e 63 68 61 72 73 65 74 5d 3b  infop->charset];
3a70: 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 62 61  .          u8 ba
3a80: 73 65 20 3d 20 69 6e 66 6f 70 2d 3e 62 61 73 65  se = infop->base
3a90: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 7b 20  ;.          do{ 
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
3ad0: 76 65 72 74 20 74 6f 20 61 73 63 69 69 20 2a 2f  vert to ascii */
3ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 2d  .            *(-
3af0: 2d 62 75 66 70 74 29 20 3d 20 63 73 65 74 5b 6c  -bufpt) = cset[l
3b00: 6f 6e 67 76 61 6c 75 65 25 62 61 73 65 5d 3b 0a  ongvalue%base];.
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 6e 67              long
3b20: 76 61 6c 75 65 20 3d 20 6c 6f 6e 67 76 61 6c 75  value = longvalu
3b30: 65 2f 62 61 73 65 3b 0a 20 20 20 20 20 20 20 20  e/base;.        
3b40: 20 20 7d 77 68 69 6c 65 28 20 6c 6f 6e 67 76 61    }while( longva
3b50: 6c 75 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  lue>0 );.       
3b60: 20 7d 0a 20 20 20 20 20 20 20 20 6c 65 6e 67 74   }.        lengt
3b70: 68 20 3d 20 28 69 6e 74 29 28 26 7a 4f 75 74 5b  h = (int)(&zOut[
3b80: 6e 4f 75 74 2d 31 5d 2d 62 75 66 70 74 29 3b 0a  nOut-1]-bufpt);.
3b90: 20 20 20 20 20 20 20 20 66 6f 72 28 69 64 78 3d          for(idx=
3ba0: 70 72 65 63 69 73 69 6f 6e 2d 6c 65 6e 67 74 68  precision-length
3bb0: 3b 20 69 64 78 3e 30 3b 20 69 64 78 2d 2d 29 7b  ; idx>0; idx--){
3bc0: 0a 20 20 20 20 20 20 20 20 20 20 2a 28 2d 2d 62  .          *(--b
3bd0: 75 66 70 74 29 20 3d 20 27 30 27 3b 20 20 20 20  ufpt) = '0';    
3be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f           /* Zero
3c00: 20 70 61 64 20 2a 2f 0a 20 20 20 20 20 20 20 20   pad */.        
3c10: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 72  }.        if( pr
3c20: 65 66 69 78 20 29 20 2a 28 2d 2d 62 75 66 70 74  efix ) *(--bufpt
3c30: 29 20 3d 20 70 72 65 66 69 78 3b 20 20 20 20 20  ) = prefix;     
3c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
3c50: 20 73 69 67 6e 20 2a 2f 0a 20 20 20 20 20 20 20   sign */.       
3c60: 20 69 66 28 20 66 6c 61 67 5f 61 6c 74 65 72 6e   if( flag_altern
3c70: 61 74 65 66 6f 72 6d 20 26 26 20 69 6e 66 6f 70  ateform && infop
3c80: 2d 3e 70 72 65 66 69 78 20 29 7b 20 20 20 20 20  ->prefix ){     
3c90: 20 2f 2a 20 41 64 64 20 22 30 22 20 6f 72 20 22   /* Add "0" or "
3ca0: 30 78 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  0x" */.         
3cb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 65   const char *pre
3cc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
3cd0: 20 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72   x;.          pr
3ce0: 65 20 3d 20 26 61 50 72 65 66 69 78 5b 69 6e 66  e = &aPrefix[inf
3cf0: 6f 70 2d 3e 70 72 65 66 69 78 5d 3b 0a 20 20 20  op->prefix];.   
3d00: 20 20 20 20 20 20 20 66 6f 72 28 3b 20 28 78 3d         for(; (x=
3d10: 28 2a 70 72 65 29 29 21 3d 30 3b 20 70 72 65 2b  (*pre))!=0; pre+
3d20: 2b 29 20 2a 28 2d 2d 62 75 66 70 74 29 20 3d 20  +) *(--bufpt) = 
3d30: 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  x;.        }.   
3d40: 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 28 69       length = (i
3d50: 6e 74 29 28 26 7a 4f 75 74 5b 6e 4f 75 74 2d 31  nt)(&zOut[nOut-1
3d60: 5d 2d 62 75 66 70 74 29 3b 0a 20 20 20 20 20 20  ]-bufpt);.      
3d70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
3d80: 61 73 65 20 65 74 46 4c 4f 41 54 3a 0a 20 20 20  ase etFLOAT:.   
3d90: 20 20 20 63 61 73 65 20 65 74 45 58 50 3a 0a 20     case etEXP:. 
3da0: 20 20 20 20 20 63 61 73 65 20 65 74 47 45 4e 45       case etGENE
3db0: 52 49 43 3a 0a 20 20 20 20 20 20 20 20 69 66 28  RIC:.        if(
3dc0: 20 62 41 72 67 4c 69 73 74 20 29 7b 0a 20 20 20   bArgList ){.   
3dd0: 20 20 20 20 20 20 20 72 65 61 6c 76 61 6c 75 65         realvalue
3de0: 20 3d 20 67 65 74 44 6f 75 62 6c 65 41 72 67 28   = getDoubleArg(
3df0: 70 41 72 67 4c 69 73 74 29 3b 0a 20 20 20 20 20  pArgList);.     
3e00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3e10: 20 20 20 20 72 65 61 6c 76 61 6c 75 65 20 3d 20      realvalue = 
3e20: 76 61 5f 61 72 67 28 61 70 2c 64 6f 75 62 6c 65  va_arg(ap,double
3e30: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66  );.        }.#if
3e40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3e50: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
3e60: 20 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20         length = 
3e70: 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  0;.#else.       
3e80: 20 69 66 28 20 70 72 65 63 69 73 69 6f 6e 3c 30   if( precision<0
3e90: 20 29 20 70 72 65 63 69 73 69 6f 6e 20 3d 20 36   ) precision = 6
3ea0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
3eb0: 20 64 65 66 61 75 6c 74 20 70 72 65 63 69 73 69   default precisi
3ec0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  on */.        if
3ed0: 28 20 72 65 61 6c 76 61 6c 75 65 3c 30 2e 30 20  ( realvalue<0.0 
3ee0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 61  ){.          rea
3ef0: 6c 76 61 6c 75 65 20 3d 20 2d 72 65 61 6c 76 61  lvalue = -realva
3f00: 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  lue;.          p
3f10: 72 65 66 69 78 20 3d 20 27 2d 27 3b 0a 20 20 20  refix = '-';.   
3f20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3f30: 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 5f 70        if( flag_p
3f40: 6c 75 73 73 69 67 6e 20 29 20 20 20 20 20 20 20  lussign )       
3f50: 20 20 20 70 72 65 66 69 78 20 3d 20 27 2b 27 3b     prefix = '+';
3f60: 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20  .          else 
3f70: 69 66 28 20 66 6c 61 67 5f 62 6c 61 6e 6b 73 69  if( flag_blanksi
3f80: 67 6e 20 29 20 20 20 20 70 72 65 66 69 78 20 3d  gn )    prefix =
3f90: 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 20 20   ' ';.          
3fa0: 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65               pre
3fc0: 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  fix = 0;.       
3fd0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 78   }.        if( x
3fe0: 74 79 70 65 3d 3d 65 74 47 45 4e 45 52 49 43 20  type==etGENERIC 
3ff0: 26 26 20 70 72 65 63 69 73 69 6f 6e 3e 30 20 29  && precision>0 )
4000: 20 70 72 65 63 69 73 69 6f 6e 2d 2d 3b 0a 20 20   precision--;.  
4010: 20 20 20 20 20 20 66 6f 72 28 69 64 78 3d 70 72        for(idx=pr
4020: 65 63 69 73 69 6f 6e 2c 20 72 6f 75 6e 64 65 72  ecision, rounder
4030: 3d 30 2e 35 3b 20 69 64 78 3e 30 3b 20 69 64 78  =0.5; idx>0; idx
4040: 2d 2d 2c 20 72 6f 75 6e 64 65 72 2a 3d 30 2e 31  --, rounder*=0.1
4050: 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ){}.        if( 
4060: 78 74 79 70 65 3d 3d 65 74 46 4c 4f 41 54 20 29  xtype==etFLOAT )
4070: 20 72 65 61 6c 76 61 6c 75 65 20 2b 3d 20 72 6f   realvalue += ro
4080: 75 6e 64 65 72 3b 0a 20 20 20 20 20 20 20 20 2f  under;.        /
4090: 2a 20 4e 6f 72 6d 61 6c 69 7a 65 20 72 65 61 6c  * Normalize real
40a0: 76 61 6c 75 65 20 74 6f 20 77 69 74 68 69 6e 20  value to within 
40b0: 31 30 2e 30 20 3e 20 72 65 61 6c 76 61 6c 75 65  10.0 > realvalue
40c0: 20 3e 3d 20 31 2e 30 20 2a 2f 0a 20 20 20 20 20   >= 1.0 */.     
40d0: 20 20 20 65 78 70 20 3d 20 30 3b 0a 20 20 20 20     exp = 0;.    
40e0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
40f0: 73 4e 61 4e 28 28 64 6f 75 62 6c 65 29 72 65 61  sNaN((double)rea
4100: 6c 76 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 20  lvalue) ){.     
4110: 20 20 20 20 20 62 75 66 70 74 20 3d 20 22 4e 61       bufpt = "Na
4120: 4e 22 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 65  N";.          le
4130: 6e 67 74 68 20 3d 20 33 3b 0a 20 20 20 20 20 20  ngth = 3;.      
4140: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4150: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
4160: 20 72 65 61 6c 76 61 6c 75 65 3e 30 2e 30 20 29   realvalue>0.0 )
4170: 7b 0a 20 20 20 20 20 20 20 20 20 20 4c 4f 4e 47  {.          LONG
4180: 44 4f 55 42 4c 45 5f 54 59 50 45 20 73 63 61 6c  DOUBLE_TYPE scal
4190: 65 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 20  e = 1.0;.       
41a0: 20 20 20 77 68 69 6c 65 28 20 72 65 61 6c 76 61     while( realva
41b0: 6c 75 65 3e 3d 31 65 31 30 30 2a 73 63 61 6c 65  lue>=1e100*scale
41c0: 20 26 26 20 65 78 70 3c 3d 33 35 30 20 29 7b 20   && exp<=350 ){ 
41d0: 73 63 61 6c 65 20 2a 3d 20 31 65 31 30 30 3b 65  scale *= 1e100;e
41e0: 78 70 2b 3d 31 30 30 3b 7d 0a 20 20 20 20 20 20  xp+=100;}.      
41f0: 20 20 20 20 77 68 69 6c 65 28 20 72 65 61 6c 76      while( realv
4200: 61 6c 75 65 3e 3d 31 65 36 34 2a 73 63 61 6c 65  alue>=1e64*scale
4210: 20 26 26 20 65 78 70 3c 3d 33 35 30 20 29 7b 20   && exp<=350 ){ 
4220: 73 63 61 6c 65 20 2a 3d 20 31 65 36 34 3b 20 65  scale *= 1e64; e
4230: 78 70 2b 3d 36 34 3b 20 7d 0a 20 20 20 20 20 20  xp+=64; }.      
4240: 20 20 20 20 77 68 69 6c 65 28 20 72 65 61 6c 76      while( realv
4250: 61 6c 75 65 3e 3d 31 65 38 2a 73 63 61 6c 65 20  alue>=1e8*scale 
4260: 26 26 20 65 78 70 3c 3d 33 35 30 20 29 7b 20 73  && exp<=350 ){ s
4270: 63 61 6c 65 20 2a 3d 20 31 65 38 3b 20 65 78 70  cale *= 1e8; exp
4280: 2b 3d 38 3b 20 7d 0a 20 20 20 20 20 20 20 20 20  +=8; }.         
4290: 20 77 68 69 6c 65 28 20 72 65 61 6c 76 61 6c 75   while( realvalu
42a0: 65 3e 3d 31 30 2e 30 2a 73 63 61 6c 65 20 26 26  e>=10.0*scale &&
42b0: 20 65 78 70 3c 3d 33 35 30 20 29 7b 20 73 63 61   exp<=350 ){ sca
42c0: 6c 65 20 2a 3d 20 31 30 2e 30 3b 20 65 78 70 2b  le *= 10.0; exp+
42d0: 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72  +; }.          r
42e0: 65 61 6c 76 61 6c 75 65 20 2f 3d 20 73 63 61 6c  ealvalue /= scal
42f0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  e;.          whi
4300: 6c 65 28 20 72 65 61 6c 76 61 6c 75 65 3c 31 65  le( realvalue<1e
4310: 2d 38 20 29 7b 20 72 65 61 6c 76 61 6c 75 65 20  -8 ){ realvalue 
4320: 2a 3d 20 31 65 38 3b 20 65 78 70 2d 3d 38 3b 20  *= 1e8; exp-=8; 
4330: 7d 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  }.          whil
4340: 65 28 20 72 65 61 6c 76 61 6c 75 65 3c 31 2e 30  e( realvalue<1.0
4350: 20 29 7b 20 72 65 61 6c 76 61 6c 75 65 20 2a 3d   ){ realvalue *=
4360: 20 31 30 2e 30 3b 20 65 78 70 2d 2d 3b 20 7d 0a   10.0; exp--; }.
4370: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 78            if( ex
4380: 70 3e 33 35 30 20 29 7b 0a 20 20 20 20 20 20 20  p>350 ){.       
4390: 20 20 20 20 20 69 66 28 20 70 72 65 66 69 78 3d       if( prefix=
43a0: 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
43b0: 20 20 20 20 20 20 62 75 66 70 74 20 3d 20 22 2d        bufpt = "-
43c0: 49 6e 66 22 3b 0a 20 20 20 20 20 20 20 20 20 20  Inf";.          
43d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 72 65 66    }else if( pref
43e0: 69 78 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20 20  ix=='+' ){.     
43f0: 20 20 20 20 20 20 20 20 20 62 75 66 70 74 20 3d           bufpt =
4400: 20 22 2b 49 6e 66 22 3b 0a 20 20 20 20 20 20 20   "+Inf";.       
4410: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4420: 20 20 20 20 20 20 20 20 20 20 62 75 66 70 74 20            bufpt 
4430: 3d 20 22 49 6e 66 22 3b 0a 20 20 20 20 20 20 20  = "Inf";.       
4440: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4450: 20 20 20 6c 65 6e 67 74 68 20 3d 20 73 71 6c 69     length = sqli
4460: 74 65 33 53 74 72 6c 65 6e 33 30 28 62 75 66 70  te3Strlen30(bufp
4470: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
4480: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
4490: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
44a0: 20 20 20 20 20 62 75 66 70 74 20 3d 20 62 75 66       bufpt = buf
44b0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20 20 20  ;.        /*.   
44c0: 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 66       ** If the f
44d0: 69 65 6c 64 20 74 79 70 65 20 69 73 20 65 74 47  ield type is etG
44e0: 45 4e 45 52 49 43 2c 20 74 68 65 6e 20 63 6f 6e  ENERIC, then con
44f0: 76 65 72 74 20 74 6f 20 65 69 74 68 65 72 20 65  vert to either e
4500: 74 45 58 50 0a 20 20 20 20 20 20 20 20 2a 2a 20  tEXP.        ** 
4510: 6f 72 20 65 74 46 4c 4f 41 54 2c 20 61 73 20 61  or etFLOAT, as a
4520: 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 20 20  ppropriate..    
4530: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
4540: 66 28 20 78 74 79 70 65 21 3d 65 74 46 4c 4f 41  f( xtype!=etFLOA
4550: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  T ){.          r
4560: 65 61 6c 76 61 6c 75 65 20 2b 3d 20 72 6f 75 6e  ealvalue += roun
4570: 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69  der;.          i
4580: 66 28 20 72 65 61 6c 76 61 6c 75 65 3e 3d 31 30  f( realvalue>=10
4590: 2e 30 20 29 7b 20 72 65 61 6c 76 61 6c 75 65 20  .0 ){ realvalue 
45a0: 2a 3d 20 30 2e 31 3b 20 65 78 70 2b 2b 3b 20 7d  *= 0.1; exp++; }
45b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
45c0: 20 20 20 69 66 28 20 78 74 79 70 65 3d 3d 65 74     if( xtype==et
45d0: 47 45 4e 45 52 49 43 20 29 7b 0a 20 20 20 20 20  GENERIC ){.     
45e0: 20 20 20 20 20 66 6c 61 67 5f 72 74 7a 20 3d 20       flag_rtz = 
45f0: 21 66 6c 61 67 5f 61 6c 74 65 72 6e 61 74 65 66  !flag_alternatef
4600: 6f 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  orm;.          i
4610: 66 28 20 65 78 70 3c 2d 34 20 7c 7c 20 65 78 70  f( exp<-4 || exp
4620: 3e 70 72 65 63 69 73 69 6f 6e 20 29 7b 0a 20 20  >precision ){.  
4630: 20 20 20 20 20 20 20 20 20 20 78 74 79 70 65 20            xtype 
4640: 3d 20 65 74 45 58 50 3b 0a 20 20 20 20 20 20 20  = etEXP;.       
4650: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4660: 20 20 20 20 20 20 70 72 65 63 69 73 69 6f 6e 20        precision 
4670: 3d 20 70 72 65 63 69 73 69 6f 6e 20 2d 20 65 78  = precision - ex
4680: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 78  p;.            x
4690: 74 79 70 65 20 3d 20 65 74 46 4c 4f 41 54 3b 0a  type = etFLOAT;.
46a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
46b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
46c0: 20 20 20 20 20 66 6c 61 67 5f 72 74 7a 20 3d 20       flag_rtz = 
46d0: 66 6c 61 67 5f 61 6c 74 66 6f 72 6d 32 3b 0a 20  flag_altform2;. 
46e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
46f0: 20 69 66 28 20 78 74 79 70 65 3d 3d 65 74 45 58   if( xtype==etEX
4700: 50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65  P ){.          e
4710: 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  2 = 0;.        }
4720: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
4730: 65 32 20 3d 20 65 78 70 3b 0a 20 20 20 20 20 20  e2 = exp;.      
4740: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
4750: 4d 41 58 28 65 32 2c 30 29 2b 70 72 65 63 69 73  MAX(e2,0)+precis
4760: 69 6f 6e 2b 77 69 64 74 68 20 3e 20 65 74 42 55  ion+width > etBU
4770: 46 53 49 5a 45 20 2d 20 31 35 20 29 7b 0a 20 20  FSIZE - 15 ){.  
4780: 20 20 20 20 20 20 20 20 62 75 66 70 74 20 3d 20          bufpt = 
4790: 7a 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33  zExtra = sqlite3
47a0: 4d 61 6c 6c 6f 63 28 20 4d 41 58 28 65 32 2c 30  Malloc( MAX(e2,0
47b0: 29 2b 70 72 65 63 69 73 69 6f 6e 2b 77 69 64 74  )+precision+widt
47c0: 68 2b 31 35 20 29 3b 0a 20 20 20 20 20 20 20 20  h+15 );.        
47d0: 20 20 69 66 28 20 62 75 66 70 74 3d 3d 30 20 29    if( bufpt==0 )
47e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
47f0: 74 53 74 72 41 63 63 75 6d 45 72 72 6f 72 28 70  tStrAccumError(p
4800: 41 63 63 75 6d 2c 20 53 54 52 41 43 43 55 4d 5f  Accum, STRACCUM_
4810: 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 20 20  NOMEM);.        
4820: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
4830: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4840: 7d 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 20 3d  }.        zOut =
4850: 20 62 75 66 70 74 3b 0a 20 20 20 20 20 20 20 20   bufpt;.        
4860: 6e 73 64 20 3d 20 31 36 20 2b 20 66 6c 61 67 5f  nsd = 16 + flag_
4870: 61 6c 74 66 6f 72 6d 32 2a 31 30 3b 0a 20 20 20  altform2*10;.   
4880: 20 20 20 20 20 66 6c 61 67 5f 64 70 20 3d 20 28       flag_dp = (
4890: 70 72 65 63 69 73 69 6f 6e 3e 30 20 3f 31 3a 30  precision>0 ?1:0
48a0: 29 20 7c 20 66 6c 61 67 5f 61 6c 74 65 72 6e 61  ) | flag_alterna
48b0: 74 65 66 6f 72 6d 20 7c 20 66 6c 61 67 5f 61 6c  teform | flag_al
48c0: 74 66 6f 72 6d 32 3b 0a 20 20 20 20 20 20 20 20  tform2;.        
48d0: 2f 2a 20 54 68 65 20 73 69 67 6e 20 69 6e 20 66  /* The sign in f
48e0: 72 6f 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ront of the numb
48f0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  er */.        if
4900: 28 20 70 72 65 66 69 78 20 29 7b 0a 20 20 20 20  ( prefix ){.    
4910: 20 20 20 20 20 20 2a 28 62 75 66 70 74 2b 2b 29        *(bufpt++)
4920: 20 3d 20 70 72 65 66 69 78 3b 0a 20 20 20 20 20   = prefix;.     
4930: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
4940: 44 69 67 69 74 73 20 70 72 69 6f 72 20 74 6f 20  Digits prior to 
4950: 74 68 65 20 64 65 63 69 6d 61 6c 20 70 6f 69 6e  the decimal poin
4960: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  t */.        if(
4970: 20 65 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 20   e2<0 ){.       
4980: 20 20 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20     *(bufpt++) = 
4990: 27 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  '0';.        }el
49a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  se{.          fo
49b0: 72 28 3b 20 65 32 3e 3d 30 3b 20 65 32 2d 2d 29  r(; e2>=0; e2--)
49c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 28  {.            *(
49d0: 62 75 66 70 74 2b 2b 29 20 3d 20 65 74 5f 67 65  bufpt++) = et_ge
49e0: 74 64 69 67 69 74 28 26 72 65 61 6c 76 61 6c 75  tdigit(&realvalu
49f0: 65 2c 26 6e 73 64 29 3b 0a 20 20 20 20 20 20 20  e,&nsd);.       
4a00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
4a10: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 65         /* The de
4a20: 63 69 6d 61 6c 20 70 6f 69 6e 74 20 2a 2f 0a 20  cimal point */. 
4a30: 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 5f         if( flag_
4a40: 64 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  dp ){.          
4a50: 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20 27 2e 27  *(bufpt++) = '.'
4a60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4a70: 20 20 20 20 2f 2a 20 22 30 22 20 64 69 67 69 74      /* "0" digit
4a80: 73 20 61 66 74 65 72 20 74 68 65 20 64 65 63 69  s after the deci
4a90: 6d 61 6c 20 70 6f 69 6e 74 20 62 75 74 20 62 65  mal point but be
4aa0: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 20  fore the first. 
4ab0: 20 20 20 20 20 20 20 2a 2a 20 73 69 67 6e 69 66         ** signif
4ac0: 69 63 61 6e 74 20 64 69 67 69 74 20 6f 66 20 74  icant digit of t
4ad0: 68 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  he number */.   
4ae0: 20 20 20 20 20 66 6f 72 28 65 32 2b 2b 3b 20 65       for(e2++; e
4af0: 32 3c 30 3b 20 70 72 65 63 69 73 69 6f 6e 2d 2d  2<0; precision--
4b00: 2c 20 65 32 2b 2b 29 7b 0a 20 20 20 20 20 20 20  , e2++){.       
4b10: 20 20 20 61 73 73 65 72 74 28 20 70 72 65 63 69     assert( preci
4b20: 73 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20  sion>0 );.      
4b30: 20 20 20 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d      *(bufpt++) =
4b40: 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a   '0';.        }.
4b50: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 67 6e 69          /* Signi
4b60: 66 69 63 61 6e 74 20 64 69 67 69 74 73 20 61 66  ficant digits af
4b70: 74 65 72 20 74 68 65 20 64 65 63 69 6d 61 6c 20  ter the decimal 
4b80: 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  point */.       
4b90: 20 77 68 69 6c 65 28 20 28 70 72 65 63 69 73 69   while( (precisi
4ba0: 6f 6e 2d 2d 29 3e 30 20 29 7b 0a 20 20 20 20 20  on--)>0 ){.     
4bb0: 20 20 20 20 20 2a 28 62 75 66 70 74 2b 2b 29 20       *(bufpt++) 
4bc0: 3d 20 65 74 5f 67 65 74 64 69 67 69 74 28 26 72  = et_getdigit(&r
4bd0: 65 61 6c 76 61 6c 75 65 2c 26 6e 73 64 29 3b 0a  ealvalue,&nsd);.
4be0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4bf0: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 72 61 69    /* Remove trai
4c00: 6c 69 6e 67 20 7a 65 72 6f 73 20 61 6e 64 20 74  ling zeros and t
4c10: 68 65 20 22 2e 22 20 69 66 20 6e 6f 20 64 69 67  he "." if no dig
4c20: 69 74 73 20 66 6f 6c 6c 6f 77 20 74 68 65 20 22  its follow the "
4c30: 2e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ." */.        if
4c40: 28 20 66 6c 61 67 5f 72 74 7a 20 26 26 20 66 6c  ( flag_rtz && fl
4c50: 61 67 5f 64 70 20 29 7b 0a 20 20 20 20 20 20 20  ag_dp ){.       
4c60: 20 20 20 77 68 69 6c 65 28 20 62 75 66 70 74 5b     while( bufpt[
4c70: 2d 31 5d 3d 3d 27 30 27 20 29 20 2a 28 2d 2d 62  -1]=='0' ) *(--b
4c80: 75 66 70 74 29 20 3d 20 30 3b 0a 20 20 20 20 20  ufpt) = 0;.     
4c90: 20 20 20 20 20 61 73 73 65 72 74 28 20 62 75 66       assert( buf
4ca0: 70 74 3e 7a 4f 75 74 20 29 3b 0a 20 20 20 20 20  pt>zOut );.     
4cb0: 20 20 20 20 20 69 66 28 20 62 75 66 70 74 5b 2d       if( bufpt[-
4cc0: 31 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20  1]=='.' ){.     
4cd0: 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 5f         if( flag_
4ce0: 61 6c 74 66 6f 72 6d 32 20 29 7b 0a 20 20 20 20  altform2 ){.    
4cf0: 20 20 20 20 20 20 20 20 20 20 2a 28 62 75 66 70            *(bufp
4d00: 74 2b 2b 29 20 3d 20 27 30 27 3b 0a 20 20 20 20  t++) = '0';.    
4d10: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 2d               *(-
4d30: 2d 62 75 66 70 74 29 20 3d 20 30 3b 0a 20 20 20  -bufpt) = 0;.   
4d40: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4d50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
4d60: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20  .        /* Add 
4d70: 74 68 65 20 22 65 4e 4e 4e 22 20 73 75 66 66 69  the "eNNN" suffi
4d80: 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  x */.        if(
4d90: 20 78 74 79 70 65 3d 3d 65 74 45 58 50 20 29 7b   xtype==etEXP ){
4da0: 0a 20 20 20 20 20 20 20 20 20 20 2a 28 62 75 66  .          *(buf
4db0: 70 74 2b 2b 29 20 3d 20 61 44 69 67 69 74 73 5b  pt++) = aDigits[
4dc0: 69 6e 66 6f 70 2d 3e 63 68 61 72 73 65 74 5d 3b  infop->charset];
4dd0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
4de0: 78 70 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  xp<0 ){.        
4df0: 20 20 20 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d      *(bufpt++) =
4e00: 20 27 2d 27 3b 20 65 78 70 20 3d 20 2d 65 78 70   '-'; exp = -exp
4e10: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
4e20: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e{.            *
4e30: 28 62 75 66 70 74 2b 2b 29 20 3d 20 27 2b 27 3b  (bufpt++) = '+';
4e40: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4e50: 20 20 20 20 20 20 20 69 66 28 20 65 78 70 3e 3d         if( exp>=
4e60: 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  100 ){.         
4e70: 20 20 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20     *(bufpt++) = 
4e80: 28 63 68 61 72 29 28 28 65 78 70 2f 31 30 30 29  (char)((exp/100)
4e90: 2b 27 30 27 29 3b 20 20 20 20 20 20 20 20 2f 2a  +'0');        /*
4ea0: 20 31 30 30 27 73 20 64 69 67 69 74 20 2a 2f 0a   100's digit */.
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 20              exp 
4ec0: 25 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 20 20  %= 100;.        
4ed0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2a 28    }.          *(
4ee0: 62 75 66 70 74 2b 2b 29 20 3d 20 28 63 68 61 72  bufpt++) = (char
4ef0: 29 28 65 78 70 2f 31 30 2b 27 30 27 29 3b 20 20  )(exp/10+'0');  
4f00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 30             /* 10
4f10: 27 73 20 64 69 67 69 74 20 2a 2f 0a 20 20 20 20  's digit */.    
4f20: 20 20 20 20 20 20 2a 28 62 75 66 70 74 2b 2b 29        *(bufpt++)
4f30: 20 3d 20 28 63 68 61 72 29 28 65 78 70 25 31 30   = (char)(exp%10
4f40: 2b 27 30 27 29 3b 20 20 20 20 20 20 20 20 20 20  +'0');          
4f50: 20 20 20 2f 2a 20 31 27 73 20 64 69 67 69 74 20     /* 1's digit 
4f60: 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
4f70: 20 20 20 20 20 2a 62 75 66 70 74 20 3d 20 30 3b       *bufpt = 0;
4f80: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ..        /* The
4f90: 20 63 6f 6e 76 65 72 74 65 64 20 6e 75 6d 62 65   converted numbe
4fa0: 72 20 69 73 20 69 6e 20 62 75 66 5b 5d 20 61 6e  r is in buf[] an
4fb0: 64 20 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65  d zero terminate
4fc0: 64 2e 20 4f 75 74 70 75 74 20 69 74 2e 0a 20 20  d. Output it..  
4fd0: 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
4fe0: 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 69 73  at the number is
4ff0: 20 69 6e 20 74 68 65 20 75 73 75 61 6c 20 6f 72   in the usual or
5000: 64 65 72 2c 20 6e 6f 74 20 72 65 76 65 72 73 65  der, not reverse
5010: 64 20 61 73 20 77 69 74 68 0a 20 20 20 20 20 20  d as with.      
5020: 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 63 6f 6e    ** integer con
5030: 76 65 72 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20  versions. */.   
5040: 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 28 69       length = (i
5050: 6e 74 29 28 62 75 66 70 74 2d 7a 4f 75 74 29 3b  nt)(bufpt-zOut);
5060: 0a 20 20 20 20 20 20 20 20 62 75 66 70 74 20 3d  .        bufpt =
5070: 20 7a 4f 75 74 3b 0a 0a 20 20 20 20 20 20 20 20   zOut;..        
5080: 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
5090: 20 20 41 64 64 20 6c 65 61 64 69 6e 67 20 7a 65    Add leading ze
50a0: 72 6f 73 20 69 66 20 74 68 65 20 66 6c 61 67 5f  ros if the flag_
50b0: 7a 65 72 6f 70 61 64 20 66 6c 61 67 20 69 73 0a  zeropad flag is.
50c0: 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 61          ** set a
50d0: 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 6c 65  nd we are not le
50e0: 66 74 20 6a 75 73 74 69 66 69 65 64 20 2a 2f 0a  ft justified */.
50f0: 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67          if( flag
5100: 5f 7a 65 72 6f 70 61 64 20 26 26 20 21 66 6c 61  _zeropad && !fla
5110: 67 5f 6c 65 66 74 6a 75 73 74 69 66 79 20 26 26  g_leftjustify &&
5120: 20 6c 65 6e 67 74 68 20 3c 20 77 69 64 74 68 29   length < width)
5130: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
5140: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  i;.          int
5150: 20 6e 50 61 64 20 3d 20 77 69 64 74 68 20 2d 20   nPad = width - 
5160: 6c 65 6e 67 74 68 3b 0a 20 20 20 20 20 20 20 20  length;.        
5170: 20 20 66 6f 72 28 69 3d 77 69 64 74 68 3b 20 69    for(i=width; i
5180: 3e 3d 6e 50 61 64 3b 20 69 2d 2d 29 7b 0a 20 20  >=nPad; i--){.  
5190: 20 20 20 20 20 20 20 20 20 20 62 75 66 70 74 5b            bufpt[
51a0: 69 5d 20 3d 20 62 75 66 70 74 5b 69 2d 6e 50 61  i] = bufpt[i-nPa
51b0: 64 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  d];.          }.
51c0: 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 70 72            i = pr
51d0: 65 66 69 78 21 3d 30 3b 0a 20 20 20 20 20 20 20  efix!=0;.       
51e0: 20 20 20 77 68 69 6c 65 28 20 6e 50 61 64 2d 2d     while( nPad--
51f0: 20 29 20 62 75 66 70 74 5b 69 2b 2b 5d 20 3d 20   ) bufpt[i++] = 
5200: 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 6c  '0';.          l
5210: 65 6e 67 74 68 20 3d 20 77 69 64 74 68 3b 0a 20  ength = width;. 
5220: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20         }.#endif 
5230: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
5240: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
5250: 5f 50 4f 49 4e 54 29 20 2a 2f 0a 20 20 20 20 20  _POINT) */.     
5260: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5270: 63 61 73 65 20 65 74 53 49 5a 45 3a 0a 20 20 20  case etSIZE:.   
5280: 20 20 20 20 20 69 66 28 20 21 62 41 72 67 4c 69       if( !bArgLi
5290: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
52a0: 2a 28 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 2a  *(va_arg(ap,int*
52b0: 29 29 20 3d 20 70 41 63 63 75 6d 2d 3e 6e 43 68  )) = pAccum->nCh
52c0: 61 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ar;.        }.  
52d0: 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 77        length = w
52e0: 69 64 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  idth = 0;.      
52f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
5300: 61 73 65 20 65 74 50 45 52 43 45 4e 54 3a 0a 20  ase etPERCENT:. 
5310: 20 20 20 20 20 20 20 62 75 66 5b 30 5d 20 3d 20         buf[0] = 
5320: 27 25 27 3b 0a 20 20 20 20 20 20 20 20 62 75 66  '%';.        buf
5330: 70 74 20 3d 20 62 75 66 3b 0a 20 20 20 20 20 20  pt = buf;.      
5340: 20 20 6c 65 6e 67 74 68 20 3d 20 31 3b 0a 20 20    length = 1;.  
5350: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5360: 20 20 20 63 61 73 65 20 65 74 43 48 41 52 58 3a     case etCHARX:
5370: 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 41 72  .        if( bAr
5380: 67 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  gList ){.       
5390: 20 20 20 62 75 66 70 74 20 3d 20 67 65 74 54 65     bufpt = getTe
53a0: 78 74 41 72 67 28 70 41 72 67 4c 69 73 74 29 3b  xtArg(pArgList);
53b0: 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 62  .          c = b
53c0: 75 66 70 74 20 3f 20 62 75 66 70 74 5b 30 5d 20  ufpt ? bufpt[0] 
53d0: 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  : 0;.        }el
53e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20  se{.          c 
53f0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
5400: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5410: 20 20 20 20 62 75 66 5b 30 5d 20 3d 20 28 63 68      buf[0] = (ch
5420: 61 72 29 63 3b 0a 20 20 20 20 20 20 20 20 69 66  ar)c;.        if
5430: 28 20 70 72 65 63 69 73 69 6f 6e 3e 3d 30 20 29  ( precision>=0 )
5440: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
5450: 69 64 78 3d 31 3b 20 69 64 78 3c 70 72 65 63 69  idx=1; idx<preci
5460: 73 69 6f 6e 3b 20 69 64 78 2b 2b 29 20 62 75 66  sion; idx++) buf
5470: 5b 69 64 78 5d 20 3d 20 28 63 68 61 72 29 63 3b  [idx] = (char)c;
5480: 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e 67 74  .          lengt
5490: 68 20 3d 20 70 72 65 63 69 73 69 6f 6e 3b 0a 20  h = precision;. 
54a0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
54b0: 20 20 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d          length =
54c0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
54d0: 20 20 20 20 20 62 75 66 70 74 20 3d 20 62 75 66       bufpt = buf
54e0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
54f0: 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 53 54  .      case etST
5500: 52 49 4e 47 3a 0a 20 20 20 20 20 20 63 61 73 65  RING:.      case
5510: 20 65 74 44 59 4e 53 54 52 49 4e 47 3a 0a 20 20   etDYNSTRING:.  
5520: 20 20 20 20 20 20 69 66 28 20 62 41 72 67 4c 69        if( bArgLi
5530: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
5540: 62 75 66 70 74 20 3d 20 67 65 74 54 65 78 74 41  bufpt = getTextA
5550: 72 67 28 70 41 72 67 4c 69 73 74 29 3b 0a 20 20  rg(pArgList);.  
5560: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5570: 20 20 20 20 20 20 20 62 75 66 70 74 20 3d 20 76         bufpt = v
5580: 61 5f 61 72 67 28 61 70 2c 63 68 61 72 2a 29 3b  a_arg(ap,char*);
5590: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
55a0: 20 20 20 69 66 28 20 62 75 66 70 74 3d 3d 30 20     if( bufpt==0 
55b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 75 66  ){.          buf
55c0: 70 74 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20  pt = "";.       
55d0: 20 7d 65 6c 73 65 20 69 66 28 20 78 74 79 70 65   }else if( xtype
55e0: 3d 3d 65 74 44 59 4e 53 54 52 49 4e 47 20 26 26  ==etDYNSTRING &&
55f0: 20 21 62 41 72 67 4c 69 73 74 20 29 7b 0a 20 20   !bArgList ){.  
5600: 20 20 20 20 20 20 20 20 7a 45 78 74 72 61 20 3d          zExtra =
5610: 20 62 75 66 70 74 3b 0a 20 20 20 20 20 20 20 20   bufpt;.        
5620: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 72  }.        if( pr
5630: 65 63 69 73 69 6f 6e 3e 3d 30 20 29 7b 0a 20 20  ecision>=0 ){.  
5640: 20 20 20 20 20 20 20 20 66 6f 72 28 6c 65 6e 67          for(leng
5650: 74 68 3d 30 3b 20 6c 65 6e 67 74 68 3c 70 72 65  th=0; length<pre
5660: 63 69 73 69 6f 6e 20 26 26 20 62 75 66 70 74 5b  cision && bufpt[
5670: 6c 65 6e 67 74 68 5d 3b 20 6c 65 6e 67 74 68 2b  length]; length+
5680: 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c  +){}.        }el
5690: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65  se{.          le
56a0: 6e 67 74 68 20 3d 20 73 71 6c 69 74 65 33 53 74  ngth = sqlite3St
56b0: 72 6c 65 6e 33 30 28 62 75 66 70 74 29 3b 0a 20  rlen30(bufpt);. 
56c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
56d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
56e0: 73 65 20 65 74 53 51 4c 45 53 43 41 50 45 3a 0a  se etSQLESCAPE:.
56f0: 20 20 20 20 20 20 63 61 73 65 20 65 74 53 51 4c        case etSQL
5700: 45 53 43 41 50 45 32 3a 0a 20 20 20 20 20 20 63  ESCAPE2:.      c
5710: 61 73 65 20 65 74 53 51 4c 45 53 43 41 50 45 33  ase etSQLESCAPE3
5720: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  : {.        int 
5730: 69 2c 20 6a 2c 20 6b 2c 20 6e 2c 20 69 73 6e 75  i, j, k, n, isnu
5740: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ll;.        int 
5750: 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 20 20 20  needQuote;.     
5760: 20 20 20 63 68 61 72 20 63 68 3b 0a 20 20 20 20     char ch;.    
5770: 20 20 20 20 63 68 61 72 20 71 20 3d 20 28 28 78      char q = ((x
5780: 74 79 70 65 3d 3d 65 74 53 51 4c 45 53 43 41 50  type==etSQLESCAP
5790: 45 33 29 3f 27 22 27 3a 27 5c 27 27 29 3b 20 20  E3)?'"':'\'');  
57a0: 20 2f 2a 20 51 75 6f 74 65 20 63 68 61 72 61 63   /* Quote charac
57b0: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  ter */.        c
57c0: 68 61 72 20 2a 65 73 63 61 72 67 3b 0a 0a 20 20  har *escarg;..  
57d0: 20 20 20 20 20 20 69 66 28 20 62 41 72 67 4c 69        if( bArgLi
57e0: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
57f0: 65 73 63 61 72 67 20 3d 20 67 65 74 54 65 78 74  escarg = getText
5800: 41 72 67 28 70 41 72 67 4c 69 73 74 29 3b 0a 20  Arg(pArgList);. 
5810: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
5820: 20 20 20 20 20 20 20 20 65 73 63 61 72 67 20 3d          escarg =
5830: 20 76 61 5f 61 72 67 28 61 70 2c 63 68 61 72 2a   va_arg(ap,char*
5840: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
5850: 20 20 20 20 20 69 73 6e 75 6c 6c 20 3d 20 65 73       isnull = es
5860: 63 61 72 67 3d 3d 30 3b 0a 20 20 20 20 20 20 20  carg==0;.       
5870: 20 69 66 28 20 69 73 6e 75 6c 6c 20 29 20 65 73   if( isnull ) es
5880: 63 61 72 67 20 3d 20 28 78 74 79 70 65 3d 3d 65  carg = (xtype==e
5890: 74 53 51 4c 45 53 43 41 50 45 32 20 3f 20 22 4e  tSQLESCAPE2 ? "N
58a0: 55 4c 4c 22 20 3a 20 22 28 4e 55 4c 4c 29 22 29  ULL" : "(NULL)")
58b0: 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 70 72  ;.        k = pr
58c0: 65 63 69 73 69 6f 6e 3b 0a 20 20 20 20 20 20 20  ecision;.       
58d0: 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 6b 21 3d 30   for(i=n=0; k!=0
58e0: 20 26 26 20 28 63 68 3d 65 73 63 61 72 67 5b 69   && (ch=escarg[i
58f0: 5d 29 21 3d 30 3b 20 69 2b 2b 2c 20 6b 2d 2d 29  ])!=0; i++, k--)
5900: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
5910: 63 68 3d 3d 71 20 29 20 20 6e 2b 2b 3b 0a 20 20  ch==q )  n++;.  
5920: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5930: 6e 65 65 64 51 75 6f 74 65 20 3d 20 21 69 73 6e  needQuote = !isn
5940: 75 6c 6c 20 26 26 20 78 74 79 70 65 3d 3d 65 74  ull && xtype==et
5950: 53 51 4c 45 53 43 41 50 45 32 3b 0a 20 20 20 20  SQLESCAPE2;.    
5960: 20 20 20 20 6e 20 2b 3d 20 69 20 2b 20 31 20 2b      n += i + 1 +
5970: 20 6e 65 65 64 51 75 6f 74 65 2a 32 3b 0a 20 20   needQuote*2;.  
5980: 20 20 20 20 20 20 69 66 28 20 6e 3e 65 74 42 55        if( n>etBU
5990: 46 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  FSIZE ){.       
59a0: 20 20 20 62 75 66 70 74 20 3d 20 7a 45 78 74 72     bufpt = zExtr
59b0: 61 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  a = sqlite3Mallo
59c0: 63 28 20 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  c( n );.        
59d0: 20 20 69 66 28 20 62 75 66 70 74 3d 3d 30 20 29    if( bufpt==0 )
59e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
59f0: 74 53 74 72 41 63 63 75 6d 45 72 72 6f 72 28 70  tStrAccumError(p
5a00: 41 63 63 75 6d 2c 20 53 54 52 41 43 43 55 4d 5f  Accum, STRACCUM_
5a10: 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 20 20  NOMEM);.        
5a20: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
5a30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5a40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
5a50: 20 62 75 66 70 74 20 3d 20 62 75 66 3b 0a 20 20   bufpt = buf;.  
5a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5a70: 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  j = 0;.        i
5a80: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 62  f( needQuote ) b
5a90: 75 66 70 74 5b 6a 2b 2b 5d 20 3d 20 71 3b 0a 20  ufpt[j++] = q;. 
5aa0: 20 20 20 20 20 20 20 6b 20 3d 20 69 3b 0a 20 20         k = i;.  
5ab0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
5ac0: 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
5ad0: 20 20 20 20 62 75 66 70 74 5b 6a 2b 2b 5d 20 3d      bufpt[j++] =
5ae0: 20 63 68 20 3d 20 65 73 63 61 72 67 5b 69 5d 3b   ch = escarg[i];
5af0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
5b00: 68 3d 3d 71 20 29 20 62 75 66 70 74 5b 6a 2b 2b  h==q ) bufpt[j++
5b10: 5d 20 3d 20 63 68 3b 0a 20 20 20 20 20 20 20 20  ] = ch;.        
5b20: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  }.        if( ne
5b30: 65 64 51 75 6f 74 65 20 29 20 62 75 66 70 74 5b  edQuote ) bufpt[
5b40: 6a 2b 2b 5d 20 3d 20 71 3b 0a 20 20 20 20 20 20  j++] = q;.      
5b50: 20 20 62 75 66 70 74 5b 6a 5d 20 3d 20 30 3b 0a    bufpt[j] = 0;.
5b60: 20 20 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d          length =
5b70: 20 6a 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   j;.        /* T
5b80: 68 65 20 70 72 65 63 69 73 69 6f 6e 20 69 6e 20  he precision in 
5b90: 25 71 20 61 6e 64 20 25 51 20 6d 65 61 6e 73 20  %q and %Q means 
5ba0: 68 6f 77 20 6d 61 6e 79 20 69 6e 70 75 74 20 63  how many input c
5bb0: 68 61 72 61 63 74 65 72 73 20 74 6f 0a 20 20 20  haracters to.   
5bc0: 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 2c       ** consume,
5bd0: 20 6e 6f 74 20 74 68 65 20 6c 65 6e 67 74 68 20   not the length 
5be0: 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2e 2e 2e  of the output...
5bf0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 28 20  .        ** if( 
5c00: 70 72 65 63 69 73 69 6f 6e 3e 3d 30 20 26 26 20  precision>=0 && 
5c10: 70 72 65 63 69 73 69 6f 6e 3c 6c 65 6e 67 74 68  precision<length
5c20: 20 29 20 6c 65 6e 67 74 68 20 3d 20 70 72 65 63   ) length = prec
5c30: 69 73 69 6f 6e 3b 20 2a 2f 0a 20 20 20 20 20 20  ision; */.      
5c40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5c50: 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 54 4f  .      case etTO
5c60: 4b 45 4e 3a 20 7b 0a 20 20 20 20 20 20 20 20 54  KEN: {.        T
5c70: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 76  oken *pToken = v
5c80: 61 5f 61 72 67 28 61 70 2c 20 54 6f 6b 65 6e 2a  a_arg(ap, Token*
5c90: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
5ca0: 74 28 20 62 41 72 67 4c 69 73 74 3d 3d 30 20 29  t( bArgList==0 )
5cb0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
5cc0: 6f 6b 65 6e 20 26 26 20 70 54 6f 6b 65 6e 2d 3e  oken && pToken->
5cd0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  n ){.          s
5ce0: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
5cf0: 70 65 6e 64 28 70 41 63 63 75 6d 2c 20 28 63 6f  pend(pAccum, (co
5d00: 6e 73 74 20 63 68 61 72 2a 29 70 54 6f 6b 65 6e  nst char*)pToken
5d10: 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b  ->z, pToken->n);
5d20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5d30: 20 20 20 6c 65 6e 67 74 68 20 3d 20 77 69 64 74     length = widt
5d40: 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62  h = 0;.        b
5d50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
5d60: 20 20 20 20 63 61 73 65 20 65 74 53 52 43 4c 49      case etSRCLI
5d70: 53 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 53 72  ST: {.        Sr
5d80: 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 76 61  cList *pSrc = va
5d90: 5f 61 72 67 28 61 70 2c 20 53 72 63 4c 69 73 74  _arg(ap, SrcList
5da0: 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  *);.        int 
5db0: 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  k = va_arg(ap, i
5dc0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72  nt);.        str
5dd0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
5de0: 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d   *pItem = &pSrc-
5df0: 3e 61 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 61  >a[k];.        a
5e00: 73 73 65 72 74 28 20 62 41 72 67 4c 69 73 74 3d  ssert( bArgList=
5e10: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
5e20: 73 65 72 74 28 20 6b 3e 3d 30 20 26 26 20 6b 3c  sert( k>=0 && k<
5e30: 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  pSrc->nSrc );.  
5e40: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
5e50: 3e 7a 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20  >zDatabase ){.  
5e60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
5e70: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c  trAccumAppendAll
5e80: 28 70 41 63 63 75 6d 2c 20 70 49 74 65 6d 2d 3e  (pAccum, pItem->
5e90: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
5ea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
5eb0: 41 63 63 75 6d 41 70 70 65 6e 64 28 70 41 63 63  AccumAppend(pAcc
5ec0: 75 6d 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20 20  um, ".", 1);.   
5ed0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
5ee0: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
5ef0: 70 65 6e 64 41 6c 6c 28 70 41 63 63 75 6d 2c 20  pendAll(pAccum, 
5f00: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
5f10: 20 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20         length = 
5f20: 77 69 64 74 68 20 3d 20 30 3b 0a 20 20 20 20 20  width = 0;.     
5f30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5f40: 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  }.      default:
5f50: 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   {.        asser
5f60: 74 28 20 78 74 79 70 65 3d 3d 65 74 49 4e 56 41  t( xtype==etINVA
5f70: 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 20 20 72  LID );.        r
5f80: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
5f90: 20 20 20 7d 2f 2a 20 45 6e 64 20 73 77 69 74 63     }/* End switc
5fa0: 68 20 6f 76 65 72 20 74 68 65 20 66 6f 72 6d 61  h over the forma
5fb0: 74 20 74 79 70 65 20 2a 2f 0a 20 20 20 20 2f 2a  t type */.    /*
5fc0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 65 78 74  .    ** The text
5fd0: 20 6f 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69   of the conversi
5fe0: 6f 6e 20 69 73 20 70 6f 69 6e 74 65 64 20 74 6f  on is pointed to
5ff0: 20 62 79 20 22 62 75 66 70 74 22 20 61 6e 64 20   by "bufpt" and 
6000: 69 73 0a 20 20 20 20 2a 2a 20 22 6c 65 6e 67 74  is.    ** "lengt
6010: 68 22 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f  h" characters lo
6020: 6e 67 2e 20 20 54 68 65 20 66 69 65 6c 64 20 77  ng.  The field w
6030: 69 64 74 68 20 69 73 20 22 77 69 64 74 68 22 2e  idth is "width".
6040: 20 20 44 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20    Do.    ** the 
6050: 6f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2f 0a 20  output..    */. 
6060: 20 20 20 77 69 64 74 68 20 2d 3d 20 6c 65 6e 67     width -= leng
6070: 74 68 3b 0a 20 20 20 20 69 66 28 20 77 69 64 74  th;.    if( widt
6080: 68 3e 30 20 26 26 20 21 66 6c 61 67 5f 6c 65 66  h>0 && !flag_lef
6090: 74 6a 75 73 74 69 66 79 20 29 20 73 71 6c 69 74  tjustify ) sqlit
60a0: 65 33 41 70 70 65 6e 64 53 70 61 63 65 28 70 41  e3AppendSpace(pA
60b0: 63 63 75 6d 2c 20 77 69 64 74 68 29 3b 0a 20 20  ccum, width);.  
60c0: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
60d0: 6d 41 70 70 65 6e 64 28 70 41 63 63 75 6d 2c 20  mAppend(pAccum, 
60e0: 62 75 66 70 74 2c 20 6c 65 6e 67 74 68 29 3b 0a  bufpt, length);.
60f0: 20 20 20 20 69 66 28 20 77 69 64 74 68 3e 30 20      if( width>0 
6100: 26 26 20 66 6c 61 67 5f 6c 65 66 74 6a 75 73 74  && flag_leftjust
6110: 69 66 79 20 29 20 73 71 6c 69 74 65 33 41 70 70  ify ) sqlite3App
6120: 65 6e 64 53 70 61 63 65 28 70 41 63 63 75 6d 2c  endSpace(pAccum,
6130: 20 77 69 64 74 68 29 3b 0a 0a 20 20 20 20 69 66   width);..    if
6140: 28 20 7a 45 78 74 72 61 20 29 20 73 71 6c 69 74  ( zExtra ) sqlit
6150: 65 33 5f 66 72 65 65 28 7a 45 78 74 72 61 29 3b  e3_free(zExtra);
6160: 0a 20 20 7d 2f 2a 20 45 6e 64 20 66 6f 72 20 6c  .  }/* End for l
6170: 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 66 6f 72  oop over the for
6180: 6d 61 74 20 73 74 72 69 6e 67 20 2a 2f 0a 7d 20  mat string */.} 
6190: 2f 2a 20 45 6e 64 20 6f 66 20 66 75 6e 63 74 69  /* End of functi
61a0: 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 6e 6c  on */../*.** Enl
61b0: 61 72 67 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  arge the memory 
61c0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 6e 20 61 20  allocation on a 
61d0: 53 74 72 41 63 63 75 6d 20 6f 62 6a 65 63 74 20  StrAccum object 
61e0: 73 6f 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a  so that it is.**
61f0: 20 61 62 6c 65 20 74 6f 20 61 63 63 65 70 74 20   able to accept 
6200: 61 74 20 6c 65 61 73 74 20 4e 20 6d 6f 72 65 20  at least N more 
6210: 62 79 74 65 73 20 6f 66 20 74 65 78 74 2e 0a 2a  bytes of text..*
6220: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
6230: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
6240: 6f 66 20 74 65 78 74 20 74 68 61 74 20 53 74 72  of text that Str
6250: 41 63 63 75 6d 20 69 73 20 61 62 6c 65 20 74 6f  Accum is able to
6260: 20 61 63 63 65 70 74 0a 2a 2a 20 61 66 74 65 72   accept.** after
6270: 20 74 68 65 20 61 74 74 65 6d 70 74 65 64 20 65   the attempted e
6280: 6e 6c 61 72 67 65 6d 65 6e 74 2e 20 20 54 68 65  nlargement.  The
6290: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
62a0: 6d 69 67 68 74 20 62 65 20 7a 65 72 6f 2e 0a 2a  might be zero..*
62b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
62c0: 69 74 65 33 53 74 72 41 63 63 75 6d 45 6e 6c 61  ite3StrAccumEnla
62d0: 72 67 65 28 53 74 72 41 63 63 75 6d 20 2a 70 2c  rge(StrAccum *p,
62e0: 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68 61 72 20   int N){.  char 
62f0: 2a 7a 4e 65 77 3b 0a 20 20 61 73 73 65 72 74 28  *zNew;.  assert(
6300: 20 70 2d 3e 6e 43 68 61 72 2b 4e 20 3e 3d 20 70   p->nChar+N >= p
6310: 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 20 2f 2a 20 4f  ->nAlloc ); /* O
6320: 6e 6c 79 20 63 61 6c 6c 65 64 20 69 66 20 72 65  nly called if re
6330: 61 6c 6c 79 20 6e 65 65 64 65 64 20 2a 2f 0a 20  ally needed */. 
6340: 20 69 66 28 20 70 2d 3e 61 63 63 45 72 72 6f 72   if( p->accError
6350: 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65   ){.    testcase
6360: 28 70 2d 3e 61 63 63 45 72 72 6f 72 3d 3d 53 54  (p->accError==ST
6370: 52 41 43 43 55 4d 5f 54 4f 4f 42 49 47 29 3b 0a  RACCUM_TOOBIG);.
6380: 20 20 20 20 74 65 73 74 63 61 73 65 28 70 2d 3e      testcase(p->
6390: 61 63 63 45 72 72 6f 72 3d 3d 53 54 52 41 43 43  accError==STRACC
63a0: 55 4d 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 72  UM_NOMEM);.    r
63b0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
63c0: 66 28 20 21 70 2d 3e 75 73 65 4d 61 6c 6c 6f 63  f( !p->useMalloc
63d0: 20 29 7b 0a 20 20 20 20 4e 20 3d 20 70 2d 3e 6e   ){.    N = p->n
63e0: 41 6c 6c 6f 63 20 2d 20 70 2d 3e 6e 43 68 61 72  Alloc - p->nChar
63f0: 20 2d 20 31 3b 0a 20 20 20 20 73 65 74 53 74 72   - 1;.    setStr
6400: 41 63 63 75 6d 45 72 72 6f 72 28 70 2c 20 53 54  AccumError(p, ST
6410: 52 41 43 43 55 4d 5f 54 4f 4f 42 49 47 29 3b 0a  RACCUM_TOOBIG);.
6420: 20 20 20 20 72 65 74 75 72 6e 20 4e 3b 0a 20 20      return N;.  
6430: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
6440: 2a 7a 4f 6c 64 20 3d 20 28 70 2d 3e 7a 54 65 78  *zOld = (p->zTex
6450: 74 3d 3d 70 2d 3e 7a 42 61 73 65 20 3f 20 30 20  t==p->zBase ? 0 
6460: 3a 20 70 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20  : p->zText);.   
6470: 20 69 36 34 20 73 7a 4e 65 77 20 3d 20 70 2d 3e   i64 szNew = p->
6480: 6e 43 68 61 72 3b 0a 20 20 20 20 73 7a 4e 65 77  nChar;.    szNew
6490: 20 2b 3d 20 4e 20 2b 20 31 3b 0a 20 20 20 20 69   += N + 1;.    i
64a0: 66 28 20 73 7a 4e 65 77 20 3e 20 70 2d 3e 6d 78  f( szNew > p->mx
64b0: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 73  Alloc ){.      s
64c0: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 52 65  qlite3StrAccumRe
64d0: 73 65 74 28 70 29 3b 0a 20 20 20 20 20 20 73 65  set(p);.      se
64e0: 74 53 74 72 41 63 63 75 6d 45 72 72 6f 72 28 70  tStrAccumError(p
64f0: 2c 20 53 54 52 41 43 43 55 4d 5f 54 4f 4f 42 49  , STRACCUM_TOOBI
6500: 47 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  G);.      return
6510: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
6520: 20 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d       p->nAlloc =
6530: 20 28 69 6e 74 29 73 7a 4e 65 77 3b 0a 20 20 20   (int)szNew;.   
6540: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 73   }.    if( p->us
6550: 65 4d 61 6c 6c 6f 63 3d 3d 31 20 29 7b 0a 20 20  eMalloc==1 ){.  
6560: 20 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74      zNew = sqlit
6570: 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64  e3DbRealloc(p->d
6580: 62 2c 20 7a 4f 6c 64 2c 20 70 2d 3e 6e 41 6c 6c  b, zOld, p->nAll
6590: 6f 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  oc);.    }else{.
65a0: 20 20 20 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c        zNew = sql
65b0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 7a 4f 6c  ite3_realloc(zOl
65c0: 64 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20  d, p->nAlloc);. 
65d0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e 65     }.    if( zNe
65e0: 77 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  w ){.      asser
65f0: 74 28 20 70 2d 3e 7a 54 65 78 74 21 3d 30 20 7c  t( p->zText!=0 |
6600: 7c 20 70 2d 3e 6e 43 68 61 72 3d 3d 30 20 29 3b  | p->nChar==0 );
6610: 0a 20 20 20 20 20 20 69 66 28 20 7a 4f 6c 64 3d  .      if( zOld=
6620: 3d 30 20 26 26 20 70 2d 3e 6e 43 68 61 72 3e 30  =0 && p->nChar>0
6630: 20 29 20 6d 65 6d 63 70 79 28 7a 4e 65 77 2c 20   ) memcpy(zNew, 
6640: 70 2d 3e 7a 54 65 78 74 2c 20 70 2d 3e 6e 43 68  p->zText, p->nCh
6650: 61 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 54  ar);.      p->zT
6660: 65 78 74 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20  ext = zNew;.    
6670: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
6680: 69 74 65 33 53 74 72 41 63 63 75 6d 52 65 73 65  ite3StrAccumRese
6690: 74 28 70 29 3b 0a 20 20 20 20 20 20 73 65 74 53  t(p);.      setS
66a0: 74 72 41 63 63 75 6d 45 72 72 6f 72 28 70 2c 20  trAccumError(p, 
66b0: 53 54 52 41 43 43 55 4d 5f 4e 4f 4d 45 4d 29 3b  STRACCUM_NOMEM);
66c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
66d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
66e0: 75 72 6e 20 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn N;.}../*.** 
66f0: 41 70 70 65 6e 64 20 4e 20 73 70 61 63 65 20 63  Append N space c
6700: 68 61 72 61 63 74 65 72 73 20 74 6f 20 74 68 65  haracters to the
6710: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 62 75   given string bu
6720: 66 66 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ffer..*/.void sq
6730: 6c 69 74 65 33 41 70 70 65 6e 64 53 70 61 63 65  lite3AppendSpace
6740: 28 53 74 72 41 63 63 75 6d 20 2a 70 2c 20 69 6e  (StrAccum *p, in
6750: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e  t N){.  if( p->n
6760: 43 68 61 72 2b 4e 20 3e 3d 20 70 2d 3e 6e 41 6c  Char+N >= p->nAl
6770: 6c 6f 63 20 26 26 20 28 4e 20 3d 20 73 71 6c 69  loc && (N = sqli
6780: 74 65 33 53 74 72 41 63 63 75 6d 45 6e 6c 61 72  te3StrAccumEnlar
6790: 67 65 28 70 2c 20 4e 29 29 3c 3d 30 20 29 20 72  ge(p, N))<=0 ) r
67a0: 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20  eturn;.  while( 
67b0: 28 4e 2d 2d 29 3e 30 20 29 20 70 2d 3e 7a 54 65  (N--)>0 ) p->zTe
67c0: 78 74 5b 70 2d 3e 6e 43 68 61 72 2b 2b 5d 20 3d  xt[p->nChar++] =
67d0: 20 27 20 27 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   ' ';.}../*.** T
67e0: 68 65 20 53 74 72 41 63 63 75 6d 20 22 70 22 20  he StrAccum "p" 
67f0: 69 73 20 6e 6f 74 20 6c 61 72 67 65 20 65 6e 6f  is not large eno
6800: 75 67 68 20 74 6f 20 61 63 63 65 70 74 20 4e 20  ugh to accept N 
6810: 6e 65 77 20 62 79 74 65 73 20 6f 66 20 7a 5b 5d  new bytes of z[]
6820: 2e 0a 2a 2a 20 53 6f 20 65 6e 6c 61 72 67 65 20  ..** So enlarge 
6830: 69 66 20 66 69 72 73 74 2c 20 74 68 65 6e 20 64  if first, then d
6840: 6f 20 74 68 65 20 61 70 70 65 6e 64 2e 0a 2a 2a  o the append..**
6850: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 68 65  .** This is a he
6860: 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f 20  lper routine to 
6870: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
6880: 70 70 65 6e 64 28 29 20 74 68 61 74 20 64 6f 65  ppend() that doe
6890: 73 20 73 70 65 63 69 61 6c 2d 63 61 73 65 0a 2a  s special-case.*
68a0: 2a 20 77 6f 72 6b 20 28 65 6e 6c 61 72 67 69 6e  * work (enlargin
68b0: 67 20 74 68 65 20 62 75 66 66 65 72 29 20 75 73  g the buffer) us
68c0: 69 6e 67 20 74 61 69 6c 20 72 65 63 75 72 73 69  ing tail recursi
68d0: 6f 6e 2c 20 73 6f 20 74 68 61 74 20 74 68 65 0a  on, so that the.
68e0: 2a 2a 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  ** sqlite3StrAcc
68f0: 75 6d 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69  umAppend() routi
6900: 6e 65 20 63 61 6e 20 75 73 65 20 66 61 73 74 20  ne can use fast 
6910: 63 61 6c 6c 69 6e 67 20 73 65 6d 61 6e 74 69 63  calling semantic
6920: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
6930: 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  d SQLITE_NOINLIN
6940: 45 20 65 6e 6c 61 72 67 65 41 6e 64 41 70 70 65  E enlargeAndAppe
6950: 6e 64 28 53 74 72 41 63 63 75 6d 20 2a 70 2c 20  nd(StrAccum *p, 
6960: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
6970: 6e 74 20 4e 29 7b 0a 20 20 4e 20 3d 20 73 71 6c  nt N){.  N = sql
6980: 69 74 65 33 53 74 72 41 63 63 75 6d 45 6e 6c 61  ite3StrAccumEnla
6990: 72 67 65 28 70 2c 20 4e 29 3b 0a 20 20 69 66 28  rge(p, N);.  if(
69a0: 20 4e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 63   N>0 ){.    memc
69b0: 70 79 28 26 70 2d 3e 7a 54 65 78 74 5b 70 2d 3e  py(&p->zText[p->
69c0: 6e 43 68 61 72 5d 2c 20 7a 2c 20 4e 29 3b 0a 20  nChar], z, N);. 
69d0: 20 20 20 70 2d 3e 6e 43 68 61 72 20 2b 3d 20 4e     p->nChar += N
69e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
69f0: 70 70 65 6e 64 20 4e 20 62 79 74 65 73 20 6f 66  ppend N bytes of
6a00: 20 74 65 78 74 20 66 72 6f 6d 20 7a 20 74 6f 20   text from z to 
6a10: 74 68 65 20 53 74 72 41 63 63 75 6d 20 6f 62 6a  the StrAccum obj
6a20: 65 63 74 2e 20 20 49 6e 63 72 65 61 73 65 20 74  ect.  Increase t
6a30: 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  he.** size of th
6a40: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
6a50: 69 6f 6e 20 66 6f 72 20 53 74 72 41 63 63 75 6d  ion for StrAccum
6a60: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
6a70: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74  /.void sqlite3St
6a80: 72 41 63 63 75 6d 41 70 70 65 6e 64 28 53 74 72  rAccumAppend(Str
6a90: 41 63 63 75 6d 20 2a 70 2c 20 63 6f 6e 73 74 20  Accum *p, const 
6aa0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 4e 29 7b  char *z, int N){
6ab0: 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20  .  assert( z!=0 
6ac0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
6ad0: 7a 54 65 78 74 21 3d 30 20 7c 7c 20 70 2d 3e 6e  zText!=0 || p->n
6ae0: 43 68 61 72 3d 3d 30 20 7c 7c 20 70 2d 3e 61 63  Char==0 || p->ac
6af0: 63 45 72 72 6f 72 20 29 3b 0a 20 20 61 73 73 65  cError );.  asse
6b00: 72 74 28 20 4e 3e 3d 30 20 29 3b 0a 20 20 61 73  rt( N>=0 );.  as
6b10: 73 65 72 74 28 20 70 2d 3e 61 63 63 45 72 72 6f  sert( p->accErro
6b20: 72 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 41 6c 6c 6f  r==0 || p->nAllo
6b30: 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  c==0 );.  if( p-
6b40: 3e 6e 43 68 61 72 2b 4e 20 3e 3d 20 70 2d 3e 6e  >nChar+N >= p->n
6b50: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 65 6e 6c  Alloc ){.    enl
6b60: 61 72 67 65 41 6e 64 41 70 70 65 6e 64 28 70 2c  argeAndAppend(p,
6b70: 7a 2c 4e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  z,N);.  }else{. 
6b80: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 54     assert( p->zT
6b90: 65 78 74 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 43  ext );.    p->nC
6ba0: 68 61 72 20 2b 3d 20 4e 3b 0a 20 20 20 20 6d 65  har += N;.    me
6bb0: 6d 63 70 79 28 26 70 2d 3e 7a 54 65 78 74 5b 70  mcpy(&p->zText[p
6bc0: 2d 3e 6e 43 68 61 72 2d 4e 5d 2c 20 7a 2c 20 4e  ->nChar-N], z, N
6bd0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6be0: 41 70 70 65 6e 64 20 74 68 65 20 63 6f 6d 70 6c  Append the compl
6bf0: 65 74 65 20 74 65 78 74 20 6f 66 20 7a 65 72 6f  ete text of zero
6c00: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
6c10: 6e 67 20 7a 5b 5d 20 74 6f 20 74 68 65 20 70 20  ng z[] to the p 
6c20: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  string..*/.void 
6c30: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
6c40: 70 70 65 6e 64 41 6c 6c 28 53 74 72 41 63 63 75  ppendAll(StrAccu
6c50: 6d 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  m *p, const char
6c60: 20 2a 7a 29 7b 0a 20 20 73 71 6c 69 74 65 33 53   *z){.  sqlite3S
6c70: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 2c  trAccumAppend(p,
6c80: 20 7a 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65   z, sqlite3Strle
6c90: 6e 33 30 28 7a 29 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  n30(z));.}.../*.
6ca0: 2a 2a 20 46 69 6e 69 73 68 20 6f 66 66 20 61 20  ** Finish off a 
6cb0: 73 74 72 69 6e 67 20 62 79 20 6d 61 6b 69 6e 67  string by making
6cc0: 20 73 75 72 65 20 69 74 20 69 73 20 7a 65 72 6f   sure it is zero
6cd0: 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20  -terminated..** 
6ce0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
6cf0: 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 69 6e   to the resultin
6d00: 67 20 73 74 72 69 6e 67 2e 20 20 52 65 74 75 72  g string.  Retur
6d10: 6e 20 61 20 4e 55 4c 4c 0a 2a 2a 20 70 6f 69 6e  n a NULL.** poin
6d20: 74 65 72 20 69 66 20 61 6e 79 20 6b 69 6e 64 20  ter if any kind 
6d30: 6f 66 20 65 72 72 6f 72 20 77 61 73 20 65 6e 63  of error was enc
6d40: 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 63 68 61  ountered..*/.cha
6d50: 72 20 2a 73 71 6c 69 74 65 33 53 74 72 41 63 63  r *sqlite3StrAcc
6d60: 75 6d 46 69 6e 69 73 68 28 53 74 72 41 63 63 75  umFinish(StrAccu
6d70: 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  m *p){.  if( p->
6d80: 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  zText ){.    p->
6d90: 7a 54 65 78 74 5b 70 2d 3e 6e 43 68 61 72 5d 20  zText[p->nChar] 
6da0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  = 0;.    if( p->
6db0: 75 73 65 4d 61 6c 6c 6f 63 20 26 26 20 70 2d 3e  useMalloc && p->
6dc0: 7a 54 65 78 74 3d 3d 70 2d 3e 7a 42 61 73 65 20  zText==p->zBase 
6dd0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
6de0: 75 73 65 4d 61 6c 6c 6f 63 3d 3d 31 20 29 7b 0a  useMalloc==1 ){.
6df0: 20 20 20 20 20 20 20 20 70 2d 3e 7a 54 65 78 74          p->zText
6e00: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
6e10: 6f 63 52 61 77 28 70 2d 3e 64 62 2c 20 70 2d 3e  ocRaw(p->db, p->
6e20: 6e 43 68 61 72 2b 31 20 29 3b 0a 20 20 20 20 20  nChar+1 );.     
6e30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6e40: 70 2d 3e 7a 54 65 78 74 20 3d 20 73 71 6c 69 74  p->zText = sqlit
6e50: 65 33 5f 6d 61 6c 6c 6f 63 28 70 2d 3e 6e 43 68  e3_malloc(p->nCh
6e60: 61 72 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ar+1);.      }. 
6e70: 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 54 65 78       if( p->zTex
6e80: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  t ){.        mem
6e90: 63 70 79 28 70 2d 3e 7a 54 65 78 74 2c 20 70 2d  cpy(p->zText, p-
6ea0: 3e 7a 42 61 73 65 2c 20 70 2d 3e 6e 43 68 61 72  >zBase, p->nChar
6eb0: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
6ec0: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 53 74 72  {.        setStr
6ed0: 41 63 63 75 6d 45 72 72 6f 72 28 70 2c 20 53 54  AccumError(p, ST
6ee0: 52 41 43 43 55 4d 5f 4e 4f 4d 45 4d 29 3b 0a 20  RACCUM_NOMEM);. 
6ef0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6f00: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 54 65  .  return p->zTe
6f10: 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  xt;.}../*.** Res
6f20: 65 74 20 61 6e 20 53 74 72 41 63 63 75 6d 20 73  et an StrAccum s
6f30: 74 72 69 6e 67 2e 20 20 52 65 63 6c 61 69 6d 20  tring.  Reclaim 
6f40: 61 6c 6c 20 6d 61 6c 6c 6f 63 65 64 20 6d 65 6d  all malloced mem
6f50: 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ory..*/.void sql
6f60: 69 74 65 33 53 74 72 41 63 63 75 6d 52 65 73 65  ite3StrAccumRese
6f70: 74 28 53 74 72 41 63 63 75 6d 20 2a 70 29 7b 0a  t(StrAccum *p){.
6f80: 20 20 69 66 28 20 70 2d 3e 7a 54 65 78 74 21 3d    if( p->zText!=
6f90: 70 2d 3e 7a 42 61 73 65 20 29 7b 0a 20 20 20 20  p->zBase ){.    
6fa0: 69 66 28 20 70 2d 3e 75 73 65 4d 61 6c 6c 6f 63  if( p->useMalloc
6fb0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==1 ){.      sql
6fc0: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
6fd0: 2c 20 70 2d 3e 7a 54 65 78 74 29 3b 0a 20 20 20  , p->zText);.   
6fe0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
6ff0: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54  lite3_free(p->zT
7000: 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ext);.    }.  }.
7010: 20 20 70 2d 3e 7a 54 65 78 74 20 3d 20 30 3b 0a    p->zText = 0;.
7020: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
7030: 69 7a 65 20 61 20 73 74 72 69 6e 67 20 61 63 63  ize a string acc
7040: 75 6d 75 6c 61 74 6f 72 0a 2a 2f 0a 76 6f 69 64  umulator.*/.void
7050: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
7060: 49 6e 69 74 28 53 74 72 41 63 63 75 6d 20 2a 70  Init(StrAccum *p
7070: 2c 20 63 68 61 72 20 2a 7a 42 61 73 65 2c 20 69  , char *zBase, i
7080: 6e 74 20 6e 2c 20 69 6e 74 20 6d 78 29 7b 0a 20  nt n, int mx){. 
7090: 20 70 2d 3e 7a 54 65 78 74 20 3d 20 70 2d 3e 7a   p->zText = p->z
70a0: 42 61 73 65 20 3d 20 7a 42 61 73 65 3b 0a 20 20  Base = zBase;.  
70b0: 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 70 2d 3e  p->db = 0;.  p->
70c0: 6e 43 68 61 72 20 3d 20 30 3b 0a 20 20 70 2d 3e  nChar = 0;.  p->
70d0: 6e 41 6c 6c 6f 63 20 3d 20 6e 3b 0a 20 20 70 2d  nAlloc = n;.  p-
70e0: 3e 6d 78 41 6c 6c 6f 63 20 3d 20 6d 78 3b 0a 20  >mxAlloc = mx;. 
70f0: 20 70 2d 3e 75 73 65 4d 61 6c 6c 6f 63 20 3d 20   p->useMalloc = 
7100: 31 3b 0a 20 20 70 2d 3e 61 63 63 45 72 72 6f 72  1;.  p->accError
7110: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50   = 0;.}../*.** P
7120: 72 69 6e 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  rint into memory
7130: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
7140: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 20  qliteMalloc().  
7150: 55 73 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  Use the internal
7160: 0a 2a 2a 20 25 2d 63 6f 6e 76 65 72 73 69 6f 6e  .** %-conversion
7170: 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a   extensions..*/.
7180: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 56 4d 50  char *sqlite3VMP
7190: 72 69 6e 74 66 28 73 71 6c 69 74 65 33 20 2a 64  rintf(sqlite3 *d
71a0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
71b0: 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20  Format, va_list 
71c0: 61 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  ap){.  char *z;.
71d0: 20 20 63 68 61 72 20 7a 42 61 73 65 5b 53 51 4c    char zBase[SQL
71e0: 49 54 45 5f 50 52 49 4e 54 5f 42 55 46 5f 53 49  ITE_PRINT_BUF_SI
71f0: 5a 45 5d 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  ZE];.  StrAccum 
7200: 61 63 63 3b 0a 20 20 61 73 73 65 72 74 28 20 64  acc;.  assert( d
7210: 62 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  b!=0 );.  sqlite
7220: 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 61  3StrAccumInit(&a
7230: 63 63 2c 20 7a 42 61 73 65 2c 20 73 69 7a 65 6f  cc, zBase, sizeo
7240: 66 28 7a 42 61 73 65 29 2c 0a 20 20 20 20 20 20  f(zBase),.      
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7260: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
7270: 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 29  E_LIMIT_LENGTH])
7280: 3b 0a 20 20 61 63 63 2e 64 62 20 3d 20 64 62 3b  ;.  acc.db = db;
7290: 0a 20 20 73 71 6c 69 74 65 33 56 58 50 72 69 6e  .  sqlite3VXPrin
72a0: 74 66 28 26 61 63 63 2c 20 53 51 4c 49 54 45 5f  tf(&acc, SQLITE_
72b0: 50 52 49 4e 54 46 5f 49 4e 54 45 52 4e 41 4c 2c  PRINTF_INTERNAL,
72c0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
72d0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41   z = sqlite3StrA
72e0: 63 63 75 6d 46 69 6e 69 73 68 28 26 61 63 63 29  ccumFinish(&acc)
72f0: 3b 0a 20 20 69 66 28 20 61 63 63 2e 61 63 63 45  ;.  if( acc.accE
7300: 72 72 6f 72 3d 3d 53 54 52 41 43 43 55 4d 5f 4e  rror==STRACCUM_N
7310: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 64 62 2d 3e  OMEM ){.    db->
7320: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
7330: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
7340: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ;.}../*.** Print
7350: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
7360: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
7370: 65 4d 61 6c 6c 6f 63 28 29 2e 20 20 55 73 65 20  eMalloc().  Use 
7380: 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  the internal.** 
7390: 25 2d 63 6f 6e 76 65 72 73 69 6f 6e 20 65 78 74  %-conversion ext
73a0: 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 63 68 61 72  ensions..*/.char
73b0: 20 2a 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66   *sqlite3MPrintf
73c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
73d0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
73e0: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
73f0: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
7400: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
7410: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d   zFormat);.  z =
7420: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
7430: 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  (db, zFormat, ap
7440: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
7450: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
7460: 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74  /*.** Like sqlit
7470: 65 33 4d 50 72 69 6e 74 66 28 29 2c 20 62 75 74  e3MPrintf(), but
7480: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 44 62 46   call sqlite3DbF
7490: 72 65 65 28 29 20 6f 6e 20 7a 53 74 72 20 61 66  ree() on zStr af
74a0: 74 65 72 20 66 6f 72 6d 61 74 74 69 6e 67 0a 2a  ter formatting.*
74b0: 2a 20 74 68 65 20 73 74 72 69 6e 67 20 61 6e 64  * the string and
74c0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
74d0: 67 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  g.  This routine
74e0: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
74f0: 62 65 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6d 6f  be used.** to mo
7500: 64 69 66 79 20 61 6e 20 65 78 69 73 74 69 6e 67  dify an existing
7510: 20 73 74 72 69 6e 67 2e 20 20 46 6f 72 20 65 78   string.  For ex
7520: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
7530: 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 4d 50     x = sqlite3MP
7540: 72 69 6e 74 66 28 64 62 2c 20 78 2c 20 22 70 72  rintf(db, x, "pr
7550: 65 66 69 78 20 25 73 20 73 75 66 66 69 78 22 2c  efix %s suffix",
7560: 20 78 29 3b 0a 2a 2a 0a 2a 2f 0a 63 68 61 72 20   x);.**.*/.char 
7570: 2a 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66  *sqlite3MAppendf
7580: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 68  (sqlite3 *db, ch
7590: 61 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20  ar *zStr, const 
75a0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
75b0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
75c0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  p;.  char *z;.  
75d0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
75e0: 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c  rmat);.  z = sql
75f0: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c  ite3VMPrintf(db,
7600: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
7610: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 73   va_end(ap);.  s
7620: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7630: 20 7a 53 74 72 29 3b 0a 20 20 72 65 74 75 72 6e   zStr);.  return
7640: 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69   z;.}../*.** Pri
7650: 6e 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  nt into memory o
7660: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
7670: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 20  ite3_malloc().  
7680: 4f 6d 69 74 20 74 68 65 20 69 6e 74 65 72 6e 61  Omit the interna
7690: 6c 0a 2a 2a 20 25 2d 63 6f 6e 76 65 72 73 69 6f  l.** %-conversio
76a0: 6e 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f  n extensions..*/
76b0: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 76  .char *sqlite3_v
76c0: 6d 70 72 69 6e 74 66 28 63 6f 6e 73 74 20 63 68  mprintf(const ch
76d0: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f  ar *zFormat, va_
76e0: 6c 69 73 74 20 61 70 29 7b 0a 20 20 63 68 61 72  list ap){.  char
76f0: 20 2a 7a 3b 0a 20 20 63 68 61 72 20 7a 42 61 73   *z;.  char zBas
7700: 65 5b 53 51 4c 49 54 45 5f 50 52 49 4e 54 5f 42  e[SQLITE_PRINT_B
7710: 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 53 74 72 41  UF_SIZE];.  StrA
7720: 63 63 75 6d 20 61 63 63 3b 0a 23 69 66 6e 64 65  ccum acc;.#ifnde
7730: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
7740: 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71 6c  TOINIT.  if( sql
7750: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
7760: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ) ) return 0;.#e
7770: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 53 74  ndif.  sqlite3St
7780: 72 41 63 63 75 6d 49 6e 69 74 28 26 61 63 63 2c  rAccumInit(&acc,
7790: 20 7a 42 61 73 65 2c 20 73 69 7a 65 6f 66 28 7a   zBase, sizeof(z
77a0: 42 61 73 65 29 2c 20 53 51 4c 49 54 45 5f 4d 41  Base), SQLITE_MA
77b0: 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 61 63 63  X_LENGTH);.  acc
77c0: 2e 75 73 65 4d 61 6c 6c 6f 63 20 3d 20 32 3b 0a  .useMalloc = 2;.
77d0: 20 20 73 71 6c 69 74 65 33 56 58 50 72 69 6e 74    sqlite3VXPrint
77e0: 66 28 26 61 63 63 2c 20 30 2c 20 7a 46 6f 72 6d  f(&acc, 0, zForm
77f0: 61 74 2c 20 61 70 29 3b 0a 20 20 7a 20 3d 20 73  at, ap);.  z = s
7800: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69  qlite3StrAccumFi
7810: 6e 69 73 68 28 26 61 63 63 29 3b 0a 20 20 72 65  nish(&acc);.  re
7820: 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn z;.}../*.**
7830: 20 50 72 69 6e 74 20 69 6e 74 6f 20 6d 65 6d 6f   Print into memo
7840: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
7850: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
7860: 29 28 29 2e 20 20 4f 6d 69 74 20 74 68 65 20 69  )().  Omit the i
7870: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 25 2d 63 6f 6e  nternal.** %-con
7880: 76 65 72 73 69 6f 6e 20 65 78 74 65 6e 73 69 6f  version extensio
7890: 6e 73 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  ns..*/.char *sql
78a0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 63 6f 6e  ite3_mprintf(con
78b0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
78c0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
78d0: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  t ap;.  char *z;
78e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
78f0: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
7900: 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  if( sqlite3_init
7910: 69 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72  ialize() ) retur
7920: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 76 61  n 0;.#endif.  va
7930: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
7940: 61 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  at);.  z = sqlit
7950: 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72  e3_vmprintf(zFor
7960: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
7970: 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e  nd(ap);.  return
7980: 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c   z;.}../*.** sql
7990: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 29 20  ite3_snprintf() 
79a0: 77 6f 72 6b 73 20 6c 69 6b 65 20 73 6e 70 72 69  works like snpri
79b0: 6e 74 66 28 29 20 65 78 63 65 70 74 20 74 68 61  ntf() except tha
79c0: 74 20 69 74 20 69 67 6e 6f 72 65 73 20 74 68 65  t it ignores the
79d0: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
79e0: 6c 65 20 73 65 74 74 69 6e 67 73 2e 20 20 54 68  le settings.  Th
79f0: 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  is is important 
7a00: 66 6f 72 20 53 51 4c 69 74 65 20 62 65 63 61 75  for SQLite becau
7a10: 73 65 20 77 65 0a 2a 2a 20 61 72 65 20 6e 6f 74  se we.** are not
7a20: 20 61 62 6c 65 20 74 6f 20 75 73 65 20 61 20 22   able to use a "
7a30: 2c 22 20 61 73 20 74 68 65 20 64 65 63 69 6d 61  ," as the decima
7a40: 6c 20 70 6f 69 6e 74 20 69 6e 20 70 6c 61 63 65  l point in place
7a50: 20 6f 66 20 22 2e 22 20 61 73 0a 2a 2a 20 73 70   of "." as.** sp
7a60: 65 63 69 66 69 65 64 20 62 79 20 73 6f 6d 65 20  ecified by some 
7a70: 6c 6f 63 61 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  locales..**.** O
7a80: 6f 70 73 3a 20 20 54 68 65 20 66 69 72 73 74 20  ops:  The first 
7a90: 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 66  two arguments of
7aa0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7ab0: 66 28 29 20 61 72 65 20 62 61 63 6b 77 61 72 64  f() are backward
7ac0: 73 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 6e  s.** from the sn
7ad0: 70 72 69 6e 74 66 28 29 20 73 74 61 6e 64 61 72  printf() standar
7ae0: 64 2e 20 20 55 6e 66 6f 72 74 75 6e 61 74 65 6c  d.  Unfortunatel
7af0: 79 2c 20 69 74 20 69 73 20 74 6f 6f 20 6c 61 74  y, it is too lat
7b00: 65 20 74 6f 20 63 68 61 6e 67 65 0a 2a 2a 20 74  e to change.** t
7b10: 68 69 73 20 77 69 74 68 6f 75 74 20 62 72 65 61  his without brea
7b20: 6b 69 6e 67 20 63 6f 6d 70 61 74 69 62 69 6c 69  king compatibili
7b30: 74 79 2c 20 73 6f 20 77 65 20 6a 75 73 74 20 68  ty, so we just h
7b40: 61 76 65 20 74 6f 20 6c 69 76 65 20 77 69 74 68  ave to live with
7b50: 20 74 68 65 0a 2a 2a 20 6d 69 73 74 61 6b 65 2e   the.** mistake.
7b60: 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  .**.** sqlite3_v
7b70: 73 6e 70 72 69 6e 74 66 28 29 20 69 73 20 74 68  snprintf() is th
7b80: 65 20 76 61 72 61 72 67 73 20 76 65 72 73 69 6f  e varargs versio
7b90: 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  n..*/.char *sqli
7ba0: 74 65 33 5f 76 73 6e 70 72 69 6e 74 66 28 69 6e  te3_vsnprintf(in
7bb0: 74 20 6e 2c 20 63 68 61 72 20 2a 7a 42 75 66 2c  t n, char *zBuf,
7bc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
7bd0: 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70  rmat, va_list ap
7be0: 29 7b 0a 20 20 53 74 72 41 63 63 75 6d 20 61 63  ){.  StrAccum ac
7bf0: 63 3b 0a 20 20 69 66 28 20 6e 3c 3d 30 20 29 20  c;.  if( n<=0 ) 
7c00: 72 65 74 75 72 6e 20 7a 42 75 66 3b 0a 20 20 73  return zBuf;.  s
7c10: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
7c20: 69 74 28 26 61 63 63 2c 20 7a 42 75 66 2c 20 6e  it(&acc, zBuf, n
7c30: 2c 20 30 29 3b 0a 20 20 61 63 63 2e 75 73 65 4d  , 0);.  acc.useM
7c40: 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 73 71 6c  alloc = 0;.  sql
7c50: 69 74 65 33 56 58 50 72 69 6e 74 66 28 26 61 63  ite3VXPrintf(&ac
7c60: 63 2c 20 30 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  c, 0, zFormat, a
7c70: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  p);.  return sql
7c80: 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
7c90: 73 68 28 26 61 63 63 29 3b 0a 7d 0a 63 68 61 72  sh(&acc);.}.char
7ca0: 20 2a 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e   *sqlite3_snprin
7cb0: 74 66 28 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a  tf(int n, char *
7cc0: 7a 42 75 66 2c 20 63 6f 6e 73 74 20 63 68 61 72  zBuf, const char
7cd0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
7ce0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 76 61  .  char *z;.  va
7cf0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
7d00: 74 61 72 74 28 61 70 2c 7a 46 6f 72 6d 61 74 29  tart(ap,zFormat)
7d10: 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  z = sqlite3_
7d20: 76 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 42 75  vsnprintf(n, zBu
7d30: 66 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  f, zFormat, ap);
7d40: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
7d50: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
7d60: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
7d70: 72 6f 75 74 69 6e 65 20 74 68 61 74 20 61 63 74  routine that act
7d80: 75 61 6c 6c 79 20 66 6f 72 6d 61 74 73 20 74 68  ually formats th
7d90: 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  e sqlite3_log() 
7da0: 6d 65 73 73 61 67 65 2e 0a 2a 2a 20 57 65 20 68  message..** We h
7db0: 6f 75 73 65 20 69 74 20 69 6e 20 61 20 73 65 70  ouse it in a sep
7dc0: 61 72 61 74 65 20 72 6f 75 74 69 6e 65 20 66 72  arate routine fr
7dd0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  om sqlite3_log()
7de0: 20 74 6f 20 61 76 6f 69 64 20 75 73 69 6e 67 0a   to avoid using.
7df0: 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 20 6f  ** stack space o
7e00: 6e 20 73 6d 61 6c 6c 2d 73 74 61 63 6b 20 73 79  n small-stack sy
7e10: 73 74 65 6d 73 20 77 68 65 6e 20 6c 6f 67 67 69  stems when loggi
7e20: 6e 67 20 69 73 20 64 69 73 61 62 6c 65 64 2e 0a  ng is disabled..
7e30: 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6c 6f  **.** sqlite3_lo
7e40: 67 28 29 20 6d 75 73 74 20 72 65 6e 64 65 72 20  g() must render 
7e50: 69 6e 74 6f 20 61 20 73 74 61 74 69 63 20 62 75  into a static bu
7e60: 66 66 65 72 2e 20 20 49 74 20 63 61 6e 6e 6f 74  ffer.  It cannot
7e70: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
7e80: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  allocate memory 
7e90: 62 65 63 61 75 73 65 20 69 74 20 6d 69 67 68 74  because it might
7ea0: 20 62 65 20 63 61 6c 6c 65 64 20 77 68 69 6c 65   be called while
7eb0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
7ec0: 63 61 74 6f 72 0a 2a 2a 20 6d 75 74 65 78 20 69  cator.** mutex i
7ed0: 73 20 68 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69  s held..*/.stati
7ee0: 63 20 76 6f 69 64 20 72 65 6e 64 65 72 4c 6f 67  c void renderLog
7ef0: 4d 73 67 28 69 6e 74 20 69 45 72 72 43 6f 64 65  Msg(int iErrCode
7f00: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
7f10: 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61  ormat, va_list a
7f20: 70 29 7b 0a 20 20 53 74 72 41 63 63 75 6d 20 61  p){.  StrAccum a
7f30: 63 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  cc;             
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7f50: 53 74 72 69 6e 67 20 61 63 63 75 6d 75 6c 61 74  String accumulat
7f60: 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 7a 4d 73  or */.  char zMs
7f70: 67 5b 53 51 4c 49 54 45 5f 50 52 49 4e 54 5f 42  g[SQLITE_PRINT_B
7f80: 55 46 5f 53 49 5a 45 2a 33 5d 3b 20 20 20 20 2f  UF_SIZE*3];    /
7f90: 2a 20 43 6f 6d 70 6c 65 74 65 20 6c 6f 67 20 6d  * Complete log m
7fa0: 65 73 73 61 67 65 20 2a 2f 0a 0a 20 20 73 71 6c  essage */..  sql
7fb0: 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
7fc0: 28 26 61 63 63 2c 20 7a 4d 73 67 2c 20 73 69 7a  (&acc, zMsg, siz
7fd0: 65 6f 66 28 7a 4d 73 67 29 2c 20 30 29 3b 0a 20  eof(zMsg), 0);. 
7fe0: 20 61 63 63 2e 75 73 65 4d 61 6c 6c 6f 63 20 3d   acc.useMalloc =
7ff0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 58 50   0;.  sqlite3VXP
8000: 72 69 6e 74 66 28 26 61 63 63 2c 20 30 2c 20 7a  rintf(&acc, 0, z
8010: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 73  Format, ap);.  s
8020: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
8030: 69 67 2e 78 4c 6f 67 28 73 71 6c 69 74 65 33 47  ig.xLog(sqlite3G
8040: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67  lobalConfig.pLog
8050: 41 72 67 2c 20 69 45 72 72 43 6f 64 65 2c 0a 20  Arg, iErrCode,. 
8060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8070: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8080: 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28  3StrAccumFinish(
8090: 26 61 63 63 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  &acc));.}../*.**
80a0: 20 46 6f 72 6d 61 74 20 61 6e 64 20 77 72 69 74   Format and writ
80b0: 65 20 61 20 6d 65 73 73 61 67 65 20 74 6f 20 74  e a message to t
80c0: 68 65 20 6c 6f 67 20 69 66 20 6c 6f 67 67 69 6e  he log if loggin
80d0: 67 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 2a 2f  g is enabled..*/
80e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 6c 6f  .void sqlite3_lo
80f0: 67 28 69 6e 74 20 69 45 72 72 43 6f 64 65 2c 20  g(int iErrCode, 
8100: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
8110: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
8120: 6c 69 73 74 20 61 70 3b 20 20 20 20 20 20 20 20  list ap;        
8130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8140: 20 20 20 20 20 2f 2a 20 56 61 72 61 72 67 20 6c       /* Vararg l
8150: 69 73 74 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ist */.  if( sql
8160: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
8170: 2e 78 4c 6f 67 20 29 7b 0a 20 20 20 20 76 61 5f  .xLog ){.    va_
8180: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
8190: 74 29 3b 0a 20 20 20 20 72 65 6e 64 65 72 4c 6f  t);.    renderLo
81a0: 67 4d 73 67 28 69 45 72 72 43 6f 64 65 2c 20 7a  gMsg(iErrCode, z
81b0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20  Format, ap);.   
81c0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d   va_end(ap);.  }
81d0: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
81e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
81f0: 0a 2a 2a 20 41 20 76 65 72 73 69 6f 6e 20 6f 66  .** A version of
8200: 20 70 72 69 6e 74 66 28 29 20 74 68 61 74 20 75   printf() that u
8210: 6e 64 65 72 73 74 61 6e 64 73 20 25 6c 6c 64 2e  nderstands %lld.
8220: 20 20 55 73 65 64 20 66 6f 72 20 64 65 62 75 67    Used for debug
8230: 67 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 70 72 69  ging..** The pri
8240: 6e 74 66 28 29 20 62 75 69 6c 74 20 69 6e 74 6f  ntf() built into
8250: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
8260: 66 20 77 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e  f windows does n
8270: 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 25 6c  ot understand %l
8280: 6c 64 0a 2a 2a 20 61 6e 64 20 73 65 67 66 61 75  ld.** and segfau
8290: 6c 74 73 20 69 66 20 79 6f 75 20 67 69 76 65 20  lts if you give 
82a0: 69 74 20 61 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69  it a long long i
82b0: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
82c0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 63  te3DebugPrintf(c
82d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
82e0: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
82f0: 69 73 74 20 61 70 3b 0a 20 20 53 74 72 41 63 63  ist ap;.  StrAcc
8300: 75 6d 20 61 63 63 3b 0a 20 20 63 68 61 72 20 7a  um acc;.  char z
8310: 42 75 66 5b 35 30 30 5d 3b 0a 20 20 73 71 6c 69  Buf[500];.  sqli
8320: 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
8330: 26 61 63 63 2c 20 7a 42 75 66 2c 20 73 69 7a 65  &acc, zBuf, size
8340: 6f 66 28 7a 42 75 66 29 2c 20 30 29 3b 0a 20 20  of(zBuf), 0);.  
8350: 61 63 63 2e 75 73 65 4d 61 6c 6c 6f 63 20 3d 20  acc.useMalloc = 
8360: 30 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  0;.  va_start(ap
8370: 2c 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 73 71 6c  ,zFormat);.  sql
8380: 69 74 65 33 56 58 50 72 69 6e 74 66 28 26 61 63  ite3VXPrintf(&ac
8390: 63 2c 20 30 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  c, 0, zFormat, a
83a0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
83b0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
83c0: 63 75 6d 46 69 6e 69 73 68 28 26 61 63 63 29 3b  cumFinish(&acc);
83d0: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75  .  fprintf(stdou
83e0: 74 2c 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20  t,"%s", zBuf);. 
83f0: 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
8400: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
8410: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
8420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 52 6f 75  *********.** Rou
8470: 74 69 6e 65 73 20 66 6f 72 20 69 6d 70 6c 65 6d  tines for implem
8480: 65 6e 74 69 6e 67 20 74 68 65 20 22 54 72 65 65  enting the "Tree
8490: 56 69 65 77 22 20 64 69 73 70 6c 61 79 20 6f 66  View" display of
84a0: 20 68 69 65 72 61 72 63 68 69 63 61 6c 0a 2a 2a   hierarchical.**
84b0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
84c0: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0a   for debugging..
84d0: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
84e0: 6e 74 72 79 20 70 6f 69 6e 74 73 20 28 63 6f 64  ntry points (cod
84f0: 65 64 20 65 6c 73 65 77 68 65 72 65 29 20 61 72  ed elsewhere) ar
8500: 65 3a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  e:.**     sqlite
8510: 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c  3TreeViewExpr(0,
8520: 20 70 45 78 70 72 2c 20 30 29 3b 0a 2a 2a 20 20   pExpr, 0);.**  
8530: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
8540: 65 77 45 78 70 72 4c 69 73 74 28 30 2c 20 70 4c  ewExprList(0, pL
8550: 69 73 74 2c 20 30 2c 20 30 29 3b 0a 2a 2a 20 20  ist, 0, 0);.**  
8560: 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
8570: 65 77 53 65 6c 65 63 74 28 30 2c 20 70 53 65 6c  ewSelect(0, pSel
8580: 65 63 74 2c 20 30 29 3b 0a 2a 2a 20 49 6e 73 65  ect, 0);.** Inse
8590: 72 74 20 63 61 6c 6c 73 20 74 6f 20 74 68 6f 73  rt calls to thos
85a0: 65 20 72 6f 75 74 69 6e 65 73 20 77 68 69 6c 65  e routines while
85b0: 20 64 65 62 75 67 67 69 6e 67 20 69 6e 20 6f 72   debugging in or
85c0: 64 65 72 20 74 6f 20 64 69 73 70 6c 61 79 0a 2a  der to display.*
85d0: 2a 20 61 20 64 69 61 67 72 61 6d 20 6f 66 20 45  * a diagram of E
85e0: 78 70 72 2c 20 45 78 70 72 4c 69 73 74 2c 20 61  xpr, ExprList, a
85f0: 6e 64 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74  nd Select object
8600: 73 2e 0a 2a 2a 0a 2a 2f 0a 2f 2a 20 41 64 64 20  s..**.*/./* Add 
8610: 61 20 6e 65 77 20 73 75 62 69 74 65 6d 20 74 6f  a new subitem to
8620: 20 74 68 65 20 74 72 65 65 2e 20 20 54 68 65 20   the tree.  The 
8630: 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 20 66 6c 61  moreToFollow fla
8640: 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  g indicates that
8650: 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20   this.** is not 
8660: 74 68 65 20 6c 61 73 74 20 69 74 65 6d 20 69 6e  the last item in
8670: 20 74 68 65 20 74 72 65 65 2e 20 2a 2f 0a 54 72   the tree. */.Tr
8680: 65 65 56 69 65 77 20 2a 73 71 6c 69 74 65 33 54  eeView *sqlite3T
8690: 72 65 65 56 69 65 77 50 75 73 68 28 54 72 65 65  reeViewPush(Tree
86a0: 56 69 65 77 20 2a 70 2c 20 75 38 20 6d 6f 72 65  View *p, u8 more
86b0: 54 6f 46 6f 6c 6c 6f 77 29 7b 0a 20 20 69 66 28  ToFollow){.  if(
86c0: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 70 20 3d   p==0 ){.    p =
86d0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
86e0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
86f0: 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65     if( p==0 ) re
8700: 74 75 72 6e 20 30 3b 0a 20 20 20 20 6d 65 6d 73  turn 0;.    mems
8710: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
8720: 2a 70 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  *p));.  }else{. 
8730: 20 20 20 70 2d 3e 69 4c 65 76 65 6c 2b 2b 3b 0a     p->iLevel++;.
8740: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6d 6f    }.  assert( mo
8750: 72 65 54 6f 46 6f 6c 6c 6f 77 3d 3d 30 20 7c 7c  reToFollow==0 ||
8760: 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 3d 3d 31   moreToFollow==1
8770: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 65   );.  if( p->iLe
8780: 76 65 6c 3c 73 69 7a 65 6f 66 28 70 2d 3e 62 4c  vel<sizeof(p->bL
8790: 69 6e 65 29 20 29 20 70 2d 3e 62 4c 69 6e 65 5b  ine) ) p->bLine[
87a0: 70 2d 3e 69 4c 65 76 65 6c 5d 20 3d 20 6d 6f 72  p->iLevel] = mor
87b0: 65 54 6f 46 6f 6c 6c 6f 77 3b 0a 20 20 72 65 74  eToFollow;.  ret
87c0: 75 72 6e 20 70 3b 0a 7d 0a 2f 2a 20 46 69 6e 69  urn p;.}./* Fini
87d0: 73 68 65 64 20 77 69 74 68 20 6f 6e 65 20 6c 61  shed with one la
87e0: 79 65 72 20 6f 66 20 74 68 65 20 74 72 65 65 20  yer of the tree 
87f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
8800: 72 65 65 56 69 65 77 50 6f 70 28 54 72 65 65 56  reeViewPop(TreeV
8810: 69 65 77 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  iew *p){.  if( p
8820: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
8830: 70 2d 3e 69 4c 65 76 65 6c 2d 2d 3b 0a 20 20 69  p->iLevel--;.  i
8840: 66 28 20 70 2d 3e 69 4c 65 76 65 6c 3c 30 20 29  f( p->iLevel<0 )
8850: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
8860: 3b 0a 7d 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  ;.}./* Generate 
8870: 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66  a single line of
8880: 20 6f 75 74 70 75 74 20 66 6f 72 20 74 68 65 20   output for the 
8890: 74 72 65 65 2c 20 77 69 74 68 20 61 20 70 72 65  tree, with a pre
88a0: 66 69 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  fix that contain
88b0: 73 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 61 70 70  s.** all the app
88c0: 72 6f 70 72 69 61 74 65 20 74 72 65 65 20 6c 69  ropriate tree li
88d0: 6e 65 73 20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nes */.void sqli
88e0: 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
88f0: 54 72 65 65 56 69 65 77 20 2a 70 2c 20 63 6f 6e  TreeView *p, con
8900: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
8910: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
8920: 74 20 61 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  t ap;.  int i;. 
8930: 20 53 74 72 41 63 63 75 6d 20 61 63 63 3b 0a 20   StrAccum acc;. 
8940: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 30 5d 3b   char zBuf[500];
8950: 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
8960: 75 6d 49 6e 69 74 28 26 61 63 63 2c 20 7a 42 75  umInit(&acc, zBu
8970: 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  f, sizeof(zBuf),
8980: 20 30 29 3b 0a 20 20 61 63 63 2e 75 73 65 4d 61   0);.  acc.useMa
8990: 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 69 66 28 20  lloc = 0;.  if( 
89a0: 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  p ){.    for(i=0
89b0: 3b 20 69 3c 70 2d 3e 69 4c 65 76 65 6c 20 26 26  ; i<p->iLevel &&
89c0: 20 69 3c 73 69 7a 65 6f 66 28 70 2d 3e 62 4c 69   i<sizeof(p->bLi
89d0: 6e 65 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  ne)-1; i++){.   
89e0: 20 20 20 69 66 28 20 70 2d 3e 62 4c 69 6e 65 5b     if( p->bLine[
89f0: 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i] ){.        sq
8a00: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
8a10: 65 6e 64 28 26 61 63 63 2c 20 22 5c 33 34 32 5c  end(&acc, "\342\
8a20: 32 32 34 5c 32 30 32 20 20 22 2c 20 35 29 3b 0a  224\202  ", 5);.
8a30: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8a40: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
8a50: 63 63 75 6d 41 70 70 65 6e 64 28 26 61 63 63 2c  ccumAppend(&acc,
8a60: 20 22 20 20 20 22 2c 20 33 29 3b 0a 20 20 20 20   "   ", 3);.    
8a70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
8a80: 28 20 70 2d 3e 62 4c 69 6e 65 5b 69 5d 20 29 7b  ( p->bLine[i] ){
8a90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74  .      sqlite3St
8aa0: 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 61 63  rAccumAppend(&ac
8ab0: 63 2c 20 22 5c 33 34 32 5c 32 32 34 5c 32 33 34  c, "\342\224\234
8ac0: 5c 33 34 32 5c 32 32 34 5c 32 30 30 20 22 2c 20  \342\224\200 ", 
8ad0: 37 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  7);.    }else{. 
8ae0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
8af0: 63 63 75 6d 41 70 70 65 6e 64 28 26 61 63 63 2c  ccumAppend(&acc,
8b00: 20 22 5c 33 34 32 5c 32 32 34 5c 32 32 34 5c 33   "\342\224\224\3
8b10: 34 32 5c 32 32 34 5c 32 30 30 20 22 2c 20 37 29  42\224\200 ", 7)
8b20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61  ;.    }.  }.  va
8b30: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
8b40: 61 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 58  at);.  sqlite3VX
8b50: 50 72 69 6e 74 66 28 26 61 63 63 2c 20 30 2c 20  Printf(&acc, 0, 
8b60: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
8b70: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66  va_end(ap);.  if
8b80: 28 20 7a 42 75 66 5b 61 63 63 2e 6e 43 68 61 72  ( zBuf[acc.nChar
8b90: 2d 31 5d 21 3d 27 5c 6e 27 20 29 20 73 71 6c 69  -1]!='\n' ) sqli
8ba0: 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
8bb0: 64 28 26 61 63 63 2c 20 22 5c 6e 22 2c 20 31 29  d(&acc, "\n", 1)
8bc0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
8bd0: 63 75 6d 46 69 6e 69 73 68 28 26 61 63 63 29 3b  cumFinish(&acc);
8be0: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75  .  fprintf(stdou
8bf0: 74 2c 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20  t,"%s", zBuf);. 
8c00: 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
8c10: 0a 7d 0a 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20  .}./* Shorthand 
8c20: 66 6f 72 20 73 74 61 72 74 69 6e 67 20 61 20 6e  for starting a n
8c30: 65 77 20 74 72 65 65 20 69 74 65 6d 20 74 68 61  ew tree item tha
8c40: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  t consists of a 
8c50: 73 69 6e 67 6c 65 20 6c 61 62 65 6c 20 2a 2f 0a  single label */.
8c60: 76 6f 69 64 20 73 71 6c 69 74 65 33 54 72 65 65  void sqlite3Tree
8c70: 56 69 65 77 49 74 65 6d 28 54 72 65 65 56 69 65  ViewItem(TreeVie
8c80: 77 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  w *p, const char
8c90: 20 2a 7a 4c 61 62 65 6c 2c 20 75 38 20 6d 6f 72   *zLabel, u8 mor
8ca0: 65 54 6f 46 6f 6c 6c 6f 77 29 7b 0a 20 20 70 20  eToFollow){.  p 
8cb0: 3d 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65  = sqlite3TreeVie
8cc0: 77 50 75 73 68 28 70 2c 20 6d 6f 72 65 54 6f 46  wPush(p, moreToF
8cd0: 6f 6c 6c 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65  ollow);.  sqlite
8ce0: 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 2c  3TreeViewLine(p,
8cf0: 20 22 25 73 22 2c 20 7a 4c 61 62 65 6c 29 3b 0a   "%s", zLabel);.
8d00: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8d10: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  TE_DEBUG */../*.
8d20: 2a 2a 20 76 61 72 69 61 62 6c 65 2d 61 72 67 75  ** variable-argu
8d30: 6d 65 6e 74 20 77 72 61 70 70 65 72 20 61 72 6f  ment wrapper aro
8d40: 75 6e 64 20 73 71 6c 69 74 65 33 56 58 50 72 69  und sqlite3VXPri
8d50: 6e 74 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ntf()..*/.void s
8d60: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 53 74  qlite3XPrintf(St
8d70: 72 41 63 63 75 6d 20 2a 70 2c 20 75 33 32 20 62  rAccum *p, u32 b
8d80: 46 6c 61 67 73 2c 20 63 6f 6e 73 74 20 63 68 61  Flags, const cha
8d90: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
8da0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
8db0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 7a 46    va_start(ap,zF
8dc0: 6f 72 6d 61 74 29 3b 0a 20 20 73 71 6c 69 74 65  ormat);.  sqlite
8dd0: 33 56 58 50 72 69 6e 74 66 28 70 2c 20 62 46 6c  3VXPrintf(p, bFl
8de0: 61 67 73 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  ags, zFormat, ap
8df0: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
8e00: 0a 7d 0a                                         .}.