/ Hex Artifact Content
Login

Artifact 36090f6d7b4946539de97c1850675ce55ef66c16:


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 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 6f  The following mo
01c0: 64 75 6c 65 73 20 69 73 20 61 6e 20 65 6e 68 61  dules is an enha
01d0: 6e 63 65 64 20 72 65 70 6c 61 63 65 6d 65 6e 74  nced replacement
01e0: 20 66 6f 72 20 74 68 65 20 22 70 72 69 6e 74 66   for the "printf
01f0: 22 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 2a 2a  " subroutines.**
0200: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 73 74   found in the st
0210: 61 6e 64 61 72 64 20 43 20 6c 69 62 72 61 72 79  andard C library
0220: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
0230: 20 65 6e 68 61 6e 63 65 6d 65 6e 74 73 20 61 72   enhancements ar
0240: 65 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 3a 0a  e.** supported:.
0250: 2a 2a 0a 2a 2a 20 20 20 20 20 20 2b 20 20 41 64  **.**      +  Ad
0260: 64 69 74 69 6f 6e 61 6c 20 66 75 6e 63 74 69 6f  ditional functio
0270: 6e 73 2e 20 20 54 68 65 20 73 74 61 6e 64 61 72  ns.  The standar
0280: 64 20 73 65 74 20 6f 66 20 22 70 72 69 6e 74 66  d set of "printf
0290: 22 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 20  " functions.**  
02a0: 20 20 20 20 20 20 20 69 6e 63 6c 75 64 65 73 20         includes 
02b0: 70 72 69 6e 74 66 2c 20 66 70 72 69 6e 74 66 2c  printf, fprintf,
02c0: 20 73 70 72 69 6e 74 66 2c 20 76 70 72 69 6e 74   sprintf, vprint
02d0: 66 2c 20 76 66 70 72 69 6e 74 66 2c 20 61 6e 64  f, vfprintf, and
02e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 73 70 72  .**         vspr
02f0: 69 6e 74 66 2e 20 20 54 68 69 73 20 6d 6f 64 75  intf.  This modu
0300: 6c 65 20 61 64 64 73 20 74 68 65 20 66 6f 6c 6c  le adds the foll
0310: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
0320: 20 20 20 20 20 20 20 2a 20 20 73 6e 70 72 69 6e         *  snprin
0330: 74 66 20 2d 2d 20 57 6f 72 6b 73 20 6c 69 6b 65  tf -- Works like
0340: 20 73 70 72 69 6e 74 66 2c 20 62 75 74 20 68 61   sprintf, but ha
0350: 73 20 61 6e 20 65 78 74 72 61 20 61 72 67 75 6d  s an extra argum
0360: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ent.**          
0370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0380: 77 68 69 63 68 20 69 73 20 74 68 65 20 73 69 7a  which is the siz
0390: 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
03a0: 77 72 69 74 74 65 6e 20 74 6f 2e 0a 2a 2a 0a 2a  written to..**.*
03b0: 2a 20 20 20 20 20 20 20 20 20 20 20 2a 20 20 6d  *           *  m
03c0: 70 72 69 6e 74 66 20 2d 2d 20 20 53 69 6d 69 6c  printf --  Simil
03d0: 61 72 20 74 6f 20 73 70 72 69 6e 74 66 2e 20 20  ar to sprintf.  
03e0: 57 72 69 74 65 73 20 6f 75 74 70 75 74 20 74 6f  Writes output to
03f0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 20 20 20   memory.**      
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0410: 20 20 20 20 6f 62 74 61 69 6e 65 64 20 66 72 6f      obtained fro
0420: 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2a 0a 2a 2a 20  m malloc..**.** 
0430: 20 20 20 20 20 20 20 20 20 20 2a 20 20 78 70 72            *  xpr
0440: 69 6e 74 66 20 2d 2d 20 20 43 61 6c 6c 73 20 61  intf --  Calls a
0450: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 64 69 73   function to dis
0460: 70 6f 73 65 20 6f 66 20 6f 75 74 70 75 74 2e 0a  pose of output..
0470: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
0480: 2a 20 20 6e 70 72 69 6e 74 66 20 2d 2d 20 20 4e  *  nprintf --  N
0490: 6f 20 6f 75 74 70 75 74 2c 20 62 75 74 20 72 65  o output, but re
04a0: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
04b0: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 0a 2a   of characters.*
04c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
04d0: 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
04e0: 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  would have been 
04f0: 6f 75 74 70 75 74 20 62 79 20 70 72 69 6e 74 66  output by printf
0500: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  ..**.**         
0510: 20 20 2a 20 20 41 20 76 2d 20 76 65 72 73 69 6f    *  A v- versio
0520: 6e 20 28 65 78 3a 20 76 73 6e 70 72 69 6e 74 66  n (ex: vsnprintf
0530: 29 20 6f 66 20 65 76 65 72 79 20 66 75 6e 63 74  ) of every funct
0540: 69 6f 6e 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 20  ion is also.**  
0550: 20 20 20 20 20 20 20 20 20 20 20 20 73 75 70 70              supp
0560: 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lied..**.**     
0570: 20 2b 20 20 41 20 66 65 77 20 65 78 74 65 6e 73   +  A few extens
0580: 69 6f 6e 73 20 74 6f 20 74 68 65 20 66 6f 72 6d  ions to the form
0590: 61 74 74 69 6e 67 20 6e 6f 74 61 74 69 6f 6e 20  atting notation 
05a0: 61 72 65 20 73 75 70 70 6f 72 74 65 64 3a 0a 2a  are supported:.*
05b0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 2a  *.**           *
05c0: 20 20 54 68 65 20 22 3d 22 20 66 6c 61 67 20 28    The "=" flag (
05d0: 73 69 6d 69 6c 61 72 20 74 6f 20 22 2d 22 29 20  similar to "-") 
05e0: 63 61 75 73 65 73 20 74 68 65 20 6f 75 74 70 75  causes the outpu
05f0: 74 20 74 6f 20 62 65 0a 2a 2a 20 20 20 20 20 20  t to be.**      
0600: 20 20 20 20 20 20 20 20 62 65 20 63 65 6e 74 65          be cente
0610: 72 65 64 20 69 6e 20 74 68 65 20 61 70 70 72 6f  red in the appro
0620: 70 72 69 61 74 65 6c 79 20 73 69 7a 65 64 20 66  priately sized f
0630: 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ield..**.**     
0640: 20 20 20 20 20 20 2a 20 20 54 68 65 20 25 62 20        *  The %b 
0650: 66 69 65 6c 64 20 6f 75 74 70 75 74 73 20 61 6e  field outputs an
0660: 20 69 6e 74 65 67 65 72 20 69 6e 20 62 69 6e 61   integer in bina
0670: 72 79 20 6e 6f 74 61 74 69 6f 6e 2e 0a 2a 2a 0a  ry notation..**.
0680: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 2a 20 20  **           *  
0690: 54 68 65 20 25 63 20 66 69 65 6c 64 20 6e 6f 77  The %c field now
06a0: 20 61 63 63 65 70 74 73 20 61 20 70 72 65 63 69   accepts a preci
06b0: 73 69 6f 6e 2e 20 20 54 68 65 20 63 68 61 72 61  sion.  The chara
06c0: 63 74 65 72 20 6f 75 74 70 75 74 0a 2a 2a 20 20  cter output.**  
06d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 72              is r
06e0: 65 70 65 61 74 65 64 20 62 79 20 74 68 65 20 6e  epeated by the n
06f0: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
0700: 68 65 20 70 72 65 63 69 73 69 6f 6e 20 73 70 65  he precision spe
0710: 63 69 66 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  cifies..**.**   
0720: 20 20 20 20 20 20 20 20 2a 20 20 54 68 65 20 25          *  The %
0730: 27 20 66 69 65 6c 64 20 77 6f 72 6b 73 20 6c 69  ' field works li
0740: 6b 65 20 25 63 2c 20 62 75 74 20 74 61 6b 65 73  ke %c, but takes
0750: 20 61 73 20 69 74 73 20 63 68 61 72 61 63 74 65   as its characte
0760: 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  r the.**        
0770: 20 20 20 20 20 20 6e 65 78 74 20 63 68 61 72 61        next chara
0780: 63 74 65 72 20 6f 66 20 74 68 65 20 66 6f 72 6d  cter of the form
0790: 61 74 20 73 74 72 69 6e 67 2c 20 69 6e 73 74 65  at string, inste
07a0: 61 64 20 6f 66 20 74 68 65 20 6e 65 78 74 0a 2a  ad of the next.*
07b0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
07c0: 72 67 75 6d 65 6e 74 2e 20 20 46 6f 72 20 65 78  rgument.  For ex
07d0: 61 6d 70 6c 65 2c 20 20 70 72 69 6e 74 66 28 22  ample,  printf("
07e0: 25 2e 37 38 27 2d 22 29 20 20 70 72 69 6e 74 73  %.78'-")  prints
07f0: 20 37 38 20 6d 69 6e 75 73 0a 2a 2a 20 20 20 20   78 minus.**    
0800: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 73 2c            signs,
0810: 20 74 68 65 20 73 61 6d 65 20 61 73 20 20 70 72   the same as  pr
0820: 69 6e 74 66 28 22 25 2e 37 38 63 22 2c 27 2d 27  intf("%.78c",'-'
0830: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 2b 20  )..**.**      + 
0840: 20 57 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 75   When compiled u
0850: 73 69 6e 67 20 47 43 43 20 6f 6e 20 61 20 53 50  sing GCC on a SP
0860: 41 52 43 2c 20 74 68 69 73 20 76 65 72 73 69 6f  ARC, this versio
0870: 6e 20 6f 66 20 70 72 69 6e 74 66 20 69 73 0a 2a  n of printf is.*
0880: 2a 20 20 20 20 20 20 20 20 20 66 61 73 74 65 72  *         faster
0890: 20 74 68 61 6e 20 74 68 65 20 6c 69 62 72 61 72   than the librar
08a0: 79 20 70 72 69 6e 74 66 20 66 6f 72 20 53 55 4e  y printf for SUN
08b0: 20 4f 53 20 34 2e 31 2e 0a 2a 2a 0a 2a 2a 20 20   OS 4.1..**.**  
08c0: 20 20 20 20 2b 20 20 41 6c 6c 20 66 75 6e 63 74      +  All funct
08d0: 69 6f 6e 73 20 61 72 65 20 66 75 6c 6c 79 20 72  ions are fully r
08e0: 65 65 6e 74 72 61 6e 74 2e 0a 2a 2a 0a 2a 2f 0a  eentrant..**.*/.
08f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0900: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 6f  Int.h"../*.** Co
0910: 6e 76 65 72 73 69 6f 6e 20 74 79 70 65 73 20 66  nversion types f
0920: 61 6c 6c 20 69 6e 74 6f 20 76 61 72 69 6f 75 73  all into various
0930: 20 63 61 74 65 67 6f 72 69 65 73 20 61 73 20 64   categories as d
0940: 65 66 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  efined by the.**
0950: 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 6e 75 6d 65   following enume
0960: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 64 65 66 69  ration..*/.#defi
0970: 6e 65 20 65 74 52 41 44 49 58 20 20 20 20 20 20  ne etRADIX      
0980: 20 31 20 2f 2a 20 49 6e 74 65 67 65 72 20 74 79   1 /* Integer ty
0990: 70 65 73 2e 20 20 25 64 2c 20 25 78 2c 20 25 6f  pes.  %d, %x, %o
09a0: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 20 2a  , and so forth *
09b0: 2f 0a 23 64 65 66 69 6e 65 20 65 74 46 4c 4f 41  /.#define etFLOA
09c0: 54 20 20 20 20 20 20 20 32 20 2f 2a 20 46 6c 6f  T       2 /* Flo
09d0: 61 74 69 6e 67 20 70 6f 69 6e 74 2e 20 20 25 66  ating point.  %f
09e0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65 74 45 58   */.#define etEX
09f0: 50 20 20 20 20 20 20 20 20 20 33 20 2f 2a 20 45  P         3 /* E
0a00: 78 70 6f 6e 65 6e 74 69 6f 6e 61 6c 20 6e 6f 74  xponentional not
0a10: 61 74 69 6f 6e 2e 20 25 65 20 61 6e 64 20 25 45  ation. %e and %E
0a20: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65 74 47 45   */.#define etGE
0a30: 4e 45 52 49 43 20 20 20 20 20 34 20 2f 2a 20 46  NERIC     4 /* F
0a40: 6c 6f 61 74 69 6e 67 20 6f 72 20 65 78 70 6f 6e  loating or expon
0a50: 65 6e 74 69 61 6c 2c 20 64 65 70 65 6e 64 69 6e  ential, dependin
0a60: 67 20 6f 6e 20 65 78 70 6f 6e 65 6e 74 2e 20 25  g on exponent. %
0a70: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65 74 53  g */.#define etS
0a80: 49 5a 45 20 20 20 20 20 20 20 20 35 20 2f 2a 20  IZE        5 /* 
0a90: 52 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 6f 66  Return number of
0aa0: 20 63 68 61 72 61 63 74 65 72 73 20 70 72 6f 63   characters proc
0ab0: 65 73 73 65 64 20 73 6f 20 66 61 72 2e 20 25 6e  essed so far. %n
0ac0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65 74 53 54   */.#define etST
0ad0: 52 49 4e 47 20 20 20 20 20 20 36 20 2f 2a 20 53  RING      6 /* S
0ae0: 74 72 69 6e 67 73 2e 20 25 73 20 2a 2f 0a 23 64  trings. %s */.#d
0af0: 65 66 69 6e 65 20 65 74 44 59 4e 53 54 52 49 4e  efine etDYNSTRIN
0b00: 47 20 20 20 37 20 2f 2a 20 44 79 6e 61 6d 69 63  G   7 /* Dynamic
0b10: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73  ally allocated s
0b20: 74 72 69 6e 67 73 2e 20 25 7a 20 2a 2f 0a 23 64  trings. %z */.#d
0b30: 65 66 69 6e 65 20 65 74 50 45 52 43 45 4e 54 20  efine etPERCENT 
0b40: 20 20 20 20 38 20 2f 2a 20 50 65 72 63 65 6e 74      8 /* Percent
0b50: 20 73 79 6d 62 6f 6c 2e 20 25 25 20 2a 2f 0a 23   symbol. %% */.#
0b60: 64 65 66 69 6e 65 20 65 74 43 48 41 52 58 20 20  define etCHARX  
0b70: 20 20 20 20 20 39 20 2f 2a 20 43 68 61 72 61 63       9 /* Charac
0b80: 74 65 72 73 2e 20 25 63 20 2a 2f 0a 23 64 65 66  ters. %c */.#def
0b90: 69 6e 65 20 65 74 45 52 52 4f 52 20 20 20 20 20  ine etERROR     
0ba0: 20 31 30 20 2f 2a 20 55 73 65 64 20 74 6f 20 69   10 /* Used to i
0bb0: 6e 64 69 63 61 74 65 20 6e 6f 20 73 75 63 68 20  ndicate no such 
0bc0: 63 6f 6e 76 65 72 73 69 6f 6e 20 74 79 70 65 20  conversion type 
0bd0: 2a 2f 0a 2f 2a 20 54 68 65 20 72 65 73 74 20 61  */./* The rest a
0be0: 72 65 20 65 78 74 65 6e 73 69 6f 6e 73 2c 20 6e  re extensions, n
0bf0: 6f 74 20 6e 6f 72 6d 61 6c 6c 79 20 66 6f 75 6e  ot normally foun
0c00: 64 20 69 6e 20 70 72 69 6e 74 66 28 29 20 2a 2f  d in printf() */
0c10: 0a 23 64 65 66 69 6e 65 20 65 74 43 48 41 52 4c  .#define etCHARL
0c20: 49 54 20 20 20 20 31 31 20 2f 2a 20 4c 69 74 65  IT    11 /* Lite
0c30: 72 61 6c 20 63 68 61 72 61 63 74 65 72 73 2e 20  ral characters. 
0c40: 20 25 27 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65   %' */.#define e
0c50: 74 53 51 4c 45 53 43 41 50 45 20 20 31 32 20 2f  tSQLESCAPE  12 /
0c60: 2a 20 53 74 72 69 6e 67 73 20 77 69 74 68 20 27  * Strings with '
0c70: 5c 27 27 20 64 6f 75 62 6c 65 64 2e 20 20 25 71  \'' doubled.  %q
0c80: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65 74 53 51   */.#define etSQ
0c90: 4c 45 53 43 41 50 45 32 20 31 33 20 2f 2a 20 53  LESCAPE2 13 /* S
0ca0: 74 72 69 6e 67 73 20 77 69 74 68 20 27 5c 27 27  trings with '\''
0cb0: 20 64 6f 75 62 6c 65 64 20 61 6e 64 20 65 6e 63   doubled and enc
0cc0: 6c 6f 73 65 64 20 69 6e 20 27 27 2c 0a 20 20 20  losed in '',.   
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 20 20 20 20 4e 55 4c 4c 20 70 6f 69 6e         NULL poin
0cf0: 74 65 72 73 20 72 65 70 6c 61 63 65 64 20 62 79  ters replaced by
0d00: 20 53 51 4c 20 4e 55 4c 4c 2e 20 20 25 51 20 2a   SQL NULL.  %Q *
0d10: 2f 0a 23 64 65 66 69 6e 65 20 65 74 54 4f 4b 45  /.#define etTOKE
0d20: 4e 20 20 20 20 20 20 31 34 20 2f 2a 20 61 20 70  N      14 /* a p
0d30: 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 6f 6b 65  ointer to a Toke
0d40: 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 23  n structure */.#
0d50: 64 65 66 69 6e 65 20 65 74 53 52 43 4c 49 53 54  define etSRCLIST
0d60: 20 20 20 20 31 35 20 2f 2a 20 61 20 70 6f 69 6e      15 /* a poin
0d70: 74 65 72 20 74 6f 20 61 20 53 72 63 4c 69 73 74  ter to a SrcList
0d80: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 22   */.../*.** An "
0d90: 65 74 42 79 74 65 22 20 69 73 20 61 6e 20 38 2d  etByte" is an 8-
0da0: 62 69 74 20 75 6e 73 69 67 6e 65 64 20 76 61 6c  bit unsigned val
0db0: 75 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 75  ue..*/.typedef u
0dc0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 74 42  nsigned char etB
0dd0: 79 74 65 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  yte;../*.** Each
0de0: 20 62 75 69 6c 74 69 6e 20 63 6f 6e 76 65 72 73   builtin convers
0df0: 69 6f 6e 20 63 68 61 72 61 63 74 65 72 20 28 65  ion character (e
0e00: 78 3a 20 74 68 65 20 27 64 27 20 69 6e 20 22 25  x: the 'd' in "%
0e10: 64 22 29 20 69 73 20 64 65 73 63 72 69 62 65 64  d") is described
0e20: 0a 2a 2a 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  .** by an instan
0e30: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0e40: 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2f  ing structure.*/
0e50: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0e60: 65 74 5f 69 6e 66 6f 20 7b 20 20 20 2f 2a 20 49  et_info {   /* I
0e70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
0e80: 20 65 61 63 68 20 66 6f 72 6d 61 74 20 66 69 65   each format fie
0e90: 6c 64 20 2a 2f 0a 20 20 63 68 61 72 20 66 6d 74  ld */.  char fmt
0ea0: 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  type;           
0eb0: 20 2f 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66   /* The format f
0ec0: 69 65 6c 64 20 63 6f 64 65 20 6c 65 74 74 65 72  ield code letter
0ed0: 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 62 61 73   */.  etByte bas
0ee0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
0ef0: 2a 20 54 68 65 20 62 61 73 65 20 66 6f 72 20 72  * The base for r
0f00: 61 64 69 78 20 63 6f 6e 76 65 72 73 69 6f 6e 20  adix conversion 
0f10: 2a 2f 0a 20 20 65 74 42 79 74 65 20 66 6c 61 67  */.  etByte flag
0f20: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
0f30: 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   One or more of 
0f40: 46 4c 41 47 5f 20 63 6f 6e 73 74 61 6e 74 73 20  FLAG_ constants 
0f50: 62 65 6c 6f 77 20 2a 2f 0a 20 20 65 74 42 79 74  below */.  etByt
0f60: 65 20 74 79 70 65 3b 20 20 20 20 20 20 20 20 20  e type;         
0f70: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 73 69 6f      /* Conversio
0f80: 6e 20 70 61 72 61 64 69 67 6d 20 2a 2f 0a 20 20  n paradigm */.  
0f90: 63 68 61 72 20 2a 63 68 61 72 73 65 74 3b 20 20  char *charset;  
0fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0fb0: 63 68 61 72 61 63 74 65 72 20 73 65 74 20 66 6f  character set fo
0fc0: 72 20 63 6f 6e 76 65 72 73 69 6f 6e 20 2a 2f 0a  r conversion */.
0fd0: 20 20 63 68 61 72 20 2a 70 72 65 66 69 78 3b 20    char *prefix; 
0fe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
0ff0: 65 66 69 78 20 6f 6e 20 6e 6f 6e 2d 7a 65 72 6f  efix on non-zero
1000: 20 76 61 6c 75 65 73 20 69 6e 20 61 6c 74 20 66   values in alt f
1010: 6f 72 6d 61 74 20 2a 2f 0a 7d 20 65 74 5f 69 6e  ormat */.} et_in
1020: 66 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  fo;../*.** Allow
1030: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 65 74  ed values for et
1040: 5f 69 6e 66 6f 2e 66 6c 61 67 73 0a 2a 2f 0a 23  _info.flags.*/.#
1050: 64 65 66 69 6e 65 20 46 4c 41 47 5f 53 49 47 4e  define FLAG_SIGN
1060: 45 44 20 20 31 20 20 20 20 20 2f 2a 20 54 72 75  ED  1     /* Tru
1070: 65 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 74  e if the value t
1080: 6f 20 63 6f 6e 76 65 72 74 20 69 73 20 73 69 67  o convert is sig
1090: 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46  ned */.#define F
10a0: 4c 41 47 5f 49 4e 54 45 52 4e 20 20 32 20 20 20  LAG_INTERN  2   
10b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 66 6f 72    /* True if for
10c0: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f 6e   internal use on
10d0: 6c 79 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  ly */.../*.** Th
10e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
10f0: 65 20 69 73 20 73 65 61 72 63 68 65 64 20 6c 69  e is searched li
1100: 6e 65 61 72 6c 79 2c 20 73 6f 20 69 74 20 69 73  nearly, so it is
1110: 20 67 6f 6f 64 20 74 6f 20 70 75 74 20 74 68 65   good to put the
1120: 0a 2a 2a 20 6d 6f 73 74 20 66 72 65 71 75 65 6e  .** most frequen
1130: 74 6c 79 20 75 73 65 64 20 63 6f 6e 76 65 72 73  tly used convers
1140: 69 6f 6e 20 74 79 70 65 73 20 66 69 72 73 74 2e  ion types first.
1150: 0a 2a 2f 0a 73 74 61 74 69 63 20 65 74 5f 69 6e  .*/.static et_in
1160: 66 6f 20 66 6d 74 69 6e 66 6f 5b 5d 20 3d 20 7b  fo fmtinfo[] = {
1170: 0a 20 20 7b 20 20 27 64 27 2c 20 31 30 2c 20 31  .  {  'd', 10, 1
1180: 2c 20 65 74 52 41 44 49 58 2c 20 20 20 20 20 20  , etRADIX,      
1190: 22 30 31 32 33 34 35 36 37 38 39 22 2c 20 20 20  "0123456789",   
11a0: 20 20 20 20 30 20 20 20 20 7d 2c 0a 20 20 7b 20      0    },.  { 
11b0: 20 27 73 27 2c 20 20 30 2c 20 30 2c 20 65 74 53   's',  0, 0, etS
11c0: 54 52 49 4e 47 2c 20 20 20 20 20 30 2c 20 20 20  TRING,     0,   
11d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
11e0: 20 20 20 20 7d 2c 0a 20 20 7b 20 20 27 7a 27 2c      },.  {  'z',
11f0: 20 20 30 2c 20 32 2c 20 65 74 44 59 4e 53 54 52    0, 2, etDYNSTR
1200: 49 4e 47 2c 20 20 30 2c 20 20 20 20 20 20 20 20  ING,  0,        
1210: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 7d            0    }
1220: 2c 0a 20 20 7b 20 20 27 71 27 2c 20 20 30 2c 20  ,.  {  'q',  0, 
1230: 30 2c 20 65 74 53 51 4c 45 53 43 41 50 45 2c 20  0, etSQLESCAPE, 
1240: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
1250: 20 20 20 20 20 30 20 20 20 20 7d 2c 0a 20 20 7b       0    },.  {
1260: 20 20 27 51 27 2c 20 20 30 2c 20 30 2c 20 65 74    'Q',  0, 0, et
1270: 53 51 4c 45 53 43 41 50 45 32 2c 20 30 2c 20 20  SQLESCAPE2, 0,  
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 30 20 20 20 20 7d 2c 0a 20 20 7b 20 20 27 63 27  0    },.  {  'c'
12a0: 2c 20 20 30 2c 20 30 2c 20 65 74 43 48 41 52 58  ,  0, 0, etCHARX
12b0: 2c 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20  ,      0,       
12c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
12d0: 7d 2c 0a 20 20 7b 20 20 27 6f 27 2c 20 20 38 2c  },.  {  'o',  8,
12e0: 20 30 2c 20 65 74 52 41 44 49 58 2c 20 20 20 20   0, etRADIX,    
12f0: 20 20 22 30 31 32 33 34 35 36 37 22 2c 20 20 20    "01234567",   
1300: 20 20 20 20 20 20 22 30 22 20 20 7d 2c 0a 20 20        "0"  },.  
1310: 7b 20 20 27 75 27 2c 20 31 30 2c 20 30 2c 20 65  {  'u', 10, 0, e
1320: 74 52 41 44 49 58 2c 20 20 20 20 20 20 22 30 31  tRADIX,      "01
1330: 32 33 34 35 36 37 38 39 22 2c 20 20 20 20 20 20  23456789",      
1340: 20 30 20 20 20 20 7d 2c 0a 20 20 7b 20 20 27 78   0    },.  {  'x
1350: 27 2c 20 31 36 2c 20 30 2c 20 65 74 52 41 44 49  ', 16, 0, etRADI
1360: 58 2c 20 20 20 20 20 20 22 30 31 32 33 34 35 36  X,      "0123456
1370: 37 38 39 61 62 63 64 65 66 22 2c 20 22 78 30 22  789abcdef", "x0"
1380: 20 7d 2c 0a 20 20 7b 20 20 27 58 27 2c 20 31 36   },.  {  'X', 16
1390: 2c 20 30 2c 20 65 74 52 41 44 49 58 2c 20 20 20  , 0, etRADIX,   
13a0: 20 20 20 22 30 31 32 33 34 35 36 37 38 39 41 42     "0123456789AB
13b0: 43 44 45 46 22 2c 20 22 58 30 22 20 7d 2c 0a 20  CDEF", "X0" },. 
13c0: 20 7b 20 20 27 66 27 2c 20 20 30 2c 20 31 2c 20   {  'f',  0, 1, 
13d0: 65 74 46 4c 4f 41 54 2c 20 20 20 20 20 20 30 2c  etFLOAT,      0,
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 30 20 20 20 20 7d 2c 0a 20 20 7b 20 20 27    0    },.  {  '
1400: 65 27 2c 20 20 30 2c 20 31 2c 20 65 74 45 58 50  e',  0, 1, etEXP
1410: 2c 20 20 20 20 20 20 20 20 22 65 22 2c 20 20 20  ,        "e",   
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
1430: 20 20 7d 2c 0a 20 20 7b 20 20 27 45 27 2c 20 20    },.  {  'E',  
1440: 30 2c 20 31 2c 20 65 74 45 58 50 2c 20 20 20 20  0, 1, etEXP,    
1450: 20 20 20 20 22 45 22 2c 20 20 20 20 20 20 20 20      "E",        
1460: 20 20 20 20 20 20 20 20 30 20 20 20 20 7d 2c 0a          0    },.
1470: 20 20 7b 20 20 27 67 27 2c 20 20 30 2c 20 31 2c    {  'g',  0, 1,
1480: 20 65 74 47 45 4e 45 52 49 43 2c 20 20 20 20 22   etGENERIC,    "
1490: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
14a0: 20 20 20 30 20 20 20 20 7d 2c 0a 20 20 7b 20 20     0    },.  {  
14b0: 27 47 27 2c 20 20 30 2c 20 31 2c 20 65 74 47 45  'G',  0, 1, etGE
14c0: 4e 45 52 49 43 2c 20 20 20 20 22 45 22 2c 20 20  NERIC,    "E",  
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
14e0: 20 20 20 7d 2c 0a 20 20 7b 20 20 27 69 27 2c 20     },.  {  'i', 
14f0: 31 30 2c 20 31 2c 20 65 74 52 41 44 49 58 2c 20  10, 1, etRADIX, 
1500: 20 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39       "0123456789
1510: 22 2c 20 20 20 20 20 20 20 30 20 20 20 20 7d 2c  ",       0    },
1520: 0a 20 20 7b 20 20 27 6e 27 2c 20 20 30 2c 20 30  .  {  'n',  0, 0
1530: 2c 20 65 74 53 49 5a 45 2c 20 20 20 20 20 20 20  , etSIZE,       
1540: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
1550: 20 20 20 20 30 20 20 20 20 7d 2c 0a 20 20 7b 20      0    },.  { 
1560: 20 27 25 27 2c 20 20 30 2c 20 30 2c 20 65 74 50   '%',  0, 0, etP
1570: 45 52 43 45 4e 54 2c 20 20 20 20 30 2c 20 20 20  ERCENT,    0,   
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1590: 20 20 20 20 7d 2c 0a 20 20 7b 20 20 27 70 27 2c      },.  {  'p',
15a0: 20 31 30 2c 20 30 2c 20 65 74 52 41 44 49 58 2c   10, 0, etRADIX,
15b0: 20 20 20 20 20 20 22 30 31 32 33 34 35 36 37 38        "012345678
15c0: 39 22 2c 20 20 20 20 20 20 20 30 20 20 20 20 7d  9",       0    }
15d0: 2c 0a 20 20 7b 20 20 27 54 27 2c 20 20 30 2c 20  ,.  {  'T',  0, 
15e0: 32 2c 20 65 74 54 4f 4b 45 4e 2c 20 20 20 20 20  2, etTOKEN,     
15f0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
1600: 20 20 20 20 20 30 20 20 20 20 7d 2c 0a 20 20 7b       0    },.  {
1610: 20 20 27 53 27 2c 20 20 30 2c 20 32 2c 20 65 74    'S',  0, 2, et
1620: 53 52 43 4c 49 53 54 2c 20 20 20 20 30 2c 20 20  SRCLIST,    0,  
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1640: 30 20 20 20 20 7d 2c 0a 7d 3b 0a 23 64 65 66 69  0    },.};.#defi
1650: 6e 65 20 65 74 4e 49 4e 46 4f 20 20 28 73 69 7a  ne etNINFO  (siz
1660: 65 6f 66 28 66 6d 74 69 6e 66 6f 29 2f 73 69 7a  eof(fmtinfo)/siz
1670: 65 6f 66 28 66 6d 74 69 6e 66 6f 5b 30 5d 29 29  eof(fmtinfo[0]))
1680: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 4e 4f 46 4c 4f  ../*.** If NOFLO
1690: 41 54 49 4e 47 50 4f 49 4e 54 20 69 73 20 64 65  ATINGPOINT is de
16a0: 66 69 6e 65 64 2c 20 74 68 65 6e 20 6e 6f 6e 65  fined, then none
16b0: 20 6f 66 20 74 68 65 20 66 6c 6f 61 74 69 6e 67   of the floating
16c0: 20 70 6f 69 6e 74 0a 2a 2a 20 63 6f 6e 76 65 72   point.** conver
16d0: 73 69 6f 6e 73 20 77 69 6c 6c 20 77 6f 72 6b 2e  sions will work.
16e0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 65 74 4e 4f  .*/.#ifndef etNO
16f0: 46 4c 4f 41 54 49 4e 47 50 4f 49 4e 54 0a 2f 2a  FLOATINGPOINT./*
1700: 0a 2a 2a 20 22 2a 76 61 6c 22 20 69 73 20 61 20  .** "*val" is a 
1710: 64 6f 75 62 6c 65 20 73 75 63 68 20 74 68 61 74  double such that
1720: 20 30 2e 31 20 3c 3d 20 2a 76 61 6c 20 3c 20 31   0.1 <= *val < 1
1730: 30 2e 30 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  0.0.** Return th
1740: 65 20 61 73 63 69 69 20 63 6f 64 65 20 66 6f 72  e ascii code for
1750: 20 74 68 65 20 6c 65 61 64 69 6e 67 20 64 69 67   the leading dig
1760: 69 74 20 6f 66 20 2a 76 61 6c 2c 20 74 68 65 6e  it of *val, then
1770: 0a 2a 2a 20 6d 75 6c 74 69 70 6c 79 20 22 2a 76  .** multiply "*v
1780: 61 6c 22 20 62 79 20 31 30 2e 30 20 74 6f 20 72  al" by 10.0 to r
1790: 65 6e 6f 72 6d 61 6c 69 7a 65 2e 0a 2a 2a 0a 2a  enormalize..**.*
17a0: 2a 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 20 20 20  * Example:.**   
17b0: 20 20 69 6e 70 75 74 3a 20 20 20 20 20 2a 76 61    input:     *va
17c0: 6c 20 3d 20 33 2e 31 34 31 35 39 0a 2a 2a 20 20  l = 3.14159.**  
17d0: 20 20 20 6f 75 74 70 75 74 3a 20 20 20 20 2a 76     output:    *v
17e0: 61 6c 20 3d 20 31 2e 34 31 35 39 20 20 20 20 66  al = 1.4159    f
17f0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 3d  unction return =
1800: 20 27 33 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   '3'.**.** The c
1810: 6f 75 6e 74 65 72 20 2a 63 6e 74 20 69 73 20 69  ounter *cnt is i
1820: 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68 20  ncremented each 
1830: 74 69 6d 65 2e 20 20 41 66 74 65 72 20 63 6f 75  time.  After cou
1840: 6e 74 65 72 20 65 78 63 65 65 64 73 0a 2a 2a 20  nter exceeds.** 
1850: 31 36 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f  16 (the number o
1860: 66 20 73 69 67 6e 69 66 69 63 61 6e 74 20 64 69  f significant di
1870: 67 69 74 73 20 69 6e 20 61 20 36 34 2d 62 69 74  gits in a 64-bit
1880: 20 66 6c 6f 61 74 29 20 27 30 27 20 69 73 0a 2a   float) '0' is.*
1890: 2a 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 65  * always returne
18a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
18b0: 20 65 74 5f 67 65 74 64 69 67 69 74 28 4c 4f 4e   et_getdigit(LON
18c0: 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 2a 76 61  GDOUBLE_TYPE *va
18d0: 6c 2c 20 69 6e 74 20 2a 63 6e 74 29 7b 0a 20 20  l, int *cnt){.  
18e0: 69 6e 74 20 64 69 67 69 74 3b 0a 20 20 4c 4f 4e  int digit;.  LON
18f0: 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 64 3b 0a  GDOUBLE_TYPE d;.
1900: 20 20 69 66 28 20 28 2a 63 6e 74 29 2b 2b 20 3e    if( (*cnt)++ >
1910: 3d 20 31 36 20 29 20 72 65 74 75 72 6e 20 27 30  = 16 ) return '0
1920: 27 3b 0a 20 20 64 69 67 69 74 20 3d 20 28 69 6e  ';.  digit = (in
1930: 74 29 2a 76 61 6c 3b 0a 20 20 64 20 3d 20 64 69  t)*val;.  d = di
1940: 67 69 74 3b 0a 20 20 64 69 67 69 74 20 2b 3d 20  git;.  digit += 
1950: 27 30 27 3b 0a 20 20 2a 76 61 6c 20 3d 20 28 2a  '0';.  *val = (*
1960: 76 61 6c 20 2d 20 64 29 2a 31 30 2e 30 3b 0a 20  val - d)*10.0;. 
1970: 20 72 65 74 75 72 6e 20 64 69 67 69 74 3b 0a 7d   return digit;.}
1980: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
1990: 20 65 74 42 55 46 53 49 5a 45 20 31 30 30 30 20   etBUFSIZE 1000 
19a0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
19b0: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  output buffer */
19c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74  ../*.** The root
19d0: 20 70 72 6f 67 72 61 6d 2e 20 20 41 6c 6c 20 76   program.  All v
19e0: 61 72 69 61 74 69 6f 6e 73 20 63 61 6c 6c 20 74  ariations call t
19f0: 68 69 73 20 63 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20  his core..**.** 
1a00: 49 4e 50 55 54 53 3a 0a 2a 2a 20 20 20 66 75 6e  INPUTS:.**   fun
1a10: 63 20 20 20 54 68 69 73 20 69 73 20 61 20 70 6f  c   This is a po
1a20: 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
1a30: 69 6f 6e 20 74 61 6b 69 6e 67 20 74 68 72 65 65  ion taking three
1a40: 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2a 20 20 20   arguments.**   
1a50: 20 20 20 20 20 20 20 20 20 31 2e 20 41 20 70 6f           1. A po
1a60: 69 6e 74 65 72 20 74 6f 20 61 6e 79 74 68 69 6e  inter to anythin
1a70: 67 2e 20 20 53 61 6d 65 20 61 73 20 74 68 65 20  g.  Same as the 
1a80: 22 61 72 67 22 20 70 61 72 61 6d 65 74 65 72 2e  "arg" parameter.
1a90: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 32  .**            2
1aa0: 2e 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  . A pointer to t
1ab0: 68 65 20 6c 69 73 74 20 6f 66 20 63 68 61 72 61  he list of chara
1ac0: 63 74 65 72 73 20 74 6f 20 62 65 20 6f 75 74 70  cters to be outp
1ad0: 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
1ae0: 20 20 20 20 28 4e 6f 74 65 2c 20 74 68 69 73 20      (Note, this 
1af0: 6c 69 73 74 20 69 73 20 4e 4f 54 20 6e 75 6c 6c  list is NOT null
1b00: 20 74 65 72 6d 69 6e 61 74 65 64 2e 29 0a 2a 2a   terminated.).**
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 33 2e 20 41              3. A
1b20: 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
1b30: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 74   of characters t
1b40: 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 2a 2a 20  o be output..** 
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4e                (N
1b60: 6f 74 65 3a 20 54 68 69 73 20 6e 75 6d 62 65 72  ote: This number
1b70: 20 6d 69 67 68 74 20 62 65 20 7a 65 72 6f 2e 29   might be zero.)
1b80: 0a 2a 2a 0a 2a 2a 20 20 20 61 72 67 20 20 20 20  .**.**   arg    
1b90: 54 68 69 73 20 69 73 20 74 68 65 20 70 6f 69 6e  This is the poin
1ba0: 74 65 72 20 74 6f 20 61 6e 79 74 68 69 6e 67 20  ter to anything 
1bb0: 77 68 69 63 68 20 77 69 6c 6c 20 62 65 20 70 61  which will be pa
1bc0: 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 20  ssed as the.**  
1bd0: 20 20 20 20 20 20 20 20 66 69 72 73 74 20 61 72          first ar
1be0: 67 75 6d 65 6e 74 20 74 6f 20 22 66 75 6e 63 22  gument to "func"
1bf0: 2e 20 20 55 73 65 20 69 74 20 66 6f 72 20 77 68  .  Use it for wh
1c00: 61 74 65 76 65 72 20 79 6f 75 20 6c 69 6b 65 2e  atever you like.
1c10: 0a 2a 2a 0a 2a 2a 20 20 20 66 6d 74 20 20 20 20  .**.**   fmt    
1c20: 54 68 69 73 20 69 73 20 74 68 65 20 66 6f 72 6d  This is the form
1c30: 61 74 20 73 74 72 69 6e 67 2c 20 61 73 20 69 6e  at string, as in
1c40: 20 74 68 65 20 75 73 75 61 6c 20 70 72 69 6e 74   the usual print
1c50: 2e 0a 2a 2a 0a 2a 2a 20 20 20 61 70 20 20 20 20  ..**.**   ap    
1c60: 20 54 68 69 73 20 69 73 20 61 20 70 6f 69 6e 74   This is a point
1c70: 65 72 20 74 6f 20 61 20 6c 69 73 74 20 6f 66 20  er to a list of 
1c80: 61 72 67 75 6d 65 6e 74 73 2e 20 20 53 61 6d 65  arguments.  Same
1c90: 20 61 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20   as in.**       
1ca0: 20 20 20 76 66 70 72 69 6e 74 2e 0a 2a 2a 0a 2a     vfprint..**.*
1cb0: 2a 20 4f 55 54 50 55 54 53 3a 0a 2a 2a 20 20 20  * OUTPUTS:.**   
1cc0: 20 20 20 20 20 20 20 54 68 65 20 72 65 74 75 72         The retur
1cd0: 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 74  n value is the t
1ce0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63  otal number of c
1cf0: 68 61 72 61 63 74 65 72 73 20 73 65 6e 74 20 74  haracters sent t
1d00: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68  o.**          th
1d10: 65 20 66 75 6e 63 74 69 6f 6e 20 22 66 75 6e 63  e function "func
1d20: 22 2e 20 20 52 65 74 75 72 6e 73 20 2d 31 20 6f  ".  Returns -1 o
1d30: 6e 20 61 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a  n a error..**.**
1d40: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6f   Note that the o
1d50: 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 61 75  rder in which au
1d60: 74 6f 6d 61 74 69 63 20 76 61 72 69 61 62 6c 65  tomatic variable
1d70: 73 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 62  s are declared b
1d80: 65 6c 6f 77 0a 2a 2a 20 73 65 65 6d 73 20 74 6f  elow.** seems to
1d90: 20 6d 61 6b 65 20 61 20 62 69 67 20 64 69 66 66   make a big diff
1da0: 65 72 65 6e 63 65 20 69 6e 20 64 65 74 65 72 6d  erence in determ
1db0: 69 6e 69 6e 67 20 68 6f 77 20 66 61 73 74 20 74  ining how fast t
1dc0: 68 69 73 20 62 65 61 73 74 0a 2a 2a 20 77 69 6c  his beast.** wil
1dd0: 6c 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  l run..*/.static
1de0: 20 69 6e 74 20 76 78 70 72 69 6e 74 66 28 0a 20   int vxprintf(. 
1df0: 20 76 6f 69 64 20 28 2a 66 75 6e 63 29 28 76 6f   void (*func)(vo
1e00: 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  id*,const char*,
1e10: 69 6e 74 29 2c 20 20 20 20 20 2f 2a 20 43 6f 6e  int),     /* Con
1e20: 73 75 6d 65 72 20 6f 66 20 74 65 78 74 20 2a 2f  sumer of text */
1e30: 0a 20 20 76 6f 69 64 20 2a 61 72 67 2c 20 20 20  .  void *arg,   
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
1e60: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 63  rgument to the c
1e70: 6f 6e 73 75 6d 65 72 20 2a 2f 0a 20 20 69 6e 74  onsumer */.  int
1e80: 20 75 73 65 45 78 74 65 6e 64 65 64 2c 20 20 20   useExtended,   
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea0: 2f 2a 20 41 6c 6c 6f 77 20 65 78 74 65 6e 64 65  /* Allow extende
1eb0: 64 20 25 2d 63 6f 6e 76 65 72 73 69 6f 6e 73 20  d %-conversions 
1ec0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1ed0: 2a 66 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  *fmt,           
1ee0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 6d 61          /* Forma
1ef0: 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 76 61  t string */.  va
1f00: 5f 6c 69 73 74 20 61 70 20 20 20 20 20 20 20 20  _list ap        
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 2f 2a 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   /* arguments */
1f30: 0a 29 7b 0a 20 20 69 6e 74 20 63 3b 20 20 20 20  .){.  int c;    
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 20 2f 2a 20 4e 65 78 74 20 63 68 61 72 61 63 74   /* Next charact
1f60: 65 72 20 69 6e 20 74 68 65 20 66 6f 72 6d 61 74  er in the format
1f70: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61   string */.  cha
1f80: 72 20 2a 62 75 66 70 74 3b 20 20 20 20 20 20 20  r *bufpt;       
1f90: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1fa0: 65 72 20 74 6f 20 74 68 65 20 63 6f 6e 76 65 72  er to the conver
1fb0: 73 69 6f 6e 20 62 75 66 66 65 72 20 2a 2f 0a 20  sion buffer */. 
1fc0: 20 69 6e 74 20 70 72 65 63 69 73 69 6f 6e 3b 20   int precision; 
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1fe0: 72 65 63 69 73 69 6f 6e 20 6f 66 20 74 68 65 20  recision of the 
1ff0: 63 75 72 72 65 6e 74 20 66 69 65 6c 64 20 2a 2f  current field */
2000: 0a 20 20 69 6e 74 20 6c 65 6e 67 74 68 3b 20 20  .  int length;  
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2020: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 66   Length of the f
2030: 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ield */.  int id
2040: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
2050: 20 20 20 20 20 2f 2a 20 41 20 67 65 6e 65 72 61       /* A genera
2060: 6c 20 70 75 72 70 6f 73 65 20 6c 6f 6f 70 20 63  l purpose loop c
2070: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
2080: 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  count;          
2090: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
20a0: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
20b0: 74 65 72 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20  ters output */. 
20c0: 20 69 6e 74 20 77 69 64 74 68 3b 20 20 20 20 20   int width;     
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
20e0: 69 64 74 68 20 6f 66 20 74 68 65 20 63 75 72 72  idth of the curr
20f0: 65 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20 65  ent field */.  e
2100: 74 42 79 74 65 20 66 6c 61 67 5f 6c 65 66 74 6a  tByte flag_leftj
2110: 75 73 74 69 66 79 3b 20 20 20 2f 2a 20 54 72 75  ustify;   /* Tru
2120: 65 20 69 66 20 22 2d 22 20 66 6c 61 67 20 69 73  e if "-" flag is
2130: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 65 74   present */.  et
2140: 42 79 74 65 20 66 6c 61 67 5f 70 6c 75 73 73 69  Byte flag_plussi
2150: 67 6e 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  gn;      /* True
2160: 20 69 66 20 22 2b 22 20 66 6c 61 67 20 69 73 20   if "+" flag is 
2170: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 65 74 42  present */.  etB
2180: 79 74 65 20 66 6c 61 67 5f 62 6c 61 6e 6b 73 69  yte flag_blanksi
2190: 67 6e 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20  gn;     /* True 
21a0: 69 66 20 22 20 22 20 66 6c 61 67 20 69 73 20 70  if " " flag is p
21b0: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 65 74 42 79  resent */.  etBy
21c0: 74 65 20 66 6c 61 67 5f 61 6c 74 65 72 6e 61 74  te flag_alternat
21d0: 65 66 6f 72 6d 3b 20 2f 2a 20 54 72 75 65 20 69  eform; /* True i
21e0: 66 20 22 23 22 20 66 6c 61 67 20 69 73 20 70 72  f "#" flag is pr
21f0: 65 73 65 6e 74 20 2a 2f 0a 20 20 65 74 42 79 74  esent */.  etByt
2200: 65 20 66 6c 61 67 5f 7a 65 72 6f 70 61 64 3b 20  e flag_zeropad; 
2210: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2220: 20 66 69 65 6c 64 20 77 69 64 74 68 20 63 6f 6e   field width con
2230: 73 74 61 6e 74 20 73 74 61 72 74 73 20 77 69 74  stant starts wit
2240: 68 20 7a 65 72 6f 20 2a 2f 0a 20 20 65 74 42 79  h zero */.  etBy
2250: 74 65 20 66 6c 61 67 5f 6c 6f 6e 67 3b 20 20 20  te flag_long;   
2260: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2270: 66 20 22 6c 22 20 66 6c 61 67 20 69 73 20 70 72  f "l" flag is pr
2280: 65 73 65 6e 74 20 2a 2f 0a 20 20 65 74 42 79 74  esent */.  etByt
2290: 65 20 66 6c 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 3b  e flag_longlong;
22a0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
22b0: 20 74 68 65 20 22 6c 6c 22 20 66 6c 61 67 20 69   the "ll" flag i
22c0: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 55  s present */.  U
22d0: 49 4e 54 36 34 5f 54 59 50 45 20 6c 6f 6e 67 76  INT64_TYPE longv
22e0: 61 6c 75 65 3b 20 20 20 20 20 2f 2a 20 56 61 6c  alue;     /* Val
22f0: 75 65 20 66 6f 72 20 69 6e 74 65 67 65 72 20 74  ue for integer t
2300: 79 70 65 73 20 2a 2f 0a 20 20 4c 4f 4e 47 44 4f  ypes */.  LONGDO
2310: 55 42 4c 45 5f 54 59 50 45 20 72 65 61 6c 76 61  UBLE_TYPE realva
2320: 6c 75 65 3b 20 2f 2a 20 56 61 6c 75 65 20 66 6f  lue; /* Value fo
2330: 72 20 72 65 61 6c 20 74 79 70 65 73 20 2a 2f 0a  r real types */.
2340: 20 20 65 74 5f 69 6e 66 6f 20 2a 69 6e 66 6f 70    et_info *infop
2350: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2360: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  Pointer to the a
2370: 70 70 72 6f 70 72 69 61 74 65 20 69 6e 66 6f 20  ppropriate info 
2380: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 63  structure */.  c
2390: 68 61 72 20 62 75 66 5b 65 74 42 55 46 53 49 5a  har buf[etBUFSIZ
23a0: 45 5d 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  E];       /* Con
23b0: 76 65 72 73 69 6f 6e 20 62 75 66 66 65 72 20 2a  version buffer *
23c0: 2f 0a 20 20 63 68 61 72 20 70 72 65 66 69 78 3b  /.  char prefix;
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23e0: 2a 20 50 72 65 66 69 78 20 63 68 61 72 61 63 74  * Prefix charact
23f0: 65 72 2e 20 20 22 2b 22 20 6f 72 20 22 2d 22 20  er.  "+" or "-" 
2400: 6f 72 20 22 20 22 20 6f 72 20 27 5c 30 27 2e 20  or " " or '\0'. 
2410: 2a 2f 0a 20 20 65 74 42 79 74 65 20 65 72 72 6f  */.  etByte erro
2420: 72 66 6c 61 67 20 3d 20 30 3b 20 20 20 20 20 20  rflag = 0;      
2430: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 65 72  /* True if an er
2440: 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
2450: 65 64 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 78  ed */.  etByte x
2460: 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  type;           
2470: 20 20 20 2f 2a 20 43 6f 6e 76 65 72 73 69 6f 6e     /* Conversion
2480: 20 70 61 72 61 64 69 67 6d 20 2a 2f 0a 20 20 63   paradigm */.  c
2490: 68 61 72 20 2a 7a 45 78 74 72 61 3b 20 20 20 20  har *zExtra;    
24a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
24b0: 72 61 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66  ra memory used f
24c0: 6f 72 20 65 74 54 43 4c 45 53 43 41 50 45 20 63  or etTCLESCAPE c
24d0: 6f 6e 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 20 20  onversions */.  
24e0: 73 74 61 74 69 63 20 63 68 61 72 20 73 70 61 63  static char spac
24f0: 65 73 5b 5d 20 3d 20 22 20 20 20 20 20 20 20 20  es[] = "        
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 20 20 20 20 20 20 20 20 20 20 22 3b 0a 23 64 65            ";.#de
2530: 66 69 6e 65 20 65 74 53 50 41 43 45 53 49 5a 45  fine etSPACESIZE
2540: 20 28 73 69 7a 65 6f 66 28 73 70 61 63 65 73 29   (sizeof(spaces)
2550: 2d 31 29 0a 23 69 66 6e 64 65 66 20 65 74 4e 4f  -1).#ifndef etNO
2560: 46 4c 4f 41 54 49 4e 47 50 4f 49 4e 54 0a 20 20  FLOATINGPOINT.  
2570: 69 6e 74 20 20 65 78 70 3b 20 20 20 20 20 20 20  int  exp;       
2580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 65 78             /* ex
2590: 70 6f 6e 65 6e 74 20 6f 66 20 72 65 61 6c 20 6e  ponent of real n
25a0: 75 6d 62 65 72 73 20 2a 2f 0a 20 20 64 6f 75 62  umbers */.  doub
25b0: 6c 65 20 72 6f 75 6e 64 65 72 3b 20 20 20 20 20  le rounder;     
25c0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66         /* Used f
25d0: 6f 72 20 72 6f 75 6e 64 69 6e 67 20 66 6c 6f 61  or rounding floa
25e0: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
25f0: 73 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 66 6c  s */.  etByte fl
2600: 61 67 5f 64 70 3b 20 20 20 20 20 20 20 20 20 20  ag_dp;          
2610: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 64 65 63    /* True if dec
2620: 69 6d 61 6c 20 70 6f 69 6e 74 20 73 68 6f 75 6c  imal point shoul
2630: 64 20 62 65 20 73 68 6f 77 6e 20 2a 2f 0a 20 20  d be shown */.  
2640: 65 74 42 79 74 65 20 66 6c 61 67 5f 72 74 7a 3b  etByte flag_rtz;
2650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2660: 75 65 20 69 66 20 74 72 61 69 6c 69 6e 67 20 7a  ue if trailing z
2670: 65 72 6f 73 20 73 68 6f 75 6c 64 20 62 65 20 72  eros should be r
2680: 65 6d 6f 76 65 64 20 2a 2f 0a 20 20 65 74 42 79  emoved */.  etBy
2690: 74 65 20 66 6c 61 67 5f 65 78 70 3b 20 20 20 20  te flag_exp;    
26a0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
26b0: 6f 20 66 6f 72 63 65 20 64 69 73 70 6c 61 79 20  o force display 
26c0: 6f 66 20 74 68 65 20 65 78 70 6f 6e 65 6e 74 20  of the exponent 
26d0: 2a 2f 0a 20 20 69 6e 74 20 6e 73 64 3b 20 20 20  */.  int nsd;   
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 69 67  /* Number of sig
2700: 6e 69 66 69 63 61 6e 74 20 64 69 67 69 74 73 20  nificant digits 
2710: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 23 65 6e 64  returned */.#end
2720: 69 66 0a 0a 20 20 66 75 6e 63 28 61 72 67 2c 22  if..  func(arg,"
2730: 22 2c 30 29 3b 0a 20 20 63 6f 75 6e 74 20 3d 20  ",0);.  count = 
2740: 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20 62 75  length = 0;.  bu
2750: 66 70 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 3b  fpt = 0;.  for(;
2760: 20 28 63 3d 28 2a 66 6d 74 29 29 21 3d 30 3b 20   (c=(*fmt))!=0; 
2770: 2b 2b 66 6d 74 29 7b 0a 20 20 20 20 69 66 28 20  ++fmt){.    if( 
2780: 63 21 3d 27 25 27 20 29 7b 0a 20 20 20 20 20 20  c!='%' ){.      
2790: 69 6e 74 20 61 6d 74 3b 0a 20 20 20 20 20 20 62  int amt;.      b
27a0: 75 66 70 74 20 3d 20 28 63 68 61 72 20 2a 29 66  ufpt = (char *)f
27b0: 6d 74 3b 0a 20 20 20 20 20 20 61 6d 74 20 3d 20  mt;.      amt = 
27c0: 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  1;.      while( 
27d0: 28 63 3d 28 2a 2b 2b 66 6d 74 29 29 21 3d 27 25  (c=(*++fmt))!='%
27e0: 27 20 26 26 20 63 21 3d 30 20 29 20 61 6d 74 2b  ' && c!=0 ) amt+
27f0: 2b 3b 0a 20 20 20 20 20 20 28 2a 66 75 6e 63 29  +;.      (*func)
2800: 28 61 72 67 2c 62 75 66 70 74 2c 61 6d 74 29 3b  (arg,bufpt,amt);
2810: 0a 20 20 20 20 20 20 63 6f 75 6e 74 20 2b 3d 20  .      count += 
2820: 61 6d 74 3b 0a 20 20 20 20 20 20 69 66 28 20 63  amt;.      if( c
2830: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
2840: 20 7d 0a 20 20 20 20 69 66 28 20 28 63 3d 28 2a   }.    if( (c=(*
2850: 2b 2b 66 6d 74 29 29 3d 3d 30 20 29 7b 0a 20 20  ++fmt))==0 ){.  
2860: 20 20 20 20 65 72 72 6f 72 66 6c 61 67 20 3d 20      errorflag = 
2870: 31 3b 0a 20 20 20 20 20 20 28 2a 66 75 6e 63 29  1;.      (*func)
2880: 28 61 72 67 2c 22 25 22 2c 31 29 3b 0a 20 20 20  (arg,"%",1);.   
2890: 20 20 20 63 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20     count++;.    
28a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
28b0: 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77     /* Find out w
28c0: 68 61 74 20 66 6c 61 67 73 20 61 72 65 20 70 72  hat flags are pr
28d0: 65 73 65 6e 74 20 2a 2f 0a 20 20 20 20 66 6c 61  esent */.    fla
28e0: 67 5f 6c 65 66 74 6a 75 73 74 69 66 79 20 3d 20  g_leftjustify = 
28f0: 66 6c 61 67 5f 70 6c 75 73 73 69 67 6e 20 3d 20  flag_plussign = 
2900: 66 6c 61 67 5f 62 6c 61 6e 6b 73 69 67 6e 20 3d  flag_blanksign =
2910: 20 0a 20 20 20 20 20 66 6c 61 67 5f 61 6c 74 65   .     flag_alte
2920: 72 6e 61 74 65 66 6f 72 6d 20 3d 20 66 6c 61 67  rnateform = flag
2930: 5f 7a 65 72 6f 70 61 64 20 3d 20 30 3b 0a 20 20  _zeropad = 0;.  
2940: 20 20 64 6f 7b 0a 20 20 20 20 20 20 73 77 69 74    do{.      swit
2950: 63 68 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20  ch( c ){.       
2960: 20 63 61 73 65 20 27 2d 27 3a 20 20 20 66 6c 61   case '-':   fla
2970: 67 5f 6c 65 66 74 6a 75 73 74 69 66 79 20 3d 20  g_leftjustify = 
2980: 31 3b 20 20 20 20 20 63 20 3d 20 30 3b 20 20 20  1;     c = 0;   
2990: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
29a0: 61 73 65 20 27 2b 27 3a 20 20 20 66 6c 61 67 5f  ase '+':   flag_
29b0: 70 6c 75 73 73 69 67 6e 20 3d 20 31 3b 20 20 20  plussign = 1;   
29c0: 20 20 20 20 20 63 20 3d 20 30 3b 20 20 20 62 72       c = 0;   br
29d0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
29e0: 65 20 27 20 27 3a 20 20 20 66 6c 61 67 5f 62 6c  e ' ':   flag_bl
29f0: 61 6e 6b 73 69 67 6e 20 3d 20 31 3b 20 20 20 20  anksign = 1;    
2a00: 20 20 20 63 20 3d 20 30 3b 20 20 20 62 72 65 61     c = 0;   brea
2a10: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
2a20: 27 23 27 3a 20 20 20 66 6c 61 67 5f 61 6c 74 65  '#':   flag_alte
2a30: 72 6e 61 74 65 66 6f 72 6d 20 3d 20 31 3b 20 20  rnateform = 1;  
2a40: 20 63 20 3d 20 30 3b 20 20 20 62 72 65 61 6b 3b   c = 0;   break;
2a50: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 30  .        case '0
2a60: 27 3a 20 20 20 66 6c 61 67 5f 7a 65 72 6f 70 61  ':   flag_zeropa
2a70: 64 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 63  d = 1;         c
2a80: 20 3d 20 30 3b 20 20 20 62 72 65 61 6b 3b 0a 20   = 0;   break;. 
2a90: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2ad0: 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
2ae0: 20 63 3d 3d 30 20 26 26 20 28 63 3d 28 2a 2b 2b   c==0 && (c=(*++
2af0: 66 6d 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  fmt))!=0 );.    
2b00: 2f 2a 20 47 65 74 20 74 68 65 20 66 69 65 6c 64  /* Get the field
2b10: 20 77 69 64 74 68 20 2a 2f 0a 20 20 20 20 77 69   width */.    wi
2b20: 64 74 68 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  dth = 0;.    if(
2b30: 20 63 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20   c=='*' ){.     
2b40: 20 77 69 64 74 68 20 3d 20 76 61 5f 61 72 67 28   width = va_arg(
2b50: 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  ap,int);.      i
2b60: 66 28 20 77 69 64 74 68 3c 30 20 29 7b 0a 20 20  f( width<0 ){.  
2b70: 20 20 20 20 20 20 66 6c 61 67 5f 6c 65 66 74 6a        flag_leftj
2b80: 75 73 74 69 66 79 20 3d 20 31 3b 0a 20 20 20 20  ustify = 1;.    
2b90: 20 20 20 20 77 69 64 74 68 20 3d 20 2d 77 69 64      width = -wid
2ba0: 74 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  th;.      }.    
2bb0: 20 20 63 20 3d 20 2a 2b 2b 66 6d 74 3b 0a 20 20    c = *++fmt;.  
2bc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77    }else{.      w
2bd0: 68 69 6c 65 28 20 63 3e 3d 27 30 27 20 26 26 20  hile( c>='0' && 
2be0: 63 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 20 20  c<='9' ){.      
2bf0: 20 20 77 69 64 74 68 20 3d 20 77 69 64 74 68 2a    width = width*
2c00: 31 30 20 2b 20 63 20 2d 20 27 30 27 3b 0a 20 20  10 + c - '0';.  
2c10: 20 20 20 20 20 20 63 20 3d 20 2a 2b 2b 66 6d 74        c = *++fmt
2c20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c30: 20 20 20 20 69 66 28 20 77 69 64 74 68 20 3e 20      if( width > 
2c40: 65 74 42 55 46 53 49 5a 45 2d 31 30 20 29 7b 0a  etBUFSIZE-10 ){.
2c50: 20 20 20 20 20 20 77 69 64 74 68 20 3d 20 65 74        width = et
2c60: 42 55 46 53 49 5a 45 2d 31 30 3b 0a 20 20 20 20  BUFSIZE-10;.    
2c70: 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65  }.    /* Get the
2c80: 20 70 72 65 63 69 73 69 6f 6e 20 2a 2f 0a 20 20   precision */.  
2c90: 20 20 69 66 28 20 63 3d 3d 27 2e 27 20 29 7b 0a    if( c=='.' ){.
2ca0: 20 20 20 20 20 20 70 72 65 63 69 73 69 6f 6e 20        precision 
2cb0: 3d 20 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a  = 0;.      c = *
2cc0: 2b 2b 66 6d 74 3b 0a 20 20 20 20 20 20 69 66 28  ++fmt;.      if(
2cd0: 20 63 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20   c=='*' ){.     
2ce0: 20 20 20 70 72 65 63 69 73 69 6f 6e 20 3d 20 76     precision = v
2cf0: 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
2d00: 20 20 20 20 20 20 20 69 66 28 20 70 72 65 63 69         if( preci
2d10: 73 69 6f 6e 3c 30 20 29 20 70 72 65 63 69 73 69  sion<0 ) precisi
2d20: 6f 6e 20 3d 20 2d 70 72 65 63 69 73 69 6f 6e 3b  on = -precision;
2d30: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 2a 2b 2b  .        c = *++
2d40: 66 6d 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  fmt;.      }else
2d50: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
2d60: 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39   c>='0' && c<='9
2d70: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ' ){.          p
2d80: 72 65 63 69 73 69 6f 6e 20 3d 20 70 72 65 63 69  recision = preci
2d90: 73 69 6f 6e 2a 31 30 20 2b 20 63 20 2d 20 27 30  sion*10 + c - '0
2da0: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  ';.          c =
2db0: 20 2a 2b 2b 66 6d 74 3b 0a 20 20 20 20 20 20 20   *++fmt;.       
2dc0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2dd0: 20 2f 2a 20 4c 69 6d 69 74 20 74 68 65 20 70 72   /* Limit the pr
2de0: 65 63 69 73 69 6f 6e 20 74 6f 20 70 72 65 76 65  ecision to preve
2df0: 6e 74 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20 62  nt overflowing b
2e00: 75 66 5b 5d 20 64 75 72 69 6e 67 20 63 6f 6e 76  uf[] during conv
2e10: 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ersion */.      
2e20: 69 66 28 20 70 72 65 63 69 73 69 6f 6e 3e 65 74  if( precision>et
2e30: 42 55 46 53 49 5a 45 2d 34 30 20 29 20 70 72 65  BUFSIZE-40 ) pre
2e40: 63 69 73 69 6f 6e 20 3d 20 65 74 42 55 46 53 49  cision = etBUFSI
2e50: 5a 45 2d 34 30 3b 0a 20 20 20 20 7d 65 6c 73 65  ZE-40;.    }else
2e60: 7b 0a 20 20 20 20 20 20 70 72 65 63 69 73 69 6f  {.      precisio
2e70: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  n = -1;.    }.  
2e80: 20 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6e    /* Get the con
2e90: 76 65 72 73 69 6f 6e 20 74 79 70 65 20 6d 6f 64  version type mod
2ea0: 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 69 66 28  ifier */.    if(
2eb0: 20 63 3d 3d 27 6c 27 20 29 7b 0a 20 20 20 20 20   c=='l' ){.     
2ec0: 20 66 6c 61 67 5f 6c 6f 6e 67 20 3d 20 31 3b 0a   flag_long = 1;.
2ed0: 20 20 20 20 20 20 63 20 3d 20 2a 2b 2b 66 6d 74        c = *++fmt
2ee0: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  ;.      if( c=='
2ef0: 6c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c  l' ){.        fl
2f00: 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 20 3d 20 31 3b  ag_longlong = 1;
2f10: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 2a 2b 2b  .        c = *++
2f20: 66 6d 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  fmt;.      }else
2f30: 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 5f 6c  {.        flag_l
2f40: 6f 6e 67 6c 6f 6e 67 20 3d 20 30 3b 0a 20 20 20  onglong = 0;.   
2f50: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2f60: 20 20 20 20 20 20 66 6c 61 67 5f 6c 6f 6e 67 20        flag_long 
2f70: 3d 20 66 6c 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 20  = flag_longlong 
2f80: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  = 0;.    }.    /
2f90: 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 66 6f  * Fetch the info
2fa0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
2fb0: 69 65 6c 64 20 2a 2f 0a 20 20 20 20 69 6e 66 6f  ield */.    info
2fc0: 70 20 3d 20 30 3b 0a 20 20 20 20 78 74 79 70 65  p = 0;.    xtype
2fd0: 20 3d 20 65 74 45 52 52 4f 52 3b 0a 20 20 20 20   = etERROR;.    
2fe0: 66 6f 72 28 69 64 78 3d 30 3b 20 69 64 78 3c 65  for(idx=0; idx<e
2ff0: 74 4e 49 4e 46 4f 3b 20 69 64 78 2b 2b 29 7b 0a  tNINFO; idx++){.
3000: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 66 6d 74        if( c==fmt
3010: 69 6e 66 6f 5b 69 64 78 5d 2e 66 6d 74 74 79 70  info[idx].fmttyp
3020: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 66  e ){.        inf
3030: 6f 70 20 3d 20 26 66 6d 74 69 6e 66 6f 5b 69 64  op = &fmtinfo[id
3040: 78 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x];.        if( 
3050: 75 73 65 45 78 74 65 6e 64 65 64 20 7c 7c 20 28  useExtended || (
3060: 69 6e 66 6f 70 2d 3e 66 6c 61 67 73 20 26 20 46  infop->flags & F
3070: 4c 41 47 5f 49 4e 54 45 52 4e 29 3d 3d 30 20 29  LAG_INTERN)==0 )
3080: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 74 79 70  {.          xtyp
3090: 65 20 3d 20 69 6e 66 6f 70 2d 3e 74 79 70 65 3b  e = infop->type;
30a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
30c0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 45 78 74  }.    }.    zExt
30d0: 72 61 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 0a  ra = 0;..    /*.
30e0: 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70      ** At this p
30f0: 6f 69 6e 74 2c 20 76 61 72 69 61 62 6c 65 73 20  oint, variables 
3100: 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
3110: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
3120: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 66 6c 61 67  **.    **   flag
3130: 5f 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d 20 20  _alternateform  
3140: 20 20 20 20 20 20 20 20 54 52 55 45 20 69 66 20          TRUE if 
3150: 61 20 27 23 27 20 69 73 20 70 72 65 73 65 6e 74  a '#' is present
3160: 2e 0a 20 20 20 20 2a 2a 20 20 20 66 6c 61 67 5f  ..    **   flag_
3170: 70 6c 75 73 73 69 67 6e 20 20 20 20 20 20 20 20  plussign        
3180: 20 20 20 20 20 20 20 54 52 55 45 20 69 66 20 61         TRUE if a
3190: 20 27 2b 27 20 69 73 20 70 72 65 73 65 6e 74 2e   '+' is present.
31a0: 0a 20 20 20 20 2a 2a 20 20 20 66 6c 61 67 5f 6c  .    **   flag_l
31b0: 65 66 74 6a 75 73 74 69 66 79 20 20 20 20 20 20  eftjustify      
31c0: 20 20 20 20 20 20 54 52 55 45 20 69 66 20 61 20        TRUE if a 
31d0: 27 2d 27 20 69 73 20 70 72 65 73 65 6e 74 20 6f  '-' is present o
31e0: 72 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  r if the.    ** 
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
3210: 65 6c 64 20 77 69 64 74 68 20 77 61 73 20 6e 65  eld width was ne
3220: 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2a 20 20  gative..    **  
3230: 20 66 6c 61 67 5f 7a 65 72 6f 70 61 64 20 20 20   flag_zeropad   
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 52 55               TRU
3250: 45 20 69 66 20 74 68 65 20 77 69 64 74 68 20 62  E if the width b
3260: 65 67 61 6e 20 77 69 74 68 20 30 2e 0a 20 20 20  egan with 0..   
3270: 20 2a 2a 20 20 20 66 6c 61 67 5f 6c 6f 6e 67 20   **   flag_long 
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 20 20 54 52 55 45 20 69 66 20 74 68 65 20 6c 65    TRUE if the le
32a0: 74 74 65 72 20 27 6c 27 20 28 65 6c 6c 29 20 70  tter 'l' (ell) p
32b0: 72 65 66 69 78 65 64 0a 20 20 20 20 2a 2a 20 20  refixed.    **  
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
32e0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 63 68 61 72   conversion char
32f0: 61 63 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20  acter..    **   
3300: 66 6c 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 20 20 20  flag_longlong   
3310: 20 20 20 20 20 20 20 20 20 20 20 20 54 52 55 45              TRUE
3320: 20 69 66 20 74 68 65 20 6c 65 74 74 65 72 20 27   if the letter '
3330: 6c 6c 27 20 28 65 6c 6c 20 65 6c 6c 29 20 70 72  ll' (ell ell) pr
3340: 65 66 69 78 65 64 0a 20 20 20 20 2a 2a 20 20 20  efixed.    **   
3350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3360: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
3370: 63 6f 6e 76 65 72 73 69 6f 6e 20 63 68 61 72 61  conversion chara
3380: 63 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 66  cter..    **   f
3390: 6c 61 67 5f 62 6c 61 6e 6b 73 69 67 6e 20 20 20  lag_blanksign   
33a0: 20 20 20 20 20 20 20 20 20 20 20 54 52 55 45 20             TRUE 
33b0: 69 66 20 61 20 27 20 27 20 69 73 20 70 72 65 73  if a ' ' is pres
33c0: 65 6e 74 2e 0a 20 20 20 20 2a 2a 20 20 20 77 69  ent..    **   wi
33d0: 64 74 68 20 20 20 20 20 20 20 20 20 20 20 20 20  dth             
33e0: 20 20 20 20 20 20 20 20 20 20 54 68 65 20 73 70            The sp
33f0: 65 63 69 66 69 65 64 20 66 69 65 6c 64 20 77 69  ecified field wi
3400: 64 74 68 2e 20 20 54 68 69 73 20 69 73 0a 20 20  dth.  This is.  
3410: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3430: 20 20 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 6e 65     always non-ne
3440: 67 61 74 69 76 65 2e 20 20 5a 65 72 6f 20 69 73  gative.  Zero is
3450: 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20   the default..  
3460: 20 20 2a 2a 20 20 20 70 72 65 63 69 73 69 6f 6e    **   precision
3470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3480: 20 20 20 54 68 65 20 73 70 65 63 69 66 69 65 64     The specified
3490: 20 70 72 65 63 69 73 69 6f 6e 2e 20 20 54 68 65   precision.  The
34a0: 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20   default.    ** 
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
34d0: 20 2d 31 2e 0a 20 20 20 20 2a 2a 20 20 20 78 74   -1..    **   xt
34e0: 79 70 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ype             
34f0: 20 20 20 20 20 20 20 20 20 20 54 68 65 20 63 6c            The cl
3500: 61 73 73 20 6f 66 20 74 68 65 20 63 6f 6e 76 65  ass of the conve
3510: 72 73 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20 20 20  rsion..    **   
3520: 69 6e 66 6f 70 20 20 20 20 20 20 20 20 20 20 20  infop           
3530: 20 20 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e              Poin
3540: 74 65 72 20 74 6f 20 74 68 65 20 61 70 70 72 6f  ter to the appro
3550: 70 72 69 61 74 65 20 69 6e 66 6f 20 73 74 72 75  priate info stru
3560: 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ct..    */.    s
3570: 77 69 74 63 68 28 20 78 74 79 70 65 20 29 7b 0a  witch( xtype ){.
3580: 20 20 20 20 20 20 63 61 73 65 20 65 74 52 41 44        case etRAD
3590: 49 58 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20  IX:.        if( 
35a0: 69 6e 66 6f 70 2d 3e 66 6c 61 67 73 20 26 20 46  infop->flags & F
35b0: 4c 41 47 5f 53 49 47 4e 45 44 20 29 7b 0a 20 20  LAG_SIGNED ){.  
35c0: 20 20 20 20 20 20 20 20 69 36 34 20 76 3b 0a 20          i64 v;. 
35d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61           if( fla
35e0: 67 5f 6c 6f 6e 67 6c 6f 6e 67 20 29 20 20 20 76  g_longlong )   v
35f0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 36 34   = va_arg(ap,i64
3600: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73  );.          els
3610: 65 20 69 66 28 20 66 6c 61 67 5f 6c 6f 6e 67 20  e if( flag_long 
3620: 29 20 20 76 20 3d 20 76 61 5f 61 72 67 28 61 70  )  v = va_arg(ap
3630: 2c 6c 6f 6e 67 20 69 6e 74 29 3b 0a 20 20 20 20  ,long int);.    
3640: 20 20 20 20 20 20 65 6c 73 65 20 20 20 20 20 20        else      
3650: 20 20 20 20 20 20 20 20 20 20 20 20 76 20 3d 20              v = 
3660: 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
3670: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3c            if( v<
3680: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
3690: 20 6c 6f 6e 67 76 61 6c 75 65 20 3d 20 2d 76 3b   longvalue = -v;
36a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65  .            pre
36b0: 66 69 78 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20  fix = '-';.     
36c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
36d0: 20 20 20 20 20 20 20 20 6c 6f 6e 67 76 61 6c 75          longvalu
36e0: 65 20 3d 20 76 3b 0a 20 20 20 20 20 20 20 20 20  e = v;.         
36f0: 20 20 20 69 66 28 20 66 6c 61 67 5f 70 6c 75 73     if( flag_plus
3700: 73 69 67 6e 20 29 20 20 20 20 20 20 20 20 70 72  sign )        pr
3710: 65 66 69 78 20 3d 20 27 2b 27 3b 0a 20 20 20 20  efix = '+';.    
3720: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
3730: 20 66 6c 61 67 5f 62 6c 61 6e 6b 73 69 67 6e 20   flag_blanksign 
3740: 29 20 20 70 72 65 66 69 78 20 3d 20 27 20 27 3b  )  prefix = ' ';
3750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73  .            els
3760: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
3770: 20 20 20 20 20 20 20 20 70 72 65 66 69 78 20 3d          prefix =
3780: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
3790: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
37a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61           if( fla
37b0: 67 5f 6c 6f 6e 67 6c 6f 6e 67 20 29 20 20 20 6c  g_longlong )   l
37c0: 6f 6e 67 76 61 6c 75 65 20 3d 20 76 61 5f 61 72  ongvalue = va_ar
37d0: 67 28 61 70 2c 75 36 34 29 3b 0a 20 20 20 20 20  g(ap,u64);.     
37e0: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 66 6c       else if( fl
37f0: 61 67 5f 6c 6f 6e 67 20 29 20 20 6c 6f 6e 67 76  ag_long )  longv
3800: 61 6c 75 65 20 3d 20 76 61 5f 61 72 67 28 61 70  alue = va_arg(ap
3810: 2c 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69  ,unsigned long i
3820: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65  nt);.          e
3830: 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  lse             
3840: 20 20 20 20 20 6c 6f 6e 67 76 61 6c 75 65 20 3d       longvalue =
3850: 20 76 61 5f 61 72 67 28 61 70 2c 75 6e 73 69 67   va_arg(ap,unsig
3860: 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ned int);.      
3870: 20 20 20 20 70 72 65 66 69 78 20 3d 20 30 3b 0a      prefix = 0;.
3880: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3890: 20 20 69 66 28 20 6c 6f 6e 67 76 61 6c 75 65 3d    if( longvalue=
38a0: 3d 30 20 29 20 66 6c 61 67 5f 61 6c 74 65 72 6e  =0 ) flag_altern
38b0: 61 74 65 66 6f 72 6d 20 3d 20 30 3b 0a 20 20 20  ateform = 0;.   
38c0: 20 20 20 20 20 69 66 28 20 66 6c 61 67 5f 7a 65       if( flag_ze
38d0: 72 6f 70 61 64 20 26 26 20 70 72 65 63 69 73 69  ropad && precisi
38e0: 6f 6e 3c 77 69 64 74 68 2d 28 70 72 65 66 69 78  on<width-(prefix
38f0: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
3900: 20 20 70 72 65 63 69 73 69 6f 6e 20 3d 20 77 69    precision = wi
3910: 64 74 68 2d 28 70 72 65 66 69 78 21 3d 30 29 3b  dth-(prefix!=0);
3920: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3930: 20 20 20 62 75 66 70 74 20 3d 20 26 62 75 66 5b     bufpt = &buf[
3940: 65 74 42 55 46 53 49 5a 45 2d 31 5d 3b 0a 20 20  etBUFSIZE-1];.  
3950: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
3960: 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20    register char 
3970: 2a 63 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 55  *cset;      /* U
3980: 73 65 20 72 65 67 69 73 74 65 72 73 20 66 6f 72  se registers for
3990: 20 73 70 65 65 64 20 2a 2f 0a 20 20 20 20 20 20   speed */.      
39a0: 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74      register int
39b0: 20 62 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20   base;.         
39c0: 20 63 73 65 74 20 3d 20 69 6e 66 6f 70 2d 3e 63   cset = infop->c
39d0: 68 61 72 73 65 74 3b 0a 20 20 20 20 20 20 20 20  harset;.        
39e0: 20 20 62 61 73 65 20 3d 20 69 6e 66 6f 70 2d 3e    base = infop->
39f0: 62 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  base;.          
3a00: 64 6f 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  do{             
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3a30: 20 43 6f 6e 76 65 72 74 20 74 6f 20 61 73 63 69   Convert to asci
3a40: 69 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  i */.           
3a50: 20 2a 28 2d 2d 62 75 66 70 74 29 20 3d 20 63 73   *(--bufpt) = cs
3a60: 65 74 5b 6c 6f 6e 67 76 61 6c 75 65 25 62 61 73  et[longvalue%bas
3a70: 65 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e];.            
3a80: 6c 6f 6e 67 76 61 6c 75 65 20 3d 20 6c 6f 6e 67  longvalue = long
3a90: 76 61 6c 75 65 2f 62 61 73 65 3b 0a 20 20 20 20  value/base;.    
3aa0: 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6c 6f        }while( lo
3ab0: 6e 67 76 61 6c 75 65 3e 30 20 29 3b 0a 20 20 20  ngvalue>0 );.   
3ac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c       }.        l
3ad0: 65 6e 67 74 68 20 3d 20 26 62 75 66 5b 65 74 42  ength = &buf[etB
3ae0: 55 46 53 49 5a 45 2d 31 5d 2d 62 75 66 70 74 3b  UFSIZE-1]-bufpt;
3af0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 64 78  .        for(idx
3b00: 3d 70 72 65 63 69 73 69 6f 6e 2d 6c 65 6e 67 74  =precision-lengt
3b10: 68 3b 20 69 64 78 3e 30 3b 20 69 64 78 2d 2d 29  h; idx>0; idx--)
3b20: 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 2d 2d  {.          *(--
3b30: 62 75 66 70 74 29 20 3d 20 27 30 27 3b 20 20 20  bufpt) = '0';   
3b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72            /* Zer
3b60: 6f 20 70 61 64 20 2a 2f 0a 20 20 20 20 20 20 20  o pad */.       
3b70: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
3b80: 72 65 66 69 78 20 29 20 2a 28 2d 2d 62 75 66 70  refix ) *(--bufp
3b90: 74 29 20 3d 20 70 72 65 66 69 78 3b 20 20 20 20  t) = prefix;    
3ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
3bb0: 64 20 73 69 67 6e 20 2a 2f 0a 20 20 20 20 20 20  d sign */.      
3bc0: 20 20 69 66 28 20 66 6c 61 67 5f 61 6c 74 65 72    if( flag_alter
3bd0: 6e 61 74 65 66 6f 72 6d 20 26 26 20 69 6e 66 6f  nateform && info
3be0: 70 2d 3e 70 72 65 66 69 78 20 29 7b 20 20 20 20  p->prefix ){    
3bf0: 20 20 2f 2a 20 41 64 64 20 22 30 22 20 6f 72 20    /* Add "0" or 
3c00: 22 30 78 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  "0x" */.        
3c10: 20 20 63 68 61 72 20 2a 70 72 65 2c 20 78 3b 0a    char *pre, x;.
3c20: 20 20 20 20 20 20 20 20 20 20 70 72 65 20 3d 20            pre = 
3c30: 69 6e 66 6f 70 2d 3e 70 72 65 66 69 78 3b 0a 20  infop->prefix;. 
3c40: 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 62 75           if( *bu
3c50: 66 70 74 21 3d 70 72 65 5b 30 5d 20 29 7b 0a 20  fpt!=pre[0] ){. 
3c60: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 70             for(p
3c70: 72 65 3d 69 6e 66 6f 70 2d 3e 70 72 65 66 69 78  re=infop->prefix
3c80: 3b 20 28 78 3d 28 2a 70 72 65 29 29 21 3d 30 3b  ; (x=(*pre))!=0;
3c90: 20 70 72 65 2b 2b 29 20 2a 28 2d 2d 62 75 66 70   pre++) *(--bufp
3ca0: 74 29 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20  t) = x;.        
3cb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
3cc0: 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 26        length = &
3cd0: 62 75 66 5b 65 74 42 55 46 53 49 5a 45 2d 31 5d  buf[etBUFSIZE-1]
3ce0: 2d 62 75 66 70 74 3b 0a 20 20 20 20 20 20 20 20  -bufpt;.        
3cf0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
3d00: 65 20 65 74 46 4c 4f 41 54 3a 0a 20 20 20 20 20  e etFLOAT:.     
3d10: 20 63 61 73 65 20 65 74 45 58 50 3a 0a 20 20 20   case etEXP:.   
3d20: 20 20 20 63 61 73 65 20 65 74 47 45 4e 45 52 49     case etGENERI
3d30: 43 3a 0a 20 20 20 20 20 20 20 20 72 65 61 6c 76  C:.        realv
3d40: 61 6c 75 65 20 3d 20 76 61 5f 61 72 67 28 61 70  alue = va_arg(ap
3d50: 2c 64 6f 75 62 6c 65 29 3b 0a 23 69 66 6e 64 65  ,double);.#ifnde
3d60: 66 20 65 74 4e 4f 46 4c 4f 41 54 49 4e 47 50 4f  f etNOFLOATINGPO
3d70: 49 4e 54 0a 20 20 20 20 20 20 20 20 69 66 28 20  INT.        if( 
3d80: 70 72 65 63 69 73 69 6f 6e 3c 30 20 29 20 70 72  precision<0 ) pr
3d90: 65 63 69 73 69 6f 6e 20 3d 20 36 3b 20 20 20 20  ecision = 6;    
3da0: 20 20 20 20 20 2f 2a 20 53 65 74 20 64 65 66 61       /* Set defa
3db0: 75 6c 74 20 70 72 65 63 69 73 69 6f 6e 20 2a 2f  ult precision */
3dc0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 72 65  .        if( pre
3dd0: 63 69 73 69 6f 6e 3e 65 74 42 55 46 53 49 5a 45  cision>etBUFSIZE
3de0: 2d 31 30 20 29 20 70 72 65 63 69 73 69 6f 6e 20  -10 ) precision 
3df0: 3d 20 65 74 42 55 46 53 49 5a 45 2d 31 30 3b 0a  = etBUFSIZE-10;.
3e00: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 61 6c          if( real
3e10: 76 61 6c 75 65 3c 30 2e 30 20 29 7b 0a 20 20 20  value<0.0 ){.   
3e20: 20 20 20 20 20 20 20 72 65 61 6c 76 61 6c 75 65         realvalue
3e30: 20 3d 20 2d 72 65 61 6c 76 61 6c 75 65 3b 0a 20   = -realvalue;. 
3e40: 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78 20           prefix 
3e50: 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d  = '-';.        }
3e60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
3e70: 69 66 28 20 66 6c 61 67 5f 70 6c 75 73 73 69 67  if( flag_plussig
3e80: 6e 20 29 20 20 20 20 20 20 20 20 20 20 70 72 65  n )          pre
3e90: 66 69 78 20 3d 20 27 2b 27 3b 0a 20 20 20 20 20  fix = '+';.     
3ea0: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 66 6c       else if( fl
3eb0: 61 67 5f 62 6c 61 6e 6b 73 69 67 6e 20 29 20 20  ag_blanksign )  
3ec0: 20 20 70 72 65 66 69 78 20 3d 20 27 20 27 3b 0a    prefix = ' ';.
3ed0: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 20            else  
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 20 20 20 20 20 20 20 70 72 65 66 69 78 20 3d 20         prefix = 
3f00: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
3f10: 20 20 20 20 20 69 66 28 20 69 6e 66 6f 70 2d 3e       if( infop->
3f20: 74 79 70 65 3d 3d 65 74 47 45 4e 45 52 49 43 20  type==etGENERIC 
3f30: 26 26 20 70 72 65 63 69 73 69 6f 6e 3e 30 20 29  && precision>0 )
3f40: 20 70 72 65 63 69 73 69 6f 6e 2d 2d 3b 0a 20 20   precision--;.  
3f50: 20 20 20 20 20 20 72 6f 75 6e 64 65 72 20 3d 20        rounder = 
3f60: 30 2e 30 3b 0a 23 69 66 20 30 0a 20 20 20 20 20  0.0;.#if 0.     
3f70: 20 20 20 2f 2a 20 52 6f 75 6e 64 69 6e 67 20 77     /* Rounding w
3f80: 6f 72 6b 73 20 6c 69 6b 65 20 42 53 44 20 77 68  orks like BSD wh
3f90: 65 6e 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  en the constant 
3fa0: 30 2e 34 39 39 39 20 69 73 20 75 73 65 64 2e 20  0.4999 is used. 
3fb0: 20 57 69 65 72 64 21 20 2a 2f 0a 20 20 20 20 20   Wierd! */.     
3fc0: 20 20 20 66 6f 72 28 69 64 78 3d 70 72 65 63 69     for(idx=preci
3fd0: 73 69 6f 6e 2c 20 72 6f 75 6e 64 65 72 3d 30 2e  sion, rounder=0.
3fe0: 34 39 39 39 3b 20 69 64 78 3e 30 3b 20 69 64 78  4999; idx>0; idx
3ff0: 2d 2d 2c 20 72 6f 75 6e 64 65 72 2a 3d 30 2e 31  --, rounder*=0.1
4000: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  );.#else.       
4010: 20 2f 2a 20 49 74 20 6d 61 6b 65 73 20 6d 6f 72   /* It makes mor
4020: 65 20 73 65 6e 73 65 20 74 6f 20 75 73 65 20 30  e sense to use 0
4030: 2e 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  .5 */.        fo
4040: 72 28 69 64 78 3d 70 72 65 63 69 73 69 6f 6e 2c  r(idx=precision,
4050: 20 72 6f 75 6e 64 65 72 3d 30 2e 35 3b 20 69 64   rounder=0.5; id
4060: 78 3e 30 3b 20 69 64 78 2d 2d 2c 20 72 6f 75 6e  x>0; idx--, roun
4070: 64 65 72 2a 3d 30 2e 31 29 3b 0a 23 65 6e 64 69  der*=0.1);.#endi
4080: 66 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  f.        if( in
4090: 66 6f 70 2d 3e 74 79 70 65 3d 3d 65 74 46 4c 4f  fop->type==etFLO
40a0: 41 54 20 29 20 72 65 61 6c 76 61 6c 75 65 20 2b  AT ) realvalue +
40b0: 3d 20 72 6f 75 6e 64 65 72 3b 0a 20 20 20 20 20  = rounder;.     
40c0: 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 69 7a 65 20     /* Normalize 
40d0: 72 65 61 6c 76 61 6c 75 65 20 74 6f 20 77 69 74  realvalue to wit
40e0: 68 69 6e 20 31 30 2e 30 20 3e 20 72 65 61 6c 76  hin 10.0 > realv
40f0: 61 6c 75 65 20 3e 3d 20 31 2e 30 20 2a 2f 0a 20  alue >= 1.0 */. 
4100: 20 20 20 20 20 20 20 65 78 70 20 3d 20 30 3b 0a         exp = 0;.
4110: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 61 6c          if( real
4120: 76 61 6c 75 65 3e 30 2e 30 20 29 7b 0a 20 20 20  value>0.0 ){.   
4130: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 65         while( re
4140: 61 6c 76 61 6c 75 65 3e 3d 31 65 38 20 26 26 20  alvalue>=1e8 && 
4150: 65 78 70 3c 3d 33 35 30 20 29 7b 20 72 65 61 6c  exp<=350 ){ real
4160: 76 61 6c 75 65 20 2a 3d 20 31 65 2d 38 3b 20 65  value *= 1e-8; e
4170: 78 70 2b 3d 38 3b 20 7d 0a 20 20 20 20 20 20 20  xp+=8; }.       
4180: 20 20 20 77 68 69 6c 65 28 20 72 65 61 6c 76 61     while( realva
4190: 6c 75 65 3e 3d 31 30 2e 30 20 26 26 20 65 78 70  lue>=10.0 && exp
41a0: 3c 3d 33 35 30 20 29 7b 20 72 65 61 6c 76 61 6c  <=350 ){ realval
41b0: 75 65 20 2a 3d 20 30 2e 31 3b 20 65 78 70 2b 2b  ue *= 0.1; exp++
41c0: 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 77 68  ; }.          wh
41d0: 69 6c 65 28 20 72 65 61 6c 76 61 6c 75 65 3c 31  ile( realvalue<1
41e0: 65 2d 38 20 26 26 20 65 78 70 3e 3d 2d 33 35 30  e-8 && exp>=-350
41f0: 20 29 7b 20 72 65 61 6c 76 61 6c 75 65 20 2a 3d   ){ realvalue *=
4200: 20 31 65 38 3b 20 65 78 70 2d 3d 38 3b 20 7d 0a   1e8; exp-=8; }.
4210: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
4220: 20 72 65 61 6c 76 61 6c 75 65 3c 31 2e 30 20 26   realvalue<1.0 &
4230: 26 20 65 78 70 3e 3d 2d 33 35 30 20 29 7b 20 72  & exp>=-350 ){ r
4240: 65 61 6c 76 61 6c 75 65 20 2a 3d 20 31 30 2e 30  ealvalue *= 10.0
4250: 3b 20 65 78 70 2d 2d 3b 20 7d 0a 20 20 20 20 20  ; exp--; }.     
4260: 20 20 20 20 20 69 66 28 20 65 78 70 3e 33 35 30       if( exp>350
4270: 20 7c 7c 20 65 78 70 3c 2d 33 35 30 20 29 7b 0a   || exp<-350 ){.
4280: 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66 70              bufp
4290: 74 20 3d 20 22 4e 61 4e 22 3b 0a 20 20 20 20 20  t = "NaN";.     
42a0: 20 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20         length = 
42b0: 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  3;.            b
42c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
42d0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
42e0: 20 20 20 20 62 75 66 70 74 20 3d 20 62 75 66 3b      bufpt = buf;
42f0: 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20  .        /*.    
4300: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 66 69      ** If the fi
4310: 65 6c 64 20 74 79 70 65 20 69 73 20 65 74 47 45  eld type is etGE
4320: 4e 45 52 49 43 2c 20 74 68 65 6e 20 63 6f 6e 76  NERIC, then conv
4330: 65 72 74 20 74 6f 20 65 69 74 68 65 72 20 65 74  ert to either et
4340: 45 58 50 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  EXP.        ** o
4350: 72 20 65 74 46 4c 4f 41 54 2c 20 61 73 20 61 70  r etFLOAT, as ap
4360: 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 20 20 20  propriate..     
4370: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6c     */.        fl
4380: 61 67 5f 65 78 70 20 3d 20 78 74 79 70 65 3d 3d  ag_exp = xtype==
4390: 65 74 45 58 50 3b 0a 20 20 20 20 20 20 20 20 69  etEXP;.        i
43a0: 66 28 20 78 74 79 70 65 21 3d 65 74 46 4c 4f 41  f( xtype!=etFLOA
43b0: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  T ){.          r
43c0: 65 61 6c 76 61 6c 75 65 20 2b 3d 20 72 6f 75 6e  ealvalue += roun
43d0: 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69  der;.          i
43e0: 66 28 20 72 65 61 6c 76 61 6c 75 65 3e 3d 31 30  f( realvalue>=10
43f0: 2e 30 20 29 7b 20 72 65 61 6c 76 61 6c 75 65 20  .0 ){ realvalue 
4400: 2a 3d 20 30 2e 31 3b 20 65 78 70 2b 2b 3b 20 7d  *= 0.1; exp++; }
4410: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4420: 20 20 20 69 66 28 20 78 74 79 70 65 3d 3d 65 74     if( xtype==et
4430: 47 45 4e 45 52 49 43 20 29 7b 0a 20 20 20 20 20  GENERIC ){.     
4440: 20 20 20 20 20 66 6c 61 67 5f 72 74 7a 20 3d 20       flag_rtz = 
4450: 21 66 6c 61 67 5f 61 6c 74 65 72 6e 61 74 65 66  !flag_alternatef
4460: 6f 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  orm;.          i
4470: 66 28 20 65 78 70 3c 2d 34 20 7c 7c 20 65 78 70  f( exp<-4 || exp
4480: 3e 70 72 65 63 69 73 69 6f 6e 20 29 7b 0a 20 20  >precision ){.  
4490: 20 20 20 20 20 20 20 20 20 20 78 74 79 70 65 20            xtype 
44a0: 3d 20 65 74 45 58 50 3b 0a 20 20 20 20 20 20 20  = etEXP;.       
44b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
44c0: 20 20 20 20 20 20 70 72 65 63 69 73 69 6f 6e 20        precision 
44d0: 3d 20 70 72 65 63 69 73 69 6f 6e 20 2d 20 65 78  = precision - ex
44e0: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 78  p;.            x
44f0: 74 79 70 65 20 3d 20 65 74 46 4c 4f 41 54 3b 0a  type = etFLOAT;.
4500: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4510: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4520: 20 20 20 20 20 66 6c 61 67 5f 72 74 7a 20 3d 20       flag_rtz = 
4530: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
4540: 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20       /*.        
4550: 2a 2a 20 54 68 65 20 22 65 78 70 2b 70 72 65 63  ** The "exp+prec
4560: 69 73 69 6f 6e 22 20 74 65 73 74 20 63 61 75 73  ision" test caus
4570: 65 73 20 6f 75 74 70 75 74 20 74 6f 20 62 65 20  es output to be 
4580: 6f 66 20 74 79 70 65 20 65 74 45 58 50 20 69 66  of type etEXP if
4590: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
45a0: 70 72 65 63 69 73 69 6f 6e 20 69 73 20 74 6f 6f  precision is too
45b0: 20 6c 61 72 67 65 20 74 6f 20 66 69 74 20 69 6e   large to fit in
45c0: 20 62 75 66 5b 5d 2e 0a 20 20 20 20 20 20 20 20   buf[]..        
45d0: 2a 2f 0a 20 20 20 20 20 20 20 20 6e 73 64 20 3d  */.        nsd =
45e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
45f0: 78 74 79 70 65 3d 3d 65 74 46 4c 4f 41 54 20 26  xtype==etFLOAT &
4600: 26 20 65 78 70 2b 70 72 65 63 69 73 69 6f 6e 3c  & exp+precision<
4610: 65 74 42 55 46 53 49 5a 45 2d 33 30 20 29 7b 0a  etBUFSIZE-30 ){.
4620: 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 5f 64            flag_d
4630: 70 20 3d 20 28 70 72 65 63 69 73 69 6f 6e 3e 30  p = (precision>0
4640: 20 7c 7c 20 66 6c 61 67 5f 61 6c 74 65 72 6e 61   || flag_alterna
4650: 74 65 66 6f 72 6d 29 3b 0a 20 20 20 20 20 20 20  teform);.       
4660: 20 20 20 69 66 28 20 70 72 65 66 69 78 20 29 20     if( prefix ) 
4670: 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20 70 72 65  *(bufpt++) = pre
4680: 66 69 78 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  fix;         /* 
4690: 53 69 67 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  Sign */.        
46a0: 20 20 69 66 28 20 65 78 70 3c 30 20 29 20 20 2a    if( exp<0 )  *
46b0: 28 62 75 66 70 74 2b 2b 29 20 3d 20 27 30 27 3b  (bufpt++) = '0';
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
46d0: 69 67 69 74 73 20 62 65 66 6f 72 65 20 22 2e 22  igits before "."
46e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 65 6c   */.          el
46f0: 73 65 20 66 6f 72 28 3b 20 65 78 70 3e 3d 30 3b  se for(; exp>=0;
4700: 20 65 78 70 2d 2d 29 20 2a 28 62 75 66 70 74 2b   exp--) *(bufpt+
4710: 2b 29 20 3d 20 65 74 5f 67 65 74 64 69 67 69 74  +) = et_getdigit
4720: 28 26 72 65 61 6c 76 61 6c 75 65 2c 26 6e 73 64  (&realvalue,&nsd
4730: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
4740: 20 66 6c 61 67 5f 64 70 20 29 20 2a 28 62 75 66   flag_dp ) *(buf
4750: 70 74 2b 2b 29 20 3d 20 27 2e 27 3b 20 20 20 20  pt++) = '.';    
4760: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 65         /* The de
4770: 63 69 6d 61 6c 20 70 6f 69 6e 74 20 2a 2f 0a 20  cimal point */. 
4780: 20 20 20 20 20 20 20 20 20 66 6f 72 28 65 78 70           for(exp
4790: 2b 2b 3b 20 65 78 70 3c 30 20 26 26 20 70 72 65  ++; exp<0 && pre
47a0: 63 69 73 69 6f 6e 3e 30 3b 20 70 72 65 63 69 73  cision>0; precis
47b0: 69 6f 6e 2d 2d 2c 20 65 78 70 2b 2b 29 7b 0a 20  ion--, exp++){. 
47c0: 20 20 20 20 20 20 20 20 20 20 20 2a 28 62 75 66             *(buf
47d0: 70 74 2b 2b 29 20 3d 20 27 30 27 3b 0a 20 20 20  pt++) = '0';.   
47e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
47f0: 20 20 20 77 68 69 6c 65 28 20 28 70 72 65 63 69     while( (preci
4800: 73 69 6f 6e 2d 2d 29 3e 30 20 29 20 2a 28 62 75  sion--)>0 ) *(bu
4810: 66 70 74 2b 2b 29 20 3d 20 65 74 5f 67 65 74 64  fpt++) = et_getd
4820: 69 67 69 74 28 26 72 65 61 6c 76 61 6c 75 65 2c  igit(&realvalue,
4830: 26 6e 73 64 29 3b 0a 20 20 20 20 20 20 20 20 20  &nsd);.         
4840: 20 2a 28 62 75 66 70 74 2d 2d 29 20 3d 20 30 3b   *(bufpt--) = 0;
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4870: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 2a 2f 0a  ll terminate */.
4880: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66 6c            if( fl
4890: 61 67 5f 72 74 7a 20 26 26 20 66 6c 61 67 5f 64  ag_rtz && flag_d
48a0: 70 20 29 7b 20 20 20 20 20 2f 2a 20 52 65 6d 6f  p ){     /* Remo
48b0: 76 65 20 74 72 61 69 6c 69 6e 67 20 7a 65 72 6f  ve trailing zero
48c0: 73 20 61 6e 64 20 22 2e 22 20 2a 2f 0a 20 20 20  s and "." */.   
48d0: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
48e0: 62 75 66 70 74 3e 3d 62 75 66 20 26 26 20 2a 62  bufpt>=buf && *b
48f0: 75 66 70 74 3d 3d 27 30 27 20 29 20 2a 28 62 75  ufpt=='0' ) *(bu
4900: 66 70 74 2d 2d 29 20 3d 20 30 3b 0a 20 20 20 20  fpt--) = 0;.    
4910: 20 20 20 20 20 20 20 20 69 66 28 20 62 75 66 70          if( bufp
4920: 74 3e 3d 62 75 66 20 26 26 20 2a 62 75 66 70 74  t>=buf && *bufpt
4930: 3d 3d 27 2e 27 20 29 20 2a 28 62 75 66 70 74 2d  =='.' ) *(bufpt-
4940: 2d 29 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  -) = 0;.        
4950: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 75    }.          bu
4960: 66 70 74 2b 2b 3b 20 20 20 20 20 20 20 20 20 20  fpt++;          
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4980: 20 20 2f 2a 20 70 6f 69 6e 74 20 74 6f 20 6e 65    /* point to ne
4990: 78 74 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  xt free slot */.
49a0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 20          }else{  
49b0: 20 20 2f 2a 20 65 74 45 58 50 20 6f 72 20 65 74    /* etEXP or et
49c0: 47 45 4e 45 52 49 43 20 2a 2f 0a 20 20 20 20 20  GENERIC */.     
49d0: 20 20 20 20 20 66 6c 61 67 5f 64 70 20 3d 20 28       flag_dp = (
49e0: 70 72 65 63 69 73 69 6f 6e 3e 30 20 7c 7c 20 66  precision>0 || f
49f0: 6c 61 67 5f 61 6c 74 65 72 6e 61 74 65 66 6f 72  lag_alternatefor
4a00: 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  m);.          if
4a10: 28 20 70 72 65 66 69 78 20 29 20 2a 28 62 75 66  ( prefix ) *(buf
4a20: 70 74 2b 2b 29 20 3d 20 70 72 65 66 69 78 3b 20  pt++) = prefix; 
4a30: 20 20 2f 2a 20 53 69 67 6e 20 2a 2f 0a 20 20 20    /* Sign */.   
4a40: 20 20 20 20 20 20 20 2a 28 62 75 66 70 74 2b 2b         *(bufpt++
4a50: 29 20 3d 20 65 74 5f 67 65 74 64 69 67 69 74 28  ) = et_getdigit(
4a60: 26 72 65 61 6c 76 61 6c 75 65 2c 26 6e 73 64 29  &realvalue,&nsd)
4a70: 3b 20 20 2f 2a 20 46 69 72 73 74 20 64 69 67 69  ;  /* First digi
4a80: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  t */.          i
4a90: 66 28 20 66 6c 61 67 5f 64 70 20 29 20 2a 28 62  f( flag_dp ) *(b
4aa0: 75 66 70 74 2b 2b 29 20 3d 20 27 2e 27 3b 20 20  ufpt++) = '.';  
4ab0: 20 20 20 2f 2a 20 44 65 63 69 6d 61 6c 20 70 6f     /* Decimal po
4ac0: 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  int */.         
4ad0: 20 77 68 69 6c 65 28 20 28 70 72 65 63 69 73 69   while( (precisi
4ae0: 6f 6e 2d 2d 29 3e 30 20 29 20 2a 28 62 75 66 70  on--)>0 ) *(bufp
4af0: 74 2b 2b 29 20 3d 20 65 74 5f 67 65 74 64 69 67  t++) = et_getdig
4b00: 69 74 28 26 72 65 61 6c 76 61 6c 75 65 2c 26 6e  it(&realvalue,&n
4b10: 73 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  sd);.          b
4b20: 75 66 70 74 2d 2d 3b 20 20 20 20 20 20 20 20 20  ufpt--;         
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b40: 20 20 20 2f 2a 20 70 6f 69 6e 74 20 74 6f 20 6c     /* point to l
4b50: 61 73 74 20 64 69 67 69 74 20 2a 2f 0a 20 20 20  ast digit */.   
4b60: 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 5f         if( flag_
4b70: 72 74 7a 20 26 26 20 66 6c 61 67 5f 64 70 20 29  rtz && flag_dp )
4b80: 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  {          /* Re
4b90: 6d 6f 76 65 20 74 61 69 6c 20 7a 65 72 6f 73 20  move tail zeros 
4ba0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  */.            w
4bb0: 68 69 6c 65 28 20 62 75 66 70 74 3e 3d 62 75 66  hile( bufpt>=buf
4bc0: 20 26 26 20 2a 62 75 66 70 74 3d 3d 27 30 27 20   && *bufpt=='0' 
4bd0: 29 20 2a 28 62 75 66 70 74 2d 2d 29 20 3d 20 30  ) *(bufpt--) = 0
4be0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
4bf0: 28 20 62 75 66 70 74 3e 3d 62 75 66 20 26 26 20  ( bufpt>=buf && 
4c00: 2a 62 75 66 70 74 3d 3d 27 2e 27 20 29 20 2a 28  *bufpt=='.' ) *(
4c10: 62 75 66 70 74 2d 2d 29 20 3d 20 30 3b 0a 20 20  bufpt--) = 0;.  
4c20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4c30: 20 20 20 20 62 75 66 70 74 2b 2b 3b 20 20 20 20      bufpt++;    
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c50: 20 20 20 20 20 20 20 20 2f 2a 20 70 6f 69 6e 74          /* point
4c60: 20 74 6f 20 6e 65 78 74 20 66 72 65 65 20 73 6c   to next free sl
4c70: 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ot */.          
4c80: 69 66 28 20 65 78 70 20 7c 7c 20 66 6c 61 67 5f  if( exp || flag_
4c90: 65 78 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  exp ){.         
4ca0: 20 20 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20     *(bufpt++) = 
4cb0: 69 6e 66 6f 70 2d 3e 63 68 61 72 73 65 74 5b 30  infop->charset[0
4cc0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ];.            i
4cd0: 66 28 20 65 78 70 3c 30 20 29 7b 20 2a 28 62 75  f( exp<0 ){ *(bu
4ce0: 66 70 74 2b 2b 29 20 3d 20 27 2d 27 3b 20 65 78  fpt++) = '-'; ex
4cf0: 70 20 3d 20 2d 65 78 70 3b 20 7d 20 2f 2a 20 73  p = -exp; } /* s
4d00: 69 67 6e 20 6f 66 20 65 78 70 20 2a 2f 0a 20 20  ign of exp */.  
4d10: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 20            else  
4d20: 20 20 20 20 20 7b 20 2a 28 62 75 66 70 74 2b 2b       { *(bufpt++
4d30: 29 20 3d 20 27 2b 27 3b 20 7d 0a 20 20 20 20 20  ) = '+'; }.     
4d40: 20 20 20 20 20 20 20 69 66 28 20 65 78 70 3e 3d         if( exp>=
4d50: 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  100 ){.         
4d60: 20 20 20 20 20 2a 28 62 75 66 70 74 2b 2b 29 20       *(bufpt++) 
4d70: 3d 20 28 65 78 70 2f 31 30 30 29 2b 27 30 27 3b  = (exp/100)+'0';
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d90: 2f 2a 20 31 30 30 27 73 20 64 69 67 69 74 20 2a  /* 100's digit *
4da0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
4db0: 65 78 70 20 25 3d 20 31 30 30 3b 0a 20 20 20 20  exp %= 100;.    
4dc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4dd0: 20 20 20 20 20 20 2a 28 62 75 66 70 74 2b 2b 29        *(bufpt++)
4de0: 20 3d 20 65 78 70 2f 31 30 2b 27 30 27 3b 20 20   = exp/10+'0';  
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e00: 20 20 20 2f 2a 20 31 30 27 73 20 64 69 67 69 74     /* 10's digit
4e10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
4e20: 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20 65 78 70  *(bufpt++) = exp
4e30: 25 31 30 2b 27 30 27 3b 20 20 20 20 20 20 20 20  %10+'0';        
4e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e50: 31 27 73 20 64 69 67 69 74 20 2a 2f 0a 20 20 20  1's digit */.   
4e60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4e70: 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68   }.        /* Th
4e80: 65 20 63 6f 6e 76 65 72 74 65 64 20 6e 75 6d 62  e converted numb
4e90: 65 72 20 69 73 20 69 6e 20 62 75 66 5b 5d 20 61  er is in buf[] a
4ea0: 6e 64 20 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74  nd zero terminat
4eb0: 65 64 2e 20 4f 75 74 70 75 74 20 69 74 2e 0a 20  ed. Output it.. 
4ec0: 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74         ** Note t
4ed0: 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 69  hat the number i
4ee0: 73 20 69 6e 20 74 68 65 20 75 73 75 61 6c 20 6f  s in the usual o
4ef0: 72 64 65 72 2c 20 6e 6f 74 20 72 65 76 65 72 73  rder, not revers
4f00: 65 64 20 61 73 20 77 69 74 68 0a 20 20 20 20 20  ed as with.     
4f10: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 63 6f     ** integer co
4f20: 6e 76 65 72 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20  nversions. */.  
4f30: 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 62        length = b
4f40: 75 66 70 74 2d 62 75 66 3b 0a 20 20 20 20 20 20  ufpt-buf;.      
4f50: 20 20 62 75 66 70 74 20 3d 20 62 75 66 3b 0a 0a    bufpt = buf;..
4f60: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69          /* Speci
4f70: 61 6c 20 63 61 73 65 3a 20 20 41 64 64 20 6c 65  al case:  Add le
4f80: 61 64 69 6e 67 20 7a 65 72 6f 73 20 69 66 20 74  ading zeros if t
4f90: 68 65 20 66 6c 61 67 5f 7a 65 72 6f 70 61 64 20  he flag_zeropad 
4fa0: 66 6c 61 67 20 69 73 0a 20 20 20 20 20 20 20 20  flag is.        
4fb0: 2a 2a 20 73 65 74 20 61 6e 64 20 77 65 20 61 72  ** set and we ar
4fc0: 65 20 6e 6f 74 20 6c 65 66 74 20 6a 75 73 74 69  e not left justi
4fd0: 66 69 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  fied */.        
4fe0: 69 66 28 20 66 6c 61 67 5f 7a 65 72 6f 70 61 64  if( flag_zeropad
4ff0: 20 26 26 20 21 66 6c 61 67 5f 6c 65 66 74 6a 75   && !flag_leftju
5000: 73 74 69 66 79 20 26 26 20 6c 65 6e 67 74 68 20  stify && length 
5010: 3c 20 77 69 64 74 68 29 7b 0a 20 20 20 20 20 20  < width){.      
5020: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
5030: 20 20 20 20 20 69 6e 74 20 6e 50 61 64 20 3d 20       int nPad = 
5040: 77 69 64 74 68 20 2d 20 6c 65 6e 67 74 68 3b 0a  width - length;.
5050: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
5060: 77 69 64 74 68 3b 20 69 3e 3d 6e 50 61 64 3b 20  width; i>=nPad; 
5070: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i--){.          
5080: 20 20 62 75 66 70 74 5b 69 5d 20 3d 20 62 75 66    bufpt[i] = buf
5090: 70 74 5b 69 2d 6e 50 61 64 5d 3b 0a 20 20 20 20  pt[i-nPad];.    
50a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
50b0: 20 20 69 20 3d 20 70 72 65 66 69 78 21 3d 30 3b    i = prefix!=0;
50c0: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
50d0: 28 20 6e 50 61 64 2d 2d 20 29 20 62 75 66 70 74  ( nPad-- ) bufpt
50e0: 5b 69 2b 2b 5d 20 3d 20 27 30 27 3b 0a 20 20 20  [i++] = '0';.   
50f0: 20 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20         length = 
5100: 77 69 64 74 68 3b 0a 20 20 20 20 20 20 20 20 7d  width;.        }
5110: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
5120: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
5130: 65 20 65 74 53 49 5a 45 3a 0a 20 20 20 20 20 20  e etSIZE:.      
5140: 20 20 2a 28 76 61 5f 61 72 67 28 61 70 2c 69 6e    *(va_arg(ap,in
5150: 74 2a 29 29 20 3d 20 63 6f 75 6e 74 3b 0a 20 20  t*)) = count;.  
5160: 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 77        length = w
5170: 69 64 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  idth = 0;.      
5180: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
5190: 61 73 65 20 65 74 50 45 52 43 45 4e 54 3a 0a 20  ase etPERCENT:. 
51a0: 20 20 20 20 20 20 20 62 75 66 5b 30 5d 20 3d 20         buf[0] = 
51b0: 27 25 27 3b 0a 20 20 20 20 20 20 20 20 62 75 66  '%';.        buf
51c0: 70 74 20 3d 20 62 75 66 3b 0a 20 20 20 20 20 20  pt = buf;.      
51d0: 20 20 6c 65 6e 67 74 68 20 3d 20 31 3b 0a 20 20    length = 1;.  
51e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
51f0: 20 20 20 63 61 73 65 20 65 74 43 48 41 52 4c 49     case etCHARLI
5200: 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 65 74  T:.      case et
5210: 43 48 41 52 58 3a 0a 20 20 20 20 20 20 20 20 63  CHARX:.        c
5220: 20 3d 20 62 75 66 5b 30 5d 20 3d 20 28 78 74 79   = buf[0] = (xty
5230: 70 65 3d 3d 65 74 43 48 41 52 58 20 3f 20 76 61  pe==etCHARX ? va
5240: 5f 61 72 67 28 61 70 2c 69 6e 74 29 20 3a 20 2a  _arg(ap,int) : *
5250: 2b 2b 66 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  ++fmt);.        
5260: 69 66 28 20 70 72 65 63 69 73 69 6f 6e 3e 3d 30  if( precision>=0
5270: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
5280: 72 28 69 64 78 3d 31 3b 20 69 64 78 3c 70 72 65  r(idx=1; idx<pre
5290: 63 69 73 69 6f 6e 3b 20 69 64 78 2b 2b 29 20 62  cision; idx++) b
52a0: 75 66 5b 69 64 78 5d 20 3d 20 63 3b 0a 20 20 20  uf[idx] = c;.   
52b0: 20 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20         length = 
52c0: 70 72 65 63 69 73 69 6f 6e 3b 0a 20 20 20 20 20  precision;.     
52d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
52e0: 20 20 20 20 6c 65 6e 67 74 68 20 3d 31 3b 0a 20      length =1;. 
52f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5300: 20 62 75 66 70 74 20 3d 20 62 75 66 3b 0a 20 20   bufpt = buf;.  
5310: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5320: 20 20 20 63 61 73 65 20 65 74 53 54 52 49 4e 47     case etSTRING
5330: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 44  :.      case etD
5340: 59 4e 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20  YNSTRING:.      
5350: 20 20 62 75 66 70 74 20 3d 20 76 61 5f 61 72 67    bufpt = va_arg
5360: 28 61 70 2c 63 68 61 72 2a 29 3b 0a 20 20 20 20  (ap,char*);.    
5370: 20 20 20 20 69 66 28 20 62 75 66 70 74 3d 3d 30      if( bufpt==0
5380: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 75   ){.          bu
5390: 66 70 74 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  fpt = "";.      
53a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 74 79 70    }else if( xtyp
53b0: 65 3d 3d 65 74 44 59 4e 53 54 52 49 4e 47 20 29  e==etDYNSTRING )
53c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 45 78 74  {.          zExt
53d0: 72 61 20 3d 20 62 75 66 70 74 3b 0a 20 20 20 20  ra = bufpt;.    
53e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 65      }.        le
53f0: 6e 67 74 68 20 3d 20 73 74 72 6c 65 6e 28 62 75  ngth = strlen(bu
5400: 66 70 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  fpt);.        if
5410: 28 20 70 72 65 63 69 73 69 6f 6e 3e 3d 30 20 26  ( precision>=0 &
5420: 26 20 70 72 65 63 69 73 69 6f 6e 3c 6c 65 6e 67  & precision<leng
5430: 74 68 20 29 20 6c 65 6e 67 74 68 20 3d 20 70 72  th ) length = pr
5440: 65 63 69 73 69 6f 6e 3b 0a 20 20 20 20 20 20 20  ecision;.       
5450: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
5460: 73 65 20 65 74 53 51 4c 45 53 43 41 50 45 3a 0a  se etSQLESCAPE:.
5470: 20 20 20 20 20 20 63 61 73 65 20 65 74 53 51 4c        case etSQL
5480: 45 53 43 41 50 45 32 3a 0a 20 20 20 20 20 20 20  ESCAPE2:.       
5490: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
54a0: 20 69 2c 20 6a 2c 20 6e 2c 20 63 2c 20 69 73 6e   i, j, n, c, isn
54b0: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ull;.          c
54c0: 68 61 72 20 2a 61 72 67 20 3d 20 76 61 5f 61 72  har *arg = va_ar
54d0: 67 28 61 70 2c 63 68 61 72 2a 29 3b 0a 20 20 20  g(ap,char*);.   
54e0: 20 20 20 20 20 20 20 69 73 6e 75 6c 6c 20 3d 20         isnull = 
54f0: 61 72 67 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  arg==0;.        
5500: 20 20 69 66 28 20 69 73 6e 75 6c 6c 20 29 20 61    if( isnull ) a
5510: 72 67 20 3d 20 28 78 74 79 70 65 3d 3d 65 74 53  rg = (xtype==etS
5520: 51 4c 45 53 43 41 50 45 32 20 3f 20 22 4e 55 4c  QLESCAPE2 ? "NUL
5530: 4c 22 20 3a 20 22 28 4e 55 4c 4c 29 22 29 3b 0a  L" : "(NULL)");.
5540: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
5550: 6e 3d 30 3b 20 28 63 3d 61 72 67 5b 69 5d 29 21  n=0; (c=arg[i])!
5560: 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
5570: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27        if( c=='\'
5580: 27 20 29 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20  ' )  n++;.      
5590: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
55a0: 6e 20 2b 3d 20 69 20 2b 20 31 20 2b 20 28 28 21  n += i + 1 + ((!
55b0: 69 73 6e 75 6c 6c 20 26 26 20 78 74 79 70 65 3d  isnull && xtype=
55c0: 3d 65 74 53 51 4c 45 53 43 41 50 45 32 29 20 3f  =etSQLESCAPE2) ?
55d0: 20 32 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20   2 : 0);.       
55e0: 20 20 20 69 66 28 20 6e 3e 65 74 42 55 46 53 49     if( n>etBUFSI
55f0: 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ZE ){.          
5600: 20 20 62 75 66 70 74 20 3d 20 7a 45 78 74 72 61    bufpt = zExtra
5610: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
5620: 20 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20   n );.          
5630: 20 20 69 66 28 20 62 75 66 70 74 3d 3d 30 20 29    if( bufpt==0 )
5640: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5650: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5660: 20 20 20 20 20 20 20 20 20 62 75 66 70 74 20 3d           bufpt =
5670: 20 62 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20   buf;.          
5680: 7d 0a 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20  }.          j = 
5690: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
56a0: 20 21 69 73 6e 75 6c 6c 20 26 26 20 78 74 79 70   !isnull && xtyp
56b0: 65 3d 3d 65 74 53 51 4c 45 53 43 41 50 45 32 20  e==etSQLESCAPE2 
56c0: 29 20 62 75 66 70 74 5b 6a 2b 2b 5d 20 3d 20 27  ) bufpt[j++] = '
56d0: 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 20 20 66  \'';.          f
56e0: 6f 72 28 69 3d 30 3b 20 28 63 3d 61 72 67 5b 69  or(i=0; (c=arg[i
56f0: 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ])!=0; i++){.   
5700: 20 20 20 20 20 20 20 20 20 62 75 66 70 74 5b 6a           bufpt[j
5710: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  ++] = c;.       
5720: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27       if( c=='\''
5730: 20 29 20 62 75 66 70 74 5b 6a 2b 2b 5d 20 3d 20   ) bufpt[j++] = 
5740: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  c;.          }. 
5750: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73           if( !is
5760: 6e 75 6c 6c 20 26 26 20 78 74 79 70 65 3d 3d 65  null && xtype==e
5770: 74 53 51 4c 45 53 43 41 50 45 32 20 29 20 62 75  tSQLESCAPE2 ) bu
5780: 66 70 74 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b  fpt[j++] = '\'';
5790: 0a 20 20 20 20 20 20 20 20 20 20 62 75 66 70 74  .          bufpt
57a0: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [j] = 0;.       
57b0: 20 20 20 6c 65 6e 67 74 68 20 3d 20 6a 3b 0a 20     length = j;. 
57c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72 65           if( pre
57d0: 63 69 73 69 6f 6e 3e 3d 30 20 26 26 20 70 72 65  cision>=0 && pre
57e0: 63 69 73 69 6f 6e 3c 6c 65 6e 67 74 68 20 29 20  cision<length ) 
57f0: 6c 65 6e 67 74 68 20 3d 20 70 72 65 63 69 73 69  length = precisi
5800: 6f 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  on;.        }.  
5810: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5820: 20 20 20 63 61 73 65 20 65 74 54 4f 4b 45 4e 3a     case etTOKEN:
5830: 20 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e   {.        Token
5840: 20 2a 70 54 6f 6b 65 6e 20 3d 20 76 61 5f 61 72   *pToken = va_ar
5850: 67 28 61 70 2c 20 54 6f 6b 65 6e 2a 29 3b 0a 20  g(ap, Token*);. 
5860: 20 20 20 20 20 20 20 28 2a 66 75 6e 63 29 28 61         (*func)(a
5870: 72 67 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70  rg, pToken->z, p
5880: 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20  Token->n);.     
5890: 20 20 20 6c 65 6e 67 74 68 20 3d 20 77 69 64 74     length = widt
58a0: 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62  h = 0;.        b
58b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
58c0: 20 20 20 20 63 61 73 65 20 65 74 53 52 43 4c 49      case etSRCLI
58d0: 53 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 53 72  ST: {.        Sr
58e0: 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 76 61  cList *pSrc = va
58f0: 5f 61 72 67 28 61 70 2c 20 53 72 63 4c 69 73 74  _arg(ap, SrcList
5900: 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  *);.        int 
5910: 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  k = va_arg(ap, i
5920: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72  nt);.        str
5930: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
5940: 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d   *pItem = &pSrc-
5950: 3e 61 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 61  >a[k];.        a
5960: 73 73 65 72 74 28 20 6b 3e 3d 30 20 26 26 20 6b  ssert( k>=0 && k
5970: 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20  <pSrc->nSrc );. 
5980: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
5990: 2d 3e 7a 44 61 74 61 62 61 73 65 20 26 26 20 70  ->zDatabase && p
59a0: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 5b  Item->zDatabase[
59b0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0] ){.          
59c0: 28 2a 66 75 6e 63 29 28 61 72 67 2c 20 70 49 74  (*func)(arg, pIt
59d0: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20 73  em->zDatabase, s
59e0: 74 72 6c 65 6e 28 70 49 74 65 6d 2d 3e 7a 44 61  trlen(pItem->zDa
59f0: 74 61 62 61 73 65 29 29 3b 0a 20 20 20 20 20 20  tabase));.      
5a00: 20 20 20 20 28 2a 66 75 6e 63 29 28 61 72 67 2c      (*func)(arg,
5a10: 20 22 2e 22 2c 20 31 29 3b 0a 20 20 20 20 20 20   ".", 1);.      
5a20: 20 20 7d 0a 20 20 20 20 20 20 20 20 28 2a 66 75    }.        (*fu
5a30: 6e 63 29 28 61 72 67 2c 20 70 49 74 65 6d 2d 3e  nc)(arg, pItem->
5a40: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49  zName, strlen(pI
5a50: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  tem->zName));.  
5a60: 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 77        length = w
5a70: 69 64 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  idth = 0;.      
5a80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5a90: 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 45 52  .      case etER
5aa0: 52 4f 52 3a 0a 20 20 20 20 20 20 20 20 62 75 66  ROR:.        buf
5ab0: 5b 30 5d 20 3d 20 27 25 27 3b 0a 20 20 20 20 20  [0] = '%';.     
5ac0: 20 20 20 62 75 66 5b 31 5d 20 3d 20 63 3b 0a 20     buf[1] = c;. 
5ad0: 20 20 20 20 20 20 20 65 72 72 6f 72 66 6c 61 67         errorflag
5ae0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 64   = 0;.        id
5af0: 78 20 3d 20 31 2b 28 63 21 3d 30 29 3b 0a 20 20  x = 1+(c!=0);.  
5b00: 20 20 20 20 20 20 28 2a 66 75 6e 63 29 28 61 72        (*func)(ar
5b10: 67 2c 22 25 22 2c 69 64 78 29 3b 0a 20 20 20 20  g,"%",idx);.    
5b20: 20 20 20 20 63 6f 75 6e 74 20 2b 3d 20 69 64 78      count += idx
5b30: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  ;.        if( c=
5b40: 3d 30 20 29 20 66 6d 74 2d 2d 3b 0a 20 20 20 20  =0 ) fmt--;.    
5b50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5b60: 2f 2a 20 45 6e 64 20 73 77 69 74 63 68 20 6f 76  /* End switch ov
5b70: 65 72 20 74 68 65 20 66 6f 72 6d 61 74 20 74 79  er the format ty
5b80: 70 65 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20  pe */.    /*.   
5b90: 20 2a 2a 20 54 68 65 20 74 65 78 74 20 6f 66 20   ** The text of 
5ba0: 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69  the conversion i
5bb0: 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
5bc0: 22 62 75 66 70 74 22 20 61 6e 64 20 69 73 0a 20  "bufpt" and is. 
5bd0: 20 20 20 2a 2a 20 22 6c 65 6e 67 74 68 22 20 63     ** "length" c
5be0: 68 61 72 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20  haracters long. 
5bf0: 20 54 68 65 20 66 69 65 6c 64 20 77 69 64 74 68   The field width
5c00: 20 69 73 20 22 77 69 64 74 68 22 2e 20 20 44 6f   is "width".  Do
5c10: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 75 74 70  .    ** the outp
5c20: 75 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ut..    */.    i
5c30: 66 28 20 21 66 6c 61 67 5f 6c 65 66 74 6a 75 73  f( !flag_leftjus
5c40: 74 69 66 79 20 29 7b 0a 20 20 20 20 20 20 72 65  tify ){.      re
5c50: 67 69 73 74 65 72 20 69 6e 74 20 6e 73 70 61 63  gister int nspac
5c60: 65 3b 0a 20 20 20 20 20 20 6e 73 70 61 63 65 20  e;.      nspace 
5c70: 3d 20 77 69 64 74 68 2d 6c 65 6e 67 74 68 3b 0a  = width-length;.
5c80: 20 20 20 20 20 20 69 66 28 20 6e 73 70 61 63 65        if( nspace
5c90: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  >0 ){.        co
5ca0: 75 6e 74 20 2b 3d 20 6e 73 70 61 63 65 3b 0a 20  unt += nspace;. 
5cb0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 73         while( ns
5cc0: 70 61 63 65 3e 3d 65 74 53 50 41 43 45 53 49 5a  pace>=etSPACESIZ
5cd0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 28  E ){.          (
5ce0: 2a 66 75 6e 63 29 28 61 72 67 2c 73 70 61 63 65  *func)(arg,space
5cf0: 73 2c 65 74 53 50 41 43 45 53 49 5a 45 29 3b 0a  s,etSPACESIZE);.
5d00: 20 20 20 20 20 20 20 20 20 20 6e 73 70 61 63 65            nspace
5d10: 20 2d 3d 20 65 74 53 50 41 43 45 53 49 5a 45 3b   -= etSPACESIZE;
5d20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5d30: 20 20 20 69 66 28 20 6e 73 70 61 63 65 3e 30 20     if( nspace>0 
5d40: 29 20 28 2a 66 75 6e 63 29 28 61 72 67 2c 73 70  ) (*func)(arg,sp
5d50: 61 63 65 73 2c 6e 73 70 61 63 65 29 3b 0a 20 20  aces,nspace);.  
5d60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5d70: 69 66 28 20 6c 65 6e 67 74 68 3e 30 20 29 7b 0a  if( length>0 ){.
5d80: 20 20 20 20 20 20 28 2a 66 75 6e 63 29 28 61 72        (*func)(ar
5d90: 67 2c 62 75 66 70 74 2c 6c 65 6e 67 74 68 29 3b  g,bufpt,length);
5da0: 0a 20 20 20 20 20 20 63 6f 75 6e 74 20 2b 3d 20  .      count += 
5db0: 6c 65 6e 67 74 68 3b 0a 20 20 20 20 7d 0a 20 20  length;.    }.  
5dc0: 20 20 69 66 28 20 66 6c 61 67 5f 6c 65 66 74 6a    if( flag_leftj
5dd0: 75 73 74 69 66 79 20 29 7b 0a 20 20 20 20 20 20  ustify ){.      
5de0: 72 65 67 69 73 74 65 72 20 69 6e 74 20 6e 73 70  register int nsp
5df0: 61 63 65 3b 0a 20 20 20 20 20 20 6e 73 70 61 63  ace;.      nspac
5e00: 65 20 3d 20 77 69 64 74 68 2d 6c 65 6e 67 74 68  e = width-length
5e10: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 73 70 61  ;.      if( nspa
5e20: 63 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ce>0 ){.        
5e30: 63 6f 75 6e 74 20 2b 3d 20 6e 73 70 61 63 65 3b  count += nspace;
5e40: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
5e50: 6e 73 70 61 63 65 3e 3d 65 74 53 50 41 43 45 53  nspace>=etSPACES
5e60: 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IZE ){.         
5e70: 20 28 2a 66 75 6e 63 29 28 61 72 67 2c 73 70 61   (*func)(arg,spa
5e80: 63 65 73 2c 65 74 53 50 41 43 45 53 49 5a 45 29  ces,etSPACESIZE)
5e90: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 73 70 61  ;.          nspa
5ea0: 63 65 20 2d 3d 20 65 74 53 50 41 43 45 53 49 5a  ce -= etSPACESIZ
5eb0: 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
5ec0: 20 20 20 20 20 69 66 28 20 6e 73 70 61 63 65 3e       if( nspace>
5ed0: 30 20 29 20 28 2a 66 75 6e 63 29 28 61 72 67 2c  0 ) (*func)(arg,
5ee0: 73 70 61 63 65 73 2c 6e 73 70 61 63 65 29 3b 0a  spaces,nspace);.
5ef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5f00: 20 20 69 66 28 20 7a 45 78 74 72 61 20 29 7b 0a    if( zExtra ){.
5f10: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
5f20: 28 7a 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a  (zExtra);.    }.
5f30: 20 20 7d 2f 2a 20 45 6e 64 20 66 6f 72 20 6c 6f    }/* End for lo
5f40: 6f 70 20 6f 76 65 72 20 74 68 65 20 66 6f 72 6d  op over the form
5f50: 61 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 72  at string */.  r
5f60: 65 74 75 72 6e 20 65 72 72 6f 72 66 6c 61 67 20  eturn errorflag 
5f70: 3f 20 2d 31 20 3a 20 63 6f 75 6e 74 3b 0a 7d 20  ? -1 : count;.} 
5f80: 2f 2a 20 45 6e 64 20 6f 66 20 66 75 6e 63 74 69  /* End of functi
5f90: 6f 6e 20 2a 2f 0a 0a 0a 2f 2a 20 54 68 69 73 20  on */.../* This 
5fa0: 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
5fb0: 64 20 74 6f 20 73 74 6f 72 65 20 73 74 61 74 65  d to store state
5fc0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
5fd0: 75 74 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20  ut the.** write 
5fe0: 74 6f 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 69  to memory that i
5ff0: 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  s currently in p
6000: 72 6f 67 72 65 73 73 2e 0a 2a 2f 0a 73 74 72 75  rogress..*/.stru
6010: 63 74 20 73 67 4d 70 72 69 6e 74 66 20 7b 0a 20  ct sgMprintf {. 
6020: 20 63 68 61 72 20 2a 7a 42 61 73 65 3b 20 20 20   char *zBase;   
6030: 20 20 2f 2a 20 41 20 62 61 73 65 20 61 6c 6c 6f    /* A base allo
6040: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72  cation */.  char
6050: 20 2a 7a 54 65 78 74 3b 20 20 20 20 20 2f 2a 20   *zText;     /* 
6060: 54 68 65 20 73 74 72 69 6e 67 20 63 6f 6c 6c 65  The string colle
6070: 63 74 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  cted so far */. 
6080: 20 69 6e 74 20 20 6e 43 68 61 72 3b 20 20 20 20   int  nChar;    
6090: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
60a0: 68 65 20 73 74 72 69 6e 67 20 73 6f 20 66 61 72  he string so far
60b0: 20 2a 2f 0a 20 20 69 6e 74 20 20 6e 54 6f 74 61   */.  int  nTota
60c0: 6c 3b 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  l;     /* Output
60d0: 20 73 69 7a 65 20 69 66 20 75 6e 63 6f 6e 73 74   size if unconst
60e0: 72 61 69 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  rained */.  int 
60f0: 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 2f 2a 20   nAlloc;     /* 
6100: 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  Amount of space 
6110: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 7a 54 65  allocated in zTe
6120: 78 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 28 2a  xt */.  void *(*
6130: 78 52 65 61 6c 6c 6f 63 29 28 76 6f 69 64 2a 2c  xRealloc)(void*,
6140: 69 6e 74 29 3b 20 20 2f 2a 20 46 75 6e 63 74 69  int);  /* Functi
6150: 6f 6e 20 75 73 65 64 20 74 6f 20 72 65 61 6c 6c  on used to reall
6160: 6f 63 20 6d 65 6d 6f 72 79 20 2a 2f 0a 7d 3b 0a  oc memory */.};.
6170: 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./* .** This fun
6180: 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73  ction implements
6190: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 72   the callback fr
61a0: 6f 6d 20 76 78 70 72 69 6e 74 66 2e 20 0a 2a 2a  om vxprintf. .**
61b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
61c0: 20 61 64 64 20 6e 4e 65 77 43 68 61 72 20 63 68   add nNewChar ch
61d0: 61 72 61 63 74 65 72 73 20 6f 66 20 74 65 78 74  aracters of text
61e0: 20 69 6e 20 7a 4e 65 77 54 65 78 74 20 74 6f 0a   in zNewText to.
61f0: 2a 2a 20 74 68 65 20 73 67 4d 70 72 69 6e 74 66  ** the sgMprintf
6200: 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
6210: 65 64 20 74 6f 20 62 79 20 22 61 72 67 22 2e 0a  ed to by "arg"..
6220: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
6230: 6f 75 74 28 76 6f 69 64 20 2a 61 72 67 2c 20 63  out(void *arg, c
6240: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 54  onst char *zNewT
6250: 65 78 74 2c 20 69 6e 74 20 6e 4e 65 77 43 68 61  ext, int nNewCha
6260: 72 29 7b 0a 20 20 73 74 72 75 63 74 20 73 67 4d  r){.  struct sgM
6270: 70 72 69 6e 74 66 20 2a 70 4d 20 3d 20 28 73 74  printf *pM = (st
6280: 72 75 63 74 20 73 67 4d 70 72 69 6e 74 66 2a 29  ruct sgMprintf*)
6290: 61 72 67 3b 0a 20 20 70 4d 2d 3e 6e 54 6f 74 61  arg;.  pM->nTota
62a0: 6c 20 2b 3d 20 6e 4e 65 77 43 68 61 72 3b 0a 20  l += nNewChar;. 
62b0: 20 69 66 28 20 70 4d 2d 3e 6e 43 68 61 72 20 2b   if( pM->nChar +
62c0: 20 6e 4e 65 77 43 68 61 72 20 2b 20 31 20 3e 20   nNewChar + 1 > 
62d0: 70 4d 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  pM->nAlloc ){.  
62e0: 20 20 69 66 28 20 70 4d 2d 3e 78 52 65 61 6c 6c    if( pM->xReall
62f0: 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  oc==0 ){.      n
6300: 4e 65 77 43 68 61 72 20 3d 20 20 70 4d 2d 3e 6e  NewChar =  pM->n
6310: 41 6c 6c 6f 63 20 2d 20 70 4d 2d 3e 6e 43 68 61  Alloc - pM->nCha
6320: 72 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  r - 1;.    }else
6330: 7b 0a 20 20 20 20 20 20 70 4d 2d 3e 6e 41 6c 6c  {.      pM->nAll
6340: 6f 63 20 3d 20 70 4d 2d 3e 6e 43 68 61 72 20 2b  oc = pM->nChar +
6350: 20 6e 4e 65 77 43 68 61 72 2a 32 20 2b 20 31 3b   nNewChar*2 + 1;
6360: 0a 20 20 20 20 20 20 69 66 28 20 70 4d 2d 3e 7a  .      if( pM->z
6370: 54 65 78 74 3d 3d 70 4d 2d 3e 7a 42 61 73 65 20  Text==pM->zBase 
6380: 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 2d 3e 7a  ){.        pM->z
6390: 54 65 78 74 20 3d 20 70 4d 2d 3e 78 52 65 61 6c  Text = pM->xReal
63a0: 6c 6f 63 28 30 2c 20 70 4d 2d 3e 6e 41 6c 6c 6f  loc(0, pM->nAllo
63b0: 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
63c0: 70 4d 2d 3e 7a 54 65 78 74 20 26 26 20 70 4d 2d  pM->zText && pM-
63d0: 3e 6e 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20  >nChar ){.      
63e0: 20 20 20 20 6d 65 6d 63 70 79 28 70 4d 2d 3e 7a      memcpy(pM->z
63f0: 54 65 78 74 2c 20 70 4d 2d 3e 7a 42 61 73 65 2c  Text, pM->zBase,
6400: 20 70 4d 2d 3e 6e 43 68 61 72 29 3b 0a 20 20 20   pM->nChar);.   
6410: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
6420: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 2d 3e  se{.        pM->
6430: 7a 54 65 78 74 20 3d 20 70 4d 2d 3e 78 52 65 61  zText = pM->xRea
6440: 6c 6c 6f 63 28 70 4d 2d 3e 7a 54 65 78 74 2c 20  lloc(pM->zText, 
6450: 70 4d 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20  pM->nAlloc);.   
6460: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6470: 20 69 66 28 20 70 4d 2d 3e 7a 54 65 78 74 20 29   if( pM->zText )
6480: 7b 0a 20 20 20 20 69 66 28 20 6e 4e 65 77 43 68  {.    if( nNewCh
6490: 61 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ar>0 ){.      me
64a0: 6d 63 70 79 28 26 70 4d 2d 3e 7a 54 65 78 74 5b  mcpy(&pM->zText[
64b0: 70 4d 2d 3e 6e 43 68 61 72 5d 2c 20 7a 4e 65 77  pM->nChar], zNew
64c0: 54 65 78 74 2c 20 6e 4e 65 77 43 68 61 72 29 3b  Text, nNewChar);
64d0: 0a 20 20 20 20 20 20 70 4d 2d 3e 6e 43 68 61 72  .      pM->nChar
64e0: 20 2b 3d 20 6e 4e 65 77 43 68 61 72 3b 0a 20 20   += nNewChar;.  
64f0: 20 20 7d 0a 20 20 20 20 70 4d 2d 3e 7a 54 65 78    }.    pM->zTex
6500: 74 5b 70 4d 2d 3e 6e 43 68 61 72 5d 20 3d 20 30  t[pM->nChar] = 0
6510: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
6520: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
6530: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
6540: 78 70 72 69 6e 74 66 28 29 20 74 68 61 74 20 69  xprintf() that i
6550: 6e 76 6f 6b 65 73 20 6d 6f 75 74 28 29 20 61 73  nvokes mout() as
6560: 0a 2a 2a 20 74 68 65 20 63 6f 6e 73 75 6d 65 72  .** the consumer
6570: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  .  .*/.static ch
6580: 61 72 20 2a 62 61 73 65 5f 76 70 72 69 6e 74 66  ar *base_vprintf
6590: 28 0a 20 20 76 6f 69 64 20 2a 28 2a 78 52 65 61  (.  void *(*xRea
65a0: 6c 6c 6f 63 29 28 76 6f 69 64 2a 2c 69 6e 74 29  lloc)(void*,int)
65b0: 2c 20 20 20 2f 2a 20 52 6f 75 74 69 6e 65 20 74  ,   /* Routine t
65c0: 6f 20 72 65 61 6c 6c 6f 63 20 6d 65 6d 6f 72 79  o realloc memory
65d0: 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
65e0: 0a 20 20 69 6e 74 20 75 73 65 49 6e 74 65 72 6e  .  int useIntern
65f0: 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  al,             
6600: 20 20 20 2f 2a 20 55 73 65 20 69 6e 74 65 72 6e     /* Use intern
6610: 61 6c 20 25 2d 63 6f 6e 76 65 72 73 69 6f 6e 73  al %-conversions
6620: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 63 68   if true */.  ch
6630: 61 72 20 2a 7a 49 6e 69 74 42 75 66 2c 20 20 20  ar *zInitBuf,   
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6650: 20 49 6e 69 74 69 61 6c 6c 79 20 77 72 69 74 65   Initially write
6660: 20 68 65 72 65 2c 20 62 65 66 6f 72 65 20 6d 61   here, before ma
6670: 6c 6c 6f 63 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  llocing */.  int
6680: 20 6e 49 6e 69 74 42 75 66 2c 20 20 20 20 20 20   nInitBuf,      
6690: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
66a0: 53 69 7a 65 20 6f 66 20 7a 49 6e 69 74 42 75 66  Size of zInitBuf
66b0: 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  [] */.  const ch
66c0: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 20 20 20  ar *zFormat,    
66d0: 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 6d 61          /* forma
66e0: 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 76 61  t string */.  va
66f0: 5f 6c 69 73 74 20 61 70 20 20 20 20 20 20 20 20  _list ap        
6700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6710: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
6720: 0a 20 20 73 74 72 75 63 74 20 73 67 4d 70 72 69  .  struct sgMpri
6730: 6e 74 66 20 73 4d 3b 0a 20 20 73 4d 2e 7a 42 61  ntf sM;.  sM.zBa
6740: 73 65 20 3d 20 73 4d 2e 7a 54 65 78 74 20 3d 20  se = sM.zText = 
6750: 7a 49 6e 69 74 42 75 66 3b 0a 20 20 73 4d 2e 6e  zInitBuf;.  sM.n
6760: 43 68 61 72 20 3d 20 73 4d 2e 6e 54 6f 74 61 6c  Char = sM.nTotal
6770: 20 3d 20 30 3b 0a 20 20 73 4d 2e 6e 41 6c 6c 6f   = 0;.  sM.nAllo
6780: 63 20 3d 20 6e 49 6e 69 74 42 75 66 3b 0a 20 20  c = nInitBuf;.  
6790: 73 4d 2e 78 52 65 61 6c 6c 6f 63 20 3d 20 78 52  sM.xRealloc = xR
67a0: 65 61 6c 6c 6f 63 3b 0a 20 20 76 78 70 72 69 6e  ealloc;.  vxprin
67b0: 74 66 28 6d 6f 75 74 2c 20 26 73 4d 2c 20 75 73  tf(mout, &sM, us
67c0: 65 49 6e 74 65 72 6e 61 6c 2c 20 7a 46 6f 72 6d  eInternal, zForm
67d0: 61 74 2c 20 61 70 29 3b 0a 20 20 69 66 28 20 78  at, ap);.  if( x
67e0: 52 65 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69  Realloc ){.    i
67f0: 66 28 20 73 4d 2e 7a 54 65 78 74 3d 3d 73 4d 2e  f( sM.zText==sM.
6800: 7a 42 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73  zBase ){.      s
6810: 4d 2e 7a 54 65 78 74 20 3d 20 78 52 65 61 6c 6c  M.zText = xReall
6820: 6f 63 28 30 2c 20 73 4d 2e 6e 43 68 61 72 2b 31  oc(0, sM.nChar+1
6830: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 4d 2e  );.      if( sM.
6840: 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  zText ){.       
6850: 20 6d 65 6d 63 70 79 28 73 4d 2e 7a 54 65 78 74   memcpy(sM.zText
6860: 2c 20 73 4d 2e 7a 42 61 73 65 2c 20 73 4d 2e 6e  , sM.zBase, sM.n
6870: 43 68 61 72 2b 31 29 3b 0a 20 20 20 20 20 20 7d  Char+1);.      }
6880: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
6890: 4d 2e 6e 41 6c 6c 6f 63 3e 73 4d 2e 6e 43 68 61  M.nAlloc>sM.nCha
68a0: 72 2b 31 30 20 29 7b 0a 20 20 20 20 20 20 73 4d  r+10 ){.      sM
68b0: 2e 7a 54 65 78 74 20 3d 20 78 52 65 61 6c 6c 6f  .zText = xReallo
68c0: 63 28 73 4d 2e 7a 54 65 78 74 2c 20 73 4d 2e 6e  c(sM.zText, sM.n
68d0: 43 68 61 72 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  Char+1);.    }. 
68e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 4d 2e 7a   }.  return sM.z
68f0: 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Text;.}../*.** R
6900: 65 61 6c 6c 6f 63 20 74 68 61 74 20 69 73 20 61  ealloc that is a
6910: 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20   real function, 
6920: 6e 6f 74 20 61 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  not a macro..*/.
6930: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 70 72 69  static void *pri
6940: 6e 74 66 5f 72 65 61 6c 6c 6f 63 28 76 6f 69 64  ntf_realloc(void
6950: 20 2a 6f 6c 64 2c 20 69 6e 74 20 73 69 7a 65 29   *old, int size)
6960: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
6970: 65 52 65 61 6c 6c 6f 63 28 6f 6c 64 2c 73 69 7a  eRealloc(old,siz
6980: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  e);.}../*.** Pri
6990: 6e 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  nt into memory o
69a0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
69b0: 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 20 55 73  iteMalloc().  Us
69c0: 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a  e the internal.*
69d0: 2a 20 25 2d 63 6f 6e 76 65 72 73 69 6f 6e 20 65  * %-conversion e
69e0: 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 63 68  xtensions..*/.ch
69f0: 61 72 20 2a 73 71 6c 69 74 65 33 56 4d 50 72 69  ar *sqlite3VMPri
6a00: 6e 74 66 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ntf(const char *
6a10: 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74  zFormat, va_list
6a20: 20 61 70 29 7b 0a 20 20 63 68 61 72 20 7a 42 61   ap){.  char zBa
6a30: 73 65 5b 31 30 30 30 5d 3b 0a 20 20 72 65 74 75  se[1000];.  retu
6a40: 72 6e 20 62 61 73 65 5f 76 70 72 69 6e 74 66 28  rn base_vprintf(
6a50: 70 72 69 6e 74 66 5f 72 65 61 6c 6c 6f 63 2c 20  printf_realloc, 
6a60: 31 2c 20 7a 42 61 73 65 2c 20 73 69 7a 65 6f 66  1, zBase, sizeof
6a70: 28 7a 42 61 73 65 29 2c 20 7a 46 6f 72 6d 61 74  (zBase), zFormat
6a80: 2c 20 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , ap);.}../*.** 
6a90: 50 72 69 6e 74 20 69 6e 74 6f 20 6d 65 6d 6f 72  Print into memor
6aa0: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
6ab0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20  sqliteMalloc(). 
6ac0: 20 55 73 65 20 74 68 65 20 69 6e 74 65 72 6e 61   Use the interna
6ad0: 6c 0a 2a 2a 20 25 2d 63 6f 6e 76 65 72 73 69 6f  l.** %-conversio
6ae0: 6e 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f  n extensions..*/
6af0: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4d 50  .char *sqlite3MP
6b00: 72 69 6e 74 66 28 63 6f 6e 73 74 20 63 68 61 72  rintf(const char
6b10: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
6b20: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
6b30: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72   char *z;.  char
6b40: 20 7a 42 61 73 65 5b 31 30 30 30 5d 3b 0a 20 20   zBase[1000];.  
6b50: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
6b60: 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 62 61 73  rmat);.  z = bas
6b70: 65 5f 76 70 72 69 6e 74 66 28 70 72 69 6e 74 66  e_vprintf(printf
6b80: 5f 72 65 61 6c 6c 6f 63 2c 20 31 2c 20 7a 42 61  _realloc, 1, zBa
6b90: 73 65 2c 20 73 69 7a 65 6f 66 28 7a 42 61 73 65  se, sizeof(zBase
6ba0: 29 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  ), zFormat, ap);
6bb0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
6bc0: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
6bd0: 0a 2a 2a 20 50 72 69 6e 74 20 69 6e 74 6f 20 6d  .** Print into m
6be0: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
6bf0: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 20 44  rom malloc().  D
6c00: 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 69 6e  o not use the in
6c10: 74 65 72 6e 61 6c 0a 2a 2a 20 25 2d 63 6f 6e 76  ternal.** %-conv
6c20: 65 72 73 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e  ersion extension
6c30: 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
6c40: 20 69 73 20 66 6f 72 20 75 73 65 20 62 79 20 65   is for use by e
6c50: 78 74 65 72 6e 61 6c 20 75 73 65 72 73 2e 0a 2a  xternal users..*
6c60: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
6c70: 6d 70 72 69 6e 74 66 28 63 6f 6e 73 74 20 63 68  mprintf(const ch
6c80: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
6c90: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
6ca0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68  .  char *z;.  ch
6cb0: 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 0a 20  ar zBuf[200];.. 
6cc0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 7a 46 6f   va_start(ap,zFo
6cd0: 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 62 61 73  rmat);.  z = bas
6ce0: 65 5f 76 70 72 69 6e 74 66 28 28 76 6f 69 64 2a  e_vprintf((void*
6cf0: 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 72  (*)(void*,int))r
6d00: 65 61 6c 6c 6f 63 2c 20 30 2c 20 0a 20 20 20 20  ealloc, 0, .    
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
6d20: 42 75 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66  Buf, sizeof(zBuf
6d30: 29 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  ), zFormat, ap);
6d40: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
6d50: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
6d60: 20 54 68 69 73 20 69 73 20 74 68 65 20 76 61 72   This is the var
6d70: 61 72 67 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  args version of 
6d80: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 2e  sqlite3_mprintf.
6d90: 20 20 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69    .*/.char *sqli
6da0: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 63 6f 6e  te3_vmprintf(con
6db0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
6dc0: 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20  , va_list ap){. 
6dd0: 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b   char zBuf[200];
6de0: 0a 20 20 72 65 74 75 72 6e 20 62 61 73 65 5f 76  .  return base_v
6df0: 70 72 69 6e 74 66 28 28 76 6f 69 64 2a 28 2a 29  printf((void*(*)
6e00: 28 76 6f 69 64 2a 2c 69 6e 74 29 29 72 65 61 6c  (void*,int))real
6e10: 6c 6f 63 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  loc, 0,.        
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 42                zB
6e30: 75 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29  uf, sizeof(zBuf)
6e40: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
6e50: 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  }../*.** sqlite3
6e60: 5f 73 6e 70 72 69 6e 74 66 28 29 20 77 6f 72 6b  _snprintf() work
6e70: 73 20 6c 69 6b 65 20 73 6e 70 72 69 6e 74 66 28  s like snprintf(
6e80: 29 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  ) except that it
6e90: 20 69 67 6e 6f 72 65 73 20 74 68 65 0a 2a 2a 20   ignores the.** 
6ea0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 65 20 73  current locale s
6eb0: 65 74 74 69 6e 67 73 2e 20 20 54 68 69 73 20 69  ettings.  This i
6ec0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20  s important for 
6ed0: 53 51 4c 69 74 65 20 62 65 63 61 75 73 65 20 77  SQLite because w
6ee0: 65 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 61 62 6c  e.** are not abl
6ef0: 65 20 74 6f 20 75 73 65 20 61 20 22 2c 22 20 61  e to use a "," a
6f00: 73 20 74 68 65 20 64 65 63 69 6d 61 6c 20 70 6f  s the decimal po
6f10: 69 6e 74 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  int in place of 
6f20: 22 2e 22 20 61 73 0a 2a 2a 20 73 70 65 63 69 66  "." as.** specif
6f30: 69 65 64 20 62 79 20 73 6f 6d 65 20 6c 6f 63 61  ied by some loca
6f40: 6c 65 73 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  les..*/.char *sq
6f50: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 69  lite3_snprintf(i
6f60: 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 42 75 66  nt n, char *zBuf
6f70: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
6f80: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63  ormat, ...){.  c
6f90: 68 61 72 20 2a 7a 3b 0a 20 20 76 61 5f 6c 69 73  har *z;.  va_lis
6fa0: 74 20 61 70 3b 0a 0a 20 20 76 61 5f 73 74 61 72  t ap;..  va_star
6fb0: 74 28 61 70 2c 7a 46 6f 72 6d 61 74 29 3b 0a 20  t(ap,zFormat);. 
6fc0: 20 7a 20 3d 20 62 61 73 65 5f 76 70 72 69 6e 74   z = base_vprint
6fd0: 66 28 30 2c 20 30 2c 20 7a 42 75 66 2c 20 6e 2c  f(0, 0, zBuf, n,
6fe0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
6ff0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
7000: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 20  eturn z;.}..#if 
7010: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
7020: 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  EST) || defined(
7030: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
7040: 0a 2a 2a 20 41 20 76 65 72 73 69 6f 6e 20 6f 66  .** A version of
7050: 20 70 72 69 6e 74 66 28 29 20 74 68 61 74 20 75   printf() that u
7060: 6e 64 65 72 73 74 61 6e 64 73 20 25 6c 6c 64 2e  nderstands %lld.
7070: 20 20 55 73 65 64 20 66 6f 72 20 64 65 62 75 67    Used for debug
7080: 67 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 70 72 69  ging..** The pri
7090: 6e 74 66 28 29 20 62 75 69 6c 74 20 69 6e 74 6f  ntf() built into
70a0: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
70b0: 66 20 77 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e  f windows does n
70c0: 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 25 6c  ot understand %l
70d0: 6c 64 0a 2a 2a 20 61 6e 64 20 73 65 67 66 61 75  ld.** and segfau
70e0: 6c 74 73 20 69 66 20 79 6f 75 20 67 69 76 65 20  lts if you give 
70f0: 69 74 20 61 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69  it a long long i
7100: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
7110: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 63  te3DebugPrintf(c
7120: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
7130: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
7140: 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 7a  ist ap;.  char z
7150: 42 75 66 5b 35 30 30 5d 3b 0a 20 20 76 61 5f 73  Buf[500];.  va_s
7160: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
7170: 29 3b 0a 20 20 62 61 73 65 5f 76 70 72 69 6e 74  );.  base_vprint
7180: 66 28 30 2c 20 30 2c 20 7a 42 75 66 2c 20 73 69  f(0, 0, zBuf, si
7190: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 46 6f 72  zeof(zBuf), zFor
71a0: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
71b0: 6e 64 28 61 70 29 3b 0a 20 20 66 70 72 69 6e 74  nd(ap);.  fprint
71c0: 66 28 73 74 64 6f 75 74 2c 22 25 73 22 2c 20 7a  f(stdout,"%s", z
71d0: 42 75 66 29 3b 0a 20 20 66 66 6c 75 73 68 28 73  Buf);.  fflush(s
71e0: 74 64 6f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  tdout);.}.#endif
71f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
7200: 6f 77 69 6e 67 20 66 6f 75 72 20 72 6f 75 74 69  owing four routi
7210: 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  nes implement th
7220: 65 20 76 61 72 61 72 67 73 20 76 65 72 73 69 6f  e varargs versio
7230: 6e 73 20 6f 66 20 74 68 65 0a 2a 2a 20 73 71 6c  ns of the.** sql
7240: 69 74 65 33 5f 65 78 65 63 28 29 20 61 6e 64 20  ite3_exec() and 
7250: 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c  sqlite3_get_tabl
7260: 65 28 29 20 69 6e 74 65 72 66 61 63 65 73 2e 20  e() interfaces. 
7270: 20 53 65 65 20 74 68 65 20 73 71 6c 69 74 65 2e   See the sqlite.
7280: 68 0a 2a 2a 20 68 65 61 64 65 72 20 66 69 6c 65  h.** header file
7290: 73 20 66 6f 72 20 61 20 6d 6f 72 65 20 64 65 74  s for a more det
72a0: 61 69 6c 65 64 20 64 65 73 63 72 69 70 74 69 6f  ailed descriptio
72b0: 6e 20 6f 66 20 68 6f 77 20 74 68 65 73 65 20 69  n of how these i
72c0: 6e 74 65 72 66 61 63 65 73 0a 2a 2a 20 77 6f 72  nterfaces.** wor
72d0: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  k..**.** These r
72e0: 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20  outines are all 
72f0: 6a 75 73 74 20 73 69 6d 70 6c 65 20 77 72 61 70  just simple wrap
7300: 70 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  pers..*/.int sql
7310: 69 74 65 33 5f 65 78 65 63 5f 76 70 72 69 6e 74  ite3_exec_vprint
7320: 66 28 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 2c  f(.  sqlite *db,
7330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7340: 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61     /* An open da
7350: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73  tabase */.  cons
7360: 74 20 63 68 61 72 20 2a 73 71 6c 46 6f 72 6d 61  t char *sqlForma
7370: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 72 69  t,        /* pri
7380: 6e 74 66 2d 73 74 79 6c 65 20 66 6f 72 6d 61 74  ntf-style format
7390: 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20   string for the 
73a0: 53 51 4c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f  SQL */.  sqlite_
73b0: 63 61 6c 6c 62 61 63 6b 20 78 43 61 6c 6c 62 61  callback xCallba
73c0: 63 6b 2c 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61  ck,    /* Callba
73d0: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ck function */. 
73e0: 20 76 6f 69 64 20 2a 70 41 72 67 2c 20 20 20 20   void *pArg,    
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7400: 2a 20 31 73 74 20 61 72 67 75 6d 65 6e 74 20 74  * 1st argument t
7410: 6f 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  o callback funct
7420: 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ion */.  char **
7430: 65 72 72 6d 73 67 2c 20 20 20 20 20 20 20 20 20  errmsg,         
7440: 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
7450: 6d 73 67 20 77 72 69 74 74 65 6e 20 68 65 72 65  msg written here
7460: 20 2a 2f 0a 20 20 76 61 5f 6c 69 73 74 20 61 70   */.  va_list ap
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73      /* Arguments
7490: 20 74 6f 20 74 68 65 20 66 6f 72 6d 61 74 20 73   to the format s
74a0: 74 72 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63  tring. */.){.  c
74b0: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74  har *zSql;.  int
74c0: 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73   rc;..  zSql = s
74d0: 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28  qlite3_vmprintf(
74e0: 73 71 6c 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  sqlFormat, ap);.
74f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
7500: 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 78 43  xec(db, zSql, xC
7510: 61 6c 6c 62 61 63 6b 2c 20 70 41 72 67 2c 20 65  allback, pArg, e
7520: 72 72 6d 73 67 29 3b 0a 20 20 66 72 65 65 28 7a  rrmsg);.  free(z
7530: 53 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Sql);.  return r
7540: 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
7550: 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 0a 20 20  _exec_printf(.  
7560: 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20 20 20  sqlite *db,     
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7580: 20 41 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73   An open databas
7590: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
75a0: 72 20 2a 73 71 6c 46 6f 72 6d 61 74 2c 20 20 20  r *sqlFormat,   
75b0: 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 66 2d 73       /* printf-s
75c0: 74 79 6c 65 20 66 6f 72 6d 61 74 20 73 74 72 69  tyle format stri
75d0: 6e 67 20 66 6f 72 20 74 68 65 20 53 51 4c 20 2a  ng for the SQL *
75e0: 2f 0a 20 20 73 71 6c 69 74 65 5f 63 61 6c 6c 62  /.  sqlite_callb
75f0: 61 63 6b 20 78 43 61 6c 6c 62 61 63 6b 2c 20 20  ack xCallback,  
7600: 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75    /* Callback fu
7610: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  nction */.  void
7620: 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20   *pArg,         
7630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 73 74            /* 1st
7640: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 63 61 6c   argument to cal
7650: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a  lback function *
7660: 2f 0a 20 20 63 68 61 72 20 2a 2a 65 72 72 6d 73  /.  char **errms
7670: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
7680: 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20 77    /* Error msg w
7690: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20  ritten here */. 
76a0: 20 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20 20   ...            
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
76c0: 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  * Arguments to t
76d0: 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  he format string
76e0: 2e 20 2a 2f 0a 29 7b 0a 20 20 76 61 5f 6c 69 73  . */.){.  va_lis
76f0: 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  t ap;.  int rc;.
7700: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
7710: 65 72 72 6d 73 67 29 3b 0a 20 20 72 63 20 3d 20  errmsg);.  rc = 
7720: 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 76 70 72  sqlite3_exec_vpr
7730: 69 6e 74 66 28 64 62 2c 20 73 71 6c 46 6f 72 6d  intf(db, sqlForm
7740: 61 74 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20 70  at, xCallback, p
7750: 41 72 67 2c 20 65 72 72 6d 73 67 2c 20 61 70 29  Arg, errmsg, ap)
7760: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
7770: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
7780: 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74  nt sqlite3_get_t
7790: 61 62 6c 65 5f 76 70 72 69 6e 74 66 28 0a 20 20  able_vprintf(.  
77a0: 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20 20 20  sqlite *db,     
77b0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65         /* An ope
77c0: 6e 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  n database */.  
77d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 46  const char *sqlF
77e0: 6f 72 6d 61 74 2c 20 2f 2a 20 70 72 69 6e 74 66  ormat, /* printf
77f0: 2d 73 74 79 6c 65 20 66 6f 72 6d 61 74 20 73 74  -style format st
7800: 72 69 6e 67 20 66 6f 72 20 74 68 65 20 53 51 4c  ring for the SQL
7810: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 2a 72 65   */.  char ***re
7820: 73 75 6c 74 70 2c 20 20 20 20 20 20 20 2f 2a 20  sultp,       /* 
7830: 52 65 73 75 6c 74 20 77 72 69 74 74 65 6e 20 74  Result written t
7840: 6f 20 61 20 63 68 61 72 20 2a 5b 5d 20 20 74 68  o a char *[]  th
7850: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74  at this points t
7860: 6f 20 2a 2f 0a 20 20 69 6e 74 20 2a 6e 72 6f 77  o */.  int *nrow
7870: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
7880: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
7890: 74 20 72 6f 77 73 20 77 72 69 74 74 65 6e 20 68  t rows written h
78a0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 6e 63  ere */.  int *nc
78b0: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
78c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
78d0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 77 72 69 74  ult columns writ
78e0: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 63 68  ten here */.  ch
78f0: 61 72 20 2a 2a 65 72 72 6d 73 67 2c 20 20 20 20  ar **errmsg,    
7900: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73       /* Error ms
7910: 67 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  g written here *
7920: 2f 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 20 20  /.  va_list ap  
7930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
7940: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66  guments to the f
7950: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 2a 2f 0a  ormat string */.
7960: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  ){.  char *zSql;
7970: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 7a 53  .  int rc;..  zS
7980: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70  ql = sqlite3_vmp
7990: 72 69 6e 74 66 28 73 71 6c 46 6f 72 6d 61 74 2c  rintf(sqlFormat,
79a0: 20 61 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c   ap);.  rc = sql
79b0: 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28 64  ite3_get_table(d
79c0: 62 2c 20 7a 53 71 6c 2c 20 72 65 73 75 6c 74 70  b, zSql, resultp
79d0: 2c 20 6e 72 6f 77 2c 20 6e 63 6f 6c 75 6d 6e 2c  , nrow, ncolumn,
79e0: 20 65 72 72 6d 73 67 29 3b 0a 20 20 66 72 65 65   errmsg);.  free
79f0: 28 7a 53 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (zSql);.  return
7a00: 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   rc;.}.int sqlit
7a10: 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69  e3_get_table_pri
7a20: 6e 74 66 28 0a 20 20 73 71 6c 69 74 65 20 2a 64  ntf(.  sqlite *d
7a30: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
7a40: 20 41 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73   An open databas
7a50: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
7a60: 72 20 2a 73 71 6c 46 6f 72 6d 61 74 2c 20 2f 2a  r *sqlFormat, /*
7a70: 20 70 72 69 6e 74 66 2d 73 74 79 6c 65 20 66 6f   printf-style fo
7a80: 72 6d 61 74 20 73 74 72 69 6e 67 20 66 6f 72 20  rmat string for 
7a90: 74 68 65 20 53 51 4c 20 2a 2f 0a 20 20 63 68 61  the SQL */.  cha
7aa0: 72 20 2a 2a 2a 72 65 73 75 6c 74 70 2c 20 20 20  r ***resultp,   
7ab0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 77 72      /* Result wr
7ac0: 69 74 74 65 6e 20 74 6f 20 61 20 63 68 61 72 20  itten to a char 
7ad0: 2a 5b 5d 20 20 74 68 61 74 20 74 68 69 73 20 70  *[]  that this p
7ae0: 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 69 6e  oints to */.  in
7af0: 74 20 2a 6e 72 6f 77 2c 20 20 20 20 20 20 20 20  t *nrow,        
7b00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7b10: 66 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77 72  f result rows wr
7b20: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20  itten here */.  
7b30: 69 6e 74 20 2a 6e 63 6f 6c 2c 20 20 20 20 20 20  int *ncol,      
7b40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7b50: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
7b60: 6e 73 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ns written here 
7b70: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 65 72 72 6d  */.  char **errm
7b80: 73 67 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45  sg,         /* E
7b90: 72 72 6f 72 20 6d 73 67 20 77 72 69 74 74 65 6e  rror msg written
7ba0: 20 68 65 72 65 20 2a 2f 0a 20 20 2e 2e 2e 20 20   here */.  ...  
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bc0: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74    /* Arguments t
7bd0: 6f 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72  o the format str
7be0: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 76 61 5f 6c  ing */.){.  va_l
7bf0: 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63  ist ap;.  int rc
7c00: 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  ;..  va_start(ap
7c10: 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 72 63 20  , errmsg);.  rc 
7c20: 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61  = sqlite3_get_ta
7c30: 62 6c 65 5f 76 70 72 69 6e 74 66 28 64 62 2c 20  ble_vprintf(db, 
7c40: 73 71 6c 46 6f 72 6d 61 74 2c 20 72 65 73 75 6c  sqlFormat, resul
7c50: 74 70 2c 20 6e 72 6f 77 2c 20 6e 63 6f 6c 2c 20  tp, nrow, ncol, 
7c60: 65 72 72 6d 73 67 2c 20 61 70 29 3b 0a 20 20 76  errmsg, ap);.  v
7c70: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
7c80: 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.