/ Hex Artifact Content
Login

Artifact a06d3527c677334a97eaaa1573d0c644c987acf6:


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 23 64 65 66 69 6e 65 20 65 74 50 4f   */.#define etPO
0d90: 49 4e 54 45 52 20 20 20 20 31 36 20 2f 2a 20 54  INTER    16 /* T
0da0: 68 65 20 25 70 20 63 6f 6e 76 65 72 73 69 6f 6e  he %p conversion
0db0: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 22   */.../*.** An "
0dc0: 65 74 42 79 74 65 22 20 69 73 20 61 6e 20 38 2d  etByte" is an 8-
0dd0: 62 69 74 20 75 6e 73 69 67 6e 65 64 20 76 61 6c  bit unsigned val
0de0: 75 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 75  ue..*/.typedef u
0df0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 74 42  nsigned char etB
0e00: 79 74 65 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  yte;../*.** Each
0e10: 20 62 75 69 6c 74 69 6e 20 63 6f 6e 76 65 72 73   builtin convers
0e20: 69 6f 6e 20 63 68 61 72 61 63 74 65 72 20 28 65  ion character (e
0e30: 78 3a 20 74 68 65 20 27 64 27 20 69 6e 20 22 25  x: the 'd' in "%
0e40: 64 22 29 20 69 73 20 64 65 73 63 72 69 62 65 64  d") is described
0e50: 0a 2a 2a 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  .** by an instan
0e60: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0e70: 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2f  ing structure.*/
0e80: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0e90: 65 74 5f 69 6e 66 6f 20 7b 20 20 20 2f 2a 20 49  et_info {   /* I
0ea0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
0eb0: 20 65 61 63 68 20 66 6f 72 6d 61 74 20 66 69 65   each format fie
0ec0: 6c 64 20 2a 2f 0a 20 20 63 68 61 72 20 66 6d 74  ld */.  char fmt
0ed0: 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  type;           
0ee0: 20 2f 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66   /* The format f
0ef0: 69 65 6c 64 20 63 6f 64 65 20 6c 65 74 74 65 72  ield code letter
0f00: 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 62 61 73   */.  etByte bas
0f10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
0f20: 2a 20 54 68 65 20 62 61 73 65 20 66 6f 72 20 72  * The base for r
0f30: 61 64 69 78 20 63 6f 6e 76 65 72 73 69 6f 6e 20  adix conversion 
0f40: 2a 2f 0a 20 20 65 74 42 79 74 65 20 66 6c 61 67  */.  etByte flag
0f50: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
0f60: 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   One or more of 
0f70: 46 4c 41 47 5f 20 63 6f 6e 73 74 61 6e 74 73 20  FLAG_ constants 
0f80: 62 65 6c 6f 77 20 2a 2f 0a 20 20 65 74 42 79 74  below */.  etByt
0f90: 65 20 74 79 70 65 3b 20 20 20 20 20 20 20 20 20  e type;         
0fa0: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 73 69 6f      /* Conversio
0fb0: 6e 20 70 61 72 61 64 69 67 6d 20 2a 2f 0a 20 20  n paradigm */.  
0fc0: 65 74 42 79 74 65 20 63 68 61 72 73 65 74 3b 20  etByte charset; 
0fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
0fe0: 65 74 20 69 6e 74 6f 20 61 44 69 67 69 74 73 5b  et into aDigits[
0ff0: 5d 20 6f 66 20 74 68 65 20 64 69 67 69 74 73 20  ] of the digits 
1000: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 65 74 42 79  string */.  etBy
1010: 74 65 20 70 72 65 66 69 78 3b 20 20 20 20 20 20  te prefix;      
1020: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1030: 6e 74 6f 20 61 50 72 65 66 69 78 5b 5d 20 6f 66  nto aPrefix[] of
1040: 20 74 68 65 20 70 72 65 66 69 78 20 73 74 72 69   the prefix stri
1050: 6e 67 20 2a 2f 0a 7d 20 65 74 5f 69 6e 66 6f 3b  ng */.} et_info;
1060: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
1070: 76 61 6c 75 65 73 20 66 6f 72 20 65 74 5f 69 6e  values for et_in
1080: 66 6f 2e 66 6c 61 67 73 0a 2a 2f 0a 23 64 65 66  fo.flags.*/.#def
1090: 69 6e 65 20 46 4c 41 47 5f 53 49 47 4e 45 44 20  ine FLAG_SIGNED 
10a0: 20 31 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69   1     /* True i
10b0: 66 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 63  f the value to c
10c0: 6f 6e 76 65 72 74 20 69 73 20 73 69 67 6e 65 64  onvert is signed
10d0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4c 41 47   */.#define FLAG
10e0: 5f 49 4e 54 45 52 4e 20 20 32 20 20 20 20 20 2f  _INTERN  2     /
10f0: 2a 20 54 72 75 65 20 69 66 20 66 6f 72 20 69 6e  * True if for in
1100: 74 65 72 6e 61 6c 20 75 73 65 20 6f 6e 6c 79 20  ternal use only 
1110: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4c 41 47 5f  */.#define FLAG_
1120: 53 54 52 49 4e 47 20 20 34 20 20 20 20 20 2f 2a  STRING  4     /*
1130: 20 41 6c 6c 6f 77 20 69 6e 66 69 6e 69 74 79 20   Allow infinity 
1140: 70 72 65 63 69 73 69 6f 6e 20 2a 2f 0a 0a 0a 2f  precision */.../
1150: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1160: 6e 67 20 74 61 62 6c 65 20 69 73 20 73 65 61 72  ng table is sear
1170: 63 68 65 64 20 6c 69 6e 65 61 72 6c 79 2c 20 73  ched linearly, s
1180: 6f 20 69 74 20 69 73 20 67 6f 6f 64 20 74 6f 20  o it is good to 
1190: 70 75 74 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20  put the.** most 
11a0: 66 72 65 71 75 65 6e 74 6c 79 20 75 73 65 64 20  frequently used 
11b0: 63 6f 6e 76 65 72 73 69 6f 6e 20 74 79 70 65 73  conversion types
11c0: 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74 69   first..*/.stati
11d0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 61 44 69  c const char aDi
11e0: 67 69 74 73 5b 5d 20 3d 20 22 30 31 32 33 34 35  gits[] = "012345
11f0: 36 37 38 39 41 42 43 44 45 46 30 31 32 33 34 35  6789ABCDEF012345
1200: 36 37 38 39 61 62 63 64 65 66 22 3b 0a 73 74 61  6789abcdef";.sta
1210: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 61  tic const char a
1220: 50 72 65 66 69 78 5b 5d 20 3d 20 22 2d 78 30 5c  Prefix[] = "-x0\
1230: 30 30 30 58 30 22 3b 0a 73 74 61 74 69 63 20 63  000X0";.static c
1240: 6f 6e 73 74 20 65 74 5f 69 6e 66 6f 20 66 6d 74  onst et_info fmt
1250: 69 6e 66 6f 5b 5d 20 3d 20 7b 0a 20 20 7b 20 20  info[] = {.  {  
1260: 27 64 27 2c 20 31 30 2c 20 31 2c 20 65 74 52 41  'd', 10, 1, etRA
1270: 44 49 58 2c 20 20 20 20 20 20 30 2c 20 20 30 20  DIX,      0,  0 
1280: 7d 2c 0a 20 20 7b 20 20 27 73 27 2c 20 20 30 2c  },.  {  's',  0,
1290: 20 34 2c 20 65 74 53 54 52 49 4e 47 2c 20 20 20   4, etSTRING,   
12a0: 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20 7b 20 20    0,  0 },.  {  
12b0: 27 7a 27 2c 20 20 30 2c 20 36 2c 20 65 74 44 59  'z',  0, 6, etDY
12c0: 4e 53 54 52 49 4e 47 2c 20 20 30 2c 20 20 30 20  NSTRING,  0,  0 
12d0: 7d 2c 0a 20 20 7b 20 20 27 71 27 2c 20 20 30 2c  },.  {  'q',  0,
12e0: 20 34 2c 20 65 74 53 51 4c 45 53 43 41 50 45 2c   4, etSQLESCAPE,
12f0: 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20 7b 20 20    0,  0 },.  {  
1300: 27 51 27 2c 20 20 30 2c 20 34 2c 20 65 74 53 51  'Q',  0, 4, etSQ
1310: 4c 45 53 43 41 50 45 32 2c 20 30 2c 20 20 30 20  LESCAPE2, 0,  0 
1320: 7d 2c 0a 20 20 7b 20 20 27 63 27 2c 20 20 30 2c  },.  {  'c',  0,
1330: 20 30 2c 20 65 74 43 48 41 52 58 2c 20 20 20 20   0, etCHARX,    
1340: 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20 7b 20 20    0,  0 },.  {  
1350: 27 6f 27 2c 20 20 38 2c 20 30 2c 20 65 74 52 41  'o',  8, 0, etRA
1360: 44 49 58 2c 20 20 20 20 20 20 30 2c 20 20 32 20  DIX,      0,  2 
1370: 7d 2c 0a 20 20 7b 20 20 27 75 27 2c 20 31 30 2c  },.  {  'u', 10,
1380: 20 30 2c 20 65 74 52 41 44 49 58 2c 20 20 20 20   0, etRADIX,    
1390: 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20 7b 20 20    0,  0 },.  {  
13a0: 27 78 27 2c 20 31 36 2c 20 30 2c 20 65 74 52 41  'x', 16, 0, etRA
13b0: 44 49 58 2c 20 20 20 20 20 20 31 36 2c 20 31 20  DIX,      16, 1 
13c0: 7d 2c 0a 20 20 7b 20 20 27 58 27 2c 20 31 36 2c  },.  {  'X', 16,
13d0: 20 30 2c 20 65 74 52 41 44 49 58 2c 20 20 20 20   0, etRADIX,    
13e0: 20 20 30 2c 20 20 34 20 7d 2c 0a 20 20 7b 20 20    0,  4 },.  {  
13f0: 27 66 27 2c 20 20 30 2c 20 31 2c 20 65 74 46 4c  'f',  0, 1, etFL
1400: 4f 41 54 2c 20 20 20 20 20 20 30 2c 20 20 30 20  OAT,      0,  0 
1410: 7d 2c 0a 20 20 7b 20 20 27 65 27 2c 20 20 30 2c  },.  {  'e',  0,
1420: 20 31 2c 20 65 74 45 58 50 2c 20 20 20 20 20 20   1, etEXP,      
1430: 20 20 33 30 2c 20 30 20 7d 2c 0a 20 20 7b 20 20    30, 0 },.  {  
1440: 27 45 27 2c 20 20 30 2c 20 31 2c 20 65 74 45 58  'E',  0, 1, etEX
1450: 50 2c 20 20 20 20 20 20 20 20 31 34 2c 20 30 20  P,        14, 0 
1460: 7d 2c 0a 20 20 7b 20 20 27 67 27 2c 20 20 30 2c  },.  {  'g',  0,
1470: 20 31 2c 20 65 74 47 45 4e 45 52 49 43 2c 20 20   1, etGENERIC,  
1480: 20 20 33 30 2c 20 30 20 7d 2c 0a 20 20 7b 20 20    30, 0 },.  {  
1490: 27 47 27 2c 20 20 30 2c 20 31 2c 20 65 74 47 45  'G',  0, 1, etGE
14a0: 4e 45 52 49 43 2c 20 20 20 20 31 34 2c 20 30 20  NERIC,    14, 0 
14b0: 7d 2c 0a 20 20 7b 20 20 27 69 27 2c 20 31 30 2c  },.  {  'i', 10,
14c0: 20 31 2c 20 65 74 52 41 44 49 58 2c 20 20 20 20   1, etRADIX,    
14d0: 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20 7b 20 20    0,  0 },.  {  
14e0: 27 6e 27 2c 20 20 30 2c 20 30 2c 20 65 74 53 49  'n',  0, 0, etSI
14f0: 5a 45 2c 20 20 20 20 20 20 20 30 2c 20 20 30 20  ZE,       0,  0 
1500: 7d 2c 0a 20 20 7b 20 20 27 25 27 2c 20 20 30 2c  },.  {  '%',  0,
1510: 20 30 2c 20 65 74 50 45 52 43 45 4e 54 2c 20 20   0, etPERCENT,  
1520: 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20 7b 20 20    0,  0 },.  {  
1530: 27 70 27 2c 20 31 36 2c 20 30 2c 20 65 74 50 4f  'p', 16, 0, etPO
1540: 49 4e 54 45 52 2c 20 20 20 20 30 2c 20 20 31 20  INTER,    0,  1 
1550: 7d 2c 0a 20 20 7b 20 20 27 54 27 2c 20 20 30 2c  },.  {  'T',  0,
1560: 20 32 2c 20 65 74 54 4f 4b 45 4e 2c 20 20 20 20   2, etTOKEN,    
1570: 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20 7b 20 20    0,  0 },.  {  
1580: 27 53 27 2c 20 20 30 2c 20 32 2c 20 65 74 53 52  'S',  0, 2, etSR
1590: 43 4c 49 53 54 2c 20 20 20 20 30 2c 20 20 30 20  CLIST,    0,  0 
15a0: 7d 2c 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 65 74  },.};.#define et
15b0: 4e 49 4e 46 4f 20 20 28 73 69 7a 65 6f 66 28 66  NINFO  (sizeof(f
15c0: 6d 74 69 6e 66 6f 29 2f 73 69 7a 65 6f 66 28 66  mtinfo)/sizeof(f
15d0: 6d 74 69 6e 66 6f 5b 30 5d 29 29 0a 0a 2f 2a 0a  mtinfo[0]))../*.
15e0: 2a 2a 20 49 66 20 4e 4f 46 4c 4f 41 54 49 4e 47  ** If NOFLOATING
15f0: 50 4f 49 4e 54 20 69 73 20 64 65 66 69 6e 65 64  POINT is defined
1600: 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74  , then none of t
1610: 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  he floating poin
1620: 74 0a 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73  t.** conversions
1630: 20 77 69 6c 6c 20 77 6f 72 6b 2e 0a 2a 2f 0a 23   will work..*/.#
1640: 69 66 6e 64 65 66 20 65 74 4e 4f 46 4c 4f 41 54  ifndef etNOFLOAT
1650: 49 4e 47 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 22  INGPOINT./*.** "
1660: 2a 76 61 6c 22 20 69 73 20 61 20 64 6f 75 62 6c  *val" is a doubl
1670: 65 20 73 75 63 68 20 74 68 61 74 20 30 2e 31 20  e such that 0.1 
1680: 3c 3d 20 2a 76 61 6c 20 3c 20 31 30 2e 30 0a 2a  <= *val < 10.0.*
1690: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 73 63  * Return the asc
16a0: 69 69 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ii code for the 
16b0: 6c 65 61 64 69 6e 67 20 64 69 67 69 74 20 6f 66  leading digit of
16c0: 20 2a 76 61 6c 2c 20 74 68 65 6e 0a 2a 2a 20 6d   *val, then.** m
16d0: 75 6c 74 69 70 6c 79 20 22 2a 76 61 6c 22 20 62  ultiply "*val" b
16e0: 79 20 31 30 2e 30 20 74 6f 20 72 65 6e 6f 72 6d  y 10.0 to renorm
16f0: 61 6c 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  alize..**.** Exa
1700: 6d 70 6c 65 3a 0a 2a 2a 20 20 20 20 20 69 6e 70  mple:.**     inp
1710: 75 74 3a 20 20 20 20 20 2a 76 61 6c 20 3d 20 33  ut:     *val = 3
1720: 2e 31 34 31 35 39 0a 2a 2a 20 20 20 20 20 6f 75  .14159.**     ou
1730: 74 70 75 74 3a 20 20 20 20 2a 76 61 6c 20 3d 20  tput:    *val = 
1740: 31 2e 34 31 35 39 20 20 20 20 66 75 6e 63 74 69  1.4159    functi
1750: 6f 6e 20 72 65 74 75 72 6e 20 3d 20 27 33 27 0a  on return = '3'.
1760: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 75 6e 74 65  **.** The counte
1770: 72 20 2a 63 6e 74 20 69 73 20 69 6e 63 72 65 6d  r *cnt is increm
1780: 65 6e 74 65 64 20 65 61 63 68 20 74 69 6d 65 2e  ented each time.
1790: 20 20 41 66 74 65 72 20 63 6f 75 6e 74 65 72 20    After counter 
17a0: 65 78 63 65 65 64 73 0a 2a 2a 20 31 36 20 28 74  exceeds.** 16 (t
17b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 67  he number of sig
17c0: 6e 69 66 69 63 61 6e 74 20 64 69 67 69 74 73 20  nificant digits 
17d0: 69 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  in a 64-bit floa
17e0: 74 29 20 27 30 27 20 69 73 0a 2a 2a 20 61 6c 77  t) '0' is.** alw
17f0: 61 79 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  ays returned..*/
1800: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 74 5f 67  .static int et_g
1810: 65 74 64 69 67 69 74 28 4c 4f 4e 47 44 4f 55 42  etdigit(LONGDOUB
1820: 4c 45 5f 54 59 50 45 20 2a 76 61 6c 2c 20 69 6e  LE_TYPE *val, in
1830: 74 20 2a 63 6e 74 29 7b 0a 20 20 69 6e 74 20 64  t *cnt){.  int d
1840: 69 67 69 74 3b 0a 20 20 4c 4f 4e 47 44 4f 55 42  igit;.  LONGDOUB
1850: 4c 45 5f 54 59 50 45 20 64 3b 0a 20 20 69 66 28  LE_TYPE d;.  if(
1860: 20 28 2a 63 6e 74 29 2b 2b 20 3e 3d 20 31 36 20   (*cnt)++ >= 16 
1870: 29 20 72 65 74 75 72 6e 20 27 30 27 3b 0a 20 20  ) return '0';.  
1880: 64 69 67 69 74 20 3d 20 28 69 6e 74 29 2a 76 61  digit = (int)*va
1890: 6c 3b 0a 20 20 64 20 3d 20 64 69 67 69 74 3b 0a  l;.  d = digit;.
18a0: 20 20 64 69 67 69 74 20 2b 3d 20 27 30 27 3b 0a    digit += '0';.
18b0: 20 20 2a 76 61 6c 20 3d 20 28 2a 76 61 6c 20 2d    *val = (*val -
18c0: 20 64 29 2a 31 30 2e 30 3b 0a 20 20 72 65 74 75   d)*10.0;.  retu
18d0: 72 6e 20 64 69 67 69 74 3b 0a 7d 0a 23 65 6e 64  rn digit;.}.#end
18e0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 65 74 42 55  if..#define etBU
18f0: 46 53 49 5a 45 20 31 30 30 30 20 20 2f 2a 20 53  FSIZE 1000  /* S
1900: 69 7a 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ize of the outpu
1910: 74 20 62 75 66 66 65 72 20 2a 2f 0a 0a 2f 2a 0a  t buffer */../*.
1920: 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 72 6f 67  ** The root prog
1930: 72 61 6d 2e 20 20 41 6c 6c 20 76 61 72 69 61 74  ram.  All variat
1940: 69 6f 6e 73 20 63 61 6c 6c 20 74 68 69 73 20 63  ions call this c
1950: 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 4e 50 55 54  ore..**.** INPUT
1960: 53 3a 0a 2a 2a 20 20 20 66 75 6e 63 20 20 20 54  S:.**   func   T
1970: 68 69 73 20 69 73 20 61 20 70 6f 69 6e 74 65 72  his is a pointer
1980: 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
1990: 61 6b 69 6e 67 20 74 68 72 65 65 20 61 72 67 75  aking three argu
19a0: 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 20 20  ments.**        
19b0: 20 20 20 20 31 2e 20 41 20 70 6f 69 6e 74 65 72      1. A pointer
19c0: 20 74 6f 20 61 6e 79 74 68 69 6e 67 2e 20 20 53   to anything.  S
19d0: 61 6d 65 20 61 73 20 74 68 65 20 22 61 72 67 22  ame as the "arg"
19e0: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 20   parameter..**  
19f0: 20 20 20 20 20 20 20 20 20 20 32 2e 20 41 20 70            2. A p
1a00: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 69  ointer to the li
1a10: 73 74 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  st of characters
1a20: 20 74 6f 20 62 65 20 6f 75 74 70 75 74 0a 2a 2a   to be output.**
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1a40: 4e 6f 74 65 2c 20 74 68 69 73 20 6c 69 73 74 20  Note, this list 
1a50: 69 73 20 4e 4f 54 20 6e 75 6c 6c 20 74 65 72 6d  is NOT null term
1a60: 69 6e 61 74 65 64 2e 29 0a 2a 2a 20 20 20 20 20  inated.).**     
1a70: 20 20 20 20 20 20 20 33 2e 20 41 6e 20 69 6e 74         3. An int
1a80: 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63  eger number of c
1a90: 68 61 72 61 63 74 65 72 73 20 74 6f 20 62 65 20  haracters to be 
1aa0: 6f 75 74 70 75 74 2e 0a 2a 2a 20 20 20 20 20 20  output..**      
1ab0: 20 20 20 20 20 20 20 20 20 28 4e 6f 74 65 3a 20           (Note: 
1ac0: 54 68 69 73 20 6e 75 6d 62 65 72 20 6d 69 67 68  This number migh
1ad0: 74 20 62 65 20 7a 65 72 6f 2e 29 0a 2a 2a 0a 2a  t be zero.).**.*
1ae0: 2a 20 20 20 61 72 67 20 20 20 20 54 68 69 73 20  *   arg    This 
1af0: 69 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74  is the pointer t
1b00: 6f 20 61 6e 79 74 68 69 6e 67 20 77 68 69 63 68  o anything which
1b10: 20 77 69 6c 6c 20 62 65 20 70 61 73 73 65 64 20   will be passed 
1b20: 61 73 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  as the.**       
1b30: 20 20 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e     first argumen
1b40: 74 20 74 6f 20 22 66 75 6e 63 22 2e 20 20 55 73  t to "func".  Us
1b50: 65 20 69 74 20 66 6f 72 20 77 68 61 74 65 76 65  e it for whateve
1b60: 72 20 79 6f 75 20 6c 69 6b 65 2e 0a 2a 2a 0a 2a  r you like..**.*
1b70: 2a 20 20 20 66 6d 74 20 20 20 20 54 68 69 73 20  *   fmt    This 
1b80: 69 73 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74  is the format st
1b90: 72 69 6e 67 2c 20 61 73 20 69 6e 20 74 68 65 20  ring, as in the 
1ba0: 75 73 75 61 6c 20 70 72 69 6e 74 2e 0a 2a 2a 0a  usual print..**.
1bb0: 2a 2a 20 20 20 61 70 20 20 20 20 20 54 68 69 73  **   ap     This
1bc0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1bd0: 20 61 20 6c 69 73 74 20 6f 66 20 61 72 67 75 6d   a list of argum
1be0: 65 6e 74 73 2e 20 20 53 61 6d 65 20 61 73 20 69  ents.  Same as i
1bf0: 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 76 66  n.**          vf
1c00: 70 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 55 54  print..**.** OUT
1c10: 50 55 54 53 3a 0a 2a 2a 20 20 20 20 20 20 20 20  PUTS:.**        
1c20: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
1c30: 75 65 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20  ue is the total 
1c40: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
1c50: 74 65 72 73 20 73 65 6e 74 20 74 6f 0a 2a 2a 20  ters sent to.** 
1c60: 20 20 20 20 20 20 20 20 20 74 68 65 20 66 75 6e           the fun
1c70: 63 74 69 6f 6e 20 22 66 75 6e 63 22 2e 20 20 52  ction "func".  R
1c80: 65 74 75 72 6e 73 20 2d 31 20 6f 6e 20 61 20 65  eturns -1 on a e
1c90: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  rror..**.** Note
1ca0: 20 74 68 61 74 20 74 68 65 20 6f 72 64 65 72 20   that the order 
1cb0: 69 6e 20 77 68 69 63 68 20 61 75 74 6f 6d 61 74  in which automat
1cc0: 69 63 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  ic variables are
1cd0: 20 64 65 63 6c 61 72 65 64 20 62 65 6c 6f 77 0a   declared below.
1ce0: 2a 2a 20 73 65 65 6d 73 20 74 6f 20 6d 61 6b 65  ** seems to make
1cf0: 20 61 20 62 69 67 20 64 69 66 66 65 72 65 6e 63   a big differenc
1d00: 65 20 69 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67  e in determining
1d10: 20 68 6f 77 20 66 61 73 74 20 74 68 69 73 20 62   how fast this b
1d20: 65 61 73 74 0a 2a 2a 20 77 69 6c 6c 20 72 75 6e  east.** will run
1d30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d40: 76 78 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64  vxprintf(.  void
1d50: 20 28 2a 66 75 6e 63 29 28 76 6f 69 64 2a 2c 63   (*func)(void*,c
1d60: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 2c  onst char*,int),
1d70: 20 20 20 20 20 2f 2a 20 43 6f 6e 73 75 6d 65 72       /* Consumer
1d80: 20 6f 66 20 74 65 78 74 20 2a 2f 0a 20 20 76 6f   of text */.  vo
1d90: 69 64 20 2a 61 72 67 2c 20 20 20 20 20 20 20 20  id *arg,        
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db0: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
1dc0: 6e 74 20 74 6f 20 74 68 65 20 63 6f 6e 73 75 6d  nt to the consum
1dd0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 45  er */.  int useE
1de0: 78 74 65 6e 64 65 64 2c 20 20 20 20 20 20 20 20  xtended,        
1df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
1e00: 6c 6f 77 20 65 78 74 65 6e 64 65 64 20 25 2d 63  low extended %-c
1e10: 6f 6e 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 20 20  onversions */.  
1e20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6d 74 2c  const char *fmt,
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20 73 74 72     /* Format str
1e50: 69 6e 67 20 2a 2f 0a 20 20 76 61 5f 6c 69 73 74  ing */.  va_list
1e60: 20 61 70 20 20 20 20 20 20 20 20 20 20 20 20 20   ap             
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
1e80: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
1e90: 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20 20   int c;         
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1eb0: 65 78 74 20 63 68 61 72 61 63 74 65 72 20 69 6e  ext character in
1ec0: 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69   the format stri
1ed0: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 62 75  ng */.  char *bu
1ee0: 66 70 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  fpt;            
1ef0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1f00: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
1f10: 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
1f20: 70 72 65 63 69 73 69 6f 6e 3b 20 20 20 20 20 20  precision;      
1f30: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63 69 73         /* Precis
1f40: 69 6f 6e 20 6f 66 20 74 68 65 20 63 75 72 72 65  ion of the curre
1f50: 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e  nt field */.  in
1f60: 74 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20  t length;       
1f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
1f80: 74 68 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20  th of the field 
1f90: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20  */.  int idx;   
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 2f 2a 20 41 20 67 65 6e 65 72 61 6c 20 70 75 72  /* A general pur
1fc0: 70 6f 73 65 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  pose loop counte
1fd0: 72 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74  r */.  int count
1fe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ff0: 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
2000: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
2010: 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
2020: 77 69 64 74 68 3b 20 20 20 20 20 20 20 20 20 20  width;          
2030: 20 20 20 20 20 20 20 2f 2a 20 57 69 64 74 68 20         /* Width 
2040: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  of the current f
2050: 69 65 6c 64 20 2a 2f 0a 20 20 65 74 42 79 74 65  ield */.  etByte
2060: 20 66 6c 61 67 5f 6c 65 66 74 6a 75 73 74 69 66   flag_leftjustif
2070: 79 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  y;   /* True if 
2080: 22 2d 22 20 66 6c 61 67 20 69 73 20 70 72 65 73  "-" flag is pres
2090: 65 6e 74 20 2a 2f 0a 20 20 65 74 42 79 74 65 20  ent */.  etByte 
20a0: 66 6c 61 67 5f 70 6c 75 73 73 69 67 6e 3b 20 20  flag_plussign;  
20b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 22      /* True if "
20c0: 2b 22 20 66 6c 61 67 20 69 73 20 70 72 65 73 65  +" flag is prese
20d0: 6e 74 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 66  nt */.  etByte f
20e0: 6c 61 67 5f 62 6c 61 6e 6b 73 69 67 6e 3b 20 20  lag_blanksign;  
20f0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 22 20     /* True if " 
2100: 22 20 66 6c 61 67 20 69 73 20 70 72 65 73 65 6e  " flag is presen
2110: 74 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 66 6c  t */.  etByte fl
2120: 61 67 5f 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d  ag_alternateform
2130: 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 22 23 22  ; /* True if "#"
2140: 20 66 6c 61 67 20 69 73 20 70 72 65 73 65 6e 74   flag is present
2150: 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 66 6c 61   */.  etByte fla
2160: 67 5f 7a 65 72 6f 70 61 64 3b 20 20 20 20 20 20  g_zeropad;      
2170: 20 2f 2a 20 54 72 75 65 20 69 66 20 66 69 65 6c   /* True if fiel
2180: 64 20 77 69 64 74 68 20 63 6f 6e 73 74 61 6e 74  d width constant
2190: 20 73 74 61 72 74 73 20 77 69 74 68 20 7a 65 72   starts with zer
21a0: 6f 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 66 6c  o */.  etByte fl
21b0: 61 67 5f 6c 6f 6e 67 3b 20 20 20 20 20 20 20 20  ag_long;        
21c0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 22 6c 22    /* True if "l"
21d0: 20 66 6c 61 67 20 69 73 20 70 72 65 73 65 6e 74   flag is present
21e0: 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 66 6c 61   */.  etByte fla
21f0: 67 5f 6c 6f 6e 67 6c 6f 6e 67 3b 20 20 20 20 20  g_longlong;     
2200: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
2210: 22 6c 6c 22 20 66 6c 61 67 20 69 73 20 70 72 65  "ll" flag is pre
2220: 73 65 6e 74 20 2a 2f 0a 20 20 55 49 4e 54 36 34  sent */.  UINT64
2230: 5f 54 59 50 45 20 6c 6f 6e 67 76 61 6c 75 65 3b  _TYPE longvalue;
2240: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
2250: 72 20 69 6e 74 65 67 65 72 20 74 79 70 65 73 20  r integer types 
2260: 2a 2f 0a 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f  */.  LONGDOUBLE_
2270: 54 59 50 45 20 72 65 61 6c 76 61 6c 75 65 3b 20  TYPE realvalue; 
2280: 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 72 65 61  /* Value for rea
2290: 6c 20 74 79 70 65 73 20 2a 2f 0a 20 20 63 6f 6e  l types */.  con
22a0: 73 74 20 65 74 5f 69 6e 66 6f 20 2a 69 6e 66 6f  st et_info *info
22b0: 70 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  p;      /* Point
22c0: 65 72 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70  er to the approp
22d0: 72 69 61 74 65 20 69 6e 66 6f 20 73 74 72 75 63  riate info struc
22e0: 74 75 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 62  ture */.  char b
22f0: 75 66 5b 65 74 42 55 46 53 49 5a 45 5d 3b 20 20  uf[etBUFSIZE];  
2300: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 73 69       /* Conversi
2310: 6f 6e 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 63  on buffer */.  c
2320: 68 61 72 20 70 72 65 66 69 78 3b 20 20 20 20 20  har prefix;     
2330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
2340: 66 69 78 20 63 68 61 72 61 63 74 65 72 2e 20 20  fix character.  
2350: 22 2b 22 20 6f 72 20 22 2d 22 20 6f 72 20 22 20  "+" or "-" or " 
2360: 22 20 6f 72 20 27 5c 30 27 2e 20 2a 2f 0a 20 20  " or '\0'. */.  
2370: 65 74 42 79 74 65 20 65 72 72 6f 72 66 6c 61 67  etByte errorflag
2380: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 72   = 0;      /* Tr
2390: 75 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  ue if an error i
23a0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f  s encountered */
23b0: 0a 20 20 65 74 42 79 74 65 20 78 74 79 70 65 3b  .  etByte xtype;
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23d0: 20 43 6f 6e 76 65 72 73 69 6f 6e 20 70 61 72 61   Conversion para
23e0: 64 69 67 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a  digm */.  char *
23f0: 7a 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20  zExtra;         
2400: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 6d 65       /* Extra me
2410: 6d 6f 72 79 20 75 73 65 64 20 66 6f 72 20 65 74  mory used for et
2420: 54 43 4c 45 53 43 41 50 45 20 63 6f 6e 76 65 72  TCLESCAPE conver
2430: 73 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 61 74 69  sions */.  stati
2440: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 73 70 61  c const char spa
2450: 63 65 73 5b 5d 20 3d 0a 20 20 20 22 20 20 20 20  ces[] =.   "    
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 20 20 20 20 22 3b 0a 23 64 65 66 69 6e 65 20       ";.#define 
24b0: 65 74 53 50 41 43 45 53 49 5a 45 20 28 73 69 7a  etSPACESIZE (siz
24c0: 65 6f 66 28 73 70 61 63 65 73 29 2d 31 29 0a 23  eof(spaces)-1).#
24d0: 69 66 6e 64 65 66 20 65 74 4e 4f 46 4c 4f 41 54  ifndef etNOFLOAT
24e0: 49 4e 47 50 4f 49 4e 54 0a 20 20 69 6e 74 20 20  INGPOINT.  int  
24f0: 65 78 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  exp;            
2500: 20 20 20 20 20 20 2f 2a 20 65 78 70 6f 6e 65 6e        /* exponen
2510: 74 20 6f 66 20 72 65 61 6c 20 6e 75 6d 62 65 72  t of real number
2520: 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 6f  s */.  double ro
2530: 75 6e 64 65 72 3b 20 20 20 20 20 20 20 20 20 20  under;          
2540: 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 72 6f    /* Used for ro
2550: 75 6e 64 69 6e 67 20 66 6c 6f 61 74 69 6e 67 20  unding floating 
2560: 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a  point values */.
2570: 20 20 65 74 42 79 74 65 20 66 6c 61 67 5f 64 70    etByte flag_dp
2580: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2590: 54 72 75 65 20 69 66 20 64 65 63 69 6d 61 6c 20  True if decimal 
25a0: 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 62 65 20  point should be 
25b0: 73 68 6f 77 6e 20 2a 2f 0a 20 20 65 74 42 79 74  shown */.  etByt
25c0: 65 20 66 6c 61 67 5f 72 74 7a 3b 20 20 20 20 20  e flag_rtz;     
25d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
25e0: 20 74 72 61 69 6c 69 6e 67 20 7a 65 72 6f 73 20   trailing zeros 
25f0: 73 68 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65  should be remove
2600: 64 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 66 6c  d */.  etByte fl
2610: 61 67 5f 65 78 70 3b 20 20 20 20 20 20 20 20 20  ag_exp;         
2620: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 66 6f 72    /* True to for
2630: 63 65 20 64 69 73 70 6c 61 79 20 6f 66 20 74 68  ce display of th
2640: 65 20 65 78 70 6f 6e 65 6e 74 20 2a 2f 0a 20 20  e exponent */.  
2650: 69 6e 74 20 6e 73 64 3b 20 20 20 20 20 20 20 20  int nsd;        
2660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2670: 6d 62 65 72 20 6f 66 20 73 69 67 6e 69 66 69 63  mber of signific
2680: 61 6e 74 20 64 69 67 69 74 73 20 72 65 74 75 72  ant digits retur
2690: 6e 65 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ned */.#endif.. 
26a0: 20 66 75 6e 63 28 61 72 67 2c 22 22 2c 30 29 3b   func(arg,"",0);
26b0: 0a 20 20 63 6f 75 6e 74 20 3d 20 6c 65 6e 67 74  .  count = lengt
26c0: 68 20 3d 20 30 3b 0a 20 20 62 75 66 70 74 20 3d  h = 0;.  bufpt =
26d0: 20 30 3b 0a 20 20 66 6f 72 28 3b 20 28 63 3d 28   0;.  for(; (c=(
26e0: 2a 66 6d 74 29 29 21 3d 30 3b 20 2b 2b 66 6d 74  *fmt))!=0; ++fmt
26f0: 29 7b 0a 20 20 20 20 69 66 28 20 63 21 3d 27 25  ){.    if( c!='%
2700: 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  ' ){.      int a
2710: 6d 74 3b 0a 20 20 20 20 20 20 62 75 66 70 74 20  mt;.      bufpt 
2720: 3d 20 28 63 68 61 72 20 2a 29 66 6d 74 3b 0a 20  = (char *)fmt;. 
2730: 20 20 20 20 20 61 6d 74 20 3d 20 31 3b 0a 20 20       amt = 1;.  
2740: 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 28 2a      while( (c=(*
2750: 2b 2b 66 6d 74 29 29 21 3d 27 25 27 20 26 26 20  ++fmt))!='%' && 
2760: 63 21 3d 30 20 29 20 61 6d 74 2b 2b 3b 0a 20 20  c!=0 ) amt++;.  
2770: 20 20 20 20 28 2a 66 75 6e 63 29 28 61 72 67 2c      (*func)(arg,
2780: 62 75 66 70 74 2c 61 6d 74 29 3b 0a 20 20 20 20  bufpt,amt);.    
2790: 20 20 63 6f 75 6e 74 20 2b 3d 20 61 6d 74 3b 0a    count += amt;.
27a0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
27b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
27c0: 20 20 69 66 28 20 28 63 3d 28 2a 2b 2b 66 6d 74    if( (c=(*++fmt
27d0: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 65  ))==0 ){.      e
27e0: 72 72 6f 72 66 6c 61 67 20 3d 20 31 3b 0a 20 20  rrorflag = 1;.  
27f0: 20 20 20 20 28 2a 66 75 6e 63 29 28 61 72 67 2c      (*func)(arg,
2800: 22 25 22 2c 31 29 3b 0a 20 20 20 20 20 20 63 6f  "%",1);.      co
2810: 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65  unt++;.      bre
2820: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ak;.    }.    /*
2830: 20 46 69 6e 64 20 6f 75 74 20 77 68 61 74 20 66   Find out what f
2840: 6c 61 67 73 20 61 72 65 20 70 72 65 73 65 6e 74  lags are present
2850: 20 2a 2f 0a 20 20 20 20 66 6c 61 67 5f 6c 65 66   */.    flag_lef
2860: 74 6a 75 73 74 69 66 79 20 3d 20 66 6c 61 67 5f  tjustify = flag_
2870: 70 6c 75 73 73 69 67 6e 20 3d 20 66 6c 61 67 5f  plussign = flag_
2880: 62 6c 61 6e 6b 73 69 67 6e 20 3d 20 0a 20 20 20  blanksign = .   
2890: 20 20 66 6c 61 67 5f 61 6c 74 65 72 6e 61 74 65    flag_alternate
28a0: 66 6f 72 6d 20 3d 20 66 6c 61 67 5f 7a 65 72 6f  form = flag_zero
28b0: 70 61 64 20 3d 20 30 3b 0a 20 20 20 20 64 6f 7b  pad = 0;.    do{
28c0: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 63  .      switch( c
28d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
28e0: 20 27 2d 27 3a 20 20 20 66 6c 61 67 5f 6c 65 66   '-':   flag_lef
28f0: 74 6a 75 73 74 69 66 79 20 3d 20 31 3b 20 20 20  tjustify = 1;   
2900: 20 20 63 20 3d 20 30 3b 20 20 20 62 72 65 61 6b    c = 0;   break
2910: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  ;.        case '
2920: 2b 27 3a 20 20 20 66 6c 61 67 5f 70 6c 75 73 73  +':   flag_pluss
2930: 69 67 6e 20 3d 20 31 3b 20 20 20 20 20 20 20 20  ign = 1;        
2940: 63 20 3d 20 30 3b 20 20 20 62 72 65 61 6b 3b 0a  c = 0;   break;.
2950: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 20 27          case ' '
2960: 3a 20 20 20 66 6c 61 67 5f 62 6c 61 6e 6b 73 69  :   flag_blanksi
2970: 67 6e 20 3d 20 31 3b 20 20 20 20 20 20 20 63 20  gn = 1;       c 
2980: 3d 20 30 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  = 0;   break;.  
2990: 20 20 20 20 20 20 63 61 73 65 20 27 23 27 3a 20        case '#': 
29a0: 20 20 66 6c 61 67 5f 61 6c 74 65 72 6e 61 74 65    flag_alternate
29b0: 66 6f 72 6d 20 3d 20 31 3b 20 20 20 63 20 3d 20  form = 1;   c = 
29c0: 30 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  0;   break;.    
29d0: 20 20 20 20 63 61 73 65 20 27 30 27 3a 20 20 20      case '0':   
29e0: 66 6c 61 67 5f 7a 65 72 6f 70 61 64 20 3d 20 31  flag_zeropad = 1
29f0: 3b 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b  ;         c = 0;
2a00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2a10: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2a50: 20 20 20 20 7d 77 68 69 6c 65 28 20 63 3d 3d 30      }while( c==0
2a60: 20 26 26 20 28 63 3d 28 2a 2b 2b 66 6d 74 29 29   && (c=(*++fmt))
2a70: 21 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 47 65  !=0 );.    /* Ge
2a80: 74 20 74 68 65 20 66 69 65 6c 64 20 77 69 64 74  t the field widt
2a90: 68 20 2a 2f 0a 20 20 20 20 77 69 64 74 68 20 3d  h */.    width =
2aa0: 20 30 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27   0;.    if( c=='
2ab0: 2a 27 20 29 7b 0a 20 20 20 20 20 20 77 69 64 74  *' ){.      widt
2ac0: 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  h = va_arg(ap,in
2ad0: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 77 69  t);.      if( wi
2ae0: 64 74 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  dth<0 ){.       
2af0: 20 66 6c 61 67 5f 6c 65 66 74 6a 75 73 74 69 66   flag_leftjustif
2b00: 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 77  y = 1;.        w
2b10: 69 64 74 68 20 3d 20 2d 77 69 64 74 68 3b 0a 20  idth = -width;. 
2b20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 20 3d       }.      c =
2b30: 20 2a 2b 2b 66 6d 74 3b 0a 20 20 20 20 7d 65 6c   *++fmt;.    }el
2b40: 73 65 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  se{.      while(
2b50: 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39   c>='0' && c<='9
2b60: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 64  ' ){.        wid
2b70: 74 68 20 3d 20 77 69 64 74 68 2a 31 30 20 2b 20  th = width*10 + 
2b80: 63 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20  c - '0';.       
2b90: 20 63 20 3d 20 2a 2b 2b 66 6d 74 3b 0a 20 20 20   c = *++fmt;.   
2ba0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2bb0: 66 28 20 77 69 64 74 68 20 3e 20 65 74 42 55 46  f( width > etBUF
2bc0: 53 49 5a 45 2d 31 30 20 29 7b 0a 20 20 20 20 20  SIZE-10 ){.     
2bd0: 20 77 69 64 74 68 20 3d 20 65 74 42 55 46 53 49   width = etBUFSI
2be0: 5a 45 2d 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20  ZE-10;.    }.   
2bf0: 20 2f 2a 20 47 65 74 20 74 68 65 20 70 72 65 63   /* Get the prec
2c00: 69 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28  ision */.    if(
2c10: 20 63 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20   c=='.' ){.     
2c20: 20 70 72 65 63 69 73 69 6f 6e 20 3d 20 30 3b 0a   precision = 0;.
2c30: 20 20 20 20 20 20 63 20 3d 20 2a 2b 2b 66 6d 74        c = *++fmt
2c40: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  ;.      if( c=='
2c50: 2a 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  *' ){.        pr
2c60: 65 63 69 73 69 6f 6e 20 3d 20 76 61 5f 61 72 67  ecision = va_arg
2c70: 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
2c80: 20 20 69 66 28 20 70 72 65 63 69 73 69 6f 6e 3c    if( precision<
2c90: 30 20 29 20 70 72 65 63 69 73 69 6f 6e 20 3d 20  0 ) precision = 
2ca0: 2d 70 72 65 63 69 73 69 6f 6e 3b 0a 20 20 20 20  -precision;.    
2cb0: 20 20 20 20 63 20 3d 20 2a 2b 2b 66 6d 74 3b 0a      c = *++fmt;.
2cc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2cd0: 20 20 20 20 20 77 68 69 6c 65 28 20 63 3e 3d 27       while( c>='
2ce0: 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29 7b 0a  0' && c<='9' ){.
2cf0: 20 20 20 20 20 20 20 20 20 20 70 72 65 63 69 73            precis
2d00: 69 6f 6e 20 3d 20 70 72 65 63 69 73 69 6f 6e 2a  ion = precision*
2d10: 31 30 20 2b 20 63 20 2d 20 27 30 27 3b 0a 20 20  10 + c - '0';.  
2d20: 20 20 20 20 20 20 20 20 63 20 3d 20 2a 2b 2b 66          c = *++f
2d30: 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  mt;.        }.  
2d40: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2d50: 0a 20 20 20 20 20 20 70 72 65 63 69 73 69 6f 6e  .      precision
2d60: 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
2d70: 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6e 76   /* Get the conv
2d80: 65 72 73 69 6f 6e 20 74 79 70 65 20 6d 6f 64 69  ersion type modi
2d90: 66 69 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  fier */.    if( 
2da0: 63 3d 3d 27 6c 27 20 29 7b 0a 20 20 20 20 20 20  c=='l' ){.      
2db0: 66 6c 61 67 5f 6c 6f 6e 67 20 3d 20 31 3b 0a 20  flag_long = 1;. 
2dc0: 20 20 20 20 20 63 20 3d 20 2a 2b 2b 66 6d 74 3b       c = *++fmt;
2dd0: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 6c  .      if( c=='l
2de0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  ' ){.        fla
2df0: 67 5f 6c 6f 6e 67 6c 6f 6e 67 20 3d 20 31 3b 0a  g_longlong = 1;.
2e00: 20 20 20 20 20 20 20 20 63 20 3d 20 2a 2b 2b 66          c = *++f
2e10: 6d 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  mt;.      }else{
2e20: 0a 20 20 20 20 20 20 20 20 66 6c 61 67 5f 6c 6f  .        flag_lo
2e30: 6e 67 6c 6f 6e 67 20 3d 20 30 3b 0a 20 20 20 20  nglong = 0;.    
2e40: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2e50: 20 20 20 20 20 66 6c 61 67 5f 6c 6f 6e 67 20 3d       flag_long =
2e60: 20 66 6c 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 20 3d   flag_longlong =
2e70: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a   0;.    }.    /*
2e80: 20 46 65 74 63 68 20 74 68 65 20 69 6e 66 6f 20   Fetch the info 
2e90: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
2ea0: 65 6c 64 20 2a 2f 0a 20 20 20 20 69 6e 66 6f 70  eld */.    infop
2eb0: 20 3d 20 30 3b 0a 20 20 20 20 78 74 79 70 65 20   = 0;.    xtype 
2ec0: 3d 20 65 74 45 52 52 4f 52 3b 0a 20 20 20 20 66  = etERROR;.    f
2ed0: 6f 72 28 69 64 78 3d 30 3b 20 69 64 78 3c 65 74  or(idx=0; idx<et
2ee0: 4e 49 4e 46 4f 3b 20 69 64 78 2b 2b 29 7b 0a 20  NINFO; idx++){. 
2ef0: 20 20 20 20 20 69 66 28 20 63 3d 3d 66 6d 74 69       if( c==fmti
2f00: 6e 66 6f 5b 69 64 78 5d 2e 66 6d 74 74 79 70 65  nfo[idx].fmttype
2f10: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 66 6f   ){.        info
2f20: 70 20 3d 20 26 66 6d 74 69 6e 66 6f 5b 69 64 78  p = &fmtinfo[idx
2f30: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  ];.        if( u
2f40: 73 65 45 78 74 65 6e 64 65 64 20 7c 7c 20 28 69  seExtended || (i
2f50: 6e 66 6f 70 2d 3e 66 6c 61 67 73 20 26 20 46 4c  nfop->flags & FL
2f60: 41 47 5f 49 4e 54 45 52 4e 29 3d 3d 30 20 29 7b  AG_INTERN)==0 ){
2f70: 0a 20 20 20 20 20 20 20 20 20 20 78 74 79 70 65  .          xtype
2f80: 20 3d 20 69 6e 66 6f 70 2d 3e 74 79 70 65 3b 0a   = infop->type;.
2f90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fa0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2fb0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 45 78 74 72  .    }.    zExtr
2fc0: 61 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c  a = 0;..    /* L
2fd0: 69 6d 69 74 20 74 68 65 20 70 72 65 63 69 73 69  imit the precisi
2fe0: 6f 6e 20 74 6f 20 70 72 65 76 65 6e 74 20 6f 76  on to prevent ov
2ff0: 65 72 66 6c 6f 77 69 6e 67 20 62 75 66 5b 5d 20  erflowing buf[] 
3000: 64 75 72 69 6e 67 20 63 6f 6e 76 65 72 73 69 6f  during conversio
3010: 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 72 65  n */.    if( pre
3020: 63 69 73 69 6f 6e 3e 65 74 42 55 46 53 49 5a 45  cision>etBUFSIZE
3030: 2d 34 30 20 26 26 20 28 69 6e 66 6f 70 2d 3e 66  -40 && (infop->f
3040: 6c 61 67 73 20 26 20 46 4c 41 47 5f 53 54 52 49  lags & FLAG_STRI
3050: 4e 47 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  NG)==0 ){.      
3060: 70 72 65 63 69 73 69 6f 6e 20 3d 20 65 74 42 55  precision = etBU
3070: 46 53 49 5a 45 2d 34 30 3b 0a 20 20 20 20 7d 0a  FSIZE-40;.    }.
3080: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 41  .    /*.    ** A
3090: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 76 61  t this point, va
30a0: 72 69 61 62 6c 65 73 20 61 72 65 20 69 6e 69 74  riables are init
30b0: 69 61 6c 69 7a 65 64 20 61 73 20 66 6f 6c 6c 6f  ialized as follo
30c0: 77 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ws:.    **.    *
30d0: 2a 20 20 20 66 6c 61 67 5f 61 6c 74 65 72 6e 61  *   flag_alterna
30e0: 74 65 66 6f 72 6d 20 20 20 20 20 20 20 20 20 20  teform          
30f0: 54 52 55 45 20 69 66 20 61 20 27 23 27 20 69 73  TRUE if a '#' is
3100: 20 70 72 65 73 65 6e 74 2e 0a 20 20 20 20 2a 2a   present..    **
3110: 20 20 20 66 6c 61 67 5f 70 6c 75 73 73 69 67 6e     flag_plussign
3120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
3130: 52 55 45 20 69 66 20 61 20 27 2b 27 20 69 73 20  RUE if a '+' is 
3140: 70 72 65 73 65 6e 74 2e 0a 20 20 20 20 2a 2a 20  present..    ** 
3150: 20 20 66 6c 61 67 5f 6c 65 66 74 6a 75 73 74 69    flag_leftjusti
3160: 66 79 20 20 20 20 20 20 20 20 20 20 20 20 54 52  fy            TR
3170: 55 45 20 69 66 20 61 20 27 2d 27 20 69 73 20 70  UE if a '-' is p
3180: 72 65 73 65 6e 74 20 6f 72 20 69 66 20 74 68 65  resent or if the
3190: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b0: 20 20 20 20 20 20 66 69 65 6c 64 20 77 69 64 74        field widt
31c0: 68 20 77 61 73 20 6e 65 67 61 74 69 76 65 2e 0a  h was negative..
31d0: 20 20 20 20 2a 2a 20 20 20 66 6c 61 67 5f 7a 65      **   flag_ze
31e0: 72 6f 70 61 64 20 20 20 20 20 20 20 20 20 20 20  ropad           
31f0: 20 20 20 20 20 54 52 55 45 20 69 66 20 74 68 65       TRUE if the
3200: 20 77 69 64 74 68 20 62 65 67 61 6e 20 77 69 74   width began wit
3210: 68 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 66 6c  h 0..    **   fl
3220: 61 67 5f 6c 6f 6e 67 20 20 20 20 20 20 20 20 20  ag_long         
3230: 20 20 20 20 20 20 20 20 20 20 54 52 55 45 20 69            TRUE i
3240: 66 20 74 68 65 20 6c 65 74 74 65 72 20 27 6c 27  f the letter 'l'
3250: 20 28 65 6c 6c 29 20 70 72 65 66 69 78 65 64 0a   (ell) prefixed.
3260: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3280: 20 20 20 20 20 74 68 65 20 63 6f 6e 76 65 72 73       the convers
3290: 69 6f 6e 20 63 68 61 72 61 63 74 65 72 2e 0a 20  ion character.. 
32a0: 20 20 20 2a 2a 20 20 20 66 6c 61 67 5f 6c 6f 6e     **   flag_lon
32b0: 67 6c 6f 6e 67 20 20 20 20 20 20 20 20 20 20 20  glong           
32c0: 20 20 20 20 54 52 55 45 20 69 66 20 74 68 65 20      TRUE if the 
32d0: 6c 65 74 74 65 72 20 27 6c 6c 27 20 28 65 6c 6c  letter 'll' (ell
32e0: 20 65 6c 6c 29 20 70 72 65 66 69 78 65 64 0a 20   ell) prefixed. 
32f0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
3300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3310: 20 20 20 20 74 68 65 20 63 6f 6e 76 65 72 73 69      the conversi
3320: 6f 6e 20 63 68 61 72 61 63 74 65 72 2e 0a 20 20  on character..  
3330: 20 20 2a 2a 20 20 20 66 6c 61 67 5f 62 6c 61 6e    **   flag_blan
3340: 6b 73 69 67 6e 20 20 20 20 20 20 20 20 20 20 20  ksign           
3350: 20 20 20 54 52 55 45 20 69 66 20 61 20 27 20 27     TRUE if a ' '
3360: 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 20   is present..   
3370: 20 2a 2a 20 20 20 77 69 64 74 68 20 20 20 20 20   **   width     
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3390: 20 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20    The specified 
33a0: 66 69 65 6c 64 20 77 69 64 74 68 2e 20 20 54 68  field width.  Th
33b0: 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 20 20 20  is is.    **    
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 20 20 20 20 20 20 20 20 20 20 20 61 6c 77 61 79             alway
33e0: 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 20  s non-negative. 
33f0: 20 5a 65 72 6f 20 69 73 20 74 68 65 20 64 65 66   Zero is the def
3400: 61 75 6c 74 2e 0a 20 20 20 20 2a 2a 20 20 20 70  ault..    **   p
3410: 72 65 63 69 73 69 6f 6e 20 20 20 20 20 20 20 20  recision        
3420: 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20 73             The s
3430: 70 65 63 69 66 69 65 64 20 70 72 65 63 69 73 69  pecified precisi
3440: 6f 6e 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  on.  The default
3450: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3470: 20 20 20 20 20 20 69 73 20 2d 31 2e 0a 20 20 20        is -1..   
3480: 20 2a 2a 20 20 20 78 74 79 70 65 20 20 20 20 20   **   xtype     
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a0: 20 20 54 68 65 20 63 6c 61 73 73 20 6f 66 20 74    The class of t
34b0: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 0a 20  he conversion.. 
34c0: 20 20 20 2a 2a 20 20 20 69 6e 66 6f 70 20 20 20     **   infop   
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e0: 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74      Pointer to t
34f0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 69  he appropriate i
3500: 6e 66 6f 20 73 74 72 75 63 74 2e 0a 20 20 20 20  nfo struct..    
3510: 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20 78  */.    switch( x
3520: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
3530: 73 65 20 65 74 50 4f 49 4e 54 45 52 3a 0a 20 20  se etPOINTER:.  
3540: 20 20 20 20 20 20 66 6c 61 67 5f 6c 6f 6e 67 6c        flag_longl
3550: 6f 6e 67 20 3d 20 73 69 7a 65 6f 66 28 63 68 61  ong = sizeof(cha
3560: 72 2a 29 3d 3d 73 69 7a 65 6f 66 28 69 36 34 29  r*)==sizeof(i64)
3570: 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 5f 6c  ;.        flag_l
3580: 6f 6e 67 20 3d 20 73 69 7a 65 6f 66 28 63 68 61  ong = sizeof(cha
3590: 72 2a 29 3d 3d 73 69 7a 65 6f 66 28 6c 6f 6e 67  r*)==sizeof(long
35a0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 2f   int);.        /
35b0: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  * Fall through i
35c0: 6e 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73  nto the next cas
35d0: 65 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65 20  e */.      case 
35e0: 65 74 52 41 44 49 58 3a 0a 20 20 20 20 20 20 20  etRADIX:.       
35f0: 20 69 66 28 20 69 6e 66 6f 70 2d 3e 66 6c 61 67   if( infop->flag
3600: 73 20 26 20 46 4c 41 47 5f 53 49 47 4e 45 44 20  s & FLAG_SIGNED 
3610: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36 34  ){.          i64
3620: 20 76 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   v;.          if
3630: 28 20 66 6c 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 20  ( flag_longlong 
3640: 29 20 20 20 76 20 3d 20 76 61 5f 61 72 67 28 61  )   v = va_arg(a
3650: 70 2c 69 36 34 29 3b 0a 20 20 20 20 20 20 20 20  p,i64);.        
3660: 20 20 65 6c 73 65 20 69 66 28 20 66 6c 61 67 5f    else if( flag_
3670: 6c 6f 6e 67 20 29 20 20 76 20 3d 20 76 61 5f 61  long )  v = va_a
3680: 72 67 28 61 70 2c 6c 6f 6e 67 20 69 6e 74 29 3b  rg(ap,long int);
3690: 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20  .          else 
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b0: 20 76 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69   v = va_arg(ap,i
36c0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
36d0: 66 28 20 76 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( v<0 ){.      
36e0: 20 20 20 20 20 20 6c 6f 6e 67 76 61 6c 75 65 20        longvalue 
36f0: 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 20 20  = -v;.          
3700: 20 20 70 72 65 66 69 78 20 3d 20 27 2d 27 3b 0a    prefix = '-';.
3710: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
3720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 6e  .            lon
3730: 67 76 61 6c 75 65 20 3d 20 76 3b 0a 20 20 20 20  gvalue = v;.    
3740: 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67          if( flag
3750: 5f 70 6c 75 73 73 69 67 6e 20 29 20 20 20 20 20  _plussign )     
3760: 20 20 20 70 72 65 66 69 78 20 3d 20 27 2b 27 3b     prefix = '+';
3770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73  .            els
3780: 65 20 69 66 28 20 66 6c 61 67 5f 62 6c 61 6e 6b  e if( flag_blank
3790: 73 69 67 6e 20 29 20 20 70 72 65 66 69 78 20 3d  sign )  prefix =
37a0: 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 20 20   ' ';.          
37b0: 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65               pre
37d0: 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  fix = 0;.       
37e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
37f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
3800: 28 20 66 6c 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 20  ( flag_longlong 
3810: 29 20 20 20 6c 6f 6e 67 76 61 6c 75 65 20 3d 20  )   longvalue = 
3820: 76 61 5f 61 72 67 28 61 70 2c 75 36 34 29 3b 0a  va_arg(ap,u64);.
3830: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
3840: 66 28 20 66 6c 61 67 5f 6c 6f 6e 67 20 29 20 20  f( flag_long )  
3850: 6c 6f 6e 67 76 61 6c 75 65 20 3d 20 76 61 5f 61  longvalue = va_a
3860: 72 67 28 61 70 2c 75 6e 73 69 67 6e 65 64 20 6c  rg(ap,unsigned l
3870: 6f 6e 67 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ong int);.      
3880: 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20      else        
3890: 20 20 20 20 20 20 20 20 20 20 6c 6f 6e 67 76 61            longva
38a0: 6c 75 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  lue = va_arg(ap,
38b0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20  unsigned int);. 
38c0: 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78 20           prefix 
38d0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
38e0: 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 76         if( longv
38f0: 61 6c 75 65 3d 3d 30 20 29 20 66 6c 61 67 5f 61  alue==0 ) flag_a
3900: 6c 74 65 72 6e 61 74 65 66 6f 72 6d 20 3d 20 30  lternateform = 0
3910: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c  ;.        if( fl
3920: 61 67 5f 7a 65 72 6f 70 61 64 20 26 26 20 70 72  ag_zeropad && pr
3930: 65 63 69 73 69 6f 6e 3c 77 69 64 74 68 2d 28 70  ecision<width-(p
3940: 72 65 66 69 78 21 3d 30 29 20 29 7b 0a 20 20 20  refix!=0) ){.   
3950: 20 20 20 20 20 20 20 70 72 65 63 69 73 69 6f 6e         precision
3960: 20 3d 20 77 69 64 74 68 2d 28 70 72 65 66 69 78   = width-(prefix
3970: 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  !=0);.        }.
3980: 20 20 20 20 20 20 20 20 62 75 66 70 74 20 3d 20          bufpt = 
3990: 26 62 75 66 5b 65 74 42 55 46 53 49 5a 45 2d 31  &buf[etBUFSIZE-1
39a0: 5d 3b 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  ];.        {.   
39b0: 20 20 20 20 20 20 20 72 65 67 69 73 74 65 72 20         register 
39c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 73 65 74  const char *cset
39d0: 3b 20 20 20 20 20 20 2f 2a 20 55 73 65 20 72 65  ;      /* Use re
39e0: 67 69 73 74 65 72 73 20 66 6f 72 20 73 70 65 65  gisters for spee
39f0: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  d */.          r
3a00: 65 67 69 73 74 65 72 20 69 6e 74 20 62 61 73 65  egister int base
3a10: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 73 65 74  ;.          cset
3a20: 20 3d 20 26 61 44 69 67 69 74 73 5b 69 6e 66 6f   = &aDigits[info
3a30: 70 2d 3e 63 68 61 72 73 65 74 5d 3b 0a 20 20 20  p->charset];.   
3a40: 20 20 20 20 20 20 20 62 61 73 65 20 3d 20 69 6e         base = in
3a50: 66 6f 70 2d 3e 62 61 73 65 3b 0a 20 20 20 20 20  fop->base;.     
3a60: 20 20 20 20 20 64 6f 7b 20 20 20 20 20 20 20 20       do{        
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a90: 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 6f     /* Convert to
3aa0: 20 61 73 63 69 69 20 2a 2f 0a 20 20 20 20 20 20   ascii */.      
3ab0: 20 20 20 20 20 20 2a 28 2d 2d 62 75 66 70 74 29        *(--bufpt)
3ac0: 20 3d 20 63 73 65 74 5b 6c 6f 6e 67 76 61 6c 75   = cset[longvalu
3ad0: 65 25 62 61 73 65 5d 3b 0a 20 20 20 20 20 20 20  e%base];.       
3ae0: 20 20 20 20 20 6c 6f 6e 67 76 61 6c 75 65 20 3d       longvalue =
3af0: 20 6c 6f 6e 67 76 61 6c 75 65 2f 62 61 73 65 3b   longvalue/base;
3b00: 0a 20 20 20 20 20 20 20 20 20 20 7d 77 68 69 6c  .          }whil
3b10: 65 28 20 6c 6f 6e 67 76 61 6c 75 65 3e 30 20 29  e( longvalue>0 )
3b20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3b30: 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 26 62 75      length = &bu
3b40: 66 5b 65 74 42 55 46 53 49 5a 45 2d 31 5d 2d 62  f[etBUFSIZE-1]-b
3b50: 75 66 70 74 3b 0a 20 20 20 20 20 20 20 20 66 6f  ufpt;.        fo
3b60: 72 28 69 64 78 3d 70 72 65 63 69 73 69 6f 6e 2d  r(idx=precision-
3b70: 6c 65 6e 67 74 68 3b 20 69 64 78 3e 30 3b 20 69  length; idx>0; i
3b80: 64 78 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20  dx--){.         
3b90: 20 2a 28 2d 2d 62 75 66 70 74 29 20 3d 20 27 30   *(--bufpt) = '0
3ba0: 27 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ';              
3bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3bc0: 2a 20 5a 65 72 6f 20 70 61 64 20 2a 2f 0a 20 20  * Zero pad */.  
3bd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3be0: 69 66 28 20 70 72 65 66 69 78 20 29 20 2a 28 2d  if( prefix ) *(-
3bf0: 2d 62 75 66 70 74 29 20 3d 20 70 72 65 66 69 78  -bufpt) = prefix
3c00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3c10: 2f 2a 20 41 64 64 20 73 69 67 6e 20 2a 2f 0a 20  /* Add sign */. 
3c20: 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 5f         if( flag_
3c30: 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d 20 26 26  alternateform &&
3c40: 20 69 6e 66 6f 70 2d 3e 70 72 65 66 69 78 20 29   infop->prefix )
3c50: 7b 20 20 20 20 20 20 2f 2a 20 41 64 64 20 22 30  {      /* Add "0
3c60: 22 20 6f 72 20 22 30 78 22 20 2a 2f 0a 20 20 20  " or "0x" */.   
3c70: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
3c80: 72 20 2a 70 72 65 3b 0a 20 20 20 20 20 20 20 20  r *pre;.        
3c90: 20 20 63 68 61 72 20 78 3b 0a 20 20 20 20 20 20    char x;.      
3ca0: 20 20 20 20 70 72 65 20 3d 20 26 61 50 72 65 66      pre = &aPref
3cb0: 69 78 5b 69 6e 66 6f 70 2d 3e 70 72 65 66 69 78  ix[infop->prefix
3cc0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
3cd0: 20 2a 62 75 66 70 74 21 3d 70 72 65 5b 30 5d 20   *bufpt!=pre[0] 
3ce0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
3cf0: 6f 72 28 3b 20 28 78 3d 28 2a 70 72 65 29 29 21  or(; (x=(*pre))!
3d00: 3d 30 3b 20 70 72 65 2b 2b 29 20 2a 28 2d 2d 62  =0; pre++) *(--b
3d10: 75 66 70 74 29 20 3d 20 78 3b 0a 20 20 20 20 20  ufpt) = x;.     
3d20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
3d30: 0a 20 20 20 20 20 20 20 20 6c 65 6e 67 74 68 20  .        length 
3d40: 3d 20 26 62 75 66 5b 65 74 42 55 46 53 49 5a 45  = &buf[etBUFSIZE
3d50: 2d 31 5d 2d 62 75 66 70 74 3b 0a 20 20 20 20 20  -1]-bufpt;.     
3d60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3d70: 63 61 73 65 20 65 74 46 4c 4f 41 54 3a 0a 20 20  case etFLOAT:.  
3d80: 20 20 20 20 63 61 73 65 20 65 74 45 58 50 3a 0a      case etEXP:.
3d90: 20 20 20 20 20 20 63 61 73 65 20 65 74 47 45 4e        case etGEN
3da0: 45 52 49 43 3a 0a 20 20 20 20 20 20 20 20 72 65  ERIC:.        re
3db0: 61 6c 76 61 6c 75 65 20 3d 20 76 61 5f 61 72 67  alvalue = va_arg
3dc0: 28 61 70 2c 64 6f 75 62 6c 65 29 3b 0a 23 69 66  (ap,double);.#if
3dd0: 6e 64 65 66 20 65 74 4e 4f 46 4c 4f 41 54 49 4e  ndef etNOFLOATIN
3de0: 47 50 4f 49 4e 54 0a 20 20 20 20 20 20 20 20 69  GPOINT.        i
3df0: 66 28 20 70 72 65 63 69 73 69 6f 6e 3c 30 20 29  f( precision<0 )
3e00: 20 70 72 65 63 69 73 69 6f 6e 20 3d 20 36 3b 20   precision = 6; 
3e10: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 64          /* Set d
3e20: 65 66 61 75 6c 74 20 70 72 65 63 69 73 69 6f 6e  efault precision
3e30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
3e40: 70 72 65 63 69 73 69 6f 6e 3e 65 74 42 55 46 53  precision>etBUFS
3e50: 49 5a 45 2d 31 30 20 29 20 70 72 65 63 69 73 69  IZE-10 ) precisi
3e60: 6f 6e 20 3d 20 65 74 42 55 46 53 49 5a 45 2d 31  on = etBUFSIZE-1
3e70: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  0;.        if( r
3e80: 65 61 6c 76 61 6c 75 65 3c 30 2e 30 20 29 7b 0a  ealvalue<0.0 ){.
3e90: 20 20 20 20 20 20 20 20 20 20 72 65 61 6c 76 61            realva
3ea0: 6c 75 65 20 3d 20 2d 72 65 61 6c 76 61 6c 75 65  lue = -realvalue
3eb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 66  ;.          pref
3ec0: 69 78 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20  ix = '-';.      
3ed0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3ee0: 20 20 20 69 66 28 20 66 6c 61 67 5f 70 6c 75 73     if( flag_plus
3ef0: 73 69 67 6e 20 29 20 20 20 20 20 20 20 20 20 20  sign )          
3f00: 70 72 65 66 69 78 20 3d 20 27 2b 27 3b 0a 20 20  prefix = '+';.  
3f10: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
3f20: 20 66 6c 61 67 5f 62 6c 61 6e 6b 73 69 67 6e 20   flag_blanksign 
3f30: 29 20 20 20 20 70 72 65 66 69 78 20 3d 20 27 20  )    prefix = ' 
3f40: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73  ';.          els
3f50: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
3f60: 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78            prefix
3f70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
3f80: 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
3f90: 70 2d 3e 74 79 70 65 3d 3d 65 74 47 45 4e 45 52  p->type==etGENER
3fa0: 49 43 20 26 26 20 70 72 65 63 69 73 69 6f 6e 3e  IC && precision>
3fb0: 30 20 29 20 70 72 65 63 69 73 69 6f 6e 2d 2d 3b  0 ) precision--;
3fc0: 0a 20 20 20 20 20 20 20 20 72 6f 75 6e 64 65 72  .        rounder
3fd0: 20 3d 20 30 2e 30 3b 0a 23 69 66 20 30 0a 20 20   = 0.0;.#if 0.  
3fe0: 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 69 6e        /* Roundin
3ff0: 67 20 77 6f 72 6b 73 20 6c 69 6b 65 20 42 53 44  g works like BSD
4000: 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 61   when the consta
4010: 6e 74 20 30 2e 34 39 39 39 20 69 73 20 75 73 65  nt 0.4999 is use
4020: 64 2e 20 20 57 69 65 72 64 21 20 2a 2f 0a 20 20  d.  Wierd! */.  
4030: 20 20 20 20 20 20 66 6f 72 28 69 64 78 3d 70 72        for(idx=pr
4040: 65 63 69 73 69 6f 6e 2c 20 72 6f 75 6e 64 65 72  ecision, rounder
4050: 3d 30 2e 34 39 39 39 3b 20 69 64 78 3e 30 3b 20  =0.4999; idx>0; 
4060: 69 64 78 2d 2d 2c 20 72 6f 75 6e 64 65 72 2a 3d  idx--, rounder*=
4070: 30 2e 31 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  0.1);.#else.    
4080: 20 20 20 20 2f 2a 20 49 74 20 6d 61 6b 65 73 20      /* It makes 
4090: 6d 6f 72 65 20 73 65 6e 73 65 20 74 6f 20 75 73  more sense to us
40a0: 65 20 30 2e 35 20 2a 2f 0a 20 20 20 20 20 20 20  e 0.5 */.       
40b0: 20 66 6f 72 28 69 64 78 3d 70 72 65 63 69 73 69   for(idx=precisi
40c0: 6f 6e 2c 20 72 6f 75 6e 64 65 72 3d 30 2e 35 3b  on, rounder=0.5;
40d0: 20 69 64 78 3e 30 3b 20 69 64 78 2d 2d 2c 20 72   idx>0; idx--, r
40e0: 6f 75 6e 64 65 72 2a 3d 30 2e 31 29 3b 0a 23 65  ounder*=0.1);.#e
40f0: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28  ndif.        if(
4100: 20 69 6e 66 6f 70 2d 3e 74 79 70 65 3d 3d 65 74   infop->type==et
4110: 46 4c 4f 41 54 20 29 20 72 65 61 6c 76 61 6c 75  FLOAT ) realvalu
4120: 65 20 2b 3d 20 72 6f 75 6e 64 65 72 3b 0a 20 20  e += rounder;.  
4130: 20 20 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 69        /* Normali
4140: 7a 65 20 72 65 61 6c 76 61 6c 75 65 20 74 6f 20  ze realvalue to 
4150: 77 69 74 68 69 6e 20 31 30 2e 30 20 3e 20 72 65  within 10.0 > re
4160: 61 6c 76 61 6c 75 65 20 3e 3d 20 31 2e 30 20 2a  alvalue >= 1.0 *
4170: 2f 0a 20 20 20 20 20 20 20 20 65 78 70 20 3d 20  /.        exp = 
4180: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  0;.        if( r
4190: 65 61 6c 76 61 6c 75 65 3e 30 2e 30 20 29 7b 0a  ealvalue>0.0 ){.
41a0: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
41b0: 20 72 65 61 6c 76 61 6c 75 65 3e 3d 31 65 33 32   realvalue>=1e32
41c0: 20 26 26 20 65 78 70 3c 3d 33 35 30 20 29 7b 20   && exp<=350 ){ 
41d0: 72 65 61 6c 76 61 6c 75 65 20 2a 3d 20 31 65 2d  realvalue *= 1e-
41e0: 33 32 3b 20 65 78 70 2b 3d 33 32 3b 20 7d 0a 20  32; exp+=32; }. 
41f0: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
4200: 72 65 61 6c 76 61 6c 75 65 3e 3d 31 65 38 20 26  realvalue>=1e8 &
4210: 26 20 65 78 70 3c 3d 33 35 30 20 29 7b 20 72 65  & exp<=350 ){ re
4220: 61 6c 76 61 6c 75 65 20 2a 3d 20 31 65 2d 38 3b  alvalue *= 1e-8;
4230: 20 65 78 70 2b 3d 38 3b 20 7d 0a 20 20 20 20 20   exp+=8; }.     
4240: 20 20 20 20 20 77 68 69 6c 65 28 20 72 65 61 6c       while( real
4250: 76 61 6c 75 65 3e 3d 31 30 2e 30 20 26 26 20 65  value>=10.0 && e
4260: 78 70 3c 3d 33 35 30 20 29 7b 20 72 65 61 6c 76  xp<=350 ){ realv
4270: 61 6c 75 65 20 2a 3d 20 30 2e 31 3b 20 65 78 70  alue *= 0.1; exp
4280: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  ++; }.          
4290: 77 68 69 6c 65 28 20 72 65 61 6c 76 61 6c 75 65  while( realvalue
42a0: 3c 31 65 2d 38 20 26 26 20 65 78 70 3e 3d 2d 33  <1e-8 && exp>=-3
42b0: 35 30 20 29 7b 20 72 65 61 6c 76 61 6c 75 65 20  50 ){ realvalue 
42c0: 2a 3d 20 31 65 38 3b 20 65 78 70 2d 3d 38 3b 20  *= 1e8; exp-=8; 
42d0: 7d 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  }.          whil
42e0: 65 28 20 72 65 61 6c 76 61 6c 75 65 3c 31 2e 30  e( realvalue<1.0
42f0: 20 26 26 20 65 78 70 3e 3d 2d 33 35 30 20 29 7b   && exp>=-350 ){
4300: 20 72 65 61 6c 76 61 6c 75 65 20 2a 3d 20 31 30   realvalue *= 10
4310: 2e 30 3b 20 65 78 70 2d 2d 3b 20 7d 0a 20 20 20  .0; exp--; }.   
4320: 20 20 20 20 20 20 20 69 66 28 20 65 78 70 3e 33         if( exp>3
4330: 35 30 20 7c 7c 20 65 78 70 3c 2d 33 35 30 20 29  50 || exp<-350 )
4340: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 75  {.            bu
4350: 66 70 74 20 3d 20 22 4e 61 4e 22 3b 0a 20 20 20  fpt = "NaN";.   
4360: 20 20 20 20 20 20 20 20 20 6c 65 6e 67 74 68 20           length 
4370: 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 3;.           
4380: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4390: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
43a0: 20 20 20 20 20 20 62 75 66 70 74 20 3d 20 62 75        bufpt = bu
43b0: 66 3b 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20 20  f;.        /*.  
43c0: 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
43d0: 66 69 65 6c 64 20 74 79 70 65 20 69 73 20 65 74  field type is et
43e0: 47 45 4e 45 52 49 43 2c 20 74 68 65 6e 20 63 6f  GENERIC, then co
43f0: 6e 76 65 72 74 20 74 6f 20 65 69 74 68 65 72 20  nvert to either 
4400: 65 74 45 58 50 0a 20 20 20 20 20 20 20 20 2a 2a  etEXP.        **
4410: 20 6f 72 20 65 74 46 4c 4f 41 54 2c 20 61 73 20   or etFLOAT, as 
4420: 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 20  appropriate..   
4430: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
4440: 66 6c 61 67 5f 65 78 70 20 3d 20 78 74 79 70 65  flag_exp = xtype
4450: 3d 3d 65 74 45 58 50 3b 0a 20 20 20 20 20 20 20  ==etEXP;.       
4460: 20 69 66 28 20 78 74 79 70 65 21 3d 65 74 46 4c   if( xtype!=etFL
4470: 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OAT ){.         
4480: 20 72 65 61 6c 76 61 6c 75 65 20 2b 3d 20 72 6f   realvalue += ro
4490: 75 6e 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20  under;.         
44a0: 20 69 66 28 20 72 65 61 6c 76 61 6c 75 65 3e 3d   if( realvalue>=
44b0: 31 30 2e 30 20 29 7b 20 72 65 61 6c 76 61 6c 75  10.0 ){ realvalu
44c0: 65 20 2a 3d 20 30 2e 31 3b 20 65 78 70 2b 2b 3b  e *= 0.1; exp++;
44d0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
44e0: 20 20 20 20 20 69 66 28 20 78 74 79 70 65 3d 3d       if( xtype==
44f0: 65 74 47 45 4e 45 52 49 43 20 29 7b 0a 20 20 20  etGENERIC ){.   
4500: 20 20 20 20 20 20 20 66 6c 61 67 5f 72 74 7a 20         flag_rtz 
4510: 3d 20 21 66 6c 61 67 5f 61 6c 74 65 72 6e 61 74  = !flag_alternat
4520: 65 66 6f 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  eform;.         
4530: 20 69 66 28 20 65 78 70 3c 2d 34 20 7c 7c 20 65   if( exp<-4 || e
4540: 78 70 3e 70 72 65 63 69 73 69 6f 6e 20 29 7b 0a  xp>precision ){.
4550: 20 20 20 20 20 20 20 20 20 20 20 20 78 74 79 70              xtyp
4560: 65 20 3d 20 65 74 45 58 50 3b 0a 20 20 20 20 20  e = etEXP;.     
4570: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4580: 20 20 20 20 20 20 20 20 70 72 65 63 69 73 69 6f          precisio
4590: 6e 20 3d 20 70 72 65 63 69 73 69 6f 6e 20 2d 20  n = precision - 
45a0: 65 78 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20  exp;.           
45b0: 20 78 74 79 70 65 20 3d 20 65 74 46 4c 4f 41 54   xtype = etFLOAT
45c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
45d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
45e0: 20 20 20 20 20 20 20 66 6c 61 67 5f 72 74 7a 20         flag_rtz 
45f0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
4600: 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20         /*.      
4610: 20 20 2a 2a 20 54 68 65 20 22 65 78 70 2b 70 72    ** The "exp+pr
4620: 65 63 69 73 69 6f 6e 22 20 74 65 73 74 20 63 61  ecision" test ca
4630: 75 73 65 73 20 6f 75 74 70 75 74 20 74 6f 20 62  uses output to b
4640: 65 20 6f 66 20 74 79 70 65 20 65 74 45 58 50 20  e of type etEXP 
4650: 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  if.        ** th
4660: 65 20 70 72 65 63 69 73 69 6f 6e 20 69 73 20 74  e precision is t
4670: 6f 6f 20 6c 61 72 67 65 20 74 6f 20 66 69 74 20  oo large to fit 
4680: 69 6e 20 62 75 66 5b 5d 2e 0a 20 20 20 20 20 20  in buf[]..      
4690: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 73 64    */.        nsd
46a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
46b0: 28 20 78 74 79 70 65 3d 3d 65 74 46 4c 4f 41 54  ( xtype==etFLOAT
46c0: 20 26 26 20 65 78 70 2b 70 72 65 63 69 73 69 6f   && exp+precisio
46d0: 6e 3c 65 74 42 55 46 53 49 5a 45 2d 33 30 20 29  n<etBUFSIZE-30 )
46e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  {.          flag
46f0: 5f 64 70 20 3d 20 28 70 72 65 63 69 73 69 6f 6e  _dp = (precision
4700: 3e 30 20 7c 7c 20 66 6c 61 67 5f 61 6c 74 65 72  >0 || flag_alter
4710: 6e 61 74 65 66 6f 72 6d 29 3b 0a 20 20 20 20 20  nateform);.     
4720: 20 20 20 20 20 69 66 28 20 70 72 65 66 69 78 20       if( prefix 
4730: 29 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20 70  ) *(bufpt++) = p
4740: 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 2f  refix;         /
4750: 2a 20 53 69 67 6e 20 2a 2f 0a 20 20 20 20 20 20  * Sign */.      
4760: 20 20 20 20 69 66 28 20 65 78 70 3c 30 20 29 20      if( exp<0 ) 
4770: 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20 27 30   *(bufpt++) = '0
4780: 27 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ';            /*
4790: 20 44 69 67 69 74 73 20 62 65 66 6f 72 65 20 22   Digits before "
47a0: 2e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ." */.          
47b0: 65 6c 73 65 20 66 6f 72 28 3b 20 65 78 70 3e 3d  else for(; exp>=
47c0: 30 3b 20 65 78 70 2d 2d 29 20 2a 28 62 75 66 70  0; exp--) *(bufp
47d0: 74 2b 2b 29 20 3d 20 65 74 5f 67 65 74 64 69 67  t++) = et_getdig
47e0: 69 74 28 26 72 65 61 6c 76 61 6c 75 65 2c 26 6e  it(&realvalue,&n
47f0: 73 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  sd);.          i
4800: 66 28 20 66 6c 61 67 5f 64 70 20 29 20 2a 28 62  f( flag_dp ) *(b
4810: 75 66 70 74 2b 2b 29 20 3d 20 27 2e 27 3b 20 20  ufpt++) = '.';  
4820: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4830: 64 65 63 69 6d 61 6c 20 70 6f 69 6e 74 20 2a 2f  decimal point */
4840: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 65  .          for(e
4850: 78 70 2b 2b 3b 20 65 78 70 3c 30 20 26 26 20 70  xp++; exp<0 && p
4860: 72 65 63 69 73 69 6f 6e 3e 30 3b 20 70 72 65 63  recision>0; prec
4870: 69 73 69 6f 6e 2d 2d 2c 20 65 78 70 2b 2b 29 7b  ision--, exp++){
4880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 62  .            *(b
4890: 75 66 70 74 2b 2b 29 20 3d 20 27 30 27 3b 0a 20  ufpt++) = '0';. 
48a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
48b0: 20 20 20 20 20 77 68 69 6c 65 28 20 28 70 72 65       while( (pre
48c0: 63 69 73 69 6f 6e 2d 2d 29 3e 30 20 29 20 2a 28  cision--)>0 ) *(
48d0: 62 75 66 70 74 2b 2b 29 20 3d 20 65 74 5f 67 65  bufpt++) = et_ge
48e0: 74 64 69 67 69 74 28 26 72 65 61 6c 76 61 6c 75  tdigit(&realvalu
48f0: 65 2c 26 6e 73 64 29 3b 0a 20 20 20 20 20 20 20  e,&nsd);.       
4900: 20 20 20 2a 28 62 75 66 70 74 2d 2d 29 20 3d 20     *(bufpt--) = 
4910: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
4920: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4930: 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 2a  Null terminate *
4940: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
4950: 66 6c 61 67 5f 72 74 7a 20 26 26 20 66 6c 61 67  flag_rtz && flag
4960: 5f 64 70 20 29 7b 20 20 20 20 20 2f 2a 20 52 65  _dp ){     /* Re
4970: 6d 6f 76 65 20 74 72 61 69 6c 69 6e 67 20 7a 65  move trailing ze
4980: 72 6f 73 20 61 6e 64 20 22 2e 22 20 2a 2f 0a 20  ros and "." */. 
4990: 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65             while
49a0: 28 20 62 75 66 70 74 3e 3d 62 75 66 20 26 26 20  ( bufpt>=buf && 
49b0: 2a 62 75 66 70 74 3d 3d 27 30 27 20 29 20 2a 28  *bufpt=='0' ) *(
49c0: 62 75 66 70 74 2d 2d 29 20 3d 20 30 3b 0a 20 20  bufpt--) = 0;.  
49d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 62 75            if( bu
49e0: 66 70 74 3e 3d 62 75 66 20 26 26 20 2a 62 75 66  fpt>=buf && *buf
49f0: 70 74 3d 3d 27 2e 27 20 29 20 2a 28 62 75 66 70  pt=='.' ) *(bufp
4a00: 74 2d 2d 29 20 3d 20 30 3b 0a 20 20 20 20 20 20  t--) = 0;.      
4a10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
4a20: 62 75 66 70 74 2b 2b 3b 20 20 20 20 20 20 20 20  bufpt++;        
4a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a40: 20 20 20 20 2f 2a 20 70 6f 69 6e 74 20 74 6f 20      /* point to 
4a50: 6e 65 78 74 20 66 72 65 65 20 73 6c 6f 74 20 2a  next free slot *
4a60: 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
4a70: 20 20 20 20 2f 2a 20 65 74 45 58 50 20 6f 72 20      /* etEXP or 
4a80: 65 74 47 45 4e 45 52 49 43 20 2a 2f 0a 20 20 20  etGENERIC */.   
4a90: 20 20 20 20 20 20 20 66 6c 61 67 5f 64 70 20 3d         flag_dp =
4aa0: 20 28 70 72 65 63 69 73 69 6f 6e 3e 30 20 7c 7c   (precision>0 ||
4ab0: 20 66 6c 61 67 5f 61 6c 74 65 72 6e 61 74 65 66   flag_alternatef
4ac0: 6f 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  orm);.          
4ad0: 69 66 28 20 70 72 65 66 69 78 20 29 20 2a 28 62  if( prefix ) *(b
4ae0: 75 66 70 74 2b 2b 29 20 3d 20 70 72 65 66 69 78  ufpt++) = prefix
4af0: 3b 20 20 20 2f 2a 20 53 69 67 6e 20 2a 2f 0a 20  ;   /* Sign */. 
4b00: 20 20 20 20 20 20 20 20 20 2a 28 62 75 66 70 74           *(bufpt
4b10: 2b 2b 29 20 3d 20 65 74 5f 67 65 74 64 69 67 69  ++) = et_getdigi
4b20: 74 28 26 72 65 61 6c 76 61 6c 75 65 2c 26 6e 73  t(&realvalue,&ns
4b30: 64 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 64 69  d);  /* First di
4b40: 67 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  git */.         
4b50: 20 69 66 28 20 66 6c 61 67 5f 64 70 20 29 20 2a   if( flag_dp ) *
4b60: 28 62 75 66 70 74 2b 2b 29 20 3d 20 27 2e 27 3b  (bufpt++) = '.';
4b70: 20 20 20 20 20 2f 2a 20 44 65 63 69 6d 61 6c 20       /* Decimal 
4b80: 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  point */.       
4b90: 20 20 20 77 68 69 6c 65 28 20 28 70 72 65 63 69     while( (preci
4ba0: 73 69 6f 6e 2d 2d 29 3e 30 20 29 20 2a 28 62 75  sion--)>0 ) *(bu
4bb0: 66 70 74 2b 2b 29 20 3d 20 65 74 5f 67 65 74 64  fpt++) = et_getd
4bc0: 69 67 69 74 28 26 72 65 61 6c 76 61 6c 75 65 2c  igit(&realvalue,
4bd0: 26 6e 73 64 29 3b 0a 20 20 20 20 20 20 20 20 20  &nsd);.         
4be0: 20 62 75 66 70 74 2d 2d 3b 20 20 20 20 20 20 20   bufpt--;       
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c00: 20 20 20 20 20 2f 2a 20 70 6f 69 6e 74 20 74 6f       /* point to
4c10: 20 6c 61 73 74 20 64 69 67 69 74 20 2a 2f 0a 20   last digit */. 
4c20: 20 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61           if( fla
4c30: 67 5f 72 74 7a 20 26 26 20 66 6c 61 67 5f 64 70  g_rtz && flag_dp
4c40: 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   ){          /* 
4c50: 52 65 6d 6f 76 65 20 74 61 69 6c 20 7a 65 72 6f  Remove tail zero
4c60: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
4c70: 20 77 68 69 6c 65 28 20 62 75 66 70 74 3e 3d 62   while( bufpt>=b
4c80: 75 66 20 26 26 20 2a 62 75 66 70 74 3d 3d 27 30  uf && *bufpt=='0
4c90: 27 20 29 20 2a 28 62 75 66 70 74 2d 2d 29 20 3d  ' ) *(bufpt--) =
4ca0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
4cb0: 69 66 28 20 62 75 66 70 74 3e 3d 62 75 66 20 26  if( bufpt>=buf &
4cc0: 26 20 2a 62 75 66 70 74 3d 3d 27 2e 27 20 29 20  & *bufpt=='.' ) 
4cd0: 2a 28 62 75 66 70 74 2d 2d 29 20 3d 20 30 3b 0a  *(bufpt--) = 0;.
4ce0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4cf0: 20 20 20 20 20 20 62 75 66 70 74 2b 2b 3b 20 20        bufpt++;  
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 6f 69            /* poi
4d20: 6e 74 20 74 6f 20 6e 65 78 74 20 66 72 65 65 20  nt to next free 
4d30: 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  slot */.        
4d40: 20 20 69 66 28 20 65 78 70 20 7c 7c 20 66 6c 61    if( exp || fla
4d50: 67 5f 65 78 70 20 29 7b 0a 20 20 20 20 20 20 20  g_exp ){.       
4d60: 20 20 20 20 20 2a 28 62 75 66 70 74 2b 2b 29 20       *(bufpt++) 
4d70: 3d 20 61 44 69 67 69 74 73 5b 69 6e 66 6f 70 2d  = aDigits[infop-
4d80: 3e 63 68 61 72 73 65 74 5d 3b 0a 20 20 20 20 20  >charset];.     
4d90: 20 20 20 20 20 20 20 69 66 28 20 65 78 70 3c 30         if( exp<0
4da0: 20 29 7b 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d   ){ *(bufpt++) =
4db0: 20 27 2d 27 3b 20 65 78 70 20 3d 20 2d 65 78 70   '-'; exp = -exp
4dc0: 3b 20 7d 20 2f 2a 20 73 69 67 6e 20 6f 66 20 65  ; } /* sign of e
4dd0: 78 70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  xp */.          
4de0: 20 20 65 6c 73 65 20 20 20 20 20 20 20 7b 20 2a    else       { *
4df0: 28 62 75 66 70 74 2b 2b 29 20 3d 20 27 2b 27 3b  (bufpt++) = '+';
4e00: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
4e10: 66 28 20 65 78 70 3e 3d 31 30 30 20 29 7b 0a 20  f( exp>=100 ){. 
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 62               *(b
4e30: 75 66 70 74 2b 2b 29 20 3d 20 28 65 78 70 2f 31  ufpt++) = (exp/1
4e40: 30 30 29 2b 27 30 27 3b 20 20 20 20 20 20 20 20  00)+'0';        
4e50: 20 20 20 20 20 20 20 20 2f 2a 20 31 30 30 27 73          /* 100's
4e60: 20 64 69 67 69 74 20 2a 2f 0a 20 20 20 20 20 20   digit */.      
4e70: 20 20 20 20 20 20 20 20 65 78 70 20 25 3d 20 31          exp %= 1
4e80: 30 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  00;.            
4e90: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 28  }.            *(
4ea0: 62 75 66 70 74 2b 2b 29 20 3d 20 65 78 70 2f 31  bufpt++) = exp/1
4eb0: 30 2b 27 30 27 3b 20 20 20 20 20 20 20 20 20 20  0+'0';          
4ec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 30             /* 10
4ed0: 27 73 20 64 69 67 69 74 20 2a 2f 0a 20 20 20 20  's digit */.    
4ee0: 20 20 20 20 20 20 20 20 2a 28 62 75 66 70 74 2b          *(bufpt+
4ef0: 2b 29 20 3d 20 65 78 70 25 31 30 2b 27 30 27 3b  +) = exp%10+'0';
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f10: 20 20 20 20 20 2f 2a 20 31 27 73 20 64 69 67 69       /* 1's digi
4f20: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7d  t */.          }
4f30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4f40: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 76 65 72     /* The conver
4f50: 74 65 64 20 6e 75 6d 62 65 72 20 69 73 20 69 6e  ted number is in
4f60: 20 62 75 66 5b 5d 20 61 6e 64 20 7a 65 72 6f 20   buf[] and zero 
4f70: 74 65 72 6d 69 6e 61 74 65 64 2e 20 4f 75 74 70  terminated. Outp
4f80: 75 74 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a  ut it..        *
4f90: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
4fa0: 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 74 68 65  number is in the
4fb0: 20 75 73 75 61 6c 20 6f 72 64 65 72 2c 20 6e 6f   usual order, no
4fc0: 74 20 72 65 76 65 72 73 65 64 20 61 73 20 77 69  t reversed as wi
4fd0: 74 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  th.        ** in
4fe0: 74 65 67 65 72 20 63 6f 6e 76 65 72 73 69 6f 6e  teger conversion
4ff0: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 65  s. */.        le
5000: 6e 67 74 68 20 3d 20 62 75 66 70 74 2d 62 75 66  ngth = bufpt-buf
5010: 3b 0a 20 20 20 20 20 20 20 20 62 75 66 70 74 20  ;.        bufpt 
5020: 3d 20 62 75 66 3b 0a 0a 20 20 20 20 20 20 20 20  = buf;..        
5030: 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
5040: 20 20 41 64 64 20 6c 65 61 64 69 6e 67 20 7a 65    Add leading ze
5050: 72 6f 73 20 69 66 20 74 68 65 20 66 6c 61 67 5f  ros if the flag_
5060: 7a 65 72 6f 70 61 64 20 66 6c 61 67 20 69 73 0a  zeropad flag is.
5070: 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 61          ** set a
5080: 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 6c 65  nd we are not le
5090: 66 74 20 6a 75 73 74 69 66 69 65 64 20 2a 2f 0a  ft justified */.
50a0: 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67          if( flag
50b0: 5f 7a 65 72 6f 70 61 64 20 26 26 20 21 66 6c 61  _zeropad && !fla
50c0: 67 5f 6c 65 66 74 6a 75 73 74 69 66 79 20 26 26  g_leftjustify &&
50d0: 20 6c 65 6e 67 74 68 20 3c 20 77 69 64 74 68 29   length < width)
50e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
50f0: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  i;.          int
5100: 20 6e 50 61 64 20 3d 20 77 69 64 74 68 20 2d 20   nPad = width - 
5110: 6c 65 6e 67 74 68 3b 0a 20 20 20 20 20 20 20 20  length;.        
5120: 20 20 66 6f 72 28 69 3d 77 69 64 74 68 3b 20 69    for(i=width; i
5130: 3e 3d 6e 50 61 64 3b 20 69 2d 2d 29 7b 0a 20 20  >=nPad; i--){.  
5140: 20 20 20 20 20 20 20 20 20 20 62 75 66 70 74 5b            bufpt[
5150: 69 5d 20 3d 20 62 75 66 70 74 5b 69 2d 6e 50 61  i] = bufpt[i-nPa
5160: 64 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  d];.          }.
5170: 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 70 72            i = pr
5180: 65 66 69 78 21 3d 30 3b 0a 20 20 20 20 20 20 20  efix!=0;.       
5190: 20 20 20 77 68 69 6c 65 28 20 6e 50 61 64 2d 2d     while( nPad--
51a0: 20 29 20 62 75 66 70 74 5b 69 2b 2b 5d 20 3d 20   ) bufpt[i++] = 
51b0: 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 6c  '0';.          l
51c0: 65 6e 67 74 68 20 3d 20 77 69 64 74 68 3b 0a 20  ength = width;. 
51d0: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
51e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
51f0: 20 20 20 20 20 63 61 73 65 20 65 74 53 49 5a 45       case etSIZE
5200: 3a 0a 20 20 20 20 20 20 20 20 2a 28 76 61 5f 61  :.        *(va_a
5210: 72 67 28 61 70 2c 69 6e 74 2a 29 29 20 3d 20 63  rg(ap,int*)) = c
5220: 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 6c 65  ount;.        le
5230: 6e 67 74 68 20 3d 20 77 69 64 74 68 20 3d 20 30  ngth = width = 0
5240: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
5250: 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 50 45  .      case etPE
5260: 52 43 45 4e 54 3a 0a 20 20 20 20 20 20 20 20 62  RCENT:.        b
5270: 75 66 5b 30 5d 20 3d 20 27 25 27 3b 0a 20 20 20  uf[0] = '%';.   
5280: 20 20 20 20 20 62 75 66 70 74 20 3d 20 62 75 66       bufpt = buf
5290: 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e 67 74 68  ;.        length
52a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72   = 1;.        br
52b0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
52c0: 65 74 43 48 41 52 4c 49 54 3a 0a 20 20 20 20 20  etCHARLIT:.     
52d0: 20 63 61 73 65 20 65 74 43 48 41 52 58 3a 0a 20   case etCHARX:. 
52e0: 20 20 20 20 20 20 20 63 20 3d 20 62 75 66 5b 30         c = buf[0
52f0: 5d 20 3d 20 28 78 74 79 70 65 3d 3d 65 74 43 48  ] = (xtype==etCH
5300: 41 52 58 20 3f 20 76 61 5f 61 72 67 28 61 70 2c  ARX ? va_arg(ap,
5310: 69 6e 74 29 20 3a 20 2a 2b 2b 66 6d 74 29 3b 0a  int) : *++fmt);.
5320: 20 20 20 20 20 20 20 20 69 66 28 20 70 72 65 63          if( prec
5330: 69 73 69 6f 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  ision>=0 ){.    
5340: 20 20 20 20 20 20 66 6f 72 28 69 64 78 3d 31 3b        for(idx=1;
5350: 20 69 64 78 3c 70 72 65 63 69 73 69 6f 6e 3b 20   idx<precision; 
5360: 69 64 78 2b 2b 29 20 62 75 66 5b 69 64 78 5d 20  idx++) buf[idx] 
5370: 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 6c  = c;.          l
5380: 65 6e 67 74 68 20 3d 20 70 72 65 63 69 73 69 6f  ength = precisio
5390: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  n;.        }else
53a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e 67  {.          leng
53b0: 74 68 20 3d 31 3b 0a 20 20 20 20 20 20 20 20 7d  th =1;.        }
53c0: 0a 20 20 20 20 20 20 20 20 62 75 66 70 74 20 3d  .        bufpt =
53d0: 20 62 75 66 3b 0a 20 20 20 20 20 20 20 20 62 72   buf;.        br
53e0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
53f0: 65 74 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20  etSTRING:.      
5400: 63 61 73 65 20 65 74 44 59 4e 53 54 52 49 4e 47  case etDYNSTRING
5410: 3a 0a 20 20 20 20 20 20 20 20 62 75 66 70 74 20  :.        bufpt 
5420: 3d 20 76 61 5f 61 72 67 28 61 70 2c 63 68 61 72  = va_arg(ap,char
5430: 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  *);.        if( 
5440: 62 75 66 70 74 3d 3d 30 20 29 7b 0a 20 20 20 20  bufpt==0 ){.    
5450: 20 20 20 20 20 20 62 75 66 70 74 20 3d 20 22 22        bufpt = ""
5460: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
5470: 69 66 28 20 78 74 79 70 65 3d 3d 65 74 44 59 4e  if( xtype==etDYN
5480: 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 20 20  STRING ){.      
5490: 20 20 20 20 7a 45 78 74 72 61 20 3d 20 62 75 66      zExtra = buf
54a0: 70 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pt;.        }.  
54b0: 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 73        length = s
54c0: 74 72 6c 65 6e 28 62 75 66 70 74 29 3b 0a 20 20  trlen(bufpt);.  
54d0: 20 20 20 20 20 20 69 66 28 20 70 72 65 63 69 73        if( precis
54e0: 69 6f 6e 3e 3d 30 20 26 26 20 70 72 65 63 69 73  ion>=0 && precis
54f0: 69 6f 6e 3c 6c 65 6e 67 74 68 20 29 20 6c 65 6e  ion<length ) len
5500: 67 74 68 20 3d 20 70 72 65 63 69 73 69 6f 6e 3b  gth = precision;
5510: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5520: 20 20 20 20 20 20 63 61 73 65 20 65 74 53 51 4c        case etSQL
5530: 45 53 43 41 50 45 3a 0a 20 20 20 20 20 20 63 61  ESCAPE:.      ca
5540: 73 65 20 65 74 53 51 4c 45 53 43 41 50 45 32 3a  se etSQLESCAPE2:
5550: 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
5560: 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e       int i, j, n
5570: 2c 20 63 2c 20 69 73 6e 75 6c 6c 3b 0a 20 20 20  , c, isnull;.   
5580: 20 20 20 20 20 20 20 69 6e 74 20 6e 65 65 64 51         int needQ
5590: 75 6f 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20  uote;.          
55a0: 63 68 61 72 20 2a 61 72 67 20 3d 20 76 61 5f 61  char *arg = va_a
55b0: 72 67 28 61 70 2c 63 68 61 72 2a 29 3b 0a 20 20  rg(ap,char*);.  
55c0: 20 20 20 20 20 20 20 20 69 73 6e 75 6c 6c 20 3d          isnull =
55d0: 20 61 72 67 3d 3d 30 3b 0a 20 20 20 20 20 20 20   arg==0;.       
55e0: 20 20 20 69 66 28 20 69 73 6e 75 6c 6c 20 29 20     if( isnull ) 
55f0: 61 72 67 20 3d 20 28 78 74 79 70 65 3d 3d 65 74  arg = (xtype==et
5600: 53 51 4c 45 53 43 41 50 45 32 20 3f 20 22 4e 55  SQLESCAPE2 ? "NU
5610: 4c 4c 22 20 3a 20 22 28 4e 55 4c 4c 29 22 29 3b  LL" : "(NULL)");
5620: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
5630: 3d 6e 3d 30 3b 20 28 63 3d 61 72 67 5b 69 5d 29  =n=0; (c=arg[i])
5640: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  !=0; i++){.     
5650: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c         if( c=='\
5660: 27 27 20 29 20 20 6e 2b 2b 3b 0a 20 20 20 20 20  '' )  n++;.     
5670: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5680: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 21 69 73   needQuote = !is
5690: 6e 75 6c 6c 20 26 26 20 78 74 79 70 65 3d 3d 65  null && xtype==e
56a0: 74 53 51 4c 45 53 43 41 50 45 32 3b 0a 20 20 20  tSQLESCAPE2;.   
56b0: 20 20 20 20 20 20 20 6e 20 2b 3d 20 69 20 2b 20         n += i + 
56c0: 31 20 2b 20 6e 65 65 64 51 75 6f 74 65 2a 32 3b  1 + needQuote*2;
56d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
56e0: 3e 65 74 42 55 46 53 49 5a 45 20 29 7b 0a 20 20  >etBUFSIZE ){.  
56f0: 20 20 20 20 20 20 20 20 20 20 62 75 66 70 74 20            bufpt 
5700: 3d 20 7a 45 78 74 72 61 20 3d 20 73 71 6c 69 74  = zExtra = sqlit
5710: 65 4d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20  eMalloc( n );.  
5720: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 62 75            if( bu
5730: 66 70 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  fpt==0 ) return 
5740: 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  -1;.          }e
5750: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
5760: 20 62 75 66 70 74 20 3d 20 62 75 66 3b 0a 20 20   bufpt = buf;.  
5770: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5780: 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20      j = 0;.     
5790: 20 20 20 20 20 69 66 28 20 6e 65 65 64 51 75 6f       if( needQuo
57a0: 74 65 20 29 20 62 75 66 70 74 5b 6a 2b 2b 5d 20  te ) bufpt[j++] 
57b0: 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20  = '\'';.        
57c0: 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 3d 61 72    for(i=0; (c=ar
57d0: 67 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  g[i])!=0; i++){.
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66 70              bufp
57f0: 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  t[j++] = c;.    
5800: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
5810: 5c 27 27 20 29 20 62 75 66 70 74 5b 6a 2b 2b 5d  \'' ) bufpt[j++]
5820: 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20   = c;.          
5830: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
5840: 6e 65 65 64 51 75 6f 74 65 20 29 20 62 75 66 70  needQuote ) bufp
5850: 74 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20  t[j++] = '\'';. 
5860: 20 20 20 20 20 20 20 20 20 62 75 66 70 74 5b 6a           bufpt[j
5870: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
5880: 20 6c 65 6e 67 74 68 20 3d 20 6a 3b 0a 20 20 20   length = j;.   
5890: 20 20 20 20 20 20 20 69 66 28 20 70 72 65 63 69         if( preci
58a0: 73 69 6f 6e 3e 3d 30 20 26 26 20 70 72 65 63 69  sion>=0 && preci
58b0: 73 69 6f 6e 3c 6c 65 6e 67 74 68 20 29 20 6c 65  sion<length ) le
58c0: 6e 67 74 68 20 3d 20 70 72 65 63 69 73 69 6f 6e  ngth = precision
58d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
58e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
58f0: 20 63 61 73 65 20 65 74 54 4f 4b 45 4e 3a 20 7b   case etTOKEN: {
5900: 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a  .        Token *
5910: 70 54 6f 6b 65 6e 20 3d 20 76 61 5f 61 72 67 28  pToken = va_arg(
5920: 61 70 2c 20 54 6f 6b 65 6e 2a 29 3b 0a 20 20 20  ap, Token*);.   
5930: 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20       if( pToken 
5940: 26 26 20 70 54 6f 6b 65 6e 2d 3e 7a 20 29 7b 0a  && pToken->z ){.
5950: 20 20 20 20 20 20 20 20 20 20 28 2a 66 75 6e 63            (*func
5960: 29 28 61 72 67 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  )(arg, pToken->z
5970: 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20  , pToken->n);.  
5980: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5990: 6c 65 6e 67 74 68 20 3d 20 77 69 64 74 68 20 3d  length = width =
59a0: 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   0;.        brea
59b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
59c0: 20 63 61 73 65 20 65 74 53 52 43 4c 49 53 54 3a   case etSRCLIST:
59d0: 20 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69   {.        SrcLi
59e0: 73 74 20 2a 70 53 72 63 20 3d 20 76 61 5f 61 72  st *pSrc = va_ar
59f0: 67 28 61 70 2c 20 53 72 63 4c 69 73 74 2a 29 3b  g(ap, SrcList*);
5a00: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 20 3d  .        int k =
5a10: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
5a20: 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
5a30: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
5a40: 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Item = &pSrc->a[
5a50: 6b 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  k];.        asse
5a60: 72 74 28 20 6b 3e 3d 30 20 26 26 20 6b 3c 70 53  rt( k>=0 && k<pS
5a70: 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20  rc->nSrc );.    
5a80: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
5a90: 44 61 74 61 62 61 73 65 20 26 26 20 70 49 74 65  Database && pIte
5aa0: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 5b 30 5d 20  m->zDatabase[0] 
5ab0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 28 2a 66  ){.          (*f
5ac0: 75 6e 63 29 28 61 72 67 2c 20 70 49 74 65 6d 2d  unc)(arg, pItem-
5ad0: 3e 7a 44 61 74 61 62 61 73 65 2c 20 73 74 72 6c  >zDatabase, strl
5ae0: 65 6e 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  en(pItem->zDatab
5af0: 61 73 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ase));.         
5b00: 20 28 2a 66 75 6e 63 29 28 61 72 67 2c 20 22 2e   (*func)(arg, ".
5b10: 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  ", 1);.        }
5b20: 0a 20 20 20 20 20 20 20 20 28 2a 66 75 6e 63 29  .        (*func)
5b30: 28 61 72 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  (arg, pItem->zNa
5b40: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 74 65 6d  me, strlen(pItem
5b50: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
5b60: 20 20 20 6c 65 6e 67 74 68 20 3d 20 77 69 64 74     length = widt
5b70: 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62  h = 0;.        b
5b80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
5b90: 20 20 20 20 63 61 73 65 20 65 74 45 52 52 4f 52      case etERROR
5ba0: 3a 0a 20 20 20 20 20 20 20 20 62 75 66 5b 30 5d  :.        buf[0]
5bb0: 20 3d 20 27 25 27 3b 0a 20 20 20 20 20 20 20 20   = '%';.        
5bc0: 62 75 66 5b 31 5d 20 3d 20 63 3b 0a 20 20 20 20  buf[1] = c;.    
5bd0: 20 20 20 20 65 72 72 6f 72 66 6c 61 67 20 3d 20      errorflag = 
5be0: 30 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d  0;.        idx =
5bf0: 20 31 2b 28 63 21 3d 30 29 3b 0a 20 20 20 20 20   1+(c!=0);.     
5c00: 20 20 20 28 2a 66 75 6e 63 29 28 61 72 67 2c 22     (*func)(arg,"
5c10: 25 22 2c 69 64 78 29 3b 0a 20 20 20 20 20 20 20  %",idx);.       
5c20: 20 63 6f 75 6e 74 20 2b 3d 20 69 64 78 3b 0a 20   count += idx;. 
5c30: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20         if( c==0 
5c40: 29 20 66 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 20  ) fmt--;.       
5c50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 2f 2a 20   break;.    }/* 
5c60: 45 6e 64 20 73 77 69 74 63 68 20 6f 76 65 72 20  End switch over 
5c70: 74 68 65 20 66 6f 72 6d 61 74 20 74 79 70 65 20  the format type 
5c80: 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  */.    /*.    **
5c90: 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   The text of the
5ca0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 70   conversion is p
5cb0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 22 62 75  ointed to by "bu
5cc0: 66 70 74 22 20 61 6e 64 20 69 73 0a 20 20 20 20  fpt" and is.    
5cd0: 2a 2a 20 22 6c 65 6e 67 74 68 22 20 63 68 61 72  ** "length" char
5ce0: 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20 20 54 68  acters long.  Th
5cf0: 65 20 66 69 65 6c 64 20 77 69 64 74 68 20 69 73  e field width is
5d00: 20 22 77 69 64 74 68 22 2e 20 20 44 6f 0a 20 20   "width".  Do.  
5d10: 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2e    ** the output.
5d20: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
5d30: 21 66 6c 61 67 5f 6c 65 66 74 6a 75 73 74 69 66  !flag_leftjustif
5d40: 79 20 29 7b 0a 20 20 20 20 20 20 72 65 67 69 73  y ){.      regis
5d50: 74 65 72 20 69 6e 74 20 6e 73 70 61 63 65 3b 0a  ter int nspace;.
5d60: 20 20 20 20 20 20 6e 73 70 61 63 65 20 3d 20 77        nspace = w
5d70: 69 64 74 68 2d 6c 65 6e 67 74 68 3b 0a 20 20 20  idth-length;.   
5d80: 20 20 20 69 66 28 20 6e 73 70 61 63 65 3e 30 20     if( nspace>0 
5d90: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 75 6e 74  ){.        count
5da0: 20 2b 3d 20 6e 73 70 61 63 65 3b 0a 20 20 20 20   += nspace;.    
5db0: 20 20 20 20 77 68 69 6c 65 28 20 6e 73 70 61 63      while( nspac
5dc0: 65 3e 3d 65 74 53 50 41 43 45 53 49 5a 45 20 29  e>=etSPACESIZE )
5dd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 28 2a 66 75  {.          (*fu
5de0: 6e 63 29 28 61 72 67 2c 73 70 61 63 65 73 2c 65  nc)(arg,spaces,e
5df0: 74 53 50 41 43 45 53 49 5a 45 29 3b 0a 20 20 20  tSPACESIZE);.   
5e00: 20 20 20 20 20 20 20 6e 73 70 61 63 65 20 2d 3d         nspace -=
5e10: 20 65 74 53 50 41 43 45 53 49 5a 45 3b 0a 20 20   etSPACESIZE;.  
5e20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5e30: 69 66 28 20 6e 73 70 61 63 65 3e 30 20 29 20 28  if( nspace>0 ) (
5e40: 2a 66 75 6e 63 29 28 61 72 67 2c 73 70 61 63 65  *func)(arg,space
5e50: 73 2c 6e 73 70 61 63 65 29 3b 0a 20 20 20 20 20  s,nspace);.     
5e60: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
5e70: 20 6c 65 6e 67 74 68 3e 30 20 29 7b 0a 20 20 20   length>0 ){.   
5e80: 20 20 20 28 2a 66 75 6e 63 29 28 61 72 67 2c 62     (*func)(arg,b
5e90: 75 66 70 74 2c 6c 65 6e 67 74 68 29 3b 0a 20 20  ufpt,length);.  
5ea0: 20 20 20 20 63 6f 75 6e 74 20 2b 3d 20 6c 65 6e      count += len
5eb0: 67 74 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gth;.    }.    i
5ec0: 66 28 20 66 6c 61 67 5f 6c 65 66 74 6a 75 73 74  f( flag_leftjust
5ed0: 69 66 79 20 29 7b 0a 20 20 20 20 20 20 72 65 67  ify ){.      reg
5ee0: 69 73 74 65 72 20 69 6e 74 20 6e 73 70 61 63 65  ister int nspace
5ef0: 3b 0a 20 20 20 20 20 20 6e 73 70 61 63 65 20 3d  ;.      nspace =
5f00: 20 77 69 64 74 68 2d 6c 65 6e 67 74 68 3b 0a 20   width-length;. 
5f10: 20 20 20 20 20 69 66 28 20 6e 73 70 61 63 65 3e       if( nspace>
5f20: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 75  0 ){.        cou
5f30: 6e 74 20 2b 3d 20 6e 73 70 61 63 65 3b 0a 20 20  nt += nspace;.  
5f40: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 73 70        while( nsp
5f50: 61 63 65 3e 3d 65 74 53 50 41 43 45 53 49 5a 45  ace>=etSPACESIZE
5f60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 28 2a   ){.          (*
5f70: 66 75 6e 63 29 28 61 72 67 2c 73 70 61 63 65 73  func)(arg,spaces
5f80: 2c 65 74 53 50 41 43 45 53 49 5a 45 29 3b 0a 20  ,etSPACESIZE);. 
5f90: 20 20 20 20 20 20 20 20 20 6e 73 70 61 63 65 20           nspace 
5fa0: 2d 3d 20 65 74 53 50 41 43 45 53 49 5a 45 3b 0a  -= etSPACESIZE;.
5fb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5fc0: 20 20 69 66 28 20 6e 73 70 61 63 65 3e 30 20 29    if( nspace>0 )
5fd0: 20 28 2a 66 75 6e 63 29 28 61 72 67 2c 73 70 61   (*func)(arg,spa
5fe0: 63 65 73 2c 6e 73 70 61 63 65 29 3b 0a 20 20 20  ces,nspace);.   
5ff0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
6000: 66 28 20 7a 45 78 74 72 61 20 29 7b 0a 20 20 20  f( zExtra ){.   
6010: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 45     sqliteFree(zE
6020: 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  xtra);.    }.  }
6030: 2f 2a 20 45 6e 64 20 66 6f 72 20 6c 6f 6f 70 20  /* End for loop 
6040: 6f 76 65 72 20 74 68 65 20 66 6f 72 6d 61 74 20  over the format 
6050: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 72 65 74 75  string */.  retu
6060: 72 6e 20 65 72 72 6f 72 66 6c 61 67 20 3f 20 2d  rn errorflag ? -
6070: 31 20 3a 20 63 6f 75 6e 74 3b 0a 7d 20 2f 2a 20  1 : count;.} /* 
6080: 45 6e 64 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  End of function 
6090: 2a 2f 0a 0a 0a 2f 2a 20 54 68 69 73 20 73 74 72  */.../* This str
60a0: 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 74  ucture is used t
60b0: 6f 20 73 74 6f 72 65 20 73 74 61 74 65 20 69 6e  o store state in
60c0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
60d0: 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 74 6f 20  the.** write to 
60e0: 6d 65 6d 6f 72 79 20 74 68 61 74 20 69 73 20 63  memory that is c
60f0: 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
6100: 72 65 73 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ress..*/.struct 
6110: 73 67 4d 70 72 69 6e 74 66 20 7b 0a 20 20 63 68  sgMprintf {.  ch
6120: 61 72 20 2a 7a 42 61 73 65 3b 20 20 20 20 20 2f  ar *zBase;     /
6130: 2a 20 41 20 62 61 73 65 20 61 6c 6c 6f 63 61 74  * A base allocat
6140: 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ion */.  char *z
6150: 54 65 78 74 3b 20 20 20 20 20 2f 2a 20 54 68 65  Text;     /* The
6160: 20 73 74 72 69 6e 67 20 63 6f 6c 6c 65 63 74 65   string collecte
6170: 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 69 6e  d so far */.  in
6180: 74 20 20 6e 43 68 61 72 3b 20 20 20 20 20 20 2f  t  nChar;      /
6190: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
61a0: 73 74 72 69 6e 67 20 73 6f 20 66 61 72 20 2a 2f  string so far */
61b0: 0a 20 20 69 6e 74 20 20 6e 54 6f 74 61 6c 3b 20  .  int  nTotal; 
61c0: 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 73 69      /* Output si
61d0: 7a 65 20 69 66 20 75 6e 63 6f 6e 73 74 72 61 69  ze if unconstrai
61e0: 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 20 6e 41  ned */.  int  nA
61f0: 6c 6c 6f 63 3b 20 20 20 20 20 2f 2a 20 41 6d 6f  lloc;     /* Amo
6200: 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  unt of space all
6210: 6f 63 61 74 65 64 20 69 6e 20 7a 54 65 78 74 20  ocated in zText 
6220: 2a 2f 0a 20 20 76 6f 69 64 20 2a 28 2a 78 52 65  */.  void *(*xRe
6230: 61 6c 6c 6f 63 29 28 76 6f 69 64 2a 2c 69 6e 74  alloc)(void*,int
6240: 29 3b 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  );  /* Function 
6250: 75 73 65 64 20 74 6f 20 72 65 61 6c 6c 6f 63 20  used to realloc 
6260: 6d 65 6d 6f 72 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  memory */.};../*
6270: 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69   .** This functi
6280: 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  on implements th
6290: 65 20 63 61 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  e callback from 
62a0: 76 78 70 72 69 6e 74 66 2e 20 0a 2a 2a 0a 2a 2a  vxprintf. .**.**
62b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64   This routine ad
62c0: 64 20 6e 4e 65 77 43 68 61 72 20 63 68 61 72 61  d nNewChar chara
62d0: 63 74 65 72 73 20 6f 66 20 74 65 78 74 20 69 6e  cters of text in
62e0: 20 7a 4e 65 77 54 65 78 74 20 74 6f 0a 2a 2a 20   zNewText to.** 
62f0: 74 68 65 20 73 67 4d 70 72 69 6e 74 66 20 73 74  the sgMprintf st
6300: 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
6310: 74 6f 20 62 79 20 22 61 72 67 22 2e 0a 2a 2f 0a  to by "arg"..*/.
6320: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 75 74  static void mout
6330: 28 76 6f 69 64 20 2a 61 72 67 2c 20 63 6f 6e 73  (void *arg, cons
6340: 74 20 63 68 61 72 20 2a 7a 4e 65 77 54 65 78 74  t char *zNewText
6350: 2c 20 69 6e 74 20 6e 4e 65 77 43 68 61 72 29 7b  , int nNewChar){
6360: 0a 20 20 73 74 72 75 63 74 20 73 67 4d 70 72 69  .  struct sgMpri
6370: 6e 74 66 20 2a 70 4d 20 3d 20 28 73 74 72 75 63  ntf *pM = (struc
6380: 74 20 73 67 4d 70 72 69 6e 74 66 2a 29 61 72 67  t sgMprintf*)arg
6390: 3b 0a 20 20 70 4d 2d 3e 6e 54 6f 74 61 6c 20 2b  ;.  pM->nTotal +
63a0: 3d 20 6e 4e 65 77 43 68 61 72 3b 0a 20 20 69 66  = nNewChar;.  if
63b0: 28 20 70 4d 2d 3e 6e 43 68 61 72 20 2b 20 6e 4e  ( pM->nChar + nN
63c0: 65 77 43 68 61 72 20 2b 20 31 20 3e 20 70 4d 2d  ewChar + 1 > pM-
63d0: 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69  >nAlloc ){.    i
63e0: 66 28 20 70 4d 2d 3e 78 52 65 61 6c 6c 6f 63 3d  f( pM->xRealloc=
63f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4e 65 77  =0 ){.      nNew
6400: 43 68 61 72 20 3d 20 20 70 4d 2d 3e 6e 41 6c 6c  Char =  pM->nAll
6410: 6f 63 20 2d 20 70 4d 2d 3e 6e 43 68 61 72 20 2d  oc - pM->nChar -
6420: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
6430: 20 20 20 20 20 70 4d 2d 3e 6e 41 6c 6c 6f 63 20       pM->nAlloc 
6440: 3d 20 70 4d 2d 3e 6e 43 68 61 72 20 2b 20 6e 4e  = pM->nChar + nN
6450: 65 77 43 68 61 72 2a 32 20 2b 20 31 3b 0a 20 20  ewChar*2 + 1;.  
6460: 20 20 20 20 69 66 28 20 70 4d 2d 3e 7a 54 65 78      if( pM->zTex
6470: 74 3d 3d 70 4d 2d 3e 7a 42 61 73 65 20 29 7b 0a  t==pM->zBase ){.
6480: 20 20 20 20 20 20 20 20 70 4d 2d 3e 7a 54 65 78          pM->zTex
6490: 74 20 3d 20 70 4d 2d 3e 78 52 65 61 6c 6c 6f 63  t = pM->xRealloc
64a0: 28 30 2c 20 70 4d 2d 3e 6e 41 6c 6c 6f 63 29 3b  (0, pM->nAlloc);
64b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 2d  .        if( pM-
64c0: 3e 7a 54 65 78 74 20 26 26 20 70 4d 2d 3e 6e 43  >zText && pM->nC
64d0: 68 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  har ){.         
64e0: 20 6d 65 6d 63 70 79 28 70 4d 2d 3e 7a 54 65 78   memcpy(pM->zTex
64f0: 74 2c 20 70 4d 2d 3e 7a 42 61 73 65 2c 20 70 4d  t, pM->zBase, pM
6500: 2d 3e 6e 43 68 61 72 29 3b 0a 20 20 20 20 20 20  ->nChar);.      
6510: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
6520: 0a 20 20 20 20 20 20 20 20 70 4d 2d 3e 7a 54 65  .        pM->zTe
6530: 78 74 20 3d 20 70 4d 2d 3e 78 52 65 61 6c 6c 6f  xt = pM->xReallo
6540: 63 28 70 4d 2d 3e 7a 54 65 78 74 2c 20 70 4d 2d  c(pM->zText, pM-
6550: 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  >nAlloc);.      
6560: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
6570: 28 20 70 4d 2d 3e 7a 54 65 78 74 20 29 7b 0a 20  ( pM->zText ){. 
6580: 20 20 20 69 66 28 20 6e 4e 65 77 43 68 61 72 3e     if( nNewChar>
6590: 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  0 ){.      memcp
65a0: 79 28 26 70 4d 2d 3e 7a 54 65 78 74 5b 70 4d 2d  y(&pM->zText[pM-
65b0: 3e 6e 43 68 61 72 5d 2c 20 7a 4e 65 77 54 65 78  >nChar], zNewTex
65c0: 74 2c 20 6e 4e 65 77 43 68 61 72 29 3b 0a 20 20  t, nNewChar);.  
65d0: 20 20 20 20 70 4d 2d 3e 6e 43 68 61 72 20 2b 3d      pM->nChar +=
65e0: 20 6e 4e 65 77 43 68 61 72 3b 0a 20 20 20 20 7d   nNewChar;.    }
65f0: 0a 20 20 20 20 70 4d 2d 3e 7a 54 65 78 74 5b 70  .    pM->zText[p
6600: 4d 2d 3e 6e 43 68 61 72 5d 20 3d 20 30 3b 0a 20  M->nChar] = 0;. 
6610: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
6620: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72   routine is a wr
6630: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 78 70 72  apper around xpr
6640: 69 6e 74 66 28 29 20 74 68 61 74 20 69 6e 76 6f  intf() that invo
6650: 6b 65 73 20 6d 6f 75 74 28 29 20 61 73 0a 2a 2a  kes mout() as.**
6660: 20 74 68 65 20 63 6f 6e 73 75 6d 65 72 2e 20 20   the consumer.  
6670: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
6680: 2a 62 61 73 65 5f 76 70 72 69 6e 74 66 28 0a 20  *base_vprintf(. 
6690: 20 76 6f 69 64 20 2a 28 2a 78 52 65 61 6c 6c 6f   void *(*xReallo
66a0: 63 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 20 20  c)(void*,int),  
66b0: 20 2f 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 72   /* Routine to r
66c0: 65 61 6c 6c 6f 63 20 6d 65 6d 6f 72 79 2e 20 4d  ealloc memory. M
66d0: 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
66e0: 69 6e 74 20 75 73 65 49 6e 74 65 72 6e 61 6c 2c  int useInternal,
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6700: 2f 2a 20 55 73 65 20 69 6e 74 65 72 6e 61 6c 20  /* Use internal 
6710: 25 2d 63 6f 6e 76 65 72 73 69 6f 6e 73 20 69 66  %-conversions if
6720: 20 74 72 75 65 20 2a 2f 0a 20 20 63 68 61 72 20   true */.  char 
6730: 2a 7a 49 6e 69 74 42 75 66 2c 20 20 20 20 20 20  *zInitBuf,      
6740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
6750: 69 74 69 61 6c 6c 79 20 77 72 69 74 65 20 68 65  itially write he
6760: 72 65 2c 20 62 65 66 6f 72 65 20 6d 61 6c 6c 6f  re, before mallo
6770: 63 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 49  cing */.  int nI
6780: 6e 69 74 42 75 66 2c 20 20 20 20 20 20 20 20 20  nitBuf,         
6790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
67a0: 65 20 6f 66 20 7a 49 6e 69 74 42 75 66 5b 5d 20  e of zInitBuf[] 
67b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
67c0: 2a 7a 46 6f 72 6d 61 74 2c 20 20 20 20 20 20 20  *zFormat,       
67d0: 20 20 20 20 20 2f 2a 20 66 6f 72 6d 61 74 20 73       /* format s
67e0: 74 72 69 6e 67 20 2a 2f 0a 20 20 76 61 5f 6c 69  tring */.  va_li
67f0: 73 74 20 61 70 20 20 20 20 20 20 20 20 20 20 20  st ap           
6800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 72             /* ar
6810: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
6820: 73 74 72 75 63 74 20 73 67 4d 70 72 69 6e 74 66  struct sgMprintf
6830: 20 73 4d 3b 0a 20 20 73 4d 2e 7a 42 61 73 65 20   sM;.  sM.zBase 
6840: 3d 20 73 4d 2e 7a 54 65 78 74 20 3d 20 7a 49 6e  = sM.zText = zIn
6850: 69 74 42 75 66 3b 0a 20 20 73 4d 2e 6e 43 68 61  itBuf;.  sM.nCha
6860: 72 20 3d 20 73 4d 2e 6e 54 6f 74 61 6c 20 3d 20  r = sM.nTotal = 
6870: 30 3b 0a 20 20 73 4d 2e 6e 41 6c 6c 6f 63 20 3d  0;.  sM.nAlloc =
6880: 20 6e 49 6e 69 74 42 75 66 3b 0a 20 20 73 4d 2e   nInitBuf;.  sM.
6890: 78 52 65 61 6c 6c 6f 63 20 3d 20 78 52 65 61 6c  xRealloc = xReal
68a0: 6c 6f 63 3b 0a 20 20 76 78 70 72 69 6e 74 66 28  loc;.  vxprintf(
68b0: 6d 6f 75 74 2c 20 26 73 4d 2c 20 75 73 65 49 6e  mout, &sM, useIn
68c0: 74 65 72 6e 61 6c 2c 20 7a 46 6f 72 6d 61 74 2c  ternal, zFormat,
68d0: 20 61 70 29 3b 0a 20 20 69 66 28 20 78 52 65 61   ap);.  if( xRea
68e0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 66 28 20  lloc ){.    if( 
68f0: 73 4d 2e 7a 54 65 78 74 3d 3d 73 4d 2e 7a 42 61  sM.zText==sM.zBa
6900: 73 65 20 29 7b 0a 20 20 20 20 20 20 73 4d 2e 7a  se ){.      sM.z
6910: 54 65 78 74 20 3d 20 78 52 65 61 6c 6c 6f 63 28  Text = xRealloc(
6920: 30 2c 20 73 4d 2e 6e 43 68 61 72 2b 31 29 3b 0a  0, sM.nChar+1);.
6930: 20 20 20 20 20 20 69 66 28 20 73 4d 2e 7a 54 65        if( sM.zTe
6940: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  xt ){.        me
6950: 6d 63 70 79 28 73 4d 2e 7a 54 65 78 74 2c 20 73  mcpy(sM.zText, s
6960: 4d 2e 7a 42 61 73 65 2c 20 73 4d 2e 6e 43 68 61  M.zBase, sM.nCha
6970: 72 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r+1);.      }.  
6980: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 4d 2e 6e    }else if( sM.n
6990: 41 6c 6c 6f 63 3e 73 4d 2e 6e 43 68 61 72 2b 31  Alloc>sM.nChar+1
69a0: 30 20 29 7b 0a 20 20 20 20 20 20 73 4d 2e 7a 54  0 ){.      sM.zT
69b0: 65 78 74 20 3d 20 78 52 65 61 6c 6c 6f 63 28 73  ext = xRealloc(s
69c0: 4d 2e 7a 54 65 78 74 2c 20 73 4d 2e 6e 43 68 61  M.zText, sM.nCha
69d0: 72 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  r+1);.    }.  }.
69e0: 20 20 72 65 74 75 72 6e 20 73 4d 2e 7a 54 65 78    return sM.zTex
69f0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 6c  t;.}../*.** Real
6a00: 6c 6f 63 20 74 68 61 74 20 69 73 20 61 20 72 65  loc that is a re
6a10: 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 6e 6f 74  al function, not
6a20: 20 61 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 73 74 61   a macro..*/.sta
6a30: 74 69 63 20 76 6f 69 64 20 2a 70 72 69 6e 74 66  tic void *printf
6a40: 5f 72 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 6f  _realloc(void *o
6a50: 6c 64 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20  ld, int size){. 
6a60: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 52 65   return sqliteRe
6a70: 61 6c 6c 6f 63 28 6f 6c 64 2c 73 69 7a 65 29 3b  alloc(old,size);
6a80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  .}../*.** Print 
6a90: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
6aa0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
6ab0: 4d 61 6c 6c 6f 63 28 29 2e 20 20 55 73 65 20 74  Malloc().  Use t
6ac0: 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 25  he internal.** %
6ad0: 2d 63 6f 6e 76 65 72 73 69 6f 6e 20 65 78 74 65  -conversion exte
6ae0: 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 63 68 61 72 20  nsions..*/.char 
6af0: 2a 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66  *sqlite3VMPrintf
6b00: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f  (const char *zFo
6b10: 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70  rmat, va_list ap
6b20: 29 7b 0a 20 20 63 68 61 72 20 7a 42 61 73 65 5b  ){.  char zBase[
6b30: 31 30 30 30 5d 3b 0a 20 20 72 65 74 75 72 6e 20  1000];.  return 
6b40: 62 61 73 65 5f 76 70 72 69 6e 74 66 28 70 72 69  base_vprintf(pri
6b50: 6e 74 66 5f 72 65 61 6c 6c 6f 63 2c 20 31 2c 20  ntf_realloc, 1, 
6b60: 7a 42 61 73 65 2c 20 73 69 7a 65 6f 66 28 7a 42  zBase, sizeof(zB
6b70: 61 73 65 29 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ase), zFormat, a
6b80: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  p);.}../*.** Pri
6b90: 6e 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  nt into memory o
6ba0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
6bb0: 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 20 55 73  iteMalloc().  Us
6bc0: 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a  e the internal.*
6bd0: 2a 20 25 2d 63 6f 6e 76 65 72 73 69 6f 6e 20 65  * %-conversion e
6be0: 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 63 68  xtensions..*/.ch
6bf0: 61 72 20 2a 73 71 6c 69 74 65 33 4d 50 72 69 6e  ar *sqlite3MPrin
6c00: 74 66 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  tf(const char *z
6c10: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
6c20: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
6c30: 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 7a 42  ar *z;.  char zB
6c40: 61 73 65 5b 31 30 30 30 5d 3b 0a 20 20 76 61 5f  ase[1000];.  va_
6c50: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
6c60: 74 29 3b 0a 20 20 7a 20 3d 20 62 61 73 65 5f 76  t);.  z = base_v
6c70: 70 72 69 6e 74 66 28 70 72 69 6e 74 66 5f 72 65  printf(printf_re
6c80: 61 6c 6c 6f 63 2c 20 31 2c 20 7a 42 61 73 65 2c  alloc, 1, zBase,
6c90: 20 73 69 7a 65 6f 66 28 7a 42 61 73 65 29 2c 20   sizeof(zBase), 
6ca0: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
6cb0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65  va_end(ap);.  re
6cc0: 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn z;.}../*.**
6cd0: 20 50 72 69 6e 74 20 69 6e 74 6f 20 6d 65 6d 6f   Print into memo
6ce0: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
6cf0: 20 6d 61 6c 6c 6f 63 28 29 2e 20 20 44 6f 20 6e   malloc().  Do n
6d00: 6f 74 20 75 73 65 20 74 68 65 20 69 6e 74 65 72  ot use the inter
6d10: 6e 61 6c 0a 2a 2a 20 25 2d 63 6f 6e 76 65 72 73  nal.** %-convers
6d20: 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20  ion extensions. 
6d30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
6d40: 20 66 6f 72 20 75 73 65 20 62 79 20 65 78 74 65   for use by exte
6d50: 72 6e 61 6c 20 75 73 65 72 73 2e 0a 2a 2f 0a 63  rnal users..*/.c
6d60: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 6d 70 72  har *sqlite3_mpr
6d70: 69 6e 74 66 28 63 6f 6e 73 74 20 63 68 61 72 20  intf(const char 
6d80: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
6d90: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
6da0: 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20  char *z;.  char 
6db0: 7a 42 75 66 5b 32 30 30 5d 3b 0a 0a 20 20 76 61  zBuf[200];..  va
6dc0: 5f 73 74 61 72 74 28 61 70 2c 7a 46 6f 72 6d 61  _start(ap,zForma
6dd0: 74 29 3b 0a 20 20 7a 20 3d 20 62 61 73 65 5f 76  t);.  z = base_v
6de0: 70 72 69 6e 74 66 28 28 76 6f 69 64 2a 28 2a 29  printf((void*(*)
6df0: 28 76 6f 69 64 2a 2c 69 6e 74 29 29 72 65 61 6c  (void*,int))real
6e00: 6c 6f 63 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  loc, 0, .       
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 7a 42 75 66              zBuf
6e20: 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  , sizeof(zBuf), 
6e30: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
6e40: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65  va_end(ap);.  re
6e50: 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68  turn z;.}../* Th
6e60: 69 73 20 69 73 20 74 68 65 20 76 61 72 61 72 67  is is the vararg
6e70: 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  s version of sql
6e80: 69 74 65 33 5f 6d 70 72 69 6e 74 66 2e 20 20 0a  ite3_mprintf.  .
6e90: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
6ea0: 5f 76 6d 70 72 69 6e 74 66 28 63 6f 6e 73 74 20  _vmprintf(const 
6eb0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76  char *zFormat, v
6ec0: 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 63 68  a_list ap){.  ch
6ed0: 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20  ar zBuf[200];.  
6ee0: 72 65 74 75 72 6e 20 62 61 73 65 5f 76 70 72 69  return base_vpri
6ef0: 6e 74 66 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f  ntf((void*(*)(vo
6f00: 69 64 2a 2c 69 6e 74 29 29 72 65 61 6c 6c 6f 63  id*,int))realloc
6f10: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
6f20: 20 20 20 20 20 20 20 20 20 20 20 7a 42 75 66 2c             zBuf,
6f30: 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a   sizeof(zBuf), z
6f40: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 7d 0a 0a  Format, ap);.}..
6f50: 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 6e  /*.** sqlite3_sn
6f60: 70 72 69 6e 74 66 28 29 20 77 6f 72 6b 73 20 6c  printf() works l
6f70: 69 6b 65 20 73 6e 70 72 69 6e 74 66 28 29 20 65  ike snprintf() e
6f80: 78 63 65 70 74 20 74 68 61 74 20 69 74 20 69 67  xcept that it ig
6f90: 6e 6f 72 65 73 20 74 68 65 0a 2a 2a 20 63 75 72  nores the.** cur
6fa0: 72 65 6e 74 20 6c 6f 63 61 6c 65 20 73 65 74 74  rent locale sett
6fb0: 69 6e 67 73 2e 20 20 54 68 69 73 20 69 73 20 69  ings.  This is i
6fc0: 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20 53 51 4c  mportant for SQL
6fd0: 69 74 65 20 62 65 63 61 75 73 65 20 77 65 0a 2a  ite because we.*
6fe0: 2a 20 61 72 65 20 6e 6f 74 20 61 62 6c 65 20 74  * are not able t
6ff0: 6f 20 75 73 65 20 61 20 22 2c 22 20 61 73 20 74  o use a "," as t
7000: 68 65 20 64 65 63 69 6d 61 6c 20 70 6f 69 6e 74  he decimal point
7010: 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 22 2e 22   in place of "."
7020: 20 61 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64   as.** specified
7030: 20 62 79 20 73 6f 6d 65 20 6c 6f 63 61 6c 65 73   by some locales
7040: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
7050: 65 33 5f 73 6e 70 72 69 6e 74 66 28 69 6e 74 20  e3_snprintf(int 
7060: 6e 2c 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 63  n, char *zBuf, c
7070: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
7080: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72  at, ...){.  char
7090: 20 2a 7a 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61   *z;.  va_list a
70a0: 70 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61  p;..  va_start(a
70b0: 70 2c 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 20  p,zFormat);.  z 
70c0: 3d 20 62 61 73 65 5f 76 70 72 69 6e 74 66 28 30  = base_vprintf(0
70d0: 2c 20 30 2c 20 7a 42 75 66 2c 20 6e 2c 20 7a 46  , 0, zBuf, n, zF
70e0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
70f0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
7100: 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  rn z;.}..#if def
7110: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
7120: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
7130: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
7140: 20 41 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 72   A version of pr
7150: 69 6e 74 66 28 29 20 74 68 61 74 20 75 6e 64 65  intf() that unde
7160: 72 73 74 61 6e 64 73 20 25 6c 6c 64 2e 20 20 55  rstands %lld.  U
7170: 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  sed for debuggin
7180: 67 2e 0a 2a 2a 20 54 68 65 20 70 72 69 6e 74 66  g..** The printf
7190: 28 29 20 62 75 69 6c 74 20 69 6e 74 6f 20 73 6f  () built into so
71a0: 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77  me versions of w
71b0: 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20  indows does not 
71c0: 75 6e 64 65 72 73 74 61 6e 64 20 25 6c 6c 64 0a  understand %lld.
71d0: 2a 2a 20 61 6e 64 20 73 65 67 66 61 75 6c 74 73  ** and segfaults
71e0: 20 69 66 20 79 6f 75 20 67 69 76 65 20 69 74 20   if you give it 
71f0: 61 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74 2e  a long long int.
7200: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7210: 44 65 62 75 67 50 72 69 6e 74 66 28 63 6f 6e 73  DebugPrintf(cons
7220: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
7230: 20 2e 2e 2e 29 7b 0a 20 20 65 78 74 65 72 6e 20   ...){.  extern 
7240: 69 6e 74 20 67 65 74 70 69 64 28 76 6f 69 64 29  int getpid(void)
7250: 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  ;.  va_list ap;.
7260: 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 30 5d    char zBuf[500]
7270: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
7280: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 62 61 73   zFormat);.  bas
7290: 65 5f 76 70 72 69 6e 74 66 28 30 2c 20 30 2c 20  e_vprintf(0, 0, 
72a0: 7a 42 75 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75  zBuf, sizeof(zBu
72b0: 66 29 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  f), zFormat, ap)
72c0: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
72d0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74    fprintf(stdout
72e0: 2c 22 25 64 3a 20 25 73 22 2c 20 67 65 74 70 69  ,"%d: %s", getpi
72f0: 64 28 29 2c 20 7a 42 75 66 29 3b 0a 20 20 66 66  d(), zBuf);.  ff
7300: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 7d 0a  lush(stdout);.}.
7310: 23 65 6e 64 69 66 0a                             #endif.