/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 060199ba9768c9d146f8897d33d250e6ff2adaef:


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 63 6f 75 6e 74 20 3d 20 6c 65  if..  count = le
2730: 6e 67 74 68 20 3d 20 30 3b 0a 20 20 62 75 66 70  ngth = 0;.  bufp
2740: 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 3b 20 28  t = 0;.  for(; (
2750: 63 3d 28 2a 66 6d 74 29 29 21 3d 30 3b 20 2b 2b  c=(*fmt))!=0; ++
2760: 66 6d 74 29 7b 0a 20 20 20 20 69 66 28 20 63 21  fmt){.    if( c!
2770: 3d 27 25 27 20 29 7b 0a 20 20 20 20 20 20 69 6e  ='%' ){.      in
2780: 74 20 61 6d 74 3b 0a 20 20 20 20 20 20 62 75 66  t amt;.      buf
2790: 70 74 20 3d 20 28 63 68 61 72 20 2a 29 66 6d 74  pt = (char *)fmt
27a0: 3b 0a 20 20 20 20 20 20 61 6d 74 20 3d 20 31 3b  ;.      amt = 1;
27b0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
27c0: 3d 28 2a 2b 2b 66 6d 74 29 29 21 3d 27 25 27 20  =(*++fmt))!='%' 
27d0: 26 26 20 63 21 3d 30 20 29 20 61 6d 74 2b 2b 3b  && c!=0 ) amt++;
27e0: 0a 20 20 20 20 20 20 28 2a 66 75 6e 63 29 28 61  .      (*func)(a
27f0: 72 67 2c 62 75 66 70 74 2c 61 6d 74 29 3b 0a 20  rg,bufpt,amt);. 
2800: 20 20 20 20 20 63 6f 75 6e 74 20 2b 3d 20 61 6d       count += am
2810: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  t;.      if( c==
2820: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
2830: 0a 20 20 20 20 69 66 28 20 28 63 3d 28 2a 2b 2b  .    if( (c=(*++
2840: 66 6d 74 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  fmt))==0 ){.    
2850: 20 20 65 72 72 6f 72 66 6c 61 67 20 3d 20 31 3b    errorflag = 1;
2860: 0a 20 20 20 20 20 20 28 2a 66 75 6e 63 29 28 61  .      (*func)(a
2870: 72 67 2c 22 25 22 2c 31 29 3b 0a 20 20 20 20 20  rg,"%",1);.     
2880: 20 63 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20   count++;.      
2890: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
28a0: 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 61   /* Find out wha
28b0: 74 20 66 6c 61 67 73 20 61 72 65 20 70 72 65 73  t flags are pres
28c0: 65 6e 74 20 2a 2f 0a 20 20 20 20 66 6c 61 67 5f  ent */.    flag_
28d0: 6c 65 66 74 6a 75 73 74 69 66 79 20 3d 20 66 6c  leftjustify = fl
28e0: 61 67 5f 70 6c 75 73 73 69 67 6e 20 3d 20 66 6c  ag_plussign = fl
28f0: 61 67 5f 62 6c 61 6e 6b 73 69 67 6e 20 3d 20 0a  ag_blanksign = .
2900: 20 20 20 20 20 66 6c 61 67 5f 61 6c 74 65 72 6e       flag_altern
2910: 61 74 65 66 6f 72 6d 20 3d 20 66 6c 61 67 5f 7a  ateform = flag_z
2920: 65 72 6f 70 61 64 20 3d 20 30 3b 0a 20 20 20 20  eropad = 0;.    
2930: 64 6f 7b 0a 20 20 20 20 20 20 73 77 69 74 63 68  do{.      switch
2940: 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ( c ){.        c
2950: 61 73 65 20 27 2d 27 3a 20 20 20 66 6c 61 67 5f  ase '-':   flag_
2960: 6c 65 66 74 6a 75 73 74 69 66 79 20 3d 20 31 3b  leftjustify = 1;
2970: 20 20 20 20 20 63 20 3d 20 30 3b 20 20 20 62 72       c = 0;   br
2980: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
2990: 65 20 27 2b 27 3a 20 20 20 66 6c 61 67 5f 70 6c  e '+':   flag_pl
29a0: 75 73 73 69 67 6e 20 3d 20 31 3b 20 20 20 20 20  ussign = 1;     
29b0: 20 20 20 63 20 3d 20 30 3b 20 20 20 62 72 65 61     c = 0;   brea
29c0: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
29d0: 27 20 27 3a 20 20 20 66 6c 61 67 5f 62 6c 61 6e  ' ':   flag_blan
29e0: 6b 73 69 67 6e 20 3d 20 31 3b 20 20 20 20 20 20  ksign = 1;      
29f0: 20 63 20 3d 20 30 3b 20 20 20 62 72 65 61 6b 3b   c = 0;   break;
2a00: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 23  .        case '#
2a10: 27 3a 20 20 20 66 6c 61 67 5f 61 6c 74 65 72 6e  ':   flag_altern
2a20: 61 74 65 66 6f 72 6d 20 3d 20 31 3b 20 20 20 63  ateform = 1;   c
2a30: 20 3d 20 30 3b 20 20 20 62 72 65 61 6b 3b 0a 20   = 0;   break;. 
2a40: 20 20 20 20 20 20 20 63 61 73 65 20 27 30 27 3a         case '0':
2a50: 20 20 20 66 6c 61 67 5f 7a 65 72 6f 70 61 64 20     flag_zeropad 
2a60: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 63 20 3d  = 1;         c =
2a70: 20 30 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20   0;   break;.   
2a80: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20       default:   
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2ac0: 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 63   }.    }while( c
2ad0: 3d 3d 30 20 26 26 20 28 63 3d 28 2a 2b 2b 66 6d  ==0 && (c=(*++fm
2ae0: 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 2f 2a  t))!=0 );.    /*
2af0: 20 47 65 74 20 74 68 65 20 66 69 65 6c 64 20 77   Get the field w
2b00: 69 64 74 68 20 2a 2f 0a 20 20 20 20 77 69 64 74  idth */.    widt
2b10: 68 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 63  h = 0;.    if( c
2b20: 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 77  =='*' ){.      w
2b30: 69 64 74 68 20 3d 20 76 61 5f 61 72 67 28 61 70  idth = va_arg(ap
2b40: 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  ,int);.      if(
2b50: 20 77 69 64 74 68 3c 30 20 29 7b 0a 20 20 20 20   width<0 ){.    
2b60: 20 20 20 20 66 6c 61 67 5f 6c 65 66 74 6a 75 73      flag_leftjus
2b70: 74 69 66 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  tify = 1;.      
2b80: 20 20 77 69 64 74 68 20 3d 20 2d 77 69 64 74 68    width = -width
2b90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ba0: 63 20 3d 20 2a 2b 2b 66 6d 74 3b 0a 20 20 20 20  c = *++fmt;.    
2bb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 68 69  }else{.      whi
2bc0: 6c 65 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c  le( c>='0' && c<
2bd0: 3d 27 39 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='9' ){.        
2be0: 77 69 64 74 68 20 3d 20 77 69 64 74 68 2a 31 30  width = width*10
2bf0: 20 2b 20 63 20 2d 20 27 30 27 3b 0a 20 20 20 20   + c - '0';.    
2c00: 20 20 20 20 63 20 3d 20 2a 2b 2b 66 6d 74 3b 0a      c = *++fmt;.
2c10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c20: 20 20 69 66 28 20 77 69 64 74 68 20 3e 20 65 74    if( width > et
2c30: 42 55 46 53 49 5a 45 2d 31 30 20 29 7b 0a 20 20  BUFSIZE-10 ){.  
2c40: 20 20 20 20 77 69 64 74 68 20 3d 20 65 74 42 55      width = etBU
2c50: 46 53 49 5a 45 2d 31 30 3b 0a 20 20 20 20 7d 0a  FSIZE-10;.    }.
2c60: 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 70      /* Get the p
2c70: 72 65 63 69 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  recision */.    
2c80: 69 66 28 20 63 3d 3d 27 2e 27 20 29 7b 0a 20 20  if( c=='.' ){.  
2c90: 20 20 20 20 70 72 65 63 69 73 69 6f 6e 20 3d 20      precision = 
2ca0: 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 2b 2b  0;.      c = *++
2cb0: 66 6d 74 3b 0a 20 20 20 20 20 20 69 66 28 20 63  fmt;.      if( c
2cc0: 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 20  =='*' ){.       
2cd0: 20 70 72 65 63 69 73 69 6f 6e 20 3d 20 76 61 5f   precision = va_
2ce0: 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
2cf0: 20 20 20 20 20 69 66 28 20 70 72 65 63 69 73 69       if( precisi
2d00: 6f 6e 3c 30 20 29 20 70 72 65 63 69 73 69 6f 6e  on<0 ) precision
2d10: 20 3d 20 2d 70 72 65 63 69 73 69 6f 6e 3b 0a 20   = -precision;. 
2d20: 20 20 20 20 20 20 20 63 20 3d 20 2a 2b 2b 66 6d         c = *++fm
2d30: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
2d40: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63          while( c
2d50: 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27 20  >='0' && c<='9' 
2d60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 65  ){.          pre
2d70: 63 69 73 69 6f 6e 20 3d 20 70 72 65 63 69 73 69  cision = precisi
2d80: 6f 6e 2a 31 30 20 2b 20 63 20 2d 20 27 30 27 3b  on*10 + c - '0';
2d90: 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2a  .          c = *
2da0: 2b 2b 66 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d  ++fmt;.        }
2db0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
2dc0: 2a 20 4c 69 6d 69 74 20 74 68 65 20 70 72 65 63  * Limit the prec
2dd0: 69 73 69 6f 6e 20 74 6f 20 70 72 65 76 65 6e 74  ision to prevent
2de0: 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20 62 75 66   overflowing buf
2df0: 5b 5d 20 64 75 72 69 6e 67 20 63 6f 6e 76 65 72  [] during conver
2e00: 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66  sion */.      if
2e10: 28 20 70 72 65 63 69 73 69 6f 6e 3e 65 74 42 55  ( precision>etBU
2e20: 46 53 49 5a 45 2d 34 30 20 29 20 70 72 65 63 69  FSIZE-40 ) preci
2e30: 73 69 6f 6e 20 3d 20 65 74 42 55 46 53 49 5a 45  sion = etBUFSIZE
2e40: 2d 34 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  -40;.    }else{.
2e50: 20 20 20 20 20 20 70 72 65 63 69 73 69 6f 6e 20        precision 
2e60: 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
2e70: 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6e 76 65  /* Get the conve
2e80: 72 73 69 6f 6e 20 74 79 70 65 20 6d 6f 64 69 66  rsion type modif
2e90: 69 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 63  ier */.    if( c
2ea0: 3d 3d 27 6c 27 20 29 7b 0a 20 20 20 20 20 20 66  =='l' ){.      f
2eb0: 6c 61 67 5f 6c 6f 6e 67 20 3d 20 31 3b 0a 20 20  lag_long = 1;.  
2ec0: 20 20 20 20 63 20 3d 20 2a 2b 2b 66 6d 74 3b 0a      c = *++fmt;.
2ed0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 6c 27        if( c=='l'
2ee0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
2ef0: 5f 6c 6f 6e 67 6c 6f 6e 67 20 3d 20 31 3b 0a 20  _longlong = 1;. 
2f00: 20 20 20 20 20 20 20 63 20 3d 20 2a 2b 2b 66 6d         c = *++fm
2f10: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
2f20: 20 20 20 20 20 20 20 20 66 6c 61 67 5f 6c 6f 6e          flag_lon
2f30: 67 6c 6f 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  glong = 0;.     
2f40: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2f50: 20 20 20 20 66 6c 61 67 5f 6c 6f 6e 67 20 3d 20      flag_long = 
2f60: 66 6c 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 20 3d 20  flag_longlong = 
2f70: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  0;.    }.    /* 
2f80: 46 65 74 63 68 20 74 68 65 20 69 6e 66 6f 20 65  Fetch the info e
2f90: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 65  ntry for the fie
2fa0: 6c 64 20 2a 2f 0a 20 20 20 20 69 6e 66 6f 70 20  ld */.    infop 
2fb0: 3d 20 30 3b 0a 20 20 20 20 78 74 79 70 65 20 3d  = 0;.    xtype =
2fc0: 20 65 74 45 52 52 4f 52 3b 0a 20 20 20 20 66 6f   etERROR;.    fo
2fd0: 72 28 69 64 78 3d 30 3b 20 69 64 78 3c 65 74 4e  r(idx=0; idx<etN
2fe0: 49 4e 46 4f 3b 20 69 64 78 2b 2b 29 7b 0a 20 20  INFO; idx++){.  
2ff0: 20 20 20 20 69 66 28 20 63 3d 3d 66 6d 74 69 6e      if( c==fmtin
3000: 66 6f 5b 69 64 78 5d 2e 66 6d 74 74 79 70 65 20  fo[idx].fmttype 
3010: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 66 6f 70  ){.        infop
3020: 20 3d 20 26 66 6d 74 69 6e 66 6f 5b 69 64 78 5d   = &fmtinfo[idx]
3030: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 73  ;.        if( us
3040: 65 45 78 74 65 6e 64 65 64 20 7c 7c 20 28 69 6e  eExtended || (in
3050: 66 6f 70 2d 3e 66 6c 61 67 73 20 26 20 46 4c 41  fop->flags & FLA
3060: 47 5f 49 4e 54 45 52 4e 29 3d 3d 30 20 29 7b 0a  G_INTERN)==0 ){.
3070: 20 20 20 20 20 20 20 20 20 20 78 74 79 70 65 20            xtype 
3080: 3d 20 69 6e 66 6f 70 2d 3e 74 79 70 65 3b 0a 20  = infop->type;. 
3090: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
30b0: 20 20 20 20 7d 0a 20 20 20 20 7a 45 78 74 72 61      }.    zExtra
30c0: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20   = 0;..    /*.  
30d0: 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69    ** At this poi
30e0: 6e 74 2c 20 76 61 72 69 61 62 6c 65 73 20 61 72  nt, variables ar
30f0: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 73  e initialized as
3100: 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a   follows:.    **
3110: 0a 20 20 20 20 2a 2a 20 20 20 66 6c 61 67 5f 61  .    **   flag_a
3120: 6c 74 65 72 6e 61 74 65 66 6f 72 6d 20 20 20 20  lternateform    
3130: 20 20 20 20 20 20 54 52 55 45 20 69 66 20 61 20        TRUE if a 
3140: 27 23 27 20 69 73 20 70 72 65 73 65 6e 74 2e 0a  '#' is present..
3150: 20 20 20 20 2a 2a 20 20 20 66 6c 61 67 5f 70 6c      **   flag_pl
3160: 75 73 73 69 67 6e 20 20 20 20 20 20 20 20 20 20  ussign          
3170: 20 20 20 20 20 54 52 55 45 20 69 66 20 61 20 27       TRUE if a '
3180: 2b 27 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  +' is present.. 
3190: 20 20 20 2a 2a 20 20 20 66 6c 61 67 5f 6c 65 66     **   flag_lef
31a0: 74 6a 75 73 74 69 66 79 20 20 20 20 20 20 20 20  tjustify        
31b0: 20 20 20 20 54 52 55 45 20 69 66 20 61 20 27 2d      TRUE if a '-
31c0: 27 20 69 73 20 70 72 65 73 65 6e 74 20 6f 72 20  ' is present or 
31d0: 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 20 20  if the.    **   
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 65 6c              fiel
3200: 64 20 77 69 64 74 68 20 77 61 73 20 6e 65 67 61  d width was nega
3210: 74 69 76 65 2e 0a 20 20 20 20 2a 2a 20 20 20 66  tive..    **   f
3220: 6c 61 67 5f 7a 65 72 6f 70 61 64 20 20 20 20 20  lag_zeropad     
3230: 20 20 20 20 20 20 20 20 20 20 20 54 52 55 45 20             TRUE 
3240: 69 66 20 74 68 65 20 77 69 64 74 68 20 62 65 67  if the width beg
3250: 61 6e 20 77 69 74 68 20 30 2e 0a 20 20 20 20 2a  an with 0..    *
3260: 2a 20 20 20 66 6c 61 67 5f 6c 6f 6e 67 20 20 20  *   flag_long   
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3280: 54 52 55 45 20 69 66 20 74 68 65 20 6c 65 74 74  TRUE if the lett
3290: 65 72 20 27 6c 27 20 28 65 6c 6c 29 20 70 72 65  er 'l' (ell) pre
32a0: 66 69 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20  fixed.    **    
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c0: 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 63             the c
32d0: 6f 6e 76 65 72 73 69 6f 6e 20 63 68 61 72 61 63  onversion charac
32e0: 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 66 6c  ter..    **   fl
32f0: 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 20 20 20 20 20  ag_longlong     
3300: 20 20 20 20 20 20 20 20 20 20 54 52 55 45 20 69            TRUE i
3310: 66 20 74 68 65 20 6c 65 74 74 65 72 20 27 6c 6c  f the letter 'll
3320: 27 20 28 65 6c 6c 20 65 6c 6c 29 20 70 72 65 66  ' (ell ell) pref
3330: 69 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20  ixed.    **     
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3350: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 63 6f            the co
3360: 6e 76 65 72 73 69 6f 6e 20 63 68 61 72 61 63 74  nversion charact
3370: 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 66 6c 61  er..    **   fla
3380: 67 5f 62 6c 61 6e 6b 73 69 67 6e 20 20 20 20 20  g_blanksign     
3390: 20 20 20 20 20 20 20 20 20 54 52 55 45 20 69 66           TRUE if
33a0: 20 61 20 27 20 27 20 69 73 20 70 72 65 73 65 6e   a ' ' is presen
33b0: 74 2e 0a 20 20 20 20 2a 2a 20 20 20 77 69 64 74  t..    **   widt
33c0: 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h               
33d0: 20 20 20 20 20 20 20 20 54 68 65 20 73 70 65 63          The spec
33e0: 69 66 69 65 64 20 66 69 65 6c 64 20 77 69 64 74  ified field widt
33f0: 68 2e 20 20 54 68 69 73 20 69 73 0a 20 20 20 20  h.  This is.    
3400: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3420: 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 6e 65 67 61   always non-nega
3430: 74 69 76 65 2e 20 20 5a 65 72 6f 20 69 73 20 74  tive.  Zero is t
3440: 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 20 20  he default..    
3450: 2a 2a 20 20 20 70 72 65 63 69 73 69 6f 6e 20 20  **   precision  
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3470: 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20 70   The specified p
3480: 72 65 63 69 73 69 6f 6e 2e 20 20 54 68 65 20 64  recision.  The d
3490: 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 20 20  efault.    **   
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 2d              is -
34c0: 31 2e 0a 20 20 20 20 2a 2a 20 20 20 78 74 79 70  1..    **   xtyp
34d0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
34e0: 20 20 20 20 20 20 20 20 54 68 65 20 63 6c 61 73          The clas
34f0: 73 20 6f 66 20 74 68 65 20 63 6f 6e 76 65 72 73  s of the convers
3500: 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20 20 20 69 6e  ion..    **   in
3510: 66 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  fop             
3520: 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65            Pointe
3530: 72 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  r to the appropr
3540: 69 61 74 65 20 69 6e 66 6f 20 73 74 72 75 63 74  iate info struct
3550: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 77 69  ..    */.    swi
3560: 74 63 68 28 20 78 74 79 70 65 20 29 7b 0a 20 20  tch( xtype ){.  
3570: 20 20 20 20 63 61 73 65 20 65 74 52 41 44 49 58      case etRADIX
3580: 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c  :.        if( fl
3590: 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 20 29 20 20 20  ag_longlong )   
35a0: 6c 6f 6e 67 76 61 6c 75 65 20 3d 20 76 61 5f 61  longvalue = va_a
35b0: 72 67 28 61 70 2c 49 4e 54 36 34 5f 54 59 50 45  rg(ap,INT64_TYPE
35c0: 29 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20  );.        else 
35d0: 69 66 28 20 66 6c 61 67 5f 6c 6f 6e 67 20 29 20  if( flag_long ) 
35e0: 20 6c 6f 6e 67 76 61 6c 75 65 20 3d 20 76 61 5f   longvalue = va_
35f0: 61 72 67 28 61 70 2c 6c 6f 6e 67 20 69 6e 74 29  arg(ap,long int)
3600: 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 20  ;.        else  
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 6c 6f 6e 67 76 61 6c 75 65 20 3d 20 76 61 5f 61  longvalue = va_a
3630: 72 67 28 61 70 2c 69 6e 74 29 3b 0a 23 69 66 20  rg(ap,int);.#if 
3640: 31 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  1.        /* For
3650: 20 74 68 65 20 66 6f 72 6d 61 74 20 25 23 78 2c   the format %#x,
3660: 20 74 68 65 20 76 61 6c 75 65 20 7a 65 72 6f 20   the value zero 
3670: 69 73 20 70 72 69 6e 74 65 64 20 22 30 22 20 6e  is printed "0" n
3680: 6f 74 20 22 30 78 30 22 2e 0a 20 20 20 20 20 20  ot "0x0"..      
3690: 20 20 2a 2a 20 49 20 74 68 69 6e 6b 20 74 68 69    ** I think thi
36a0: 73 20 69 73 20 73 74 75 70 69 64 2e 20 2a 2f 0a  s is stupid. */.
36b0: 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
36c0: 76 61 6c 75 65 3d 3d 30 20 29 20 66 6c 61 67 5f  value==0 ) flag_
36d0: 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d 20 3d 20  alternateform = 
36e0: 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  0;.#else.       
36f0: 20 2f 2a 20 4d 6f 72 65 20 73 65 6e 73 69 62 6c   /* More sensibl
3700: 65 3a 20 74 75 72 6e 20 6f 66 66 20 74 68 65 20  e: turn off the 
3710: 70 72 65 66 69 78 20 66 6f 72 20 6f 63 74 61 6c  prefix for octal
3720: 20 28 74 6f 20 70 72 65 76 65 6e 74 20 22 30 30   (to prevent "00
3730: 22 29 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  "),.        ** b
3740: 75 74 20 6c 65 61 76 65 20 74 68 65 20 70 72 65  ut leave the pre
3750: 66 69 78 20 66 6f 72 20 68 65 78 2e 20 2a 2f 0a  fix for hex. */.
3760: 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
3770: 76 61 6c 75 65 3d 3d 30 20 26 26 20 69 6e 66 6f  value==0 && info
3780: 70 2d 3e 62 61 73 65 3d 3d 38 20 29 20 66 6c 61  p->base==8 ) fla
3790: 67 5f 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d 20  g_alternateform 
37a0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 0;.#endif.    
37b0: 20 20 20 20 69 66 28 20 69 6e 66 6f 70 2d 3e 66      if( infop->f
37c0: 6c 61 67 73 20 26 20 46 4c 41 47 5f 53 49 47 4e  lags & FLAG_SIGN
37d0: 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ED ){.          
37e0: 69 66 28 20 66 6c 61 67 5f 6c 6f 6e 67 6c 6f 6e  if( flag_longlon
37f0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g ){.           
3800: 20 69 66 28 20 2a 28 69 36 34 2a 29 26 6c 6f 6e   if( *(i64*)&lon
3810: 67 76 61 6c 75 65 3c 30 20 29 7b 0a 20 20 20 20  gvalue<0 ){.    
3820: 20 20 20 20 20 20 20 20 20 20 6c 6f 6e 67 76 61            longva
3830: 6c 75 65 20 3d 20 2d 2a 28 69 36 34 2a 29 26 6c  lue = -*(i64*)&l
3840: 6f 6e 67 76 61 6c 75 65 3b 0a 20 20 20 20 20 20  ongvalue;.      
3850: 20 20 20 20 20 20 20 20 70 72 65 66 69 78 20 3d          prefix =
3860: 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '-';.          
3870: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
3880: 5f 70 6c 75 73 73 69 67 6e 20 29 20 20 70 72 65  _plussign )  pre
3890: 66 69 78 20 3d 20 27 2b 27 3b 0a 20 20 20 20 20  fix = '+';.     
38a0: 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20         else if( 
38b0: 66 6c 61 67 5f 62 6c 61 6e 6b 73 69 67 6e 20 29  flag_blanksign )
38c0: 20 20 70 72 65 66 69 78 20 3d 20 27 20 27 3b 0a    prefix = ' ';.
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38f0: 20 20 20 20 20 20 20 70 72 65 66 69 78 20 3d 20         prefix = 
3900: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
3910: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
3920: 69 66 28 20 2a 28 6c 6f 6e 67 2a 29 26 6c 6f 6e  if( *(long*)&lon
3930: 67 76 61 6c 75 65 3c 30 20 29 7b 0a 20 20 20 20  gvalue<0 ){.    
3940: 20 20 20 20 20 20 20 20 20 20 6c 6f 6e 67 76 61            longva
3950: 6c 75 65 20 3d 20 2d 2a 28 6c 6f 6e 67 2a 29 26  lue = -*(long*)&
3960: 6c 6f 6e 67 76 61 6c 75 65 3b 0a 20 20 20 20 20  longvalue;.     
3970: 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78 20           prefix 
3980: 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 20  = '-';.         
3990: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61     }else if( fla
39a0: 67 5f 70 6c 75 73 73 69 67 6e 20 29 20 20 70 72  g_plussign )  pr
39b0: 65 66 69 78 20 3d 20 27 2b 27 3b 0a 20 20 20 20  efix = '+';.    
39c0: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
39d0: 20 66 6c 61 67 5f 62 6c 61 6e 6b 73 69 67 6e 20   flag_blanksign 
39e0: 29 20 20 70 72 65 66 69 78 20 3d 20 27 20 27 3b  )  prefix = ' ';
39f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73  .            els
3a00: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
3a10: 20 20 20 20 20 20 20 20 70 72 65 66 69 78 20 3d          prefix =
3a20: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
3a30: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 20 20          }else   
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 20 20 20 70 72 65 66 69 78 20 3d 20 30 3b       prefix = 0;
3a60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61  .        if( fla
3a70: 67 5f 7a 65 72 6f 70 61 64 20 26 26 20 70 72 65  g_zeropad && pre
3a80: 63 69 73 69 6f 6e 3c 77 69 64 74 68 2d 28 70 72  cision<width-(pr
3a90: 65 66 69 78 21 3d 30 29 20 29 7b 0a 20 20 20 20  efix!=0) ){.    
3aa0: 20 20 20 20 20 20 70 72 65 63 69 73 69 6f 6e 20        precision 
3ab0: 3d 20 77 69 64 74 68 2d 28 70 72 65 66 69 78 21  = width-(prefix!
3ac0: 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  =0);.        }. 
3ad0: 20 20 20 20 20 20 20 62 75 66 70 74 20 3d 20 26         bufpt = &
3ae0: 62 75 66 5b 65 74 42 55 46 53 49 5a 45 2d 31 5d  buf[etBUFSIZE-1]
3af0: 3b 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  ;.        {.    
3b00: 20 20 20 20 20 20 72 65 67 69 73 74 65 72 20 63        register c
3b10: 68 61 72 20 2a 63 73 65 74 3b 20 20 20 20 20 20  har *cset;      
3b20: 2f 2a 20 55 73 65 20 72 65 67 69 73 74 65 72 73  /* Use registers
3b30: 20 66 6f 72 20 73 70 65 65 64 20 2a 2f 0a 20 20   for speed */.  
3b40: 20 20 20 20 20 20 20 20 72 65 67 69 73 74 65 72          register
3b50: 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 20 20 20   int base;.     
3b60: 20 20 20 20 20 63 73 65 74 20 3d 20 69 6e 66 6f       cset = info
3b70: 70 2d 3e 63 68 61 72 73 65 74 3b 0a 20 20 20 20  p->charset;.    
3b80: 20 20 20 20 20 20 62 61 73 65 20 3d 20 69 6e 66        base = inf
3b90: 6f 70 2d 3e 62 61 73 65 3b 0a 20 20 20 20 20 20  op->base;.      
3ba0: 20 20 20 20 64 6f 7b 20 20 20 20 20 20 20 20 20      do{         
3bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bd0: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 6f 20    /* Convert to 
3be0: 61 73 63 69 69 20 2a 2f 0a 20 20 20 20 20 20 20  ascii */.       
3bf0: 20 20 20 20 20 2a 28 2d 2d 62 75 66 70 74 29 20       *(--bufpt) 
3c00: 3d 20 63 73 65 74 5b 6c 6f 6e 67 76 61 6c 75 65  = cset[longvalue
3c10: 25 62 61 73 65 5d 3b 0a 20 20 20 20 20 20 20 20  %base];.        
3c20: 20 20 20 20 6c 6f 6e 67 76 61 6c 75 65 20 3d 20      longvalue = 
3c30: 6c 6f 6e 67 76 61 6c 75 65 2f 62 61 73 65 3b 0a  longvalue/base;.
3c40: 20 20 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65            }while
3c50: 28 20 6c 6f 6e 67 76 61 6c 75 65 3e 30 20 29 3b  ( longvalue>0 );
3c60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3c70: 20 20 20 6c 65 6e 67 74 68 20 3d 20 26 62 75 66     length = &buf
3c80: 5b 65 74 42 55 46 53 49 5a 45 2d 31 5d 2d 62 75  [etBUFSIZE-1]-bu
3c90: 66 70 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  fpt;.        for
3ca0: 28 69 64 78 3d 70 72 65 63 69 73 69 6f 6e 2d 6c  (idx=precision-l
3cb0: 65 6e 67 74 68 3b 20 69 64 78 3e 30 3b 20 69 64  ength; idx>0; id
3cc0: 78 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x--){.          
3cd0: 2a 28 2d 2d 62 75 66 70 74 29 20 3d 20 27 30 27  *(--bufpt) = '0'
3ce0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d00: 20 5a 65 72 6f 20 70 61 64 20 2a 2f 0a 20 20 20   Zero pad */.   
3d10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
3d20: 66 28 20 70 72 65 66 69 78 20 29 20 2a 28 2d 2d  f( prefix ) *(--
3d30: 62 75 66 70 74 29 20 3d 20 70 72 65 66 69 78 3b  bufpt) = prefix;
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3d50: 2a 20 41 64 64 20 73 69 67 6e 20 2a 2f 0a 20 20  * Add sign */.  
3d60: 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 5f 61        if( flag_a
3d70: 6c 74 65 72 6e 61 74 65 66 6f 72 6d 20 26 26 20  lternateform && 
3d80: 69 6e 66 6f 70 2d 3e 70 72 65 66 69 78 20 29 7b  infop->prefix ){
3d90: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 22 30 22        /* Add "0"
3da0: 20 6f 72 20 22 30 78 22 20 2a 2f 0a 20 20 20 20   or "0x" */.    
3db0: 20 20 20 20 20 20 63 68 61 72 20 2a 70 72 65 2c        char *pre,
3dc0: 20 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72   x;.          pr
3dd0: 65 20 3d 20 69 6e 66 6f 70 2d 3e 70 72 65 66 69  e = infop->prefi
3de0: 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  x;.          if(
3df0: 20 2a 62 75 66 70 74 21 3d 70 72 65 5b 30 5d 20   *bufpt!=pre[0] 
3e00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
3e10: 6f 72 28 70 72 65 3d 69 6e 66 6f 70 2d 3e 70 72  or(pre=infop->pr
3e20: 65 66 69 78 3b 20 28 78 3d 28 2a 70 72 65 29 29  efix; (x=(*pre))
3e30: 21 3d 30 3b 20 70 72 65 2b 2b 29 20 2a 28 2d 2d  !=0; pre++) *(--
3e40: 62 75 66 70 74 29 20 3d 20 78 3b 0a 20 20 20 20  bufpt) = x;.    
3e50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3e60: 7d 0a 20 20 20 20 20 20 20 20 6c 65 6e 67 74 68  }.        length
3e70: 20 3d 20 26 62 75 66 5b 65 74 42 55 46 53 49 5a   = &buf[etBUFSIZ
3e80: 45 2d 31 5d 2d 62 75 66 70 74 3b 0a 20 20 20 20  E-1]-bufpt;.    
3e90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3ea0: 20 63 61 73 65 20 65 74 46 4c 4f 41 54 3a 0a 20   case etFLOAT:. 
3eb0: 20 20 20 20 20 63 61 73 65 20 65 74 45 58 50 3a       case etEXP:
3ec0: 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 47 45  .      case etGE
3ed0: 4e 45 52 49 43 3a 0a 20 20 20 20 20 20 20 20 72  NERIC:.        r
3ee0: 65 61 6c 76 61 6c 75 65 20 3d 20 76 61 5f 61 72  ealvalue = va_ar
3ef0: 67 28 61 70 2c 64 6f 75 62 6c 65 29 3b 0a 23 69  g(ap,double);.#i
3f00: 66 6e 64 65 66 20 65 74 4e 4f 46 4c 4f 41 54 49  fndef etNOFLOATI
3f10: 4e 47 50 4f 49 4e 54 0a 20 20 20 20 20 20 20 20  NGPOINT.        
3f20: 69 66 28 20 70 72 65 63 69 73 69 6f 6e 3c 30 20  if( precision<0 
3f30: 29 20 70 72 65 63 69 73 69 6f 6e 20 3d 20 36 3b  ) precision = 6;
3f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
3f50: 64 65 66 61 75 6c 74 20 70 72 65 63 69 73 69 6f  default precisio
3f60: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  n */.        if(
3f70: 20 70 72 65 63 69 73 69 6f 6e 3e 65 74 42 55 46   precision>etBUF
3f80: 53 49 5a 45 2d 31 30 20 29 20 70 72 65 63 69 73  SIZE-10 ) precis
3f90: 69 6f 6e 20 3d 20 65 74 42 55 46 53 49 5a 45 2d  ion = etBUFSIZE-
3fa0: 31 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  10;.        if( 
3fb0: 72 65 61 6c 76 61 6c 75 65 3c 30 2e 30 20 29 7b  realvalue<0.0 ){
3fc0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 61 6c 76  .          realv
3fd0: 61 6c 75 65 20 3d 20 2d 72 65 61 6c 76 61 6c 75  alue = -realvalu
3fe0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 65  e;.          pre
3ff0: 66 69 78 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20  fix = '-';.     
4000: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4010: 20 20 20 20 69 66 28 20 66 6c 61 67 5f 70 6c 75      if( flag_plu
4020: 73 73 69 67 6e 20 29 20 20 20 20 20 20 20 20 20  ssign )         
4030: 20 70 72 65 66 69 78 20 3d 20 27 2b 27 3b 0a 20   prefix = '+';. 
4040: 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66           else if
4050: 28 20 66 6c 61 67 5f 62 6c 61 6e 6b 73 69 67 6e  ( flag_blanksign
4060: 20 29 20 20 20 20 70 72 65 66 69 78 20 3d 20 27   )    prefix = '
4070: 20 27 3b 0a 20 20 20 20 20 20 20 20 20 20 65 6c   ';.          el
4080: 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
4090: 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69             prefi
40a0: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  x = 0;.        }
40b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66  .        if( inf
40c0: 6f 70 2d 3e 74 79 70 65 3d 3d 65 74 47 45 4e 45  op->type==etGENE
40d0: 52 49 43 20 26 26 20 70 72 65 63 69 73 69 6f 6e  RIC && precision
40e0: 3e 30 20 29 20 70 72 65 63 69 73 69 6f 6e 2d 2d  >0 ) precision--
40f0: 3b 0a 20 20 20 20 20 20 20 20 72 6f 75 6e 64 65  ;.        rounde
4100: 72 20 3d 20 30 2e 30 3b 0a 23 69 66 20 30 0a 20  r = 0.0;.#if 0. 
4110: 20 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 69         /* Roundi
4120: 6e 67 20 77 6f 72 6b 73 20 6c 69 6b 65 20 42 53  ng works like BS
4130: 44 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 73 74  D when the const
4140: 61 6e 74 20 30 2e 34 39 39 39 20 69 73 20 75 73  ant 0.4999 is us
4150: 65 64 2e 20 20 57 69 65 72 64 21 20 2a 2f 0a 20  ed.  Wierd! */. 
4160: 20 20 20 20 20 20 20 66 6f 72 28 69 64 78 3d 70         for(idx=p
4170: 72 65 63 69 73 69 6f 6e 2c 20 72 6f 75 6e 64 65  recision, rounde
4180: 72 3d 30 2e 34 39 39 39 3b 20 69 64 78 3e 30 3b  r=0.4999; idx>0;
4190: 20 69 64 78 2d 2d 2c 20 72 6f 75 6e 64 65 72 2a   idx--, rounder*
41a0: 3d 30 2e 31 29 3b 0a 23 65 6c 73 65 0a 20 20 20  =0.1);.#else.   
41b0: 20 20 20 20 20 2f 2a 20 49 74 20 6d 61 6b 65 73       /* It makes
41c0: 20 6d 6f 72 65 20 73 65 6e 73 65 20 74 6f 20 75   more sense to u
41d0: 73 65 20 30 2e 35 20 2a 2f 0a 20 20 20 20 20 20  se 0.5 */.      
41e0: 20 20 66 6f 72 28 69 64 78 3d 70 72 65 63 69 73    for(idx=precis
41f0: 69 6f 6e 2c 20 72 6f 75 6e 64 65 72 3d 30 2e 35  ion, rounder=0.5
4200: 3b 20 69 64 78 3e 30 3b 20 69 64 78 2d 2d 2c 20  ; idx>0; idx--, 
4210: 72 6f 75 6e 64 65 72 2a 3d 30 2e 31 29 3b 0a 23  rounder*=0.1);.#
4220: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
4230: 28 20 69 6e 66 6f 70 2d 3e 74 79 70 65 3d 3d 65  ( infop->type==e
4240: 74 46 4c 4f 41 54 20 29 20 72 65 61 6c 76 61 6c  tFLOAT ) realval
4250: 75 65 20 2b 3d 20 72 6f 75 6e 64 65 72 3b 0a 20  ue += rounder;. 
4260: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c         /* Normal
4270: 69 7a 65 20 72 65 61 6c 76 61 6c 75 65 20 74 6f  ize realvalue to
4280: 20 77 69 74 68 69 6e 20 31 30 2e 30 20 3e 20 72   within 10.0 > r
4290: 65 61 6c 76 61 6c 75 65 20 3e 3d 20 31 2e 30 20  ealvalue >= 1.0 
42a0: 2a 2f 0a 20 20 20 20 20 20 20 20 65 78 70 20 3d  */.        exp =
42b0: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
42c0: 72 65 61 6c 76 61 6c 75 65 3e 30 2e 30 20 29 7b  realvalue>0.0 ){
42d0: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
42e0: 28 20 72 65 61 6c 76 61 6c 75 65 3e 3d 31 65 38  ( realvalue>=1e8
42f0: 20 26 26 20 65 78 70 3c 3d 33 35 30 20 29 7b 20   && exp<=350 ){ 
4300: 72 65 61 6c 76 61 6c 75 65 20 2a 3d 20 31 65 2d  realvalue *= 1e-
4310: 38 3b 20 65 78 70 2b 3d 38 3b 20 7d 0a 20 20 20  8; exp+=8; }.   
4320: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 65         while( re
4330: 61 6c 76 61 6c 75 65 3e 3d 31 30 2e 30 20 26 26  alvalue>=10.0 &&
4340: 20 65 78 70 3c 3d 33 35 30 20 29 7b 20 72 65 61   exp<=350 ){ rea
4350: 6c 76 61 6c 75 65 20 2a 3d 20 30 2e 31 3b 20 65  lvalue *= 0.1; e
4360: 78 70 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20  xp++; }.        
4370: 20 20 77 68 69 6c 65 28 20 72 65 61 6c 76 61 6c    while( realval
4380: 75 65 3c 31 65 2d 38 20 26 26 20 65 78 70 3e 3d  ue<1e-8 && exp>=
4390: 2d 33 35 30 20 29 7b 20 72 65 61 6c 76 61 6c 75  -350 ){ realvalu
43a0: 65 20 2a 3d 20 31 65 38 3b 20 65 78 70 2d 3d 38  e *= 1e8; exp-=8
43b0: 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 77 68  ; }.          wh
43c0: 69 6c 65 28 20 72 65 61 6c 76 61 6c 75 65 3c 31  ile( realvalue<1
43d0: 2e 30 20 26 26 20 65 78 70 3e 3d 2d 33 35 30 20  .0 && exp>=-350 
43e0: 29 7b 20 72 65 61 6c 76 61 6c 75 65 20 2a 3d 20  ){ realvalue *= 
43f0: 31 30 2e 30 3b 20 65 78 70 2d 2d 3b 20 7d 0a 20  10.0; exp--; }. 
4400: 20 20 20 20 20 20 20 20 20 69 66 28 20 65 78 70           if( exp
4410: 3e 33 35 30 20 7c 7c 20 65 78 70 3c 2d 33 35 30  >350 || exp<-350
4420: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
4430: 62 75 66 70 74 20 3d 20 22 4e 61 4e 22 3b 0a 20  bufpt = "NaN";. 
4440: 20 20 20 20 20 20 20 20 20 20 20 6c 65 6e 67 74             lengt
4450: 68 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20  h = 3;.         
4460: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4470: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
4480: 20 20 20 20 20 20 20 20 62 75 66 70 74 20 3d 20          bufpt = 
4490: 62 75 66 3b 0a 20 20 20 20 20 20 20 20 2f 2a 0a  buf;.        /*.
44a0: 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
44b0: 65 20 66 69 65 6c 64 20 74 79 70 65 20 69 73 20  e field type is 
44c0: 65 74 47 45 4e 45 52 49 43 2c 20 74 68 65 6e 20  etGENERIC, then 
44d0: 63 6f 6e 76 65 72 74 20 74 6f 20 65 69 74 68 65  convert to eithe
44e0: 72 20 65 74 45 58 50 0a 20 20 20 20 20 20 20 20  r etEXP.        
44f0: 2a 2a 20 6f 72 20 65 74 46 4c 4f 41 54 2c 20 61  ** or etFLOAT, a
4500: 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20  s appropriate.. 
4510: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
4520: 20 20 66 6c 61 67 5f 65 78 70 20 3d 20 78 74 79    flag_exp = xty
4530: 70 65 3d 3d 65 74 45 58 50 3b 0a 20 20 20 20 20  pe==etEXP;.     
4540: 20 20 20 69 66 28 20 78 74 79 70 65 21 3d 65 74     if( xtype!=et
4550: 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
4560: 20 20 20 72 65 61 6c 76 61 6c 75 65 20 2b 3d 20     realvalue += 
4570: 72 6f 75 6e 64 65 72 3b 0a 20 20 20 20 20 20 20  rounder;.       
4580: 20 20 20 69 66 28 20 72 65 61 6c 76 61 6c 75 65     if( realvalue
4590: 3e 3d 31 30 2e 30 20 29 7b 20 72 65 61 6c 76 61  >=10.0 ){ realva
45a0: 6c 75 65 20 2a 3d 20 30 2e 31 3b 20 65 78 70 2b  lue *= 0.1; exp+
45b0: 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20  +; }.        }. 
45c0: 20 20 20 20 20 20 20 69 66 28 20 78 74 79 70 65         if( xtype
45d0: 3d 3d 65 74 47 45 4e 45 52 49 43 20 29 7b 0a 20  ==etGENERIC ){. 
45e0: 20 20 20 20 20 20 20 20 20 66 6c 61 67 5f 72 74           flag_rt
45f0: 7a 20 3d 20 21 66 6c 61 67 5f 61 6c 74 65 72 6e  z = !flag_altern
4600: 61 74 65 66 6f 72 6d 3b 0a 20 20 20 20 20 20 20  ateform;.       
4610: 20 20 20 69 66 28 20 65 78 70 3c 2d 34 20 7c 7c     if( exp<-4 ||
4620: 20 65 78 70 3e 70 72 65 63 69 73 69 6f 6e 20 29   exp>precision )
4630: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 74  {.            xt
4640: 79 70 65 20 3d 20 65 74 45 58 50 3b 0a 20 20 20  ype = etEXP;.   
4650: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
4660: 20 20 20 20 20 20 20 20 20 20 70 72 65 63 69 73            precis
4670: 69 6f 6e 20 3d 20 70 72 65 63 69 73 69 6f 6e 20  ion = precision 
4680: 2d 20 65 78 70 3b 0a 20 20 20 20 20 20 20 20 20  - exp;.         
4690: 20 20 20 78 74 79 70 65 20 3d 20 65 74 46 4c 4f     xtype = etFLO
46a0: 41 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  AT;.          }.
46b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
46c0: 20 20 20 20 20 20 20 20 20 66 6c 61 67 5f 72 74           flag_rt
46d0: 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  z = 0;.        }
46e0: 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20  .        /*.    
46f0: 20 20 20 20 2a 2a 20 54 68 65 20 22 65 78 70 2b      ** The "exp+
4700: 70 72 65 63 69 73 69 6f 6e 22 20 74 65 73 74 20  precision" test 
4710: 63 61 75 73 65 73 20 6f 75 74 70 75 74 20 74 6f  causes output to
4720: 20 62 65 20 6f 66 20 74 79 70 65 20 65 74 45 58   be of type etEX
4730: 50 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  P if.        ** 
4740: 74 68 65 20 70 72 65 63 69 73 69 6f 6e 20 69 73  the precision is
4750: 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 66 69   too large to fi
4760: 74 20 69 6e 20 62 75 66 5b 5d 2e 0a 20 20 20 20  t in buf[]..    
4770: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e      */.        n
4780: 73 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sd = 0;.        
4790: 69 66 28 20 78 74 79 70 65 3d 3d 65 74 46 4c 4f  if( xtype==etFLO
47a0: 41 54 20 26 26 20 65 78 70 2b 70 72 65 63 69 73  AT && exp+precis
47b0: 69 6f 6e 3c 65 74 42 55 46 53 49 5a 45 2d 33 30  ion<etBUFSIZE-30
47c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c   ){.          fl
47d0: 61 67 5f 64 70 20 3d 20 28 70 72 65 63 69 73 69  ag_dp = (precisi
47e0: 6f 6e 3e 30 20 7c 7c 20 66 6c 61 67 5f 61 6c 74  on>0 || flag_alt
47f0: 65 72 6e 61 74 65 66 6f 72 6d 29 3b 0a 20 20 20  ernateform);.   
4800: 20 20 20 20 20 20 20 69 66 28 20 70 72 65 66 69         if( prefi
4810: 78 20 29 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d  x ) *(bufpt++) =
4820: 20 70 72 65 66 69 78 3b 20 20 20 20 20 20 20 20   prefix;        
4830: 20 2f 2a 20 53 69 67 6e 20 2a 2f 0a 20 20 20 20   /* Sign */.    
4840: 20 20 20 20 20 20 69 66 28 20 65 78 70 3c 30 20        if( exp<0 
4850: 29 20 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20  )  *(bufpt++) = 
4860: 27 30 27 3b 20 20 20 20 20 20 20 20 20 20 20 20  '0';            
4870: 2f 2a 20 44 69 67 69 74 73 20 62 65 66 6f 72 65  /* Digits before
4880: 20 22 2e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20   "." */.        
4890: 20 20 65 6c 73 65 20 66 6f 72 28 3b 20 65 78 70    else for(; exp
48a0: 3e 3d 30 3b 20 65 78 70 2d 2d 29 20 2a 28 62 75  >=0; exp--) *(bu
48b0: 66 70 74 2b 2b 29 20 3d 20 65 74 5f 67 65 74 64  fpt++) = et_getd
48c0: 69 67 69 74 28 26 72 65 61 6c 76 61 6c 75 65 2c  igit(&realvalue,
48d0: 26 6e 73 64 29 3b 0a 20 20 20 20 20 20 20 20 20  &nsd);.         
48e0: 20 69 66 28 20 66 6c 61 67 5f 64 70 20 29 20 2a   if( flag_dp ) *
48f0: 28 62 75 66 70 74 2b 2b 29 20 3d 20 27 2e 27 3b  (bufpt++) = '.';
4900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
4910: 65 20 64 65 63 69 6d 61 6c 20 70 6f 69 6e 74 20  e decimal point 
4920: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  */.          for
4930: 28 65 78 70 2b 2b 3b 20 65 78 70 3c 30 20 26 26  (exp++; exp<0 &&
4940: 20 70 72 65 63 69 73 69 6f 6e 3e 30 3b 20 70 72   precision>0; pr
4950: 65 63 69 73 69 6f 6e 2d 2d 2c 20 65 78 70 2b 2b  ecision--, exp++
4960: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
4970: 28 62 75 66 70 74 2b 2b 29 20 3d 20 27 30 27 3b  (bufpt++) = '0';
4980: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4990: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 70         while( (p
49a0: 72 65 63 69 73 69 6f 6e 2d 2d 29 3e 30 20 29 20  recision--)>0 ) 
49b0: 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20 65 74 5f  *(bufpt++) = et_
49c0: 67 65 74 64 69 67 69 74 28 26 72 65 61 6c 76 61  getdigit(&realva
49d0: 6c 75 65 2c 26 6e 73 64 29 3b 0a 20 20 20 20 20  lue,&nsd);.     
49e0: 20 20 20 20 20 2a 28 62 75 66 70 74 2d 2d 29 20       *(bufpt--) 
49f0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4a10: 2a 20 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65  * Null terminate
4a20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
4a30: 28 20 66 6c 61 67 5f 72 74 7a 20 26 26 20 66 6c  ( flag_rtz && fl
4a40: 61 67 5f 64 70 20 29 7b 20 20 20 20 20 2f 2a 20  ag_dp ){     /* 
4a50: 52 65 6d 6f 76 65 20 74 72 61 69 6c 69 6e 67 20  Remove trailing 
4a60: 7a 65 72 6f 73 20 61 6e 64 20 22 2e 22 20 2a 2f  zeros and "." */
4a70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69  .            whi
4a80: 6c 65 28 20 62 75 66 70 74 3e 3d 62 75 66 20 26  le( bufpt>=buf &
4a90: 26 20 2a 62 75 66 70 74 3d 3d 27 30 27 20 29 20  & *bufpt=='0' ) 
4aa0: 2a 28 62 75 66 70 74 2d 2d 29 20 3d 20 30 3b 0a  *(bufpt--) = 0;.
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
4ac0: 62 75 66 70 74 3e 3d 62 75 66 20 26 26 20 2a 62  bufpt>=buf && *b
4ad0: 75 66 70 74 3d 3d 27 2e 27 20 29 20 2a 28 62 75  ufpt=='.' ) *(bu
4ae0: 66 70 74 2d 2d 29 20 3d 20 30 3b 0a 20 20 20 20  fpt--) = 0;.    
4af0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4b00: 20 20 62 75 66 70 74 2b 2b 3b 20 20 20 20 20 20    bufpt++;      
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b20: 20 20 20 20 20 20 2f 2a 20 70 6f 69 6e 74 20 74        /* point t
4b30: 6f 20 6e 65 78 74 20 66 72 65 65 20 73 6c 6f 74  o next free slot
4b40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
4b50: 65 7b 20 20 20 20 2f 2a 20 65 74 45 58 50 20 6f  e{    /* etEXP o
4b60: 72 20 65 74 47 45 4e 45 52 49 43 20 2a 2f 0a 20  r etGENERIC */. 
4b70: 20 20 20 20 20 20 20 20 20 66 6c 61 67 5f 64 70           flag_dp
4b80: 20 3d 20 28 70 72 65 63 69 73 69 6f 6e 3e 30 20   = (precision>0 
4b90: 7c 7c 20 66 6c 61 67 5f 61 6c 74 65 72 6e 61 74  || flag_alternat
4ba0: 65 66 6f 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  eform);.        
4bb0: 20 20 69 66 28 20 70 72 65 66 69 78 20 29 20 2a    if( prefix ) *
4bc0: 28 62 75 66 70 74 2b 2b 29 20 3d 20 70 72 65 66  (bufpt++) = pref
4bd0: 69 78 3b 20 20 20 2f 2a 20 53 69 67 6e 20 2a 2f  ix;   /* Sign */
4be0: 0a 20 20 20 20 20 20 20 20 20 20 2a 28 62 75 66  .          *(buf
4bf0: 70 74 2b 2b 29 20 3d 20 65 74 5f 67 65 74 64 69  pt++) = et_getdi
4c00: 67 69 74 28 26 72 65 61 6c 76 61 6c 75 65 2c 26  git(&realvalue,&
4c10: 6e 73 64 29 3b 20 20 2f 2a 20 46 69 72 73 74 20  nsd);  /* First 
4c20: 64 69 67 69 74 20 2a 2f 0a 20 20 20 20 20 20 20  digit */.       
4c30: 20 20 20 69 66 28 20 66 6c 61 67 5f 64 70 20 29     if( flag_dp )
4c40: 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20 27 2e   *(bufpt++) = '.
4c50: 27 3b 20 20 20 20 20 2f 2a 20 44 65 63 69 6d 61  ';     /* Decima
4c60: 6c 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20  l point */.     
4c70: 20 20 20 20 20 77 68 69 6c 65 28 20 28 70 72 65       while( (pre
4c80: 63 69 73 69 6f 6e 2d 2d 29 3e 30 20 29 20 2a 28  cision--)>0 ) *(
4c90: 62 75 66 70 74 2b 2b 29 20 3d 20 65 74 5f 67 65  bufpt++) = et_ge
4ca0: 74 64 69 67 69 74 28 26 72 65 61 6c 76 61 6c 75  tdigit(&realvalu
4cb0: 65 2c 26 6e 73 64 29 3b 0a 20 20 20 20 20 20 20  e,&nsd);.       
4cc0: 20 20 20 62 75 66 70 74 2d 2d 3b 20 20 20 20 20     bufpt--;     
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ce0: 20 20 20 20 20 20 20 2f 2a 20 70 6f 69 6e 74 20         /* point 
4cf0: 74 6f 20 6c 61 73 74 20 64 69 67 69 74 20 2a 2f  to last digit */
4d00: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66  .          if( f
4d10: 6c 61 67 5f 72 74 7a 20 26 26 20 66 6c 61 67 5f  lag_rtz && flag_
4d20: 64 70 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f  dp ){          /
4d30: 2a 20 52 65 6d 6f 76 65 20 74 61 69 6c 20 7a 65  * Remove tail ze
4d40: 72 6f 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ros */.         
4d50: 20 20 20 77 68 69 6c 65 28 20 62 75 66 70 74 3e     while( bufpt>
4d60: 3d 62 75 66 20 26 26 20 2a 62 75 66 70 74 3d 3d  =buf && *bufpt==
4d70: 27 30 27 20 29 20 2a 28 62 75 66 70 74 2d 2d 29  '0' ) *(bufpt--)
4d80: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
4d90: 20 20 69 66 28 20 62 75 66 70 74 3e 3d 62 75 66    if( bufpt>=buf
4da0: 20 26 26 20 2a 62 75 66 70 74 3d 3d 27 2e 27 20   && *bufpt=='.' 
4db0: 29 20 2a 28 62 75 66 70 74 2d 2d 29 20 3d 20 30  ) *(bufpt--) = 0
4dc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
4dd0: 20 20 20 20 20 20 20 20 62 75 66 70 74 2b 2b 3b          bufpt++;
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
4e00: 6f 69 6e 74 20 74 6f 20 6e 65 78 74 20 66 72 65  oint to next fre
4e10: 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20  e slot */.      
4e20: 20 20 20 20 69 66 28 20 65 78 70 20 7c 7c 20 66      if( exp || f
4e30: 6c 61 67 5f 65 78 70 20 29 7b 0a 20 20 20 20 20  lag_exp ){.     
4e40: 20 20 20 20 20 20 20 2a 28 62 75 66 70 74 2b 2b         *(bufpt++
4e50: 29 20 3d 20 69 6e 66 6f 70 2d 3e 63 68 61 72 73  ) = infop->chars
4e60: 65 74 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 20  et[0];.         
4e70: 20 20 20 69 66 28 20 65 78 70 3c 30 20 29 7b 20     if( exp<0 ){ 
4e80: 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20 27 2d 27  *(bufpt++) = '-'
4e90: 3b 20 65 78 70 20 3d 20 2d 65 78 70 3b 20 7d 20  ; exp = -exp; } 
4ea0: 2f 2a 20 73 69 67 6e 20 6f 66 20 65 78 70 20 2a  /* sign of exp *
4eb0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  /.            el
4ec0: 73 65 20 20 20 20 20 20 20 7b 20 2a 28 62 75 66  se       { *(buf
4ed0: 70 74 2b 2b 29 20 3d 20 27 2b 27 3b 20 7d 0a 20  pt++) = '+'; }. 
4ee0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65             if( e
4ef0: 78 70 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20 20  xp>=100 ){.     
4f00: 20 20 20 20 20 20 20 20 20 2a 28 62 75 66 70 74           *(bufpt
4f10: 2b 2b 29 20 3d 20 28 65 78 70 2f 31 30 30 29 2b  ++) = (exp/100)+
4f20: 27 30 27 3b 20 20 20 20 20 20 20 20 20 20 20 20  '0';            
4f30: 20 20 20 20 2f 2a 20 31 30 30 27 73 20 64 69 67      /* 100's dig
4f40: 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  it */.          
4f50: 20 20 20 20 65 78 70 20 25 3d 20 31 30 30 3b 0a      exp %= 100;.
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
4f70: 20 20 20 20 20 20 20 20 20 20 2a 28 62 75 66 70            *(bufp
4f80: 74 2b 2b 29 20 3d 20 65 78 70 2f 31 30 2b 27 30  t++) = exp/10+'0
4f90: 27 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ';              
4fa0: 20 20 20 20 20 20 20 2f 2a 20 31 30 27 73 20 64         /* 10's d
4fb0: 69 67 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  igit */.        
4fc0: 20 20 20 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d      *(bufpt++) =
4fd0: 20 65 78 70 25 31 30 2b 27 30 27 3b 20 20 20 20   exp%10+'0';    
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ff0: 20 2f 2a 20 31 27 73 20 64 69 67 69 74 20 2a 2f   /* 1's digit */
5000: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5010: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
5020: 2a 20 54 68 65 20 63 6f 6e 76 65 72 74 65 64 20  * The converted 
5030: 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62 75 66  number is in buf
5040: 5b 5d 20 61 6e 64 20 7a 65 72 6f 20 74 65 72 6d  [] and zero term
5050: 69 6e 61 74 65 64 2e 20 4f 75 74 70 75 74 20 69  inated. Output i
5060: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f  t..        ** No
5070: 74 65 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  te that the numb
5080: 65 72 20 69 73 20 69 6e 20 74 68 65 20 75 73 75  er is in the usu
5090: 61 6c 20 6f 72 64 65 72 2c 20 6e 6f 74 20 72 65  al order, not re
50a0: 76 65 72 73 65 64 20 61 73 20 77 69 74 68 0a 20  versed as with. 
50b0: 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65         ** intege
50c0: 72 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 2a  r conversions. *
50d0: 2f 0a 20 20 20 20 20 20 20 20 6c 65 6e 67 74 68  /.        length
50e0: 20 3d 20 62 75 66 70 74 2d 62 75 66 3b 0a 20 20   = bufpt-buf;.  
50f0: 20 20 20 20 20 20 62 75 66 70 74 20 3d 20 62 75        bufpt = bu
5100: 66 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  f;..        /* S
5110: 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 41 64  pecial case:  Ad
5120: 64 20 6c 65 61 64 69 6e 67 20 7a 65 72 6f 73 20  d leading zeros 
5130: 69 66 20 74 68 65 20 66 6c 61 67 5f 7a 65 72 6f  if the flag_zero
5140: 70 61 64 20 66 6c 61 67 20 69 73 0a 20 20 20 20  pad flag is.    
5150: 20 20 20 20 2a 2a 20 73 65 74 20 61 6e 64 20 77      ** set and w
5160: 65 20 61 72 65 20 6e 6f 74 20 6c 65 66 74 20 6a  e are not left j
5170: 75 73 74 69 66 69 65 64 20 2a 2f 0a 20 20 20 20  ustified */.    
5180: 20 20 20 20 69 66 28 20 66 6c 61 67 5f 7a 65 72      if( flag_zer
5190: 6f 70 61 64 20 26 26 20 21 66 6c 61 67 5f 6c 65  opad && !flag_le
51a0: 66 74 6a 75 73 74 69 66 79 20 26 26 20 6c 65 6e  ftjustify && len
51b0: 67 74 68 20 3c 20 77 69 64 74 68 29 7b 0a 20 20  gth < width){.  
51c0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
51d0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 61           int nPa
51e0: 64 20 3d 20 77 69 64 74 68 20 2d 20 6c 65 6e 67  d = width - leng
51f0: 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  th;.          fo
5200: 72 28 69 3d 77 69 64 74 68 3b 20 69 3e 3d 6e 50  r(i=width; i>=nP
5210: 61 64 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  ad; i--){.      
5220: 20 20 20 20 20 20 62 75 66 70 74 5b 69 5d 20 3d        bufpt[i] =
5230: 20 62 75 66 70 74 5b 69 2d 6e 50 61 64 5d 3b 0a   bufpt[i-nPad];.
5240: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5250: 20 20 20 20 20 20 69 20 3d 20 70 72 65 66 69 78        i = prefix
5260: 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 77  !=0;.          w
5270: 68 69 6c 65 28 20 6e 50 61 64 2d 2d 20 29 20 62  hile( nPad-- ) b
5280: 75 66 70 74 5b 69 2b 2b 5d 20 3d 20 27 30 27 3b  ufpt[i++] = '0';
5290: 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e 67 74  .          lengt
52a0: 68 20 3d 20 77 69 64 74 68 3b 0a 20 20 20 20 20  h = width;.     
52b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
52c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
52d0: 20 63 61 73 65 20 65 74 53 49 5a 45 3a 0a 20 20   case etSIZE:.  
52e0: 20 20 20 20 20 20 2a 28 76 61 5f 61 72 67 28 61        *(va_arg(a
52f0: 70 2c 69 6e 74 2a 29 29 20 3d 20 63 6f 75 6e 74  p,int*)) = count
5300: 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e 67 74 68  ;.        length
5310: 20 3d 20 77 69 64 74 68 20 3d 20 30 3b 0a 20 20   = width = 0;.  
5320: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5330: 20 20 20 63 61 73 65 20 65 74 50 45 52 43 45 4e     case etPERCEN
5340: 54 3a 0a 20 20 20 20 20 20 20 20 62 75 66 5b 30  T:.        buf[0
5350: 5d 20 3d 20 27 25 27 3b 0a 20 20 20 20 20 20 20  ] = '%';.       
5360: 20 62 75 66 70 74 20 3d 20 62 75 66 3b 0a 20 20   bufpt = buf;.  
5370: 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 31        length = 1
5380: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
5390: 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 43 48  .      case etCH
53a0: 41 52 4c 49 54 3a 0a 20 20 20 20 20 20 63 61 73  ARLIT:.      cas
53b0: 65 20 65 74 43 48 41 52 58 3a 0a 20 20 20 20 20  e etCHARX:.     
53c0: 20 20 20 63 20 3d 20 62 75 66 5b 30 5d 20 3d 20     c = buf[0] = 
53d0: 28 78 74 79 70 65 3d 3d 65 74 43 48 41 52 58 20  (xtype==etCHARX 
53e0: 3f 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  ? va_arg(ap,int)
53f0: 20 3a 20 2a 2b 2b 66 6d 74 29 3b 0a 20 20 20 20   : *++fmt);.    
5400: 20 20 20 20 69 66 28 20 70 72 65 63 69 73 69 6f      if( precisio
5410: 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
5420: 20 20 66 6f 72 28 69 64 78 3d 31 3b 20 69 64 78    for(idx=1; idx
5430: 3c 70 72 65 63 69 73 69 6f 6e 3b 20 69 64 78 2b  <precision; idx+
5440: 2b 29 20 62 75 66 5b 69 64 78 5d 20 3d 20 63 3b  +) buf[idx] = c;
5450: 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e 67 74  .          lengt
5460: 68 20 3d 20 70 72 65 63 69 73 69 6f 6e 3b 0a 20  h = precision;. 
5470: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
5480: 20 20 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d          length =
5490: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
54a0: 20 20 20 20 20 62 75 66 70 74 20 3d 20 62 75 66       bufpt = buf
54b0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
54c0: 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 53 54  .      case etST
54d0: 52 49 4e 47 3a 0a 20 20 20 20 20 20 63 61 73 65  RING:.      case
54e0: 20 65 74 44 59 4e 53 54 52 49 4e 47 3a 0a 20 20   etDYNSTRING:.  
54f0: 20 20 20 20 20 20 62 75 66 70 74 20 3d 20 76 61        bufpt = va
5500: 5f 61 72 67 28 61 70 2c 63 68 61 72 2a 29 3b 0a  _arg(ap,char*);.
5510: 20 20 20 20 20 20 20 20 69 66 28 20 62 75 66 70          if( bufp
5520: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
5530: 20 20 62 75 66 70 74 20 3d 20 22 22 3b 0a 20 20    bufpt = "";.  
5540: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
5550: 78 74 79 70 65 3d 3d 65 74 44 59 4e 53 54 52 49  xtype==etDYNSTRI
5560: 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NG ){.          
5570: 7a 45 78 74 72 61 20 3d 20 62 75 66 70 74 3b 0a  zExtra = bufpt;.
5580: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5590: 20 20 6c 65 6e 67 74 68 20 3d 20 73 74 72 6c 65    length = strle
55a0: 6e 28 62 75 66 70 74 29 3b 0a 20 20 20 20 20 20  n(bufpt);.      
55b0: 20 20 69 66 28 20 70 72 65 63 69 73 69 6f 6e 3e    if( precision>
55c0: 3d 30 20 26 26 20 70 72 65 63 69 73 69 6f 6e 3c  =0 && precision<
55d0: 6c 65 6e 67 74 68 20 29 20 6c 65 6e 67 74 68 20  length ) length 
55e0: 3d 20 70 72 65 63 69 73 69 6f 6e 3b 0a 20 20 20  = precision;.   
55f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5600: 20 20 63 61 73 65 20 65 74 53 51 4c 45 53 43 41    case etSQLESCA
5610: 50 45 3a 0a 20 20 20 20 20 20 63 61 73 65 20 65  PE:.      case e
5620: 74 53 51 4c 45 53 43 41 50 45 32 3a 0a 20 20 20  tSQLESCAPE2:.   
5630: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
5640: 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 2c 20 63 2c   int i, j, n, c,
5650: 20 69 73 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20   isnull;.       
5660: 20 20 20 63 68 61 72 20 2a 61 72 67 20 3d 20 76     char *arg = v
5670: 61 5f 61 72 67 28 61 70 2c 63 68 61 72 2a 29 3b  a_arg(ap,char*);
5680: 0a 20 20 20 20 20 20 20 20 20 20 69 73 6e 75 6c  .          isnul
5690: 6c 20 3d 20 61 72 67 3d 3d 30 3b 0a 20 20 20 20  l = arg==0;.    
56a0: 20 20 20 20 20 20 69 66 28 20 69 73 6e 75 6c 6c        if( isnull
56b0: 20 29 20 61 72 67 20 3d 20 28 78 74 79 70 65 3d   ) arg = (xtype=
56c0: 3d 65 74 53 51 4c 45 53 43 41 50 45 32 20 3f 20  =etSQLESCAPE2 ? 
56d0: 22 4e 55 4c 4c 22 20 3a 20 22 28 4e 55 4c 4c 29  "NULL" : "(NULL)
56e0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ");.          fo
56f0: 72 28 69 3d 6e 3d 30 3b 20 28 63 3d 61 72 67 5b  r(i=n=0; (c=arg[
5700: 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  i])!=0; i++){.  
5710: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
5720: 3d 27 5c 27 27 20 29 20 20 6e 2b 2b 3b 0a 20 20  ='\'' )  n++;.  
5730: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5740: 20 20 20 20 6e 20 2b 3d 20 69 20 2b 20 31 20 2b      n += i + 1 +
5750: 20 28 28 21 69 73 6e 75 6c 6c 20 26 26 20 78 74   ((!isnull && xt
5760: 79 70 65 3d 3d 65 74 53 51 4c 45 53 43 41 50 45  ype==etSQLESCAPE
5770: 32 29 20 3f 20 32 20 3a 20 30 29 3b 0a 20 20 20  2) ? 2 : 0);.   
5780: 20 20 20 20 20 20 20 69 66 28 20 6e 3e 65 74 42         if( n>etB
5790: 55 46 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  UFSIZE ){.      
57a0: 20 20 20 20 20 20 62 75 66 70 74 20 3d 20 7a 45        bufpt = zE
57b0: 78 74 72 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c  xtra = sqliteMal
57c0: 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 20 20 20 20  loc( n );.      
57d0: 20 20 20 20 20 20 69 66 28 20 62 75 66 70 74 3d        if( bufpt=
57e0: 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  =0 ) return -1;.
57f0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
5800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66  .            buf
5810: 70 74 20 3d 20 62 75 66 3b 0a 20 20 20 20 20 20  pt = buf;.      
5820: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5830: 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  j = 0;.         
5840: 20 69 66 28 20 21 69 73 6e 75 6c 6c 20 26 26 20   if( !isnull && 
5850: 78 74 79 70 65 3d 3d 65 74 53 51 4c 45 53 43 41  xtype==etSQLESCA
5860: 50 45 32 20 29 20 62 75 66 70 74 5b 6a 2b 2b 5d  PE2 ) bufpt[j++]
5870: 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20   = '\'';.       
5880: 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 3d 61     for(i=0; (c=a
5890: 72 67 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b  rg[i])!=0; i++){
58a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66  .            buf
58b0: 70 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  pt[j++] = c;.   
58c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
58d0: 27 5c 27 27 20 29 20 62 75 66 70 74 5b 6a 2b 2b  '\'' ) bufpt[j++
58e0: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20  ] = c;.         
58f0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
5900: 20 21 69 73 6e 75 6c 6c 20 26 26 20 78 74 79 70   !isnull && xtyp
5910: 65 3d 3d 65 74 53 51 4c 45 53 43 41 50 45 32 20  e==etSQLESCAPE2 
5920: 29 20 62 75 66 70 74 5b 6a 2b 2b 5d 20 3d 20 27  ) bufpt[j++] = '
5930: 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 20 20 62  \'';.          b
5940: 75 66 70 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20  ufpt[j] = 0;.   
5950: 20 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20         length = 
5960: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  j;.          if(
5970: 20 70 72 65 63 69 73 69 6f 6e 3e 3d 30 20 26 26   precision>=0 &&
5980: 20 70 72 65 63 69 73 69 6f 6e 3c 6c 65 6e 67 74   precision<lengt
5990: 68 20 29 20 6c 65 6e 67 74 68 20 3d 20 70 72 65  h ) length = pre
59a0: 63 69 73 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  cision;.        
59b0: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
59c0: 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 54 4f  .      case etTO
59d0: 4b 45 4e 3a 20 7b 0a 20 20 20 20 20 20 20 20 54  KEN: {.        T
59e0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 76  oken *pToken = v
59f0: 61 5f 61 72 67 28 61 70 2c 20 54 6f 6b 65 6e 2a  a_arg(ap, Token*
5a00: 29 3b 0a 20 20 20 20 20 20 20 20 28 2a 66 75 6e  );.        (*fun
5a10: 63 29 28 61 72 67 2c 20 70 54 6f 6b 65 6e 2d 3e  c)(arg, pToken->
5a20: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20  z, pToken->n);. 
5a30: 20 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20         length = 
5a40: 77 69 64 74 68 20 3d 20 30 3b 0a 20 20 20 20 20  width = 0;.     
5a50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5a60: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 53  }.      case etS
5a70: 52 43 4c 49 53 54 3a 20 7b 0a 20 20 20 20 20 20  RCLIST: {.      
5a80: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
5a90: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 53 72 63  = va_arg(ap, Src
5aa0: 4c 69 73 74 2a 29 3b 0a 20 20 20 20 20 20 20 20  List*);.        
5ab0: 69 6e 74 20 6b 20 3d 20 76 61 5f 61 72 67 28 61  int k = va_arg(a
5ac0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  p, int);.       
5ad0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
5ae0: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
5af0: 53 72 63 2d 3e 61 5b 6b 5d 3b 0a 20 20 20 20 20  Src->a[k];.     
5b00: 20 20 20 61 73 73 65 72 74 28 20 6b 3e 3d 30 20     assert( k>=0 
5b10: 26 26 20 6b 3c 70 53 72 63 2d 3e 6e 53 72 63 20  && k<pSrc->nSrc 
5b20: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
5b30: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
5b40: 26 26 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  && pItem->zDatab
5b50: 61 73 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ase[0] ){.      
5b60: 20 20 20 20 28 2a 66 75 6e 63 29 28 61 72 67 2c      (*func)(arg,
5b70: 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
5b80: 65 2c 20 73 74 72 6c 65 6e 28 70 49 74 65 6d 2d  e, strlen(pItem-
5b90: 3e 7a 44 61 74 61 62 61 73 65 29 29 3b 0a 20 20  >zDatabase));.  
5ba0: 20 20 20 20 20 20 20 20 28 2a 66 75 6e 63 29 28          (*func)(
5bb0: 61 72 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20  arg, ".", 1);.  
5bc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5bd0: 28 2a 66 75 6e 63 29 28 61 72 67 2c 20 70 49 74  (*func)(arg, pIt
5be0: 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  em->zName, strle
5bf0: 6e 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 29  n(pItem->zName))
5c00: 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e 67 74 68  ;.        length
5c10: 20 3d 20 77 69 64 74 68 20 3d 20 30 3b 0a 20 20   = width = 0;.  
5c20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5c30: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5c40: 65 74 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 20  etERROR:.       
5c50: 20 62 75 66 5b 30 5d 20 3d 20 27 25 27 3b 0a 20   buf[0] = '%';. 
5c60: 20 20 20 20 20 20 20 62 75 66 5b 31 5d 20 3d 20         buf[1] = 
5c70: 63 3b 0a 20 20 20 20 20 20 20 20 65 72 72 6f 72  c;.        error
5c80: 66 6c 61 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  flag = 0;.      
5c90: 20 20 69 64 78 20 3d 20 31 2b 28 63 21 3d 30 29    idx = 1+(c!=0)
5ca0: 3b 0a 20 20 20 20 20 20 20 20 28 2a 66 75 6e 63  ;.        (*func
5cb0: 29 28 61 72 67 2c 22 25 22 2c 69 64 78 29 3b 0a  )(arg,"%",idx);.
5cc0: 20 20 20 20 20 20 20 20 63 6f 75 6e 74 20 2b 3d          count +=
5cd0: 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 69 66   idx;.        if
5ce0: 28 20 63 3d 3d 30 20 29 20 66 6d 74 2d 2d 3b 0a  ( c==0 ) fmt--;.
5cf0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5d00: 20 20 20 7d 2f 2a 20 45 6e 64 20 73 77 69 74 63     }/* End switc
5d10: 68 20 6f 76 65 72 20 74 68 65 20 66 6f 72 6d 61  h over the forma
5d20: 74 20 74 79 70 65 20 2a 2f 0a 20 20 20 20 2f 2a  t type */.    /*
5d30: 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 65 78 74  .    ** The text
5d40: 20 6f 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69   of the conversi
5d50: 6f 6e 20 69 73 20 70 6f 69 6e 74 65 64 20 74 6f  on is pointed to
5d60: 20 62 79 20 22 62 75 66 70 74 22 20 61 6e 64 20   by "bufpt" and 
5d70: 69 73 0a 20 20 20 20 2a 2a 20 22 6c 65 6e 67 74  is.    ** "lengt
5d80: 68 22 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f  h" characters lo
5d90: 6e 67 2e 20 20 54 68 65 20 66 69 65 6c 64 20 77  ng.  The field w
5da0: 69 64 74 68 20 69 73 20 22 77 69 64 74 68 22 2e  idth is "width".
5db0: 20 20 44 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20    Do.    ** the 
5dc0: 6f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2f 0a 20  output..    */. 
5dd0: 20 20 20 69 66 28 20 21 66 6c 61 67 5f 6c 65 66     if( !flag_lef
5de0: 74 6a 75 73 74 69 66 79 20 29 7b 0a 20 20 20 20  tjustify ){.    
5df0: 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 6e    register int n
5e00: 73 70 61 63 65 3b 0a 20 20 20 20 20 20 6e 73 70  space;.      nsp
5e10: 61 63 65 20 3d 20 77 69 64 74 68 2d 6c 65 6e 67  ace = width-leng
5e20: 74 68 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 73  th;.      if( ns
5e30: 70 61 63 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  pace>0 ){.      
5e40: 20 20 63 6f 75 6e 74 20 2b 3d 20 6e 73 70 61 63    count += nspac
5e50: 65 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  e;.        while
5e60: 28 20 6e 73 70 61 63 65 3e 3d 65 74 53 50 41 43  ( nspace>=etSPAC
5e70: 45 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  ESIZE ){.       
5e80: 20 20 20 28 2a 66 75 6e 63 29 28 61 72 67 2c 73     (*func)(arg,s
5e90: 70 61 63 65 73 2c 65 74 53 50 41 43 45 53 49 5a  paces,etSPACESIZ
5ea0: 45 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 73  E);.          ns
5eb0: 70 61 63 65 20 2d 3d 20 65 74 53 50 41 43 45 53  pace -= etSPACES
5ec0: 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  IZE;.        }. 
5ed0: 20 20 20 20 20 20 20 69 66 28 20 6e 73 70 61 63         if( nspac
5ee0: 65 3e 30 20 29 20 28 2a 66 75 6e 63 29 28 61 72  e>0 ) (*func)(ar
5ef0: 67 2c 73 70 61 63 65 73 2c 6e 73 70 61 63 65 29  g,spaces,nspace)
5f00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5f10: 20 20 20 20 69 66 28 20 6c 65 6e 67 74 68 3e 30      if( length>0
5f20: 20 29 7b 0a 20 20 20 20 20 20 28 2a 66 75 6e 63   ){.      (*func
5f30: 29 28 61 72 67 2c 62 75 66 70 74 2c 6c 65 6e 67  )(arg,bufpt,leng
5f40: 74 68 29 3b 0a 20 20 20 20 20 20 63 6f 75 6e 74  th);.      count
5f50: 20 2b 3d 20 6c 65 6e 67 74 68 3b 0a 20 20 20 20   += length;.    
5f60: 7d 0a 20 20 20 20 69 66 28 20 66 6c 61 67 5f 6c  }.    if( flag_l
5f70: 65 66 74 6a 75 73 74 69 66 79 20 29 7b 0a 20 20  eftjustify ){.  
5f80: 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74      register int
5f90: 20 6e 73 70 61 63 65 3b 0a 20 20 20 20 20 20 6e   nspace;.      n
5fa0: 73 70 61 63 65 20 3d 20 77 69 64 74 68 2d 6c 65  space = width-le
5fb0: 6e 67 74 68 3b 0a 20 20 20 20 20 20 69 66 28 20  ngth;.      if( 
5fc0: 6e 73 70 61 63 65 3e 30 20 29 7b 0a 20 20 20 20  nspace>0 ){.    
5fd0: 20 20 20 20 63 6f 75 6e 74 20 2b 3d 20 6e 73 70      count += nsp
5fe0: 61 63 65 3b 0a 20 20 20 20 20 20 20 20 77 68 69  ace;.        whi
5ff0: 6c 65 28 20 6e 73 70 61 63 65 3e 3d 65 74 53 50  le( nspace>=etSP
6000: 41 43 45 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  ACESIZE ){.     
6010: 20 20 20 20 20 28 2a 66 75 6e 63 29 28 61 72 67       (*func)(arg
6020: 2c 73 70 61 63 65 73 2c 65 74 53 50 41 43 45 53  ,spaces,etSPACES
6030: 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 20 20  IZE);.          
6040: 6e 73 70 61 63 65 20 2d 3d 20 65 74 53 50 41 43  nspace -= etSPAC
6050: 45 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d  ESIZE;.        }
6060: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 73 70  .        if( nsp
6070: 61 63 65 3e 30 20 29 20 28 2a 66 75 6e 63 29 28  ace>0 ) (*func)(
6080: 61 72 67 2c 73 70 61 63 65 73 2c 6e 73 70 61 63  arg,spaces,nspac
6090: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
60a0: 7d 0a 20 20 20 20 69 66 28 20 7a 45 78 74 72 61  }.    if( zExtra
60b0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
60c0: 46 72 65 65 28 7a 45 78 74 72 61 29 3b 0a 20 20  Free(zExtra);.  
60d0: 20 20 7d 0a 20 20 7d 2f 2a 20 45 6e 64 20 66 6f    }.  }/* End fo
60e0: 72 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20  r loop over the 
60f0: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 2a 2f  format string */
6100: 0a 20 20 72 65 74 75 72 6e 20 65 72 72 6f 72 66  .  return errorf
6110: 6c 61 67 20 3f 20 2d 31 20 3a 20 63 6f 75 6e 74  lag ? -1 : count
6120: 3b 0a 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 66 75  ;.} /* End of fu
6130: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 0a 2f 2a 20 54  nction */.../* T
6140: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
6150: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 73   used to store s
6160: 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
6170: 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 77 72   about the.** wr
6180: 69 74 65 20 74 6f 20 6d 65 6d 6f 72 79 20 74 68  ite to memory th
6190: 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  at is currently 
61a0: 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2f 0a  in progress..*/.
61b0: 73 74 72 75 63 74 20 73 67 4d 70 72 69 6e 74 66  struct sgMprintf
61c0: 20 7b 0a 20 20 63 68 61 72 20 2a 7a 42 61 73 65   {.  char *zBase
61d0: 3b 20 20 20 20 20 2f 2a 20 41 20 62 61 73 65 20  ;     /* A base 
61e0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
61f0: 63 68 61 72 20 2a 7a 54 65 78 74 3b 20 20 20 20  char *zText;    
6200: 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 20 63   /* The string c
6210: 6f 6c 6c 65 63 74 65 64 20 73 6f 20 66 61 72 20  ollected so far 
6220: 2a 2f 0a 20 20 69 6e 74 20 20 6e 43 68 61 72 3b  */.  int  nChar;
6230: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
6240: 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 73 6f  of the string so
6250: 20 66 61 72 20 2a 2f 0a 20 20 69 6e 74 20 20 6e   far */.  int  n
6260: 54 6f 74 61 6c 3b 20 20 20 20 20 2f 2a 20 4f 75  Total;     /* Ou
6270: 74 70 75 74 20 73 69 7a 65 20 69 66 20 75 6e 63  tput size if unc
6280: 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20  onstrained */.  
6290: 69 6e 74 20 20 6e 41 6c 6c 6f 63 3b 20 20 20 20  int  nAlloc;    
62a0: 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70   /* Amount of sp
62b0: 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  ace allocated in
62c0: 20 7a 54 65 78 74 20 2a 2f 0a 20 20 76 6f 69 64   zText */.  void
62d0: 20 2a 28 2a 78 52 65 61 6c 6c 6f 63 29 28 76 6f   *(*xRealloc)(vo
62e0: 69 64 2a 2c 69 6e 74 29 3b 20 20 2f 2a 20 46 75  id*,int);  /* Fu
62f0: 6e 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 72  nction used to r
6300: 65 61 6c 6c 6f 63 20 6d 65 6d 6f 72 79 20 2a 2f  ealloc memory */
6310: 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  .};../* .** This
6320: 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d   function implem
6330: 65 6e 74 73 20 74 68 65 20 63 61 6c 6c 62 61 63  ents the callbac
6340: 6b 20 66 72 6f 6d 20 76 78 70 72 69 6e 74 66 2e  k from vxprintf.
6350: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75   .**.** This rou
6360: 74 69 6e 65 20 61 64 64 20 6e 4e 65 77 43 68 61  tine add nNewCha
6370: 72 20 63 68 61 72 61 63 74 65 72 73 20 6f 66 20  r characters of 
6380: 74 65 78 74 20 69 6e 20 7a 4e 65 77 54 65 78 74  text in zNewText
6390: 20 74 6f 0a 2a 2a 20 74 68 65 20 73 67 4d 70 72   to.** the sgMpr
63a0: 69 6e 74 66 20 73 74 72 75 63 74 75 72 65 20 70  intf structure p
63b0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 22 61 72  ointed to by "ar
63c0: 67 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  g"..*/.static vo
63d0: 69 64 20 6d 6f 75 74 28 76 6f 69 64 20 2a 61 72  id mout(void *ar
63e0: 67 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  g, const char *z
63f0: 4e 65 77 54 65 78 74 2c 20 69 6e 74 20 6e 4e 65  NewText, int nNe
6400: 77 43 68 61 72 29 7b 0a 20 20 73 74 72 75 63 74  wChar){.  struct
6410: 20 73 67 4d 70 72 69 6e 74 66 20 2a 70 4d 20 3d   sgMprintf *pM =
6420: 20 28 73 74 72 75 63 74 20 73 67 4d 70 72 69 6e   (struct sgMprin
6430: 74 66 2a 29 61 72 67 3b 0a 20 20 70 4d 2d 3e 6e  tf*)arg;.  pM->n
6440: 54 6f 74 61 6c 20 2b 3d 20 6e 4e 65 77 43 68 61  Total += nNewCha
6450: 72 3b 0a 20 20 69 66 28 20 70 4d 2d 3e 6e 43 68  r;.  if( pM->nCh
6460: 61 72 20 2b 20 6e 4e 65 77 43 68 61 72 20 2b 20  ar + nNewChar + 
6470: 31 20 3e 20 70 4d 2d 3e 6e 41 6c 6c 6f 63 20 29  1 > pM->nAlloc )
6480: 7b 0a 20 20 20 20 69 66 28 20 70 4d 2d 3e 78 52  {.    if( pM->xR
6490: 65 61 6c 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20 20  ealloc==0 ){.   
64a0: 20 20 20 6e 4e 65 77 43 68 61 72 20 3d 20 20 70     nNewChar =  p
64b0: 4d 2d 3e 6e 41 6c 6c 6f 63 20 2d 20 70 4d 2d 3e  M->nAlloc - pM->
64c0: 6e 43 68 61 72 20 2d 20 31 3b 0a 20 20 20 20 7d  nChar - 1;.    }
64d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4d 2d 3e  else{.      pM->
64e0: 6e 41 6c 6c 6f 63 20 3d 20 70 4d 2d 3e 6e 43 68  nAlloc = pM->nCh
64f0: 61 72 20 2b 20 6e 4e 65 77 43 68 61 72 2a 32 20  ar + nNewChar*2 
6500: 2b 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  + 1;.      if( p
6510: 4d 2d 3e 7a 54 65 78 74 3d 3d 70 4d 2d 3e 7a 42  M->zText==pM->zB
6520: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ase ){.        p
6530: 4d 2d 3e 7a 54 65 78 74 20 3d 20 70 4d 2d 3e 78  M->zText = pM->x
6540: 52 65 61 6c 6c 6f 63 28 30 2c 20 70 4d 2d 3e 6e  Realloc(0, pM->n
6550: 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  Alloc);.        
6560: 69 66 28 20 70 4d 2d 3e 7a 54 65 78 74 20 26 26  if( pM->zText &&
6570: 20 70 4d 2d 3e 6e 43 68 61 72 20 29 7b 0a 20 20   pM->nChar ){.  
6580: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
6590: 4d 2d 3e 7a 54 65 78 74 2c 20 70 4d 2d 3e 7a 42  M->zText, pM->zB
65a0: 61 73 65 2c 20 70 4d 2d 3e 6e 43 68 61 72 29 3b  ase, pM->nChar);
65b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
65c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
65d0: 70 4d 2d 3e 7a 54 65 78 74 20 3d 20 70 4d 2d 3e  pM->zText = pM->
65e0: 78 52 65 61 6c 6c 6f 63 28 70 4d 2d 3e 7a 54 65  xRealloc(pM->zTe
65f0: 78 74 2c 20 70 4d 2d 3e 6e 41 6c 6c 6f 63 29 3b  xt, pM->nAlloc);
6600: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6610: 20 7d 0a 20 20 69 66 28 20 70 4d 2d 3e 7a 54 65   }.  if( pM->zTe
6620: 78 74 20 26 26 20 6e 4e 65 77 43 68 61 72 3e 30  xt && nNewChar>0
6630: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   ){.    memcpy(&
6640: 70 4d 2d 3e 7a 54 65 78 74 5b 70 4d 2d 3e 6e 43  pM->zText[pM->nC
6650: 68 61 72 5d 2c 20 7a 4e 65 77 54 65 78 74 2c 20  har], zNewText, 
6660: 6e 4e 65 77 43 68 61 72 29 3b 0a 20 20 20 20 70  nNewChar);.    p
6670: 4d 2d 3e 6e 43 68 61 72 20 2b 3d 20 6e 4e 65 77  M->nChar += nNew
6680: 43 68 61 72 3b 0a 20 20 20 20 70 4d 2d 3e 7a 54  Char;.    pM->zT
6690: 65 78 74 5b 70 4d 2d 3e 6e 43 68 61 72 5d 20 3d  ext[pM->nChar] =
66a0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
66b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
66c0: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
66d0: 64 20 78 70 72 69 6e 74 66 28 29 20 74 68 61 74  d xprintf() that
66e0: 20 69 6e 76 6f 6b 65 73 20 6d 6f 75 74 28 29 20   invokes mout() 
66f0: 61 73 0a 2a 2a 20 74 68 65 20 63 6f 6e 73 75 6d  as.** the consum
6700: 65 72 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  er.  .*/.static 
6710: 63 68 61 72 20 2a 62 61 73 65 5f 76 70 72 69 6e  char *base_vprin
6720: 74 66 28 0a 20 20 76 6f 69 64 20 2a 28 2a 78 52  tf(.  void *(*xR
6730: 65 61 6c 6c 6f 63 29 28 76 6f 69 64 2a 2c 69 6e  ealloc)(void*,in
6740: 74 29 2c 20 20 20 2f 2a 20 52 6f 75 74 69 6e 65  t),   /* Routine
6750: 20 74 6f 20 72 65 61 6c 6c 6f 63 20 6d 65 6d 6f   to realloc memo
6760: 72 79 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  ry. May be NULL 
6770: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 49 6e 74 65  */.  int useInte
6780: 72 6e 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20  rnal,           
6790: 20 20 20 20 20 2f 2a 20 55 73 65 20 69 6e 74 65       /* Use inte
67a0: 72 6e 61 6c 20 25 2d 63 6f 6e 76 65 72 73 69 6f  rnal %-conversio
67b0: 6e 73 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  ns if true */.  
67c0: 63 68 61 72 20 2a 7a 49 6e 69 74 42 75 66 2c 20  char *zInitBuf, 
67d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67e0: 2f 2a 20 49 6e 69 74 69 61 6c 6c 79 20 77 72 69  /* Initially wri
67f0: 74 65 20 68 65 72 65 2c 20 62 65 66 6f 72 65 20  te here, before 
6800: 6d 61 6c 6c 6f 63 69 6e 67 20 2a 2f 0a 20 20 69  mallocing */.  i
6810: 6e 74 20 6e 49 6e 69 74 42 75 66 2c 20 20 20 20  nt nInitBuf,    
6820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6830: 2a 20 53 69 7a 65 20 6f 66 20 7a 49 6e 69 74 42  * Size of zInitB
6840: 75 66 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  uf[] */.  const 
6850: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 20  char *zFormat,  
6860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72            /* for
6870: 6d 61 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  mat string */.  
6880: 76 61 5f 6c 69 73 74 20 61 70 20 20 20 20 20 20  va_list ap      
6890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68a0: 2f 2a 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  /* arguments */.
68b0: 29 7b 0a 20 20 73 74 72 75 63 74 20 73 67 4d 70  ){.  struct sgMp
68c0: 72 69 6e 74 66 20 73 4d 3b 0a 20 20 73 4d 2e 7a  rintf sM;.  sM.z
68d0: 42 61 73 65 20 3d 20 73 4d 2e 7a 54 65 78 74 20  Base = sM.zText 
68e0: 3d 20 7a 49 6e 69 74 42 75 66 3b 0a 20 20 73 4d  = zInitBuf;.  sM
68f0: 2e 6e 43 68 61 72 20 3d 20 73 4d 2e 6e 54 6f 74  .nChar = sM.nTot
6900: 61 6c 20 3d 20 30 3b 0a 20 20 73 4d 2e 6e 41 6c  al = 0;.  sM.nAl
6910: 6c 6f 63 20 3d 20 6e 49 6e 69 74 42 75 66 3b 0a  loc = nInitBuf;.
6920: 20 20 73 4d 2e 78 52 65 61 6c 6c 6f 63 20 3d 20    sM.xRealloc = 
6930: 78 52 65 61 6c 6c 6f 63 3b 0a 20 20 76 78 70 72  xRealloc;.  vxpr
6940: 69 6e 74 66 28 6d 6f 75 74 2c 20 26 73 4d 2c 20  intf(mout, &sM, 
6950: 75 73 65 49 6e 74 65 72 6e 61 6c 2c 20 7a 46 6f  useInternal, zFo
6960: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 69 66 28  rmat, ap);.  if(
6970: 20 78 52 65 61 6c 6c 6f 63 20 29 7b 0a 20 20 20   xRealloc ){.   
6980: 20 69 66 28 20 73 4d 2e 7a 54 65 78 74 3d 3d 73   if( sM.zText==s
6990: 4d 2e 7a 42 61 73 65 20 29 7b 0a 20 20 20 20 20  M.zBase ){.     
69a0: 20 73 4d 2e 7a 54 65 78 74 20 3d 20 78 52 65 61   sM.zText = xRea
69b0: 6c 6c 6f 63 28 30 2c 20 73 4d 2e 6e 43 68 61 72  lloc(0, sM.nChar
69c0: 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  +1);.      if( s
69d0: 4d 2e 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 20  M.zText ){.     
69e0: 20 20 20 6d 65 6d 63 70 79 28 73 4d 2e 7a 54 65     memcpy(sM.zTe
69f0: 78 74 2c 20 73 4d 2e 7a 42 61 73 65 2c 20 73 4d  xt, sM.zBase, sM
6a00: 2e 6e 43 68 61 72 2b 31 29 3b 0a 20 20 20 20 20  .nChar+1);.     
6a10: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
6a20: 20 73 4d 2e 6e 41 6c 6c 6f 63 3e 73 4d 2e 6e 43   sM.nAlloc>sM.nC
6a30: 68 61 72 2b 31 30 20 29 7b 0a 20 20 20 20 20 20  har+10 ){.      
6a40: 73 4d 2e 7a 54 65 78 74 20 3d 20 78 52 65 61 6c  sM.zText = xReal
6a50: 6c 6f 63 28 73 4d 2e 7a 54 65 78 74 2c 20 73 4d  loc(sM.zText, sM
6a60: 2e 6e 43 68 61 72 2b 31 29 3b 0a 20 20 20 20 7d  .nChar+1);.    }
6a70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 4d  .  }.  return sM
6a80: 2e 7a 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .zText;.}../*.**
6a90: 20 52 65 61 6c 6c 6f 63 20 74 68 61 74 20 69 73   Realloc that is
6aa0: 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
6ab0: 2c 20 6e 6f 74 20 61 20 6d 61 63 72 6f 2e 0a 2a  , not a macro..*
6ac0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 70  /.static void *p
6ad0: 72 69 6e 74 66 5f 72 65 61 6c 6c 6f 63 28 76 6f  rintf_realloc(vo
6ae0: 69 64 20 2a 6f 6c 64 2c 20 69 6e 74 20 73 69 7a  id *old, int siz
6af0: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
6b00: 69 74 65 52 65 61 6c 6c 6f 63 28 6f 6c 64 2c 73  iteRealloc(old,s
6b10: 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ize);.}../*.** P
6b20: 72 69 6e 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  rint into memory
6b30: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
6b40: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 20  qliteMalloc().  
6b50: 55 73 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  Use the internal
6b60: 0a 2a 2a 20 25 2d 63 6f 6e 76 65 72 73 69 6f 6e  .** %-conversion
6b70: 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a   extensions..*/.
6b80: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 56 4d 50  char *sqlite3VMP
6b90: 72 69 6e 74 66 28 63 6f 6e 73 74 20 63 68 61 72  rintf(const char
6ba0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69   *zFormat, va_li
6bb0: 73 74 20 61 70 29 7b 0a 20 20 63 68 61 72 20 7a  st ap){.  char z
6bc0: 42 61 73 65 5b 31 30 30 30 5d 3b 0a 20 20 72 65  Base[1000];.  re
6bd0: 74 75 72 6e 20 62 61 73 65 5f 76 70 72 69 6e 74  turn base_vprint
6be0: 66 28 70 72 69 6e 74 66 5f 72 65 61 6c 6c 6f 63  f(printf_realloc
6bf0: 2c 20 31 2c 20 7a 42 61 73 65 2c 20 73 69 7a 65  , 1, zBase, size
6c00: 6f 66 28 7a 42 61 73 65 29 2c 20 7a 46 6f 72 6d  of(zBase), zForm
6c10: 61 74 2c 20 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  at, ap);.}../*.*
6c20: 2a 20 50 72 69 6e 74 20 69 6e 74 6f 20 6d 65 6d  * Print into mem
6c30: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
6c40: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
6c50: 2e 20 20 55 73 65 20 74 68 65 20 69 6e 74 65 72  .  Use the inter
6c60: 6e 61 6c 0a 2a 2a 20 25 2d 63 6f 6e 76 65 72 73  nal.** %-convers
6c70: 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a  ion extensions..
6c80: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
6c90: 4d 50 72 69 6e 74 66 28 63 6f 6e 73 74 20 63 68  MPrintf(const ch
6ca0: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
6cb0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
6cc0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68  .  char *z;.  ch
6cd0: 61 72 20 7a 42 61 73 65 5b 31 30 30 30 5d 3b 0a  ar zBase[1000];.
6ce0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
6cf0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 62  Format);.  z = b
6d00: 61 73 65 5f 76 70 72 69 6e 74 66 28 70 72 69 6e  ase_vprintf(prin
6d10: 74 66 5f 72 65 61 6c 6c 6f 63 2c 20 31 2c 20 7a  tf_realloc, 1, z
6d20: 42 61 73 65 2c 20 73 69 7a 65 6f 66 28 7a 42 61  Base, sizeof(zBa
6d30: 73 65 29 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  se), zFormat, ap
6d40: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
6d50: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
6d60: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 69 6e 74 6f  /*.** Print into
6d70: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
6d80: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20   from malloc(). 
6d90: 20 44 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20   Do not use the 
6da0: 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 25 2d 63 6f  internal.** %-co
6db0: 6e 76 65 72 73 69 6f 6e 20 65 78 74 65 6e 73 69  nversion extensi
6dc0: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
6dd0: 6e 65 20 69 73 20 66 6f 72 20 75 73 65 20 62 79  ne is for use by
6de0: 20 65 78 74 65 72 6e 61 6c 20 75 73 65 72 73 2e   external users.
6df0: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
6e00: 33 5f 6d 70 72 69 6e 74 66 28 63 6f 6e 73 74 20  3_mprintf(const 
6e10: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
6e20: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
6e30: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  p;.  char *z;.  
6e40: 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a  char zBuf[200];.
6e50: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 7a  .  va_start(ap,z
6e60: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 62  Format);.  z = b
6e70: 61 73 65 5f 76 70 72 69 6e 74 66 28 28 76 6f 69  ase_vprintf((voi
6e80: 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 29  d*(*)(void*,int)
6e90: 29 72 65 61 6c 6c 6f 63 2c 20 30 2c 20 0a 20 20  )realloc, 0, .  
6ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6eb0: 20 7a 42 75 66 2c 20 73 69 7a 65 6f 66 28 7a 42   zBuf, sizeof(zB
6ec0: 75 66 29 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  uf), zFormat, ap
6ed0: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
6ee0: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
6ef0: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 76  /* This is the v
6f00: 61 72 61 72 67 73 20 76 65 72 73 69 6f 6e 20 6f  arargs version o
6f10: 66 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  f sqlite3_mprint
6f20: 66 2e 20 20 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  f.  .*/.char *sq
6f30: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 63  lite3_vmprintf(c
6f40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
6f50: 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b  at, va_list ap){
6f60: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30  .  char zBuf[200
6f70: 5d 3b 0a 20 20 72 65 74 75 72 6e 20 62 61 73 65  ];.  return base
6f80: 5f 76 70 72 69 6e 74 66 28 28 76 6f 69 64 2a 28  _vprintf((void*(
6f90: 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 72 65  *)(void*,int))re
6fa0: 61 6c 6c 6f 63 2c 20 30 2c 0a 20 20 20 20 20 20  alloc, 0,.      
6fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fc0: 7a 42 75 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75  zBuf, sizeof(zBu
6fd0: 66 29 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  f), zFormat, ap)
6fe0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  ;.}../*.** sqlit
6ff0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 29 20 77 6f  e3_snprintf() wo
7000: 72 6b 73 20 6c 69 6b 65 20 73 6e 70 72 69 6e 74  rks like snprint
7010: 66 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20  f() except that 
7020: 69 74 20 69 67 6e 6f 72 65 73 20 74 68 65 0a 2a  it ignores the.*
7030: 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 65  * current locale
7040: 20 73 65 74 74 69 6e 67 73 2e 20 20 54 68 69 73   settings.  This
7050: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f   is important fo
7060: 72 20 53 51 4c 69 74 65 20 62 65 63 61 75 73 65  r SQLite because
7070: 20 77 65 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 61   we.** are not a
7080: 62 6c 65 20 74 6f 20 75 73 65 20 61 20 22 2c 22  ble to use a ","
7090: 20 61 73 20 74 68 65 20 64 65 63 69 6d 61 6c 20   as the decimal 
70a0: 70 6f 69 6e 74 20 69 6e 20 70 6c 61 63 65 20 6f  point in place o
70b0: 66 20 22 2e 22 20 61 73 0a 2a 2a 20 73 70 65 63  f "." as.** spec
70c0: 69 66 69 65 64 20 62 79 20 73 6f 6d 65 20 6c 6f  ified by some lo
70d0: 63 61 6c 65 73 2e 0a 2a 2f 0a 63 68 61 72 20 2a  cales..*/.char *
70e0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
70f0: 28 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 42  (int n, char *zB
7100: 75 66 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  uf, const char *
7110: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
7120: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 76 61 5f 6c   char *z;.  va_l
7130: 69 73 74 20 61 70 3b 0a 0a 20 20 76 61 5f 73 74  ist ap;..  va_st
7140: 61 72 74 28 61 70 2c 7a 46 6f 72 6d 61 74 29 3b  art(ap,zFormat);
7150: 0a 20 20 7a 20 3d 20 62 61 73 65 5f 76 70 72 69  .  z = base_vpri
7160: 6e 74 66 28 30 2c 20 30 2c 20 7a 42 75 66 2c 20  ntf(0, 0, zBuf, 
7170: 6e 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  n, zFormat, ap);
7180: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
7190: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69   return z;.}..#i
71a0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
71b0: 2a 2a 20 41 20 76 65 72 73 69 6f 6e 20 6f 66 20  ** A version of 
71c0: 70 72 69 6e 74 66 28 29 20 74 68 61 74 20 75 6e  printf() that un
71d0: 64 65 72 73 74 61 6e 64 73 20 25 6c 6c 64 2e 20  derstands %lld. 
71e0: 20 55 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   Used for debugg
71f0: 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 70 72 69 6e  ing..** The prin
7200: 74 66 28 29 20 62 75 69 6c 74 20 69 6e 74 6f 20  tf() built into 
7210: 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  some versions of
7220: 20 77 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f   windows does no
7230: 74 20 75 6e 64 65 72 73 74 61 6e 64 20 25 6c 6c  t understand %ll
7240: 64 0a 2a 2a 20 61 6e 64 20 73 65 67 66 61 75 6c  d.** and segfaul
7250: 74 73 20 69 66 20 79 6f 75 20 67 69 76 65 20 69  ts if you give i
7260: 74 20 61 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e  t a long long in
7270: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
7280: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 63 6f  e3DebugPrintf(co
7290: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
72a0: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
72b0: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 7a 42  st ap;.  char zB
72c0: 75 66 5b 35 30 30 5d 3b 0a 20 20 76 61 5f 73 74  uf[500];.  va_st
72d0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
72e0: 3b 0a 20 20 62 61 73 65 5f 76 70 72 69 6e 74 66  ;.  base_vprintf
72f0: 28 30 2c 20 30 2c 20 7a 42 75 66 2c 20 73 69 7a  (0, 0, zBuf, siz
7300: 65 6f 66 28 7a 42 75 66 29 2c 20 7a 46 6f 72 6d  eof(zBuf), zForm
7310: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
7320: 64 28 61 70 29 3b 0a 20 20 66 70 72 69 6e 74 66  d(ap);.  fprintf
7330: 28 73 74 64 6f 75 74 2c 22 25 73 22 2c 20 7a 42  (stdout,"%s", zB
7340: 75 66 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74  uf);.  fflush(st
7350: 64 6f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  dout);.}.#endif.
7360: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
7370: 77 69 6e 67 20 66 6f 75 72 20 72 6f 75 74 69 6e  wing four routin
7380: 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  es implement the
7390: 20 76 61 72 61 72 67 73 20 76 65 72 73 69 6f 6e   varargs version
73a0: 73 20 6f 66 20 74 68 65 0a 2a 2a 20 73 71 6c 69  s of the.** sqli
73b0: 74 65 33 5f 65 78 65 63 28 29 20 61 6e 64 20 73  te3_exec() and s
73c0: 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
73d0: 28 29 20 69 6e 74 65 72 66 61 63 65 73 2e 20 20  () interfaces.  
73e0: 53 65 65 20 74 68 65 20 73 71 6c 69 74 65 2e 68  See the sqlite.h
73f0: 0a 2a 2a 20 68 65 61 64 65 72 20 66 69 6c 65 73  .** header files
7400: 20 66 6f 72 20 61 20 6d 6f 72 65 20 64 65 74 61   for a more deta
7410: 69 6c 65 64 20 64 65 73 63 72 69 70 74 69 6f 6e  iled description
7420: 20 6f 66 20 68 6f 77 20 74 68 65 73 65 20 69 6e   of how these in
7430: 74 65 72 66 61 63 65 73 0a 2a 2a 20 77 6f 72 6b  terfaces.** work
7440: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
7450: 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6a  utines are all j
7460: 75 73 74 20 73 69 6d 70 6c 65 20 77 72 61 70 70  ust simple wrapp
7470: 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ers..*/.int sqli
7480: 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 28  te3_exec_printf(
7490: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20  .  sqlite *db,  
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74b0: 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61 74 61   /* An open data
74c0: 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
74d0: 63 68 61 72 20 2a 73 71 6c 46 6f 72 6d 61 74 2c  char *sqlFormat,
74e0: 20 20 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74          /* print
74f0: 66 2d 73 74 79 6c 65 20 66 6f 72 6d 61 74 20 73  f-style format s
7500: 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 53 51  tring for the SQ
7510: 4c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 63 61  L */.  sqlite_ca
7520: 6c 6c 62 61 63 6b 20 78 43 61 6c 6c 62 61 63 6b  llback xCallback
7530: 2c 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b  ,    /* Callback
7540: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
7550: 6f 69 64 20 2a 70 41 72 67 2c 20 20 20 20 20 20  oid *pArg,      
7560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7570: 31 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  1st argument to 
7580: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
7590: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 65 72  n */.  char **er
75a0: 72 6d 73 67 2c 20 20 20 20 20 20 20 20 20 20 20  rmsg,           
75b0: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73       /* Error ms
75c0: 67 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  g written here *
75d0: 2f 0a 20 20 2e 2e 2e 20 20 20 20 20 20 20 20 20  /.  ...         
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75f0: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74    /* Arguments t
7600: 6f 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72  o the format str
7610: 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 76 61 5f  ing. */.){.  va_
7620: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
7630: 63 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61  c;..  va_start(a
7640: 70 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 72 63  p, errmsg);.  rc
7650: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f   = sqlite3_exec_
7660: 76 70 72 69 6e 74 66 28 64 62 2c 20 73 71 6c 46  vprintf(db, sqlF
7670: 6f 72 6d 61 74 2c 20 78 43 61 6c 6c 62 61 63 6b  ormat, xCallback
7680: 2c 20 70 41 72 67 2c 20 65 72 72 6d 73 67 2c 20  , pArg, errmsg, 
7690: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
76a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
76b0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78  }.int sqlite3_ex
76c0: 65 63 5f 76 70 72 69 6e 74 66 28 0a 20 20 73 71  ec_vprintf(.  sq
76d0: 6c 69 74 65 20 2a 64 62 2c 20 20 20 20 20 20 20  lite *db,       
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
76f0: 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  n open database 
7700: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
7710: 2a 73 71 6c 46 6f 72 6d 61 74 2c 20 20 20 20 20  *sqlFormat,     
7720: 20 20 20 2f 2a 20 70 72 69 6e 74 66 2d 73 74 79     /* printf-sty
7730: 6c 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  le format string
7740: 20 66 6f 72 20 74 68 65 20 53 51 4c 20 2a 2f 0a   for the SQL */.
7750: 20 20 73 71 6c 69 74 65 5f 63 61 6c 6c 62 61 63    sqlite_callbac
7760: 6b 20 78 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20  k xCallback,    
7770: 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63  /* Callback func
7780: 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
7790: 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  pArg,           
77a0: 20 20 20 20 20 20 20 20 2f 2a 20 31 73 74 20 61          /* 1st a
77b0: 72 67 75 6d 65 6e 74 20 74 6f 20 63 61 6c 6c 62  rgument to callb
77c0: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ack function */.
77d0: 20 20 63 68 61 72 20 2a 2a 65 72 72 6d 73 67 2c    char **errmsg,
77e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77f0: 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72 69  /* Error msg wri
7800: 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 76  tten here */.  v
7810: 61 5f 6c 69 73 74 20 61 70 20 20 20 20 20 20 20  a_list ap       
7820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7830: 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  Arguments to the
7840: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e 20   format string. 
7850: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53  */.){.  char *zS
7860: 71 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ql;.  int rc;.. 
7870: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
7880: 76 6d 70 72 69 6e 74 66 28 73 71 6c 46 6f 72 6d  vmprintf(sqlForm
7890: 61 74 2c 20 61 70 29 3b 0a 20 20 72 63 20 3d 20  at, ap);.  rc = 
78a0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
78b0: 20 7a 53 71 6c 2c 20 78 43 61 6c 6c 62 61 63 6b   zSql, xCallback
78c0: 2c 20 70 41 72 67 2c 20 65 72 72 6d 73 67 29 3b  , pArg, errmsg);
78d0: 0a 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  .  free(zSql);. 
78e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
78f0: 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61  t sqlite3_get_ta
7900: 62 6c 65 5f 70 72 69 6e 74 66 28 0a 20 20 73 71  ble_printf(.  sq
7910: 6c 69 74 65 20 2a 64 62 2c 20 20 20 20 20 20 20  lite *db,       
7920: 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20       /* An open 
7930: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
7940: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 46 6f 72  nst char *sqlFor
7950: 6d 61 74 2c 20 2f 2a 20 70 72 69 6e 74 66 2d 73  mat, /* printf-s
7960: 74 79 6c 65 20 66 6f 72 6d 61 74 20 73 74 72 69  tyle format stri
7970: 6e 67 20 66 6f 72 20 74 68 65 20 53 51 4c 20 2a  ng for the SQL *
7980: 2f 0a 20 20 63 68 61 72 20 2a 2a 2a 72 65 73 75  /.  char ***resu
7990: 6c 74 70 2c 20 20 20 20 20 20 20 2f 2a 20 52 65  ltp,       /* Re
79a0: 73 75 6c 74 20 77 72 69 74 74 65 6e 20 74 6f 20  sult written to 
79b0: 61 20 63 68 61 72 20 2a 5b 5d 20 20 74 68 61 74  a char *[]  that
79c0: 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20   this points to 
79d0: 2a 2f 0a 20 20 69 6e 74 20 2a 6e 72 6f 77 2c 20  */.  int *nrow, 
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
79f0: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
7a00: 72 6f 77 73 20 77 72 69 74 74 65 6e 20 68 65 72  rows written her
7a10: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 6e 63 6f 6c  e */.  int *ncol
7a20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
7a30: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
7a40: 74 20 63 6f 6c 75 6d 6e 73 20 77 72 69 74 74 65  t columns writte
7a50: 6e 20 68 65 72 65 20 2a 2f 0a 20 20 63 68 61 72  n here */.  char
7a60: 20 2a 2a 65 72 72 6d 73 67 2c 20 20 20 20 20 20   **errmsg,      
7a70: 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20     /* Error msg 
7a80: 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
7a90: 20 20 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20    ...           
7aa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
7ab0: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 6f 72  ments to the for
7ac0: 6d 61 74 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  mat string */.){
7ad0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
7ae0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 76 61 5f 73   int rc;..  va_s
7af0: 74 61 72 74 28 61 70 2c 20 65 72 72 6d 73 67 29  tart(ap, errmsg)
7b00: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7b10: 5f 67 65 74 5f 74 61 62 6c 65 5f 76 70 72 69 6e  _get_table_vprin
7b20: 74 66 28 64 62 2c 20 73 71 6c 46 6f 72 6d 61 74  tf(db, sqlFormat
7b30: 2c 20 72 65 73 75 6c 74 70 2c 20 6e 72 6f 77 2c  , resultp, nrow,
7b40: 20 6e 63 6f 6c 2c 20 65 72 72 6d 73 67 2c 20 61   ncol, errmsg, a
7b50: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
7b60: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
7b70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74  .int sqlite3_get
7b80: 5f 74 61 62 6c 65 5f 76 70 72 69 6e 74 66 28 0a  _table_vprintf(.
7b90: 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20    sqlite *db,   
7ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f           /* An o
7bb0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  pen database */.
7bc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71    const char *sq
7bd0: 6c 46 6f 72 6d 61 74 2c 20 2f 2a 20 70 72 69 6e  lFormat, /* prin
7be0: 74 66 2d 73 74 79 6c 65 20 66 6f 72 6d 61 74 20  tf-style format 
7bf0: 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 53  string for the S
7c00: 51 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 2a  QL */.  char ***
7c10: 72 65 73 75 6c 74 70 2c 20 20 20 20 20 20 20 2f  resultp,       /
7c20: 2a 20 52 65 73 75 6c 74 20 77 72 69 74 74 65 6e  * Result written
7c30: 20 74 6f 20 61 20 63 68 61 72 20 2a 5b 5d 20 20   to a char *[]  
7c40: 74 68 61 74 20 74 68 69 73 20 70 6f 69 6e 74 73  that this points
7c50: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 2a 6e 72   to */.  int *nr
7c60: 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ow,             
7c70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
7c80: 75 6c 74 20 72 6f 77 73 20 77 72 69 74 74 65 6e  ult rows written
7c90: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   here */.  int *
7ca0: 6e 63 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  ncolumn,        
7cb0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
7cc0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 77 72  esult columns wr
7cd0: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20  itten here */.  
7ce0: 63 68 61 72 20 2a 2a 65 72 72 6d 73 67 2c 20 20  char **errmsg,  
7cf0: 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
7d00: 6d 73 67 20 77 72 69 74 74 65 6e 20 68 65 72 65  msg written here
7d10: 20 2a 2f 0a 20 20 76 61 5f 6c 69 73 74 20 61 70   */.  va_list ap
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7d30: 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  Arguments to the
7d40: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 2a   format string *
7d50: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 71  /.){.  char *zSq
7d60: 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  l;.  int rc;..  
7d70: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  zSql = sqlite3_v
7d80: 6d 70 72 69 6e 74 66 28 73 71 6c 46 6f 72 6d 61  mprintf(sqlForma
7d90: 74 2c 20 61 70 29 3b 0a 20 20 72 63 20 3d 20 73  t, ap);.  rc = s
7da0: 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
7db0: 28 64 62 2c 20 7a 53 71 6c 2c 20 72 65 73 75 6c  (db, zSql, resul
7dc0: 74 70 2c 20 6e 72 6f 77 2c 20 6e 63 6f 6c 75 6d  tp, nrow, ncolum
7dd0: 6e 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 66 72  n, errmsg);.  fr
7de0: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 72 65 74 75  ee(zSql);.  retu
7df0: 72 6e 20 72 63 3b 0a 7d 0a                       rn rc;.}.