/ Hex Artifact Content
Login

Artifact 292a7bfc5a815cb6465e32b2d5c9fe9bd43b27f0:


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 73 6c 69 67 68 74 6c 79 20 6f 75 74  are slightly out
00b0: 2d 6f 66 2d 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  -of-date..**.** 
00c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 6f  The following mo
00d0: 64 75 6c 65 73 20 69 73 20 61 6e 20 65 6e 68 61  dules is an enha
00e0: 6e 63 65 64 20 72 65 70 6c 61 63 65 6d 65 6e 74  nced replacement
00f0: 20 66 6f 72 20 74 68 65 20 22 70 72 69 6e 74 66   for the "printf
0100: 22 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 2a 2a  " subroutines.**
0110: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 73 74   found in the st
0120: 61 6e 64 61 72 64 20 43 20 6c 69 62 72 61 72 79  andard C library
0130: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
0140: 20 65 6e 68 61 6e 63 65 6d 65 6e 74 73 20 61 72   enhancements ar
0150: 65 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 3a 0a  e.** supported:.
0160: 2a 2a 0a 2a 2a 20 20 20 20 20 20 2b 20 20 41 64  **.**      +  Ad
0170: 64 69 74 69 6f 6e 61 6c 20 66 75 6e 63 74 69 6f  ditional functio
0180: 6e 73 2e 20 20 54 68 65 20 73 74 61 6e 64 61 72  ns.  The standar
0190: 64 20 73 65 74 20 6f 66 20 22 70 72 69 6e 74 66  d set of "printf
01a0: 22 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 20  " functions.**  
01b0: 20 20 20 20 20 20 20 69 6e 63 6c 75 64 65 73 20         includes 
01c0: 70 72 69 6e 74 66 2c 20 66 70 72 69 6e 74 66 2c  printf, fprintf,
01d0: 20 73 70 72 69 6e 74 66 2c 20 76 70 72 69 6e 74   sprintf, vprint
01e0: 66 2c 20 76 66 70 72 69 6e 74 66 2c 20 61 6e 64  f, vfprintf, and
01f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 73 70 72  .**         vspr
0200: 69 6e 74 66 2e 20 20 54 68 69 73 20 6d 6f 64 75  intf.  This modu
0210: 6c 65 20 61 64 64 73 20 74 68 65 20 66 6f 6c 6c  le adds the foll
0220: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
0230: 20 20 20 20 20 20 20 2a 20 20 73 6e 70 72 69 6e         *  snprin
0240: 74 66 20 2d 2d 20 57 6f 72 6b 73 20 6c 69 6b 65  tf -- Works like
0250: 20 73 70 72 69 6e 74 66 2c 20 62 75 74 20 68 61   sprintf, but ha
0260: 73 20 61 6e 20 65 78 74 72 61 20 61 72 67 75 6d  s an extra argum
0270: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ent.**          
0280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0290: 77 68 69 63 68 20 69 73 20 74 68 65 20 73 69 7a  which is the siz
02a0: 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
02b0: 77 72 69 74 74 65 6e 20 74 6f 2e 0a 2a 2a 0a 2a  written to..**.*
02c0: 2a 20 20 20 20 20 20 20 20 20 20 20 2a 20 20 6d  *           *  m
02d0: 70 72 69 6e 74 66 20 2d 2d 20 20 53 69 6d 69 6c  printf --  Simil
02e0: 61 72 20 74 6f 20 73 70 72 69 6e 74 66 2e 20 20  ar to sprintf.  
02f0: 57 72 69 74 65 73 20 6f 75 74 70 75 74 20 74 6f  Writes output to
0300: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 20 20 20   memory.**      
0310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0320: 20 20 20 20 6f 62 74 61 69 6e 65 64 20 66 72 6f      obtained fro
0330: 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2a 0a 2a 2a 20  m malloc..**.** 
0340: 20 20 20 20 20 20 20 20 20 20 2a 20 20 78 70 72            *  xpr
0350: 69 6e 74 66 20 2d 2d 20 20 43 61 6c 6c 73 20 61  intf --  Calls a
0360: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 64 69 73   function to dis
0370: 70 6f 73 65 20 6f 66 20 6f 75 74 70 75 74 2e 0a  pose of output..
0380: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
0390: 2a 20 20 6e 70 72 69 6e 74 66 20 2d 2d 20 20 4e  *  nprintf --  N
03a0: 6f 20 6f 75 74 70 75 74 2c 20 62 75 74 20 72 65  o output, but re
03b0: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
03c0: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 0a 2a   of characters.*
03d0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
03e0: 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
03f0: 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  would have been 
0400: 6f 75 74 70 75 74 20 62 79 20 70 72 69 6e 74 66  output by printf
0410: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  ..**.**         
0420: 20 20 2a 20 20 41 20 76 2d 20 76 65 72 73 69 6f    *  A v- versio
0430: 6e 20 28 65 78 3a 20 76 73 6e 70 72 69 6e 74 66  n (ex: vsnprintf
0440: 29 20 6f 66 20 65 76 65 72 79 20 66 75 6e 63 74  ) of every funct
0450: 69 6f 6e 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 20  ion is also.**  
0460: 20 20 20 20 20 20 20 20 20 20 20 20 73 75 70 70              supp
0470: 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lied..**.**     
0480: 20 2b 20 20 41 20 66 65 77 20 65 78 74 65 6e 73   +  A few extens
0490: 69 6f 6e 73 20 74 6f 20 74 68 65 20 66 6f 72 6d  ions to the form
04a0: 61 74 74 69 6e 67 20 6e 6f 74 61 74 69 6f 6e 20  atting notation 
04b0: 61 72 65 20 73 75 70 70 6f 72 74 65 64 3a 0a 2a  are supported:.*
04c0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 2a  *.**           *
04d0: 20 20 54 68 65 20 22 3d 22 20 66 6c 61 67 20 28    The "=" flag (
04e0: 73 69 6d 69 6c 61 72 20 74 6f 20 22 2d 22 29 20  similar to "-") 
04f0: 63 61 75 73 65 73 20 74 68 65 20 6f 75 74 70 75  causes the outpu
0500: 74 20 74 6f 20 62 65 0a 2a 2a 20 20 20 20 20 20  t to be.**      
0510: 20 20 20 20 20 20 20 20 62 65 20 63 65 6e 74 65          be cente
0520: 72 65 64 20 69 6e 20 74 68 65 20 61 70 70 72 6f  red in the appro
0530: 70 72 69 61 74 65 6c 79 20 73 69 7a 65 64 20 66  priately sized f
0540: 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ield..**.**     
0550: 20 20 20 20 20 20 2a 20 20 54 68 65 20 25 62 20        *  The %b 
0560: 66 69 65 6c 64 20 6f 75 74 70 75 74 73 20 61 6e  field outputs an
0570: 20 69 6e 74 65 67 65 72 20 69 6e 20 62 69 6e 61   integer in bina
0580: 72 79 20 6e 6f 74 61 74 69 6f 6e 2e 0a 2a 2a 0a  ry notation..**.
0590: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 2a 20 20  **           *  
05a0: 54 68 65 20 25 63 20 66 69 65 6c 64 20 6e 6f 77  The %c field now
05b0: 20 61 63 63 65 70 74 73 20 61 20 70 72 65 63 69   accepts a preci
05c0: 73 69 6f 6e 2e 20 20 54 68 65 20 63 68 61 72 61  sion.  The chara
05d0: 63 74 65 72 20 6f 75 74 70 75 74 0a 2a 2a 20 20  cter output.**  
05e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 72              is r
05f0: 65 70 65 61 74 65 64 20 62 79 20 74 68 65 20 6e  epeated by the n
0600: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
0610: 68 65 20 70 72 65 63 69 73 69 6f 6e 20 73 70 65  he precision spe
0620: 63 69 66 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  cifies..**.**   
0630: 20 20 20 20 20 20 20 20 2a 20 20 54 68 65 20 25          *  The %
0640: 27 20 66 69 65 6c 64 20 77 6f 72 6b 73 20 6c 69  ' field works li
0650: 6b 65 20 25 63 2c 20 62 75 74 20 74 61 6b 65 73  ke %c, but takes
0660: 20 61 73 20 69 74 73 20 63 68 61 72 61 63 74 65   as its characte
0670: 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  r the.**        
0680: 20 20 20 20 20 20 6e 65 78 74 20 63 68 61 72 61        next chara
0690: 63 74 65 72 20 6f 66 20 74 68 65 20 66 6f 72 6d  cter of the form
06a0: 61 74 20 73 74 72 69 6e 67 2c 20 69 6e 73 74 65  at string, inste
06b0: 61 64 20 6f 66 20 74 68 65 20 6e 65 78 74 0a 2a  ad of the next.*
06c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
06d0: 72 67 75 6d 65 6e 74 2e 20 20 46 6f 72 20 65 78  rgument.  For ex
06e0: 61 6d 70 6c 65 2c 20 20 70 72 69 6e 74 66 28 22  ample,  printf("
06f0: 25 2e 37 38 27 2d 22 29 20 20 70 72 69 6e 74 73  %.78'-")  prints
0700: 20 37 38 20 6d 69 6e 75 73 0a 2a 2a 20 20 20 20   78 minus.**    
0710: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 73 2c            signs,
0720: 20 74 68 65 20 73 61 6d 65 20 61 73 20 20 70 72   the same as  pr
0730: 69 6e 74 66 28 22 25 2e 37 38 63 22 2c 27 2d 27  intf("%.78c",'-'
0740: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 2b 20  )..**.**      + 
0750: 20 57 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 75   When compiled u
0760: 73 69 6e 67 20 47 43 43 20 6f 6e 20 61 20 53 50  sing GCC on a SP
0770: 41 52 43 2c 20 74 68 69 73 20 76 65 72 73 69 6f  ARC, this versio
0780: 6e 20 6f 66 20 70 72 69 6e 74 66 20 69 73 0a 2a  n of printf is.*
0790: 2a 20 20 20 20 20 20 20 20 20 66 61 73 74 65 72  *         faster
07a0: 20 74 68 61 6e 20 74 68 65 20 6c 69 62 72 61 72   than the librar
07b0: 79 20 70 72 69 6e 74 66 20 66 6f 72 20 53 55 4e  y printf for SUN
07c0: 20 4f 53 20 34 2e 31 2e 0a 2a 2a 0a 2a 2a 20 20   OS 4.1..**.**  
07d0: 20 20 20 20 2b 20 20 41 6c 6c 20 66 75 6e 63 74      +  All funct
07e0: 69 6f 6e 73 20 61 72 65 20 66 75 6c 6c 79 20 72  ions are fully r
07f0: 65 65 6e 74 72 61 6e 74 2e 0a 2a 2a 0a 2a 2f 0a  eentrant..**.*/.
0800: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0810: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 55 6e  Int.h"../*.** Un
0820: 64 65 66 69 6e 65 20 43 4f 4d 50 41 54 49 42 49  define COMPATIBI
0830: 4c 49 54 59 20 74 6f 20 6d 61 6b 65 20 73 6f 6d  LITY to make som
0840: 65 20 73 6c 69 67 68 74 20 63 68 61 6e 67 65 73  e slight changes
0850: 20 69 6e 20 74 68 65 20 77 61 79 20 74 68 69 6e   in the way thin
0860: 67 73 0a 2a 2a 20 77 6f 72 6b 2e 20 20 49 20 74  gs.** work.  I t
0870: 68 69 6e 6b 20 74 68 65 20 63 68 61 6e 67 65 73  hink the changes
0880: 20 61 72 65 20 61 6e 20 69 6d 70 72 6f 76 65 6d   are an improvem
0890: 65 6e 74 2c 20 62 75 74 20 74 68 65 79 20 61 72  ent, but they ar
08a0: 65 20 6e 6f 74 0a 2a 2a 20 62 61 63 6b 77 61 72  e not.** backwar
08b0: 64 73 20 63 6f 6d 70 61 74 69 62 6c 65 2e 0a 2a  ds compatible..*
08c0: 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20 43 4f 4d  /./* #define COM
08d0: 50 41 54 49 42 49 4c 49 54 59 20 20 20 20 20 20  PATIBILITY      
08e0: 20 2f 20 2a 20 43 6f 6d 70 61 74 69 62 6c 65 20   / * Compatible 
08f0: 77 69 74 68 20 53 55 4e 20 4f 53 20 34 2e 31 20  with SUN OS 4.1 
0900: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  */../*.** Conver
0910: 73 69 6f 6e 20 74 79 70 65 73 20 66 61 6c 6c 20  sion types fall 
0920: 69 6e 74 6f 20 76 61 72 69 6f 75 73 20 63 61 74  into various cat
0930: 65 67 6f 72 69 65 73 20 61 73 20 64 65 66 69 6e  egories as defin
0940: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 66 6f 6c  ed by the.** fol
0950: 6c 6f 77 69 6e 67 20 65 6e 75 6d 65 72 61 74 69  lowing enumerati
0960: 6f 6e 2e 0a 2a 2f 0a 65 6e 75 6d 20 65 74 5f 74  on..*/.enum et_t
0970: 79 70 65 20 7b 20 20 20 20 2f 2a 20 54 68 65 20  ype {    /* The 
0980: 74 79 70 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  type of the form
0990: 61 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20 20 65  at field */.   e
09a0: 74 52 41 44 49 58 2c 20 20 20 20 20 20 20 20 20  tRADIX,         
09b0: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 74 79     /* Integer ty
09c0: 70 65 73 2e 20 20 25 64 2c 20 25 78 2c 20 25 6f  pes.  %d, %x, %o
09d0: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 20 2a  , and so forth *
09e0: 2f 0a 20 20 20 65 74 46 4c 4f 41 54 2c 20 20 20  /.   etFLOAT,   
09f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 6f 61           /* Floa
0a00: 74 69 6e 67 20 70 6f 69 6e 74 2e 20 20 25 66 20  ting point.  %f 
0a10: 2a 2f 0a 20 20 20 65 74 45 58 50 2c 20 20 20 20  */.   etEXP,    
0a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
0a30: 6f 6e 65 6e 74 69 6f 6e 61 6c 20 6e 6f 74 61 74  onentional notat
0a40: 69 6f 6e 2e 20 25 65 20 61 6e 64 20 25 45 20 2a  ion. %e and %E *
0a50: 2f 0a 20 20 20 65 74 47 45 4e 45 52 49 43 2c 20  /.   etGENERIC, 
0a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 6f 61           /* Floa
0a70: 74 69 6e 67 20 6f 72 20 65 78 70 6f 6e 65 6e 74  ting or exponent
0a80: 69 61 6c 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  ial, depending o
0a90: 6e 20 65 78 70 6f 6e 65 6e 74 2e 20 25 67 20 2a  n exponent. %g *
0aa0: 2f 0a 20 20 20 65 74 53 49 5a 45 2c 20 20 20 20  /.   etSIZE,    
0ab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
0ac0: 72 6e 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  rn number of cha
0ad0: 72 61 63 74 65 72 73 20 70 72 6f 63 65 73 73 65  racters processe
0ae0: 64 20 73 6f 20 66 61 72 2e 20 25 6e 20 2a 2f 0a  d so far. %n */.
0af0: 20 20 20 65 74 53 54 52 49 4e 47 2c 20 20 20 20     etSTRING,    
0b00: 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67         /* String
0b10: 73 2e 20 25 73 20 2a 2f 0a 20 20 20 65 74 44 59  s. %s */.   etDY
0b20: 4e 53 54 52 49 4e 47 2c 20 20 20 20 20 20 20 20  NSTRING,        
0b30: 2f 2a 20 44 79 6e 61 6d 69 63 61 6c 6c 79 20 61  /* Dynamically a
0b40: 6c 6c 6f 63 61 74 65 64 20 73 74 72 69 6e 67 73  llocated strings
0b50: 2e 20 25 7a 20 2a 2f 0a 20 20 20 65 74 50 45 52  . %z */.   etPER
0b60: 43 45 4e 54 2c 20 20 20 20 20 20 20 20 20 20 2f  CENT,          /
0b70: 2a 20 50 65 72 63 65 6e 74 20 73 79 6d 62 6f 6c  * Percent symbol
0b80: 2e 20 25 25 20 2a 2f 0a 20 20 20 65 74 43 48 41  . %% */.   etCHA
0b90: 52 58 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  RX,            /
0ba0: 2a 20 43 68 61 72 61 63 74 65 72 73 2e 20 25 63  * Characters. %c
0bb0: 20 2a 2f 0a 20 20 20 65 74 45 52 52 4f 52 2c 20   */.   etERROR, 
0bc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
0bd0: 65 64 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e  ed to indicate n
0be0: 6f 20 73 75 63 68 20 63 6f 6e 76 65 72 73 69 6f  o such conversio
0bf0: 6e 20 74 79 70 65 20 2a 2f 0a 2f 2a 20 54 68 65  n type */./* The
0c00: 20 72 65 73 74 20 61 72 65 20 65 78 74 65 6e 73   rest are extens
0c10: 69 6f 6e 73 2c 20 6e 6f 74 20 6e 6f 72 6d 61 6c  ions, not normal
0c20: 6c 79 20 66 6f 75 6e 64 20 69 6e 20 70 72 69 6e  ly found in prin
0c30: 74 66 28 29 20 2a 2f 0a 20 20 20 65 74 43 48 41  tf() */.   etCHA
0c40: 52 4c 49 54 2c 20 20 20 20 20 20 20 20 20 20 2f  RLIT,          /
0c50: 2a 20 4c 69 74 65 72 61 6c 20 63 68 61 72 61 63  * Literal charac
0c60: 74 65 72 73 2e 20 20 25 27 20 2a 2f 0a 20 20 20  ters.  %' */.   
0c70: 65 74 53 51 4c 45 53 43 41 50 45 2c 20 20 20 20  etSQLESCAPE,    
0c80: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 73 20 77      /* Strings w
0c90: 69 74 68 20 27 5c 27 27 20 64 6f 75 62 6c 65 64  ith '\'' doubled
0ca0: 2e 20 20 25 71 20 2a 2f 0a 20 20 20 65 74 53 51  .  %q */.   etSQ
0cb0: 4c 45 53 43 41 50 45 32 2c 20 20 20 20 20 20 20  LESCAPE2,       
0cc0: 2f 2a 20 53 74 72 69 6e 67 73 20 77 69 74 68 20  /* Strings with 
0cd0: 27 5c 27 27 20 64 6f 75 62 6c 65 64 20 61 6e 64  '\'' doubled and
0ce0: 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 27 27 2c   enclosed in '',
0cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0d00: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 20             NULL 
0d10: 70 6f 69 6e 74 65 72 73 20 72 65 70 6c 61 63 65  pointers replace
0d20: 64 20 62 79 20 53 51 4c 20 4e 55 4c 4c 2e 20 20  d by SQL NULL.  
0d30: 25 51 20 2a 2f 0a 20 20 20 65 74 4f 52 44 49 4e  %Q */.   etORDIN
0d40: 41 4c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  AL           /* 
0d50: 31 73 74 2c 20 32 6e 64 2c 20 33 72 64 20 61 6e  1st, 2nd, 3rd an
0d60: 64 20 73 6f 20 66 6f 72 74 68 20 2a 2f 0a 7d 3b  d so forth */.};
0d70: 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 62 75 69  ../*.** Each bui
0d80: 6c 74 69 6e 20 63 6f 6e 76 65 72 73 69 6f 6e 20  ltin conversion 
0d90: 63 68 61 72 61 63 74 65 72 20 28 65 78 3a 20 74  character (ex: t
0da0: 68 65 20 27 64 27 20 69 6e 20 22 25 64 22 29 20  he 'd' in "%d") 
0db0: 69 73 20 64 65 73 63 72 69 62 65 64 0a 2a 2a 20  is described.** 
0dc0: 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  by an instance o
0dd0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0de0: 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 74 79 70  structure.*/.typ
0df0: 65 64 65 66 20 73 74 72 75 63 74 20 65 74 5f 69  edef struct et_i
0e00: 6e 66 6f 20 7b 20 20 20 2f 2a 20 49 6e 66 6f 72  nfo {   /* Infor
0e10: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 65 61 63  mation about eac
0e20: 68 20 66 6f 72 6d 61 74 20 66 69 65 6c 64 20 2a  h format field *
0e30: 2f 0a 20 20 69 6e 74 20 20 66 6d 74 74 79 70 65  /.  int  fmttype
0e40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
0e50: 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 69 65  * The format fie
0e60: 6c 64 20 63 6f 64 65 20 6c 65 74 74 65 72 20 2a  ld code letter *
0e70: 2f 0a 20 20 69 6e 74 20 20 62 61 73 65 3b 20 20  /.  int  base;  
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0e90: 2a 20 54 68 65 20 62 61 73 65 20 66 6f 72 20 72  * The base for r
0ea0: 61 64 69 78 20 63 6f 6e 76 65 72 73 69 6f 6e 20  adix conversion 
0eb0: 2a 2f 0a 20 20 63 68 61 72 20 2a 63 68 61 72 73  */.  char *chars
0ec0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
0ed0: 2f 2a 20 54 68 65 20 63 68 61 72 61 63 74 65 72  /* The character
0ee0: 20 73 65 74 20 66 6f 72 20 63 6f 6e 76 65 72 73   set for convers
0ef0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 20 66 6c  ion */.  int  fl
0f00: 61 67 5f 73 69 67 6e 65 64 3b 20 20 20 20 20 20  ag_signed;      
0f10: 20 20 20 20 2f 2a 20 49 73 20 74 68 65 20 71 75      /* Is the qu
0f20: 61 6e 74 69 74 79 20 73 69 67 6e 65 64 3f 20 2a  antity signed? *
0f30: 2f 0a 20 20 63 68 61 72 20 2a 70 72 65 66 69 78  /.  char *prefix
0f40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
0f50: 2a 20 50 72 65 66 69 78 20 6f 6e 20 6e 6f 6e 2d  * Prefix on non-
0f60: 7a 65 72 6f 20 76 61 6c 75 65 73 20 69 6e 20 61  zero values in a
0f70: 6c 74 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 65  lt format */.  e
0f80: 6e 75 6d 20 65 74 5f 74 79 70 65 20 74 79 70 65  num et_type type
0f90: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ;          /* Co
0fa0: 6e 76 65 72 73 69 6f 6e 20 70 61 72 61 64 69 67  nversion paradig
0fb0: 6d 20 2a 2f 0a 7d 20 65 74 5f 69 6e 66 6f 3b 0a  m */.} et_info;.
0fc0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
0fd0: 77 69 6e 67 20 74 61 62 6c 65 20 69 73 20 73 65  wing table is se
0fe0: 61 72 63 68 65 64 20 6c 69 6e 65 61 72 6c 79 2c  arched linearly,
0ff0: 20 73 6f 20 69 74 20 69 73 20 67 6f 6f 64 20 74   so it is good t
1000: 6f 20 70 75 74 20 74 68 65 0a 2a 2a 20 6d 6f 73  o put the.** mos
1010: 74 20 66 72 65 71 75 65 6e 74 6c 79 20 75 73 65  t frequently use
1020: 64 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 79 70  d conversion typ
1030: 65 73 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61  es first..*/.sta
1040: 74 69 63 20 65 74 5f 69 6e 66 6f 20 66 6d 74 69  tic et_info fmti
1050: 6e 66 6f 5b 5d 20 3d 20 7b 0a 20 20 7b 20 27 64  nfo[] = {.  { 'd
1060: 27 2c 20 20 31 30 2c 20 20 22 30 31 32 33 34 35  ',  10,  "012345
1070: 36 37 38 39 22 2c 20 20 20 20 20 20 20 31 2c 20  6789",       1, 
1080: 20 20 20 30 2c 20 65 74 52 41 44 49 58 2c 20 20     0, etRADIX,  
1090: 20 20 20 20 7d 2c 0a 20 20 7b 20 27 73 27 2c 20      },.  { 's', 
10a0: 20 20 30 2c 20 20 30 2c 20 20 20 20 20 20 20 20    0,  0,        
10b0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 20 20 20            0,    
10c0: 30 2c 20 65 74 53 54 52 49 4e 47 2c 20 20 20 20  0, etSTRING,    
10d0: 20 7d 2c 20 0a 20 20 7b 20 27 7a 27 2c 20 20 20   }, .  { 'z',   
10e0: 30 2c 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  0,  0,          
10f0: 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 30 2c          0,    0,
1100: 20 65 74 44 59 4e 53 54 52 49 4e 47 2c 20 20 7d   etDYNSTRING,  }
1110: 2c 20 0a 20 20 7b 20 27 71 27 2c 20 20 20 30 2c  , .  { 'q',   0,
1120: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
1130: 20 20 20 20 20 20 30 2c 20 20 20 20 30 2c 20 65        0,    0, e
1140: 74 53 51 4c 45 53 43 41 50 45 2c 20 20 7d 2c 0a  tSQLESCAPE,  },.
1150: 20 20 7b 20 27 51 27 2c 20 20 20 30 2c 20 20 30    { 'Q',   0,  0
1160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1170: 20 20 20 30 2c 20 20 20 20 30 2c 20 65 74 53 51     0,    0, etSQ
1180: 4c 45 53 43 41 50 45 32 2c 20 7d 2c 0a 20 20 7b  LESCAPE2, },.  {
1190: 20 27 63 27 2c 20 20 20 30 2c 20 20 30 2c 20 20   'c',   0,  0,  
11a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b0: 30 2c 20 20 20 20 30 2c 20 65 74 43 48 41 52 58  0,    0, etCHARX
11c0: 2c 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 27 6f  ,      },.  { 'o
11d0: 27 2c 20 20 20 38 2c 20 20 22 30 31 32 33 34 35  ',   8,  "012345
11e0: 36 37 22 2c 20 20 20 20 20 20 20 20 20 30 2c 20  67",         0, 
11f0: 20 22 30 22 2c 20 65 74 52 41 44 49 58 2c 20 20   "0", etRADIX,  
1200: 20 20 20 20 7d 2c 0a 20 20 7b 20 27 75 27 2c 20      },.  { 'u', 
1210: 20 31 30 2c 20 20 22 30 31 32 33 34 35 36 37 38   10,  "012345678
1220: 39 22 2c 20 20 20 20 20 20 20 30 2c 20 20 20 20  9",       0,    
1230: 30 2c 20 65 74 52 41 44 49 58 2c 20 20 20 20 20  0, etRADIX,     
1240: 20 7d 2c 0a 20 20 7b 20 27 78 27 2c 20 20 31 36   },.  { 'x',  16
1250: 2c 20 20 22 30 31 32 33 34 35 36 37 38 39 61 62  ,  "0123456789ab
1260: 63 64 65 66 22 2c 20 30 2c 20 22 78 30 22 2c 20  cdef", 0, "x0", 
1270: 65 74 52 41 44 49 58 2c 20 20 20 20 20 20 7d 2c  etRADIX,      },
1280: 0a 20 20 7b 20 27 58 27 2c 20 20 31 36 2c 20 20  .  { 'X',  16,  
1290: 22 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45  "0123456789ABCDE
12a0: 46 22 2c 20 30 2c 20 22 58 30 22 2c 20 65 74 52  F", 0, "X0", etR
12b0: 41 44 49 58 2c 20 20 20 20 20 20 7d 2c 0a 20 20  ADIX,      },.  
12c0: 7b 20 27 72 27 2c 20 20 31 30 2c 20 20 22 30 31  { 'r',  10,  "01
12d0: 32 33 34 35 36 37 38 39 22 2c 20 20 20 20 20 20  23456789",      
12e0: 20 30 2c 20 20 20 20 30 2c 20 65 74 4f 52 44 49   0,    0, etORDI
12f0: 4e 41 4c 2c 20 20 20 20 7d 2c 0a 20 20 7b 20 27  NAL,    },.  { '
1300: 66 27 2c 20 20 20 30 2c 20 20 30 2c 20 20 20 20  f',   0,  0,    
1310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
1320: 20 20 20 20 30 2c 20 65 74 46 4c 4f 41 54 2c 20      0, etFLOAT, 
1330: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 27 65 27 2c       },.  { 'e',
1340: 20 20 20 30 2c 20 20 22 65 22 2c 20 20 20 20 20     0,  "e",     
1350: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 20 20             1,   
1360: 20 30 2c 20 65 74 45 58 50 2c 20 20 20 20 20 20   0, etEXP,      
1370: 20 20 7d 2c 0a 20 20 7b 20 27 45 27 2c 20 20 20    },.  { 'E',   
1380: 30 2c 20 20 22 45 22 2c 20 20 20 20 20 20 20 20  0,  "E",        
1390: 20 20 20 20 20 20 20 20 31 2c 20 20 20 20 30 2c          1,    0,
13a0: 20 65 74 45 58 50 2c 20 20 20 20 20 20 20 20 7d   etEXP,        }
13b0: 2c 0a 20 20 7b 20 27 67 27 2c 20 20 20 30 2c 20  ,.  { 'g',   0, 
13c0: 20 22 65 22 2c 20 20 20 20 20 20 20 20 20 20 20   "e",           
13d0: 20 20 20 20 20 31 2c 20 20 20 20 30 2c 20 65 74       1,    0, et
13e0: 47 45 4e 45 52 49 43 2c 20 20 20 20 7d 2c 0a 20  GENERIC,    },. 
13f0: 20 7b 20 27 47 27 2c 20 20 20 30 2c 20 20 22 45   { 'G',   0,  "E
1400: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
1410: 20 20 31 2c 20 20 20 20 30 2c 20 65 74 47 45 4e    1,    0, etGEN
1420: 45 52 49 43 2c 20 20 20 20 7d 2c 0a 20 20 7b 20  ERIC,    },.  { 
1430: 27 69 27 2c 20 20 31 30 2c 20 20 22 30 31 32 33  'i',  10,  "0123
1440: 34 35 36 37 38 39 22 2c 20 20 20 20 20 20 20 31  456789",       1
1450: 2c 20 20 20 20 30 2c 20 65 74 52 41 44 49 58 2c  ,    0, etRADIX,
1460: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 27 6e 27        },.  { 'n'
1470: 2c 20 20 20 30 2c 20 20 30 2c 20 20 20 20 20 20  ,   0,  0,      
1480: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 20              0,  
1490: 20 20 30 2c 20 65 74 53 49 5a 45 2c 20 20 20 20    0, etSIZE,    
14a0: 20 20 20 7d 2c 0a 20 20 7b 20 27 25 27 2c 20 20     },.  { '%',  
14b0: 20 30 2c 20 20 30 2c 20 20 20 20 20 20 20 20 20   0,  0,         
14c0: 20 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 30           0,    0
14d0: 2c 20 65 74 50 45 52 43 45 4e 54 2c 20 20 20 20  , etPERCENT,    
14e0: 7d 2c 0a 20 20 7b 20 27 62 27 2c 20 20 20 32 2c  },.  { 'b',   2,
14f0: 20 20 22 30 31 22 2c 20 20 20 20 20 20 20 20 20    "01",         
1500: 20 20 20 20 20 20 30 2c 20 22 62 30 22 2c 20 65        0, "b0", e
1510: 74 52 41 44 49 58 2c 20 20 20 20 20 20 7d 2c 20  tRADIX,      }, 
1520: 2f 2a 20 42 69 6e 61 72 79 20 2a 2f 0a 20 20 7b  /* Binary */.  {
1530: 20 27 70 27 2c 20 20 31 30 2c 20 20 22 30 31 32   'p',  10,  "012
1540: 33 34 35 36 37 38 39 22 2c 20 20 20 20 20 20 20  3456789",       
1550: 30 2c 20 20 20 20 30 2c 20 65 74 52 41 44 49 58  0,    0, etRADIX
1560: 2c 20 20 20 20 20 20 7d 2c 20 2f 2a 20 50 6f 69  ,      }, /* Poi
1570: 6e 74 65 72 73 20 2a 2f 0a 20 20 7b 20 27 5c 27  nters */.  { '\'
1580: 27 2c 20 20 30 2c 20 20 30 2c 20 20 20 20 20 20  ',  0,  0,      
1590: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 20              0,  
15a0: 20 20 30 2c 20 65 74 43 48 41 52 4c 49 54 2c 20    0, etCHARLIT, 
15b0: 20 20 20 7d 2c 20 2f 2a 20 4c 69 74 65 72 61 6c     }, /* Literal
15c0: 20 63 68 61 72 20 2a 2f 0a 7d 3b 0a 23 64 65 66   char */.};.#def
15d0: 69 6e 65 20 65 74 4e 49 4e 46 4f 20 20 28 73 69  ine etNINFO  (si
15e0: 7a 65 6f 66 28 66 6d 74 69 6e 66 6f 29 2f 73 69  zeof(fmtinfo)/si
15f0: 7a 65 6f 66 28 66 6d 74 69 6e 66 6f 5b 30 5d 29  zeof(fmtinfo[0])
1600: 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 4e 4f 46 4c  )../*.** If NOFL
1610: 4f 41 54 49 4e 47 50 4f 49 4e 54 20 69 73 20 64  OATINGPOINT is d
1620: 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6e 6f 6e  efined, then non
1630: 65 20 6f 66 20 74 68 65 20 66 6c 6f 61 74 69 6e  e of the floatin
1640: 67 20 70 6f 69 6e 74 0a 2a 2a 20 63 6f 6e 76 65  g point.** conve
1650: 72 73 69 6f 6e 73 20 77 69 6c 6c 20 77 6f 72 6b  rsions will work
1660: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 65 74 4e  ..*/.#ifndef etN
1670: 4f 46 4c 4f 41 54 49 4e 47 50 4f 49 4e 54 0a 2f  OFLOATINGPOINT./
1680: 2a 0a 2a 2a 20 22 2a 76 61 6c 22 20 69 73 20 61  *.** "*val" is a
1690: 20 64 6f 75 62 6c 65 20 73 75 63 68 20 74 68 61   double such tha
16a0: 74 20 30 2e 31 20 3c 3d 20 2a 76 61 6c 20 3c 20  t 0.1 <= *val < 
16b0: 31 30 2e 30 0a 2a 2a 20 52 65 74 75 72 6e 20 74  10.0.** Return t
16c0: 68 65 20 61 73 63 69 69 20 63 6f 64 65 20 66 6f  he ascii code fo
16d0: 72 20 74 68 65 20 6c 65 61 64 69 6e 67 20 64 69  r the leading di
16e0: 67 69 74 20 6f 66 20 2a 76 61 6c 2c 20 74 68 65  git of *val, the
16f0: 6e 0a 2a 2a 20 6d 75 6c 74 69 70 6c 79 20 22 2a  n.** multiply "*
1700: 76 61 6c 22 20 62 79 20 31 30 2e 30 20 74 6f 20  val" by 10.0 to 
1710: 72 65 6e 6f 72 6d 61 6c 69 7a 65 2e 0a 2a 2a 0a  renormalize..**.
1720: 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 20 20  ** Example:.**  
1730: 20 20 20 69 6e 70 75 74 3a 20 20 20 20 20 2a 76     input:     *v
1740: 61 6c 20 3d 20 33 2e 31 34 31 35 39 0a 2a 2a 20  al = 3.14159.** 
1750: 20 20 20 20 6f 75 74 70 75 74 3a 20 20 20 20 2a      output:    *
1760: 76 61 6c 20 3d 20 31 2e 34 31 35 39 20 20 20 20  val = 1.4159    
1770: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20  function return 
1780: 3d 20 27 33 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20  = '3'.**.** The 
1790: 63 6f 75 6e 74 65 72 20 2a 63 6e 74 20 69 73 20  counter *cnt is 
17a0: 69 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68  incremented each
17b0: 20 74 69 6d 65 2e 20 20 41 66 74 65 72 20 63 6f   time.  After co
17c0: 75 6e 74 65 72 20 65 78 63 65 65 64 73 0a 2a 2a  unter exceeds.**
17d0: 20 31 36 20 28 74 68 65 20 6e 75 6d 62 65 72 20   16 (the number 
17e0: 6f 66 20 73 69 67 6e 69 66 69 63 61 6e 74 20 64  of significant d
17f0: 69 67 69 74 73 20 69 6e 20 61 20 36 34 2d 62 69  igits in a 64-bi
1800: 74 20 66 6c 6f 61 74 29 20 27 30 27 20 69 73 0a  t float) '0' is.
1810: 2a 2a 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  ** always return
1820: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1830: 74 20 65 74 5f 67 65 74 64 69 67 69 74 28 4c 4f  t et_getdigit(LO
1840: 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 2a 76  NGDOUBLE_TYPE *v
1850: 61 6c 2c 20 69 6e 74 20 2a 63 6e 74 29 7b 0a 20  al, int *cnt){. 
1860: 20 69 6e 74 20 64 69 67 69 74 3b 0a 20 20 4c 4f   int digit;.  LO
1870: 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 64 3b  NGDOUBLE_TYPE d;
1880: 0a 20 20 69 66 28 20 28 2a 63 6e 74 29 2b 2b 20  .  if( (*cnt)++ 
1890: 3e 3d 20 31 36 20 29 20 72 65 74 75 72 6e 20 27  >= 16 ) return '
18a0: 30 27 3b 0a 20 20 64 69 67 69 74 20 3d 20 28 69  0';.  digit = (i
18b0: 6e 74 29 2a 76 61 6c 3b 0a 20 20 64 20 3d 20 64  nt)*val;.  d = d
18c0: 69 67 69 74 3b 0a 20 20 64 69 67 69 74 20 2b 3d  igit;.  digit +=
18d0: 20 27 30 27 3b 0a 20 20 2a 76 61 6c 20 3d 20 28   '0';.  *val = (
18e0: 2a 76 61 6c 20 2d 20 64 29 2a 31 30 2e 30 3b 0a  *val - d)*10.0;.
18f0: 20 20 72 65 74 75 72 6e 20 64 69 67 69 74 3b 0a    return digit;.
1900: 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  }.#endif..#defin
1910: 65 20 65 74 42 55 46 53 49 5a 45 20 31 30 30 30  e etBUFSIZE 1000
1920: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1930: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   output buffer *
1940: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f  /../*.** The roo
1950: 74 20 70 72 6f 67 72 61 6d 2e 20 20 41 6c 6c 20  t program.  All 
1960: 76 61 72 69 61 74 69 6f 6e 73 20 63 61 6c 6c 20  variations call 
1970: 74 68 69 73 20 63 6f 72 65 2e 0a 2a 2a 0a 2a 2a  this core..**.**
1980: 20 49 4e 50 55 54 53 3a 0a 2a 2a 20 20 20 66 75   INPUTS:.**   fu
1990: 6e 63 20 20 20 54 68 69 73 20 69 73 20 61 20 70  nc   This is a p
19a0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
19b0: 74 69 6f 6e 20 74 61 6b 69 6e 67 20 74 68 72 65  tion taking thre
19c0: 65 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2a 20 20  e arguments.**  
19d0: 20 20 20 20 20 20 20 20 20 20 31 2e 20 41 20 70            1. A p
19e0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 74 68 69  ointer to anythi
19f0: 6e 67 2e 20 20 53 61 6d 65 20 61 73 20 74 68 65  ng.  Same as the
1a00: 20 22 61 72 67 22 20 70 61 72 61 6d 65 74 65 72   "arg" parameter
1a10: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
1a20: 32 2e 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  2. A pointer to 
1a30: 74 68 65 20 6c 69 73 74 20 6f 66 20 63 68 61 72  the list of char
1a40: 61 63 74 65 72 73 20 74 6f 20 62 65 20 6f 75 74  acters to be out
1a50: 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
1a60: 20 20 20 20 20 28 4e 6f 74 65 2c 20 74 68 69 73       (Note, this
1a70: 20 6c 69 73 74 20 69 73 20 4e 4f 54 20 6e 75 6c   list is NOT nul
1a80: 6c 20 74 65 72 6d 69 6e 61 74 65 64 2e 29 0a 2a  l terminated.).*
1a90: 2a 20 20 20 20 20 20 20 20 20 20 20 20 33 2e 20  *            3. 
1aa0: 41 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65  An integer numbe
1ab0: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
1ac0: 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 2a 2a  to be output..**
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1ae0: 4e 6f 74 65 3a 20 54 68 69 73 20 6e 75 6d 62 65  Note: This numbe
1af0: 72 20 6d 69 67 68 74 20 62 65 20 7a 65 72 6f 2e  r might be zero.
1b00: 29 0a 2a 2a 0a 2a 2a 20 20 20 61 72 67 20 20 20  ).**.**   arg   
1b10: 20 54 68 69 73 20 69 73 20 74 68 65 20 70 6f 69   This is the poi
1b20: 6e 74 65 72 20 74 6f 20 61 6e 79 74 68 69 6e 67  nter to anything
1b30: 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65 20 70   which will be p
1b40: 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20  assed as the.** 
1b50: 20 20 20 20 20 20 20 20 20 66 69 72 73 74 20 61           first a
1b60: 72 67 75 6d 65 6e 74 20 74 6f 20 22 66 75 6e 63  rgument to "func
1b70: 22 2e 20 20 55 73 65 20 69 74 20 66 6f 72 20 77  ".  Use it for w
1b80: 68 61 74 65 76 65 72 20 79 6f 75 20 6c 69 6b 65  hatever you like
1b90: 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 6d 74 20 20 20  ..**.**   fmt   
1ba0: 20 54 68 69 73 20 69 73 20 74 68 65 20 66 6f 72   This is the for
1bb0: 6d 61 74 20 73 74 72 69 6e 67 2c 20 61 73 20 69  mat string, as i
1bc0: 6e 20 74 68 65 20 75 73 75 61 6c 20 70 72 69 6e  n the usual prin
1bd0: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 61 70 20 20 20  t..**.**   ap   
1be0: 20 20 54 68 69 73 20 69 73 20 61 20 70 6f 69 6e    This is a poin
1bf0: 74 65 72 20 74 6f 20 61 20 6c 69 73 74 20 6f 66  ter to a list of
1c00: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 53 61 6d   arguments.  Sam
1c10: 65 20 61 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20  e as in.**      
1c20: 20 20 20 20 76 66 70 72 69 6e 74 2e 0a 2a 2a 0a      vfprint..**.
1c30: 2a 2a 20 4f 55 54 50 55 54 53 3a 0a 2a 2a 20 20  ** OUTPUTS:.**  
1c40: 20 20 20 20 20 20 20 20 54 68 65 20 72 65 74 75          The retu
1c50: 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
1c60: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
1c70: 63 68 61 72 61 63 74 65 72 73 20 73 65 6e 74 20  characters sent 
1c80: 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74  to.**          t
1c90: 68 65 20 66 75 6e 63 74 69 6f 6e 20 22 66 75 6e  he function "fun
1ca0: 63 22 2e 20 20 52 65 74 75 72 6e 73 20 2d 31 20  c".  Returns -1 
1cb0: 6f 6e 20 61 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  on a error..**.*
1cc0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
1cd0: 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 61  order in which a
1ce0: 75 74 6f 6d 61 74 69 63 20 76 61 72 69 61 62 6c  utomatic variabl
1cf0: 65 73 20 61 72 65 20 64 65 63 6c 61 72 65 64 20  es are declared 
1d00: 62 65 6c 6f 77 0a 2a 2a 20 73 65 65 6d 73 20 74  below.** seems t
1d10: 6f 20 6d 61 6b 65 20 61 20 62 69 67 20 64 69 66  o make a big dif
1d20: 66 65 72 65 6e 63 65 20 69 6e 20 64 65 74 65 72  ference in deter
1d30: 6d 69 6e 69 6e 67 20 68 6f 77 20 66 61 73 74 20  mining how fast 
1d40: 74 68 69 73 20 62 65 61 73 74 0a 2a 2a 20 77 69  this beast.** wi
1d50: 6c 6c 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ll run..*/.stati
1d60: 63 20 69 6e 74 20 76 78 70 72 69 6e 74 66 28 0a  c int vxprintf(.
1d70: 20 20 76 6f 69 64 20 28 2a 66 75 6e 63 29 28 76    void (*func)(v
1d80: 6f 69 64 2a 2c 63 68 61 72 2a 2c 69 6e 74 29 2c  oid*,char*,int),
1d90: 0a 20 20 76 6f 69 64 20 2a 61 72 67 2c 0a 20 20  .  void *arg,.  
1da0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6f 72 6d  const char *form
1db0: 61 74 2c 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  at,.  va_list ap
1dc0: 0a 29 7b 0a 20 20 72 65 67 69 73 74 65 72 20 63  .){.  register c
1dd0: 6f 6e 73 74 20 63 68 61 72 20 2a 66 6d 74 3b 20  onst char *fmt; 
1de0: 2f 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 73 74  /* The format st
1df0: 72 69 6e 67 2e 20 2a 2f 0a 20 20 72 65 67 69 73  ring. */.  regis
1e00: 74 65 72 20 69 6e 74 20 63 3b 20 20 20 20 20 20  ter int c;      
1e10: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 63 68 61       /* Next cha
1e20: 72 61 63 74 65 72 20 69 6e 20 74 68 65 20 66 6f  racter in the fo
1e30: 72 6d 61 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20  rmat string */. 
1e40: 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a   register char *
1e50: 62 75 66 70 74 3b 20 20 20 20 20 2f 2a 20 50 6f  bufpt;     /* Po
1e60: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6e  inter to the con
1e70: 76 65 72 73 69 6f 6e 20 62 75 66 66 65 72 20 2a  version buffer *
1e80: 2f 0a 20 20 72 65 67 69 73 74 65 72 20 69 6e 74  /.  register int
1e90: 20 20 70 72 65 63 69 73 69 6f 6e 3b 20 20 2f 2a    precision;  /*
1ea0: 20 50 72 65 63 69 73 69 6f 6e 20 6f 66 20 74 68   Precision of th
1eb0: 65 20 63 75 72 72 65 6e 74 20 66 69 65 6c 64 20  e current field 
1ec0: 2a 2f 0a 20 20 72 65 67 69 73 74 65 72 20 69 6e  */.  register in
1ed0: 74 20 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 2f  t  length;     /
1ee0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
1ef0: 66 69 65 6c 64 20 2a 2f 0a 20 20 72 65 67 69 73  field */.  regis
1f00: 74 65 72 20 69 6e 74 20 20 69 64 78 3b 20 20 20  ter int  idx;   
1f10: 20 20 20 20 20 2f 2a 20 41 20 67 65 6e 65 72 61       /* A genera
1f20: 6c 20 70 75 72 70 6f 73 65 20 6c 6f 6f 70 20 63  l purpose loop c
1f30: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
1f40: 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  count;          
1f50: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
1f60: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
1f70: 65 72 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  ers output */.  
1f80: 69 6e 74 20 77 69 64 74 68 3b 20 20 20 20 20 20  int width;      
1f90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 64            /* Wid
1fa0: 74 68 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  th of the curren
1fb0: 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74  t field */.  int
1fc0: 20 66 6c 61 67 5f 6c 65 66 74 6a 75 73 74 69 66   flag_leftjustif
1fd0: 79 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  y;     /* True i
1fe0: 66 20 22 2d 22 20 66 6c 61 67 20 69 73 20 70 72  f "-" flag is pr
1ff0: 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 66  esent */.  int f
2000: 6c 61 67 5f 70 6c 75 73 73 69 67 6e 3b 20 20 20  lag_plussign;   
2010: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2020: 22 2b 22 20 66 6c 61 67 20 69 73 20 70 72 65 73  "+" flag is pres
2030: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ent */.  int fla
2040: 67 5f 62 6c 61 6e 6b 73 69 67 6e 3b 20 20 20 20  g_blanksign;    
2050: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 22 20     /* True if " 
2060: 22 20 66 6c 61 67 20 69 73 20 70 72 65 73 65 6e  " flag is presen
2070: 74 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 5f  t */.  int flag_
2080: 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d 3b 20 20  alternateform;  
2090: 20 2f 2a 20 54 72 75 65 20 69 66 20 22 23 22 20   /* True if "#" 
20a0: 66 6c 61 67 20 69 73 20 70 72 65 73 65 6e 74 20  flag is present 
20b0: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 5f 7a 65  */.  int flag_ze
20c0: 72 6f 70 61 64 3b 20 20 20 20 20 20 20 20 20 2f  ropad;         /
20d0: 2a 20 54 72 75 65 20 69 66 20 66 69 65 6c 64 20  * True if field 
20e0: 77 69 64 74 68 20 63 6f 6e 73 74 61 6e 74 20 73  width constant s
20f0: 74 61 72 74 73 20 77 69 74 68 20 7a 65 72 6f 20  tarts with zero 
2100: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 5f 6c 6f  */.  int flag_lo
2110: 6e 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ng;            /
2120: 2a 20 54 72 75 65 20 69 66 20 22 6c 22 20 66 6c  * True if "l" fl
2130: 61 67 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  ag is present */
2140: 0a 20 20 69 6e 74 20 66 6c 61 67 5f 63 65 6e 74  .  int flag_cent
2150: 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  er;          /* 
2160: 54 72 75 65 20 69 66 20 22 3d 22 20 66 6c 61 67  True if "=" flag
2170: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
2180: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
2190: 6f 6e 67 76 61 6c 75 65 3b 20 20 2f 2a 20 56 61  ongvalue;  /* Va
21a0: 6c 75 65 20 66 6f 72 20 69 6e 74 65 67 65 72 20  lue for integer 
21b0: 74 79 70 65 73 20 2a 2f 0a 20 20 4c 4f 4e 47 44  types */.  LONGD
21c0: 4f 55 42 4c 45 5f 54 59 50 45 20 72 65 61 6c 76  OUBLE_TYPE realv
21d0: 61 6c 75 65 3b 20 2f 2a 20 56 61 6c 75 65 20 66  alue; /* Value f
21e0: 6f 72 20 72 65 61 6c 20 74 79 70 65 73 20 2a 2f  or real types */
21f0: 0a 20 20 65 74 5f 69 6e 66 6f 20 2a 69 6e 66 6f  .  et_info *info
2200: 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
2210: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  Pointer to the a
2220: 70 70 72 6f 70 72 69 61 74 65 20 69 6e 66 6f 20  ppropriate info 
2230: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 63  structure */.  c
2240: 68 61 72 20 62 75 66 5b 65 74 42 55 46 53 49 5a  har buf[etBUFSIZ
2250: 45 5d 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  E];      /* Conv
2260: 65 72 73 69 6f 6e 20 62 75 66 66 65 72 20 2a 2f  ersion buffer */
2270: 0a 20 20 63 68 61 72 20 70 72 65 66 69 78 3b 20  .  char prefix; 
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2290: 50 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72  Prefix character
22a0: 2e 20 20 22 2b 22 20 6f 72 20 22 2d 22 20 6f 72  .  "+" or "-" or
22b0: 20 22 20 22 20 6f 72 20 27 5c 30 27 2e 20 2a 2f   " " or '\0'. */
22c0: 0a 20 20 69 6e 74 20 20 65 72 72 6f 72 66 6c 61  .  int  errorfla
22d0: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  g = 0;       /* 
22e0: 54 72 75 65 20 69 66 20 61 6e 20 65 72 72 6f 72  True if an error
22f0: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
2300: 2a 2f 0a 20 20 65 6e 75 6d 20 65 74 5f 74 79 70  */.  enum et_typ
2310: 65 20 78 74 79 70 65 3b 20 20 20 20 20 20 20 2f  e xtype;       /
2320: 2a 20 43 6f 6e 76 65 72 73 69 6f 6e 20 70 61 72  * Conversion par
2330: 61 64 69 67 6d 20 2a 2f 0a 20 20 63 68 61 72 20  adigm */.  char 
2340: 2a 7a 45 78 74 72 61 3b 20 20 20 20 20 20 20 20  *zExtra;        
2350: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 6d 65       /* Extra me
2360: 6d 6f 72 79 20 75 73 65 64 20 66 6f 72 20 65 74  mory used for et
2370: 54 43 4c 45 53 43 41 50 45 20 63 6f 6e 76 65 72  TCLESCAPE conver
2380: 73 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 61 74 69  sions */.  stati
2390: 63 20 63 68 61 72 20 73 70 61 63 65 73 5b 5d 20  c char spaces[] 
23a0: 3d 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  = "             
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d0: 20 20 20 20 20 22 0a 20 20 20 20 20 22 20 20 20       ".     "   
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 20 20 20 22 3b 0a 23 64 65 66 69 6e 65 20 65 74     ";.#define et
2430: 53 50 41 43 45 53 49 5a 45 20 28 73 69 7a 65 6f  SPACESIZE (sizeo
2440: 66 28 73 70 61 63 65 73 29 2d 31 29 0a 23 69 66  f(spaces)-1).#if
2450: 6e 64 65 66 20 65 74 4e 4f 46 4c 4f 41 54 49 4e  ndef etNOFLOATIN
2460: 47 50 4f 49 4e 54 0a 20 20 69 6e 74 20 20 65 78  GPOINT.  int  ex
2470: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
2480: 20 20 20 2f 2a 20 65 78 70 6f 6e 65 6e 74 20 6f     /* exponent o
2490: 66 20 72 65 61 6c 20 6e 75 6d 62 65 72 73 20 2a  f real numbers *
24a0: 2f 0a 20 20 64 6f 75 62 6c 65 20 72 6f 75 6e 64  /.  double round
24b0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er;           /*
24c0: 20 55 73 65 64 20 66 6f 72 20 72 6f 75 6e 64 69   Used for roundi
24d0: 6e 67 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ng floating poin
24e0: 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  t values */.  in
24f0: 74 20 66 6c 61 67 5f 64 70 3b 20 20 20 20 20 20  t flag_dp;      
2500: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2510: 69 66 20 64 65 63 69 6d 61 6c 20 70 6f 69 6e 74  if decimal point
2520: 20 73 68 6f 75 6c 64 20 62 65 20 73 68 6f 77 6e   should be shown
2530: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 5f 72   */.  int flag_r
2540: 74 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tz;             
2550: 2f 2a 20 54 72 75 65 20 69 66 20 74 72 61 69 6c  /* True if trail
2560: 69 6e 67 20 7a 65 72 6f 73 20 73 68 6f 75 6c 64  ing zeros should
2570: 20 62 65 20 72 65 6d 6f 76 65 64 20 2a 2f 0a 20   be removed */. 
2580: 20 69 6e 74 20 66 6c 61 67 5f 65 78 70 3b 20 20   int flag_exp;  
2590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
25a0: 75 65 20 74 6f 20 66 6f 72 63 65 20 64 69 73 70  ue to force disp
25b0: 6c 61 79 20 6f 66 20 74 68 65 20 65 78 70 6f 6e  lay of the expon
25c0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 73 64  ent */.  int nsd
25d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
25f0: 73 69 67 6e 69 66 69 63 61 6e 74 20 64 69 67 69  significant digi
2600: 74 73 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 23  ts returned */.#
2610: 65 6e 64 69 66 0a 0a 20 20 66 6d 74 20 3d 20 66  endif..  fmt = f
2620: 6f 72 6d 61 74 3b 20 20 20 20 20 20 20 20 20 20  ormat;          
2630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
2640: 74 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 20  t in a register 
2650: 66 6f 72 20 73 70 65 65 64 20 2a 2f 0a 20 20 63  for speed */.  c
2660: 6f 75 6e 74 20 3d 20 6c 65 6e 67 74 68 20 3d 20  ount = length = 
2670: 30 3b 0a 20 20 62 75 66 70 74 20 3d 20 30 3b 0a  0;.  bufpt = 0;.
2680: 20 20 66 6f 72 28 3b 20 28 63 3d 28 2a 66 6d 74    for(; (c=(*fmt
2690: 29 29 21 3d 30 3b 20 2b 2b 66 6d 74 29 7b 0a 20  ))!=0; ++fmt){. 
26a0: 20 20 20 69 66 28 20 63 21 3d 27 25 27 20 29 7b     if( c!='%' ){
26b0: 0a 20 20 20 20 20 20 72 65 67 69 73 74 65 72 20  .      register 
26c0: 69 6e 74 20 61 6d 74 3b 0a 20 20 20 20 20 20 62  int amt;.      b
26d0: 75 66 70 74 20 3d 20 28 63 68 61 72 20 2a 29 66  ufpt = (char *)f
26e0: 6d 74 3b 0a 20 20 20 20 20 20 61 6d 74 20 3d 20  mt;.      amt = 
26f0: 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  1;.      while( 
2700: 28 63 3d 28 2a 2b 2b 66 6d 74 29 29 21 3d 27 25  (c=(*++fmt))!='%
2710: 27 20 26 26 20 63 21 3d 30 20 29 20 61 6d 74 2b  ' && c!=0 ) amt+
2720: 2b 3b 0a 20 20 20 20 20 20 28 2a 66 75 6e 63 29  +;.      (*func)
2730: 28 61 72 67 2c 62 75 66 70 74 2c 61 6d 74 29 3b  (arg,bufpt,amt);
2740: 0a 20 20 20 20 20 20 63 6f 75 6e 74 20 2b 3d 20  .      count += 
2750: 61 6d 74 3b 0a 20 20 20 20 20 20 69 66 28 20 63  amt;.      if( c
2760: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
2770: 20 7d 0a 20 20 20 20 69 66 28 20 28 63 3d 28 2a   }.    if( (c=(*
2780: 2b 2b 66 6d 74 29 29 3d 3d 30 20 29 7b 0a 20 20  ++fmt))==0 ){.  
2790: 20 20 20 20 65 72 72 6f 72 66 6c 61 67 20 3d 20      errorflag = 
27a0: 31 3b 0a 20 20 20 20 20 20 28 2a 66 75 6e 63 29  1;.      (*func)
27b0: 28 61 72 67 2c 22 25 22 2c 31 29 3b 0a 20 20 20  (arg,"%",1);.   
27c0: 20 20 20 63 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20     count++;.    
27d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
27e0: 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77     /* Find out w
27f0: 68 61 74 20 66 6c 61 67 73 20 61 72 65 20 70 72  hat flags are pr
2800: 65 73 65 6e 74 20 2a 2f 0a 20 20 20 20 66 6c 61  esent */.    fla
2810: 67 5f 6c 65 66 74 6a 75 73 74 69 66 79 20 3d 20  g_leftjustify = 
2820: 66 6c 61 67 5f 70 6c 75 73 73 69 67 6e 20 3d 20  flag_plussign = 
2830: 66 6c 61 67 5f 62 6c 61 6e 6b 73 69 67 6e 20 3d  flag_blanksign =
2840: 20 0a 20 20 20 20 20 66 6c 61 67 5f 61 6c 74 65   .     flag_alte
2850: 72 6e 61 74 65 66 6f 72 6d 20 3d 20 66 6c 61 67  rnateform = flag
2860: 5f 7a 65 72 6f 70 61 64 20 3d 20 66 6c 61 67 5f  _zeropad = flag_
2870: 63 65 6e 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  center = 0;.    
2880: 64 6f 7b 0a 20 20 20 20 20 20 73 77 69 74 63 68  do{.      switch
2890: 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ( c ){.        c
28a0: 61 73 65 20 27 2d 27 3a 20 20 20 66 6c 61 67 5f  ase '-':   flag_
28b0: 6c 65 66 74 6a 75 73 74 69 66 79 20 3d 20 31 3b  leftjustify = 1;
28c0: 20 20 20 20 20 63 20 3d 20 30 3b 20 20 20 62 72       c = 0;   br
28d0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
28e0: 65 20 27 2b 27 3a 20 20 20 66 6c 61 67 5f 70 6c  e '+':   flag_pl
28f0: 75 73 73 69 67 6e 20 3d 20 31 3b 20 20 20 20 20  ussign = 1;     
2900: 20 20 20 63 20 3d 20 30 3b 20 20 20 62 72 65 61     c = 0;   brea
2910: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
2920: 27 20 27 3a 20 20 20 66 6c 61 67 5f 62 6c 61 6e  ' ':   flag_blan
2930: 6b 73 69 67 6e 20 3d 20 31 3b 20 20 20 20 20 20  ksign = 1;      
2940: 20 63 20 3d 20 30 3b 20 20 20 62 72 65 61 6b 3b   c = 0;   break;
2950: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 23  .        case '#
2960: 27 3a 20 20 20 66 6c 61 67 5f 61 6c 74 65 72 6e  ':   flag_altern
2970: 61 74 65 66 6f 72 6d 20 3d 20 31 3b 20 20 20 63  ateform = 1;   c
2980: 20 3d 20 30 3b 20 20 20 62 72 65 61 6b 3b 0a 20   = 0;   break;. 
2990: 20 20 20 20 20 20 20 63 61 73 65 20 27 30 27 3a         case '0':
29a0: 20 20 20 66 6c 61 67 5f 7a 65 72 6f 70 61 64 20     flag_zeropad 
29b0: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 63 20 3d  = 1;         c =
29c0: 20 30 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20   0;   break;.   
29d0: 20 20 20 20 20 63 61 73 65 20 27 3d 27 3a 20 20       case '=':  
29e0: 20 66 6c 61 67 5f 63 65 6e 74 65 72 20 3d 20 31   flag_center = 1
29f0: 3b 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30  ;          c = 0
2a00: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
2a10: 20 20 20 64 65 66 61 75 6c 74 3a 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 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2a50: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 63 3d 3d  .    }while( c==
2a60: 30 20 26 26 20 28 63 3d 28 2a 2b 2b 66 6d 74 29  0 && (c=(*++fmt)
2a70: 29 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )!=0 );.    if( 
2a80: 66 6c 61 67 5f 63 65 6e 74 65 72 20 29 20 66 6c  flag_center ) fl
2a90: 61 67 5f 6c 65 66 74 6a 75 73 74 69 66 79 20 3d  ag_leftjustify =
2aa0: 20 30 3b 0a 20 20 20 20 2f 2a 20 47 65 74 20 74   0;.    /* Get t
2ab0: 68 65 20 66 69 65 6c 64 20 77 69 64 74 68 20 2a  he field width *
2ac0: 2f 0a 20 20 20 20 77 69 64 74 68 20 3d 20 30 3b  /.    width = 0;
2ad0: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2a 27 20  .    if( c=='*' 
2ae0: 29 7b 0a 20 20 20 20 20 20 77 69 64 74 68 20 3d  ){.      width =
2af0: 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b   va_arg(ap,int);
2b00: 0a 20 20 20 20 20 20 69 66 28 20 77 69 64 74 68  .      if( width
2b10: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c  <0 ){.        fl
2b20: 61 67 5f 6c 65 66 74 6a 75 73 74 69 66 79 20 3d  ag_leftjustify =
2b30: 20 31 3b 0a 20 20 20 20 20 20 20 20 77 69 64 74   1;.        widt
2b40: 68 20 3d 20 2d 77 69 64 74 68 3b 0a 20 20 20 20  h = -width;.    
2b50: 20 20 7d 0a 20 20 20 20 20 20 63 20 3d 20 2a 2b    }.      c = *+
2b60: 2b 66 6d 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  +fmt;.    }else{
2b70: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 3e  .      while( c>
2b80: 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29  ='0' && c<='9' )
2b90: 7b 0a 20 20 20 20 20 20 20 20 77 69 64 74 68 20  {.        width 
2ba0: 3d 20 77 69 64 74 68 2a 31 30 20 2b 20 63 20 2d  = width*10 + c -
2bb0: 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 63 20   '0';.        c 
2bc0: 3d 20 2a 2b 2b 66 6d 74 3b 0a 20 20 20 20 20 20  = *++fmt;.      
2bd0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2be0: 77 69 64 74 68 20 3e 20 65 74 42 55 46 53 49 5a  width > etBUFSIZ
2bf0: 45 2d 31 30 20 29 7b 0a 20 20 20 20 20 20 77 69  E-10 ){.      wi
2c00: 64 74 68 20 3d 20 65 74 42 55 46 53 49 5a 45 2d  dth = etBUFSIZE-
2c10: 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  10;.    }.    /*
2c20: 20 47 65 74 20 74 68 65 20 70 72 65 63 69 73 69   Get the precisi
2c30: 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d  on */.    if( c=
2c40: 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 70 72  ='.' ){.      pr
2c50: 65 63 69 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 20  ecision = 0;.   
2c60: 20 20 20 63 20 3d 20 2a 2b 2b 66 6d 74 3b 0a 20     c = *++fmt;. 
2c70: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2a 27 20       if( c=='*' 
2c80: 29 7b 0a 20 20 20 20 20 20 20 20 70 72 65 63 69  ){.        preci
2c90: 73 69 6f 6e 20 3d 20 76 61 5f 61 72 67 28 61 70  sion = va_arg(ap
2ca0: 2c 69 6e 74 29 3b 0a 23 69 66 6e 64 65 66 20 65  ,int);.#ifndef e
2cb0: 74 43 4f 4d 50 41 54 49 42 49 4c 49 54 59 0a 20  tCOMPATIBILITY. 
2cc0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69         /* This i
2cd0: 73 20 73 65 6e 73 69 62 6c 65 2c 20 62 75 74 20  s sensible, but 
2ce0: 53 55 4e 20 4f 53 20 34 2e 31 20 64 6f 65 73 6e  SUN OS 4.1 doesn
2cf0: 27 74 20 64 6f 20 69 74 2e 20 2a 2f 0a 20 20 20  't do it. */.   
2d00: 20 20 20 20 20 69 66 28 20 70 72 65 63 69 73 69       if( precisi
2d10: 6f 6e 3c 30 20 29 20 70 72 65 63 69 73 69 6f 6e  on<0 ) precision
2d20: 20 3d 20 2d 70 72 65 63 69 73 69 6f 6e 3b 0a 23   = -precision;.#
2d30: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 63 20  endif.        c 
2d40: 3d 20 2a 2b 2b 66 6d 74 3b 0a 20 20 20 20 20 20  = *++fmt;.      
2d50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77  }else{.        w
2d60: 68 69 6c 65 28 20 63 3e 3d 27 30 27 20 26 26 20  hile( c>='0' && 
2d70: 63 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 20 20  c<='9' ){.      
2d80: 20 20 20 20 70 72 65 63 69 73 69 6f 6e 20 3d 20      precision = 
2d90: 70 72 65 63 69 73 69 6f 6e 2a 31 30 20 2b 20 63  precision*10 + c
2da0: 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20   - '0';.        
2db0: 20 20 63 20 3d 20 2a 2b 2b 66 6d 74 3b 0a 20 20    c = *++fmt;.  
2dc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2dd0: 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 74        /* Limit t
2de0: 68 65 20 70 72 65 63 69 73 69 6f 6e 20 74 6f 20  he precision to 
2df0: 70 72 65 76 65 6e 74 20 6f 76 65 72 66 6c 6f 77  prevent overflow
2e00: 69 6e 67 20 62 75 66 5b 5d 20 64 75 72 69 6e 67  ing buf[] during
2e10: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 2a 2f 0a 20   conversion */. 
2e20: 20 20 20 20 20 69 66 28 20 70 72 65 63 69 73 69       if( precisi
2e30: 6f 6e 3e 65 74 42 55 46 53 49 5a 45 2d 34 30 20  on>etBUFSIZE-40 
2e40: 29 20 70 72 65 63 69 73 69 6f 6e 20 3d 20 65 74  ) precision = et
2e50: 42 55 46 53 49 5a 45 2d 34 30 3b 0a 20 20 20 20  BUFSIZE-40;.    
2e60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 72 65  }else{.      pre
2e70: 63 69 73 69 6f 6e 20 3d 20 2d 31 3b 0a 20 20 20  cision = -1;.   
2e80: 20 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68   }.    /* Get th
2e90: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 79 70  e conversion typ
2ea0: 65 20 6d 6f 64 69 66 69 65 72 20 2a 2f 0a 20 20  e modifier */.  
2eb0: 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 29 7b 0a    if( c=='l' ){.
2ec0: 20 20 20 20 20 20 66 6c 61 67 5f 6c 6f 6e 67 20        flag_long 
2ed0: 3d 20 31 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a  = 1;.      c = *
2ee0: 2b 2b 66 6d 74 3b 0a 20 20 20 20 7d 65 6c 73 65  ++fmt;.    }else
2ef0: 7b 0a 20 20 20 20 20 20 66 6c 61 67 5f 6c 6f 6e  {.      flag_lon
2f00: 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 0;.    }.   
2f10: 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e   /* Fetch the in
2f20: 66 6f 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  fo entry for the
2f30: 20 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20 69 6e   field */.    in
2f40: 66 6f 70 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  fop = 0;.    for
2f50: 28 69 64 78 3d 30 3b 20 69 64 78 3c 65 74 4e 49  (idx=0; idx<etNI
2f60: 4e 46 4f 3b 20 69 64 78 2b 2b 29 7b 0a 20 20 20  NFO; idx++){.   
2f70: 20 20 20 69 66 28 20 63 3d 3d 66 6d 74 69 6e 66     if( c==fmtinf
2f80: 6f 5b 69 64 78 5d 2e 66 6d 74 74 79 70 65 20 29  o[idx].fmttype )
2f90: 7b 0a 20 20 20 20 20 20 20 20 69 6e 66 6f 70 20  {.        infop 
2fa0: 3d 20 26 66 6d 74 69 6e 66 6f 5b 69 64 78 5d 3b  = &fmtinfo[idx];
2fb0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2fc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2fd0: 20 20 2f 2a 20 4e 6f 20 69 6e 66 6f 20 65 6e 74    /* No info ent
2fe0: 72 79 20 66 6f 75 6e 64 2e 20 20 49 74 20 6d 75  ry found.  It mu
2ff0: 73 74 20 62 65 20 61 6e 20 65 72 72 6f 72 2e 20  st be an error. 
3000: 2a 2f 0a 20 20 20 20 69 66 28 20 69 6e 66 6f 70  */.    if( infop
3010: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 78 74 79  ==0 ){.      xty
3020: 70 65 20 3d 20 65 74 45 52 52 4f 52 3b 0a 20 20  pe = etERROR;.  
3030: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 78    }else{.      x
3040: 74 79 70 65 20 3d 20 69 6e 66 6f 70 2d 3e 74 79  type = infop->ty
3050: 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 45  pe;.    }.    zE
3060: 78 74 72 61 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  xtra = 0;..    /
3070: 2a 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73  *.    ** At this
3080: 20 70 6f 69 6e 74 2c 20 76 61 72 69 61 62 6c 65   point, variable
3090: 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
30a0: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
30b0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 66 6c    **.    **   fl
30c0: 61 67 5f 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d  ag_alternateform
30d0: 20 20 20 20 20 20 20 20 20 20 54 52 55 45 20 69            TRUE i
30e0: 66 20 61 20 27 23 27 20 69 73 20 70 72 65 73 65  f a '#' is prese
30f0: 6e 74 2e 0a 20 20 20 20 2a 2a 20 20 20 66 6c 61  nt..    **   fla
3100: 67 5f 70 6c 75 73 73 69 67 6e 20 20 20 20 20 20  g_plussign      
3110: 20 20 20 20 20 20 20 20 20 54 52 55 45 20 69 66           TRUE if
3120: 20 61 20 27 2b 27 20 69 73 20 70 72 65 73 65 6e   a '+' is presen
3130: 74 2e 0a 20 20 20 20 2a 2a 20 20 20 66 6c 61 67  t..    **   flag
3140: 5f 6c 65 66 74 6a 75 73 74 69 66 79 20 20 20 20  _leftjustify    
3150: 20 20 20 20 20 20 20 20 54 52 55 45 20 69 66 20          TRUE if 
3160: 61 20 27 2d 27 20 69 73 20 70 72 65 73 65 6e 74  a '-' is present
3170: 20 6f 72 20 69 66 20 74 68 65 0a 20 20 20 20 2a   or if the.    *
3180: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a0: 66 69 65 6c 64 20 77 69 64 74 68 20 77 61 73 20  field width was 
31b0: 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2a  negative..    **
31c0: 20 20 20 66 6c 61 67 5f 7a 65 72 6f 70 61 64 20     flag_zeropad 
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
31e0: 52 55 45 20 69 66 20 74 68 65 20 77 69 64 74 68  RUE if the width
31f0: 20 62 65 67 61 6e 20 77 69 74 68 20 30 2e 0a 20   began with 0.. 
3200: 20 20 20 2a 2a 20 20 20 66 6c 61 67 5f 6c 6f 6e     **   flag_lon
3210: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
3220: 20 20 20 20 54 52 55 45 20 69 66 20 74 68 65 20      TRUE if the 
3230: 6c 65 74 74 65 72 20 27 6c 27 20 28 65 6c 6c 29  letter 'l' (ell)
3240: 20 70 72 65 66 69 78 65 64 0a 20 20 20 20 2a 2a   prefixed.    **
3250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
3270: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 63 68  he conversion ch
3280: 61 72 61 63 74 65 72 2e 0a 20 20 20 20 2a 2a 20  aracter..    ** 
3290: 20 20 66 6c 61 67 5f 62 6c 61 6e 6b 73 69 67 6e    flag_blanksign
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 52                TR
32b0: 55 45 20 69 66 20 61 20 27 20 27 20 69 73 20 70  UE if a ' ' is p
32c0: 72 65 73 65 6e 74 2e 0a 20 20 20 20 2a 2a 20 20  resent..    **  
32d0: 20 77 69 64 74 68 20 20 20 20 20 20 20 20 20 20   width          
32e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65               The
32f0: 20 73 70 65 63 69 66 69 65 64 20 66 69 65 6c 64   specified field
3300: 20 77 69 64 74 68 2e 20 20 54 68 69 73 20 69 73   width.  This is
3310: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
3320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3330: 20 20 20 20 20 20 61 6c 77 61 79 73 20 6e 6f 6e        always non
3340: 2d 6e 65 67 61 74 69 76 65 2e 20 20 5a 65 72 6f  -negative.  Zero
3350: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
3360: 0a 20 20 20 20 2a 2a 20 20 20 70 72 65 63 69 73  .    **   precis
3370: 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
3380: 20 20 20 20 20 20 54 68 65 20 73 70 65 63 69 66        The specif
3390: 69 65 64 20 70 72 65 63 69 73 69 6f 6e 2e 20 20  ied precision.  
33a0: 54 68 65 20 64 65 66 61 75 6c 74 0a 20 20 20 20  The default.    
33b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 20 69 73 20 2d 31 2e 0a 20 20 20 20 2a 2a 20 20   is -1..    **  
33e0: 20 78 74 79 70 65 20 20 20 20 20 20 20 20 20 20   xtype          
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65               The
3400: 20 63 6c 61 73 73 20 6f 66 20 74 68 65 20 63 6f   class of the co
3410: 6e 76 65 72 73 69 6f 6e 2e 0a 20 20 20 20 2a 2a  nversion..    **
3420: 20 20 20 69 6e 66 6f 70 20 20 20 20 20 20 20 20     infop        
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
3440: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 70  ointer to the ap
3450: 70 72 6f 70 72 69 61 74 65 20 69 6e 66 6f 20 73  propriate info s
3460: 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  truct..    */.  
3470: 20 20 73 77 69 74 63 68 28 20 78 74 79 70 65 20    switch( xtype 
3480: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 65 74  ){.      case et
3490: 4f 52 44 49 4e 41 4c 3a 0a 20 20 20 20 20 20 63  ORDINAL:.      c
34a0: 61 73 65 20 65 74 52 41 44 49 58 3a 0a 20 20 20  ase etRADIX:.   
34b0: 20 20 20 20 20 69 66 28 20 66 6c 61 67 5f 6c 6f       if( flag_lo
34c0: 6e 67 20 29 20 20 6c 6f 6e 67 76 61 6c 75 65 20  ng )  longvalue 
34d0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 6c 6f 6e 67  = va_arg(ap,long
34e0: 29 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20  );.        else 
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 6e 67              long
3500: 76 61 6c 75 65 20 3d 20 76 61 5f 61 72 67 28 61  value = va_arg(a
3510: 70 2c 69 6e 74 29 3b 0a 23 69 66 64 65 66 20 65  p,int);.#ifdef e
3520: 74 43 4f 4d 50 41 54 49 42 49 4c 49 54 59 0a 20  tCOMPATIBILITY. 
3530: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 74 68         /* For th
3540: 65 20 66 6f 72 6d 61 74 20 25 23 78 2c 20 74 68  e format %#x, th
3550: 65 20 76 61 6c 75 65 20 7a 65 72 6f 20 69 73 20  e value zero is 
3560: 70 72 69 6e 74 65 64 20 22 30 22 20 6e 6f 74 20  printed "0" not 
3570: 22 30 78 30 22 2e 0a 20 20 20 20 20 20 20 20 2a  "0x0"..        *
3580: 2a 20 49 20 74 68 69 6e 6b 20 74 68 69 73 20 69  * I think this i
3590: 73 20 73 74 75 70 69 64 2e 20 2a 2f 0a 20 20 20  s stupid. */.   
35a0: 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 76 61 6c       if( longval
35b0: 75 65 3d 3d 30 20 29 20 66 6c 61 67 5f 61 6c 74  ue==0 ) flag_alt
35c0: 65 72 6e 61 74 65 66 6f 72 6d 20 3d 20 30 3b 0a  ernateform = 0;.
35d0: 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 2f 2a  #else.        /*
35e0: 20 4d 6f 72 65 20 73 65 6e 73 69 62 6c 65 3a 20   More sensible: 
35f0: 74 75 72 6e 20 6f 66 66 20 74 68 65 20 70 72 65  turn off the pre
3600: 66 69 78 20 66 6f 72 20 6f 63 74 61 6c 20 28 74  fix for octal (t
3610: 6f 20 70 72 65 76 65 6e 74 20 22 30 30 22 29 2c  o prevent "00"),
3620: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 75 74 20  .        ** but 
3630: 6c 65 61 76 65 20 74 68 65 20 70 72 65 66 69 78  leave the prefix
3640: 20 66 6f 72 20 68 65 78 2e 20 2a 2f 0a 20 20 20   for hex. */.   
3650: 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 76 61 6c       if( longval
3660: 75 65 3d 3d 30 20 26 26 20 69 6e 66 6f 70 2d 3e  ue==0 && infop->
3670: 62 61 73 65 3d 3d 38 20 29 20 66 6c 61 67 5f 61  base==8 ) flag_a
3680: 6c 74 65 72 6e 61 74 65 66 6f 72 6d 20 3d 20 30  lternateform = 0
3690: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
36a0: 20 69 66 28 20 69 6e 66 6f 70 2d 3e 66 6c 61 67   if( infop->flag
36b0: 5f 73 69 67 6e 65 64 20 29 7b 0a 20 20 20 20 20  _signed ){.     
36c0: 20 20 20 20 20 69 66 28 20 2a 28 6c 6f 6e 67 2a       if( *(long*
36d0: 29 26 6c 6f 6e 67 76 61 6c 75 65 3c 30 20 29 7b  )&longvalue<0 ){
36e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 6e  .            lon
36f0: 67 76 61 6c 75 65 20 3d 20 2d 2a 28 6c 6f 6e 67  gvalue = -*(long
3700: 2a 29 26 6c 6f 6e 67 76 61 6c 75 65 3b 0a 20 20  *)&longvalue;.  
3710: 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78            prefix
3720: 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20   = '-';.        
3730: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
3740: 5f 70 6c 75 73 73 69 67 6e 20 29 20 20 70 72 65  _plussign )  pre
3750: 66 69 78 20 3d 20 27 2b 27 3b 0a 20 20 20 20 20  fix = '+';.     
3760: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 66 6c       else if( fl
3770: 61 67 5f 62 6c 61 6e 6b 73 69 67 6e 20 29 20 20  ag_blanksign )  
3780: 70 72 65 66 69 78 20 3d 20 27 20 27 3b 0a 20 20  prefix = ' ';.  
3790: 20 20 20 20 20 20 20 20 65 6c 73 65 20 20 20 20          else    
37a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b0: 20 20 20 70 72 65 66 69 78 20 3d 20 30 3b 0a 20     prefix = 0;. 
37c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 20 20 20         }else    
37d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e0: 20 20 20 20 70 72 65 66 69 78 20 3d 20 30 3b 0a      prefix = 0;.
37f0: 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67          if( flag
3800: 5f 7a 65 72 6f 70 61 64 20 26 26 20 70 72 65 63  _zeropad && prec
3810: 69 73 69 6f 6e 3c 77 69 64 74 68 2d 28 70 72 65  ision<width-(pre
3820: 66 69 78 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  fix!=0) ){.     
3830: 20 20 20 20 20 70 72 65 63 69 73 69 6f 6e 20 3d       precision =
3840: 20 77 69 64 74 68 2d 28 70 72 65 66 69 78 21 3d   width-(prefix!=
3850: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
3860: 20 20 20 20 20 20 62 75 66 70 74 20 3d 20 26 62        bufpt = &b
3870: 75 66 5b 65 74 42 55 46 53 49 5a 45 5d 3b 0a 20  uf[etBUFSIZE];. 
3880: 20 20 20 20 20 20 20 69 66 28 20 78 74 79 70 65         if( xtype
3890: 3d 3d 65 74 4f 52 44 49 4e 41 4c 20 29 7b 0a 20  ==etORDINAL ){. 
38a0: 20 20 20 20 20 20 20 20 20 6c 6f 6e 67 20 61 2c           long a,
38b0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d  b;.          a =
38c0: 20 6c 6f 6e 67 76 61 6c 75 65 25 31 30 3b 0a 20   longvalue%10;. 
38d0: 20 20 20 20 20 20 20 20 20 62 20 3d 20 6c 6f 6e           b = lon
38e0: 67 76 61 6c 75 65 25 31 30 30 3b 0a 20 20 20 20  gvalue%100;.    
38f0: 20 20 20 20 20 20 62 75 66 70 74 20 2d 3d 20 32        bufpt -= 2
3900: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
3910: 61 3d 3d 30 20 7c 7c 20 61 3e 33 20 7c 7c 20 28  a==0 || a>3 || (
3920: 62 3e 31 30 20 26 26 20 62 3c 31 34 29 20 29 7b  b>10 && b<14) ){
3930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66  .            buf
3940: 70 74 5b 30 5d 20 3d 20 27 74 27 3b 0a 20 20 20  pt[0] = 't';.   
3950: 20 20 20 20 20 20 20 20 20 62 75 66 70 74 5b 31           bufpt[1
3960: 5d 20 3d 20 27 68 27 3b 0a 20 20 20 20 20 20 20  ] = 'h';.       
3970: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 3d 3d     }else if( a==
3980: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
3990: 20 62 75 66 70 74 5b 30 5d 20 3d 20 27 73 27 3b   bufpt[0] = 's';
39a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66  .            buf
39b0: 70 74 5b 31 5d 20 3d 20 27 74 27 3b 0a 20 20 20  pt[1] = 't';.   
39c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
39d0: 20 61 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20   a==2 ){.       
39e0: 20 20 20 20 20 62 75 66 70 74 5b 30 5d 20 3d 20       bufpt[0] = 
39f0: 27 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  'n';.           
3a00: 20 62 75 66 70 74 5b 31 5d 20 3d 20 27 64 27 3b   bufpt[1] = 'd';
3a10: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
3a20: 20 69 66 28 20 61 3d 3d 33 20 29 7b 0a 20 20 20   if( a==3 ){.   
3a30: 20 20 20 20 20 20 20 20 20 62 75 66 70 74 5b 30           bufpt[0
3a40: 5d 20 3d 20 27 72 27 3b 0a 20 20 20 20 20 20 20  ] = 'r';.       
3a50: 20 20 20 20 20 62 75 66 70 74 5b 31 5d 20 3d 20       bufpt[1] = 
3a60: 27 64 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  'd';.          }
3a70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3a80: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72     {.          r
3a90: 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 63 73  egister char *cs
3aa0: 65 74 3b 20 20 20 20 20 20 2f 2a 20 55 73 65 20  et;      /* Use 
3ab0: 72 65 67 69 73 74 65 72 73 20 66 6f 72 20 73 70  registers for sp
3ac0: 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  eed */.         
3ad0: 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 62 61   register int ba
3ae0: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 63 73  se;.          cs
3af0: 65 74 20 3d 20 69 6e 66 6f 70 2d 3e 63 68 61 72  et = infop->char
3b00: 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62  set;.          b
3b10: 61 73 65 20 3d 20 69 6e 66 6f 70 2d 3e 62 61 73  ase = infop->bas
3b20: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 7b  e;.          do{
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3b60: 6e 76 65 72 74 20 74 6f 20 61 73 63 69 69 20 2a  nvert to ascii *
3b70: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 28  /.            *(
3b80: 2d 2d 62 75 66 70 74 29 20 3d 20 63 73 65 74 5b  --bufpt) = cset[
3b90: 6c 6f 6e 67 76 61 6c 75 65 25 62 61 73 65 5d 3b  longvalue%base];
3ba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 6e  .            lon
3bb0: 67 76 61 6c 75 65 20 3d 20 6c 6f 6e 67 76 61 6c  gvalue = longval
3bc0: 75 65 2f 62 61 73 65 3b 0a 20 20 20 20 20 20 20  ue/base;.       
3bd0: 20 20 20 7d 77 68 69 6c 65 28 20 6c 6f 6e 67 76     }while( longv
3be0: 61 6c 75 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  alue>0 );.      
3bf0: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 65 6e 67    }.        leng
3c00: 74 68 20 3d 20 26 62 75 66 5b 65 74 42 55 46 53  th = &buf[etBUFS
3c10: 49 5a 45 5d 2d 62 75 66 70 74 3b 0a 20 20 20 20  IZE]-bufpt;.    
3c20: 20 20 20 20 66 6f 72 28 69 64 78 3d 70 72 65 63      for(idx=prec
3c30: 69 73 69 6f 6e 2d 6c 65 6e 67 74 68 3b 20 69 64  ision-length; id
3c40: 78 3e 30 3b 20 69 64 78 2d 2d 29 7b 0a 20 20 20  x>0; idx--){.   
3c50: 20 20 20 20 20 20 20 2a 28 2d 2d 62 75 66 70 74         *(--bufpt
3c60: 29 20 3d 20 27 30 27 3b 20 20 20 20 20 20 20 20  ) = '0';        
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c80: 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 70 61 64       /* Zero pad
3c90: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
3ca0: 20 20 20 20 20 20 69 66 28 20 70 72 65 66 69 78        if( prefix
3cb0: 20 29 20 2a 28 2d 2d 62 75 66 70 74 29 20 3d 20   ) *(--bufpt) = 
3cc0: 70 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20  prefix;         
3cd0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 73 69 67        /* Add sig
3ce0: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  n */.        if(
3cf0: 20 66 6c 61 67 5f 61 6c 74 65 72 6e 61 74 65 66   flag_alternatef
3d00: 6f 72 6d 20 26 26 20 69 6e 66 6f 70 2d 3e 70 72  orm && infop->pr
3d10: 65 66 69 78 20 29 7b 20 20 20 20 20 20 2f 2a 20  efix ){      /* 
3d20: 41 64 64 20 22 30 22 20 6f 72 20 22 30 78 22 20  Add "0" or "0x" 
3d30: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  */.          cha
3d40: 72 20 2a 70 72 65 2c 20 78 3b 0a 20 20 20 20 20  r *pre, x;.     
3d50: 20 20 20 20 20 70 72 65 20 3d 20 69 6e 66 6f 70       pre = infop
3d60: 2d 3e 70 72 65 66 69 78 3b 0a 20 20 20 20 20 20  ->prefix;.      
3d70: 20 20 20 20 69 66 28 20 2a 62 75 66 70 74 21 3d      if( *bufpt!=
3d80: 70 72 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  pre[0] ){.      
3d90: 20 20 20 20 20 20 66 6f 72 28 70 72 65 3d 69 6e        for(pre=in
3da0: 66 6f 70 2d 3e 70 72 65 66 69 78 3b 20 28 78 3d  fop->prefix; (x=
3db0: 28 2a 70 72 65 29 29 21 3d 30 3b 20 70 72 65 2b  (*pre))!=0; pre+
3dc0: 2b 29 20 2a 28 2d 2d 62 75 66 70 74 29 20 3d 20  +) *(--bufpt) = 
3dd0: 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  x;.          }. 
3de0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3df0: 20 6c 65 6e 67 74 68 20 3d 20 26 62 75 66 5b 65   length = &buf[e
3e00: 74 42 55 46 53 49 5a 45 5d 2d 62 75 66 70 74 3b  tBUFSIZE]-bufpt;
3e10: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3e20: 20 20 20 20 20 20 63 61 73 65 20 65 74 46 4c 4f        case etFLO
3e30: 41 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 65  AT:.      case e
3e40: 74 45 58 50 3a 0a 20 20 20 20 20 20 63 61 73 65  tEXP:.      case
3e50: 20 65 74 47 45 4e 45 52 49 43 3a 0a 20 20 20 20   etGENERIC:.    
3e60: 20 20 20 20 72 65 61 6c 76 61 6c 75 65 20 3d 20      realvalue = 
3e70: 76 61 5f 61 72 67 28 61 70 2c 64 6f 75 62 6c 65  va_arg(ap,double
3e80: 29 3b 0a 23 69 66 6e 64 65 66 20 65 74 4e 4f 46  );.#ifndef etNOF
3e90: 4c 4f 41 54 49 4e 47 50 4f 49 4e 54 0a 20 20 20  LOATINGPOINT.   
3ea0: 20 20 20 20 20 69 66 28 20 70 72 65 63 69 73 69       if( precisi
3eb0: 6f 6e 3c 30 20 29 20 70 72 65 63 69 73 69 6f 6e  on<0 ) precision
3ec0: 20 3d 20 36 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 6;         /*
3ed0: 20 53 65 74 20 64 65 66 61 75 6c 74 20 70 72 65   Set default pre
3ee0: 63 69 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  cision */.      
3ef0: 20 20 69 66 28 20 70 72 65 63 69 73 69 6f 6e 3e    if( precision>
3f00: 65 74 42 55 46 53 49 5a 45 2d 31 30 20 29 20 70  etBUFSIZE-10 ) p
3f10: 72 65 63 69 73 69 6f 6e 20 3d 20 65 74 42 55 46  recision = etBUF
3f20: 53 49 5a 45 2d 31 30 3b 0a 20 20 20 20 20 20 20  SIZE-10;.       
3f30: 20 69 66 28 20 72 65 61 6c 76 61 6c 75 65 3c 30   if( realvalue<0
3f40: 2e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .0 ){.          
3f50: 72 65 61 6c 76 61 6c 75 65 20 3d 20 2d 72 65 61  realvalue = -rea
3f60: 6c 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20  lvalue;.        
3f70: 20 20 70 72 65 66 69 78 20 3d 20 27 2d 27 3b 0a    prefix = '-';.
3f80: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
3f90: 20 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61           if( fla
3fa0: 67 5f 70 6c 75 73 73 69 67 6e 20 29 20 20 20 20  g_plussign )    
3fb0: 20 20 20 20 20 20 70 72 65 66 69 78 20 3d 20 27        prefix = '
3fc0: 2b 27 3b 0a 20 20 20 20 20 20 20 20 20 20 65 6c  +';.          el
3fd0: 73 65 20 69 66 28 20 66 6c 61 67 5f 62 6c 61 6e  se if( flag_blan
3fe0: 6b 73 69 67 6e 20 29 20 20 20 20 70 72 65 66 69  ksign )    prefi
3ff0: 78 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20  x = ' ';.       
4000: 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20     else         
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 70 72 65 66 69 78 20 3d 20 30 3b 0a 20 20 20 20  prefix = 0;.    
4030: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
4040: 28 20 69 6e 66 6f 70 2d 3e 74 79 70 65 3d 3d 65  ( infop->type==e
4050: 74 47 45 4e 45 52 49 43 20 26 26 20 70 72 65 63  tGENERIC && prec
4060: 69 73 69 6f 6e 3e 30 20 29 20 70 72 65 63 69 73  ision>0 ) precis
4070: 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 72  ion--;.        r
4080: 6f 75 6e 64 65 72 20 3d 20 30 2e 30 3b 0a 23 69  ounder = 0.0;.#i
4090: 66 64 65 66 20 43 4f 4d 50 41 54 49 42 49 4c 49  fdef COMPATIBILI
40a0: 54 59 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f  TY.        /* Ro
40b0: 75 6e 64 69 6e 67 20 77 6f 72 6b 73 20 6c 69 6b  unding works lik
40c0: 65 20 42 53 44 20 77 68 65 6e 20 74 68 65 20 63  e BSD when the c
40d0: 6f 6e 73 74 61 6e 74 20 30 2e 34 39 39 39 20 69  onstant 0.4999 i
40e0: 73 20 75 73 65 64 2e 20 20 57 69 65 72 64 21 20  s used.  Wierd! 
40f0: 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
4100: 64 78 3d 70 72 65 63 69 73 69 6f 6e 2c 20 72 6f  dx=precision, ro
4110: 75 6e 64 65 72 3d 30 2e 34 39 39 39 3b 20 69 64  under=0.4999; id
4120: 78 3e 30 3b 20 69 64 78 2d 2d 2c 20 72 6f 75 6e  x>0; idx--, roun
4130: 64 65 72 2a 3d 30 2e 31 29 3b 0a 23 65 6c 73 65  der*=0.1);.#else
4140: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 74 20 6d  .        /* It m
4150: 61 6b 65 73 20 6d 6f 72 65 20 73 65 6e 73 65 20  akes more sense 
4160: 74 6f 20 75 73 65 20 30 2e 35 20 2a 2f 0a 20 20  to use 0.5 */.  
4170: 20 20 20 20 20 20 66 6f 72 28 69 64 78 3d 70 72        for(idx=pr
4180: 65 63 69 73 69 6f 6e 2c 20 72 6f 75 6e 64 65 72  ecision, rounder
4190: 3d 30 2e 35 3b 20 69 64 78 3e 30 3b 20 69 64 78  =0.5; idx>0; idx
41a0: 2d 2d 2c 20 72 6f 75 6e 64 65 72 2a 3d 30 2e 31  --, rounder*=0.1
41b0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
41c0: 20 20 69 66 28 20 69 6e 66 6f 70 2d 3e 74 79 70    if( infop->typ
41d0: 65 3d 3d 65 74 46 4c 4f 41 54 20 29 20 72 65 61  e==etFLOAT ) rea
41e0: 6c 76 61 6c 75 65 20 2b 3d 20 72 6f 75 6e 64 65  lvalue += rounde
41f0: 72 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  r;.        /* No
4200: 72 6d 61 6c 69 7a 65 20 72 65 61 6c 76 61 6c 75  rmalize realvalu
4210: 65 20 74 6f 20 77 69 74 68 69 6e 20 31 30 2e 30  e to within 10.0
4220: 20 3e 20 72 65 61 6c 76 61 6c 75 65 20 3e 3d 20   > realvalue >= 
4230: 31 2e 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 65  1.0 */.        e
4240: 78 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xp = 0;.        
4250: 69 66 28 20 72 65 61 6c 76 61 6c 75 65 3e 30 2e  if( realvalue>0.
4260: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
4270: 6e 74 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt k = 0;.      
4280: 20 20 20 20 77 68 69 6c 65 28 20 72 65 61 6c 76      while( realv
4290: 61 6c 75 65 3e 3d 31 65 38 20 26 26 20 6b 2b 2b  alue>=1e8 && k++
42a0: 3c 31 30 30 20 29 7b 20 72 65 61 6c 76 61 6c 75  <100 ){ realvalu
42b0: 65 20 2a 3d 20 31 65 2d 38 3b 20 65 78 70 2b 3d  e *= 1e-8; exp+=
42c0: 38 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 77  8; }.          w
42d0: 68 69 6c 65 28 20 72 65 61 6c 76 61 6c 75 65 3e  hile( realvalue>
42e0: 3d 31 30 2e 30 20 26 26 20 6b 2b 2b 3c 31 30 30  =10.0 && k++<100
42f0: 20 29 7b 20 72 65 61 6c 76 61 6c 75 65 20 2a 3d   ){ realvalue *=
4300: 20 30 2e 31 3b 20 65 78 70 2b 2b 3b 20 7d 0a 20   0.1; exp++; }. 
4310: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
4320: 72 65 61 6c 76 61 6c 75 65 3c 31 65 2d 38 20 26  realvalue<1e-8 &
4330: 26 20 6b 2b 2b 3c 31 30 30 20 29 7b 20 72 65 61  & k++<100 ){ rea
4340: 6c 76 61 6c 75 65 20 2a 3d 20 31 65 38 3b 20 65  lvalue *= 1e8; e
4350: 78 70 2d 3d 38 3b 20 7d 0a 20 20 20 20 20 20 20  xp-=8; }.       
4360: 20 20 20 77 68 69 6c 65 28 20 72 65 61 6c 76 61     while( realva
4370: 6c 75 65 3c 31 2e 30 20 26 26 20 6b 2b 2b 3c 31  lue<1.0 && k++<1
4380: 30 30 20 29 7b 20 72 65 61 6c 76 61 6c 75 65 20  00 ){ realvalue 
4390: 2a 3d 20 31 30 2e 30 3b 20 65 78 70 2d 2d 3b 20  *= 10.0; exp--; 
43a0: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
43b0: 6b 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20 20 20  k>=100 ){.      
43c0: 20 20 20 20 20 20 62 75 66 70 74 20 3d 20 22 4e        bufpt = "N
43d0: 61 4e 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20  aN";.           
43e0: 20 6c 65 6e 67 74 68 20 3d 20 33 3b 0a 20 20 20   length = 3;.   
43f0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
4400: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4410: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 75      }.        bu
4420: 66 70 74 20 3d 20 62 75 66 3b 0a 20 20 20 20 20  fpt = buf;.     
4430: 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a     /*.        **
4440: 20 49 66 20 74 68 65 20 66 69 65 6c 64 20 74 79   If the field ty
4450: 70 65 20 69 73 20 65 74 47 45 4e 45 52 49 43 2c  pe is etGENERIC,
4460: 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 6f   then convert to
4470: 20 65 69 74 68 65 72 20 65 74 45 58 50 0a 20 20   either etEXP.  
4480: 20 20 20 20 20 20 2a 2a 20 6f 72 20 65 74 46 4c        ** or etFL
4490: 4f 41 54 2c 20 61 73 20 61 70 70 72 6f 70 72 69  OAT, as appropri
44a0: 61 74 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ate..        */.
44b0: 20 20 20 20 20 20 20 20 66 6c 61 67 5f 65 78 70          flag_exp
44c0: 20 3d 20 78 74 79 70 65 3d 3d 65 74 45 58 50 3b   = xtype==etEXP;
44d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 74 79  .        if( xty
44e0: 70 65 21 3d 65 74 46 4c 4f 41 54 20 29 7b 0a 20  pe!=etFLOAT ){. 
44f0: 20 20 20 20 20 20 20 20 20 72 65 61 6c 76 61 6c           realval
4500: 75 65 20 2b 3d 20 72 6f 75 6e 64 65 72 3b 0a 20  ue += rounder;. 
4510: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 61           if( rea
4520: 6c 76 61 6c 75 65 3e 3d 31 30 2e 30 20 29 7b 20  lvalue>=10.0 ){ 
4530: 72 65 61 6c 76 61 6c 75 65 20 2a 3d 20 30 2e 31  realvalue *= 0.1
4540: 3b 20 65 78 70 2b 2b 3b 20 7d 0a 20 20 20 20 20  ; exp++; }.     
4550: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
4560: 20 78 74 79 70 65 3d 3d 65 74 47 45 4e 45 52 49   xtype==etGENERI
4570: 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  C ){.          f
4580: 6c 61 67 5f 72 74 7a 20 3d 20 21 66 6c 61 67 5f  lag_rtz = !flag_
4590: 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d 3b 0a 20  alternateform;. 
45a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 65 78 70           if( exp
45b0: 3c 2d 34 20 7c 7c 20 65 78 70 3e 70 72 65 63 69  <-4 || exp>preci
45c0: 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  sion ){.        
45d0: 20 20 20 20 78 74 79 70 65 20 3d 20 65 74 45 58      xtype = etEX
45e0: 50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  P;.          }el
45f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
4600: 70 72 65 63 69 73 69 6f 6e 20 3d 20 70 72 65 63  precision = prec
4610: 69 73 69 6f 6e 20 2d 20 65 78 70 3b 0a 20 20 20  ision - exp;.   
4620: 20 20 20 20 20 20 20 20 20 78 74 79 70 65 20 3d           xtype =
4630: 20 65 74 46 4c 4f 41 54 3b 0a 20 20 20 20 20 20   etFLOAT;.      
4640: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
4650: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
4660: 6c 61 67 5f 72 74 7a 20 3d 20 30 3b 0a 20 20 20  lag_rtz = 0;.   
4670: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
4680: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  *.        ** The
4690: 20 22 65 78 70 2b 70 72 65 63 69 73 69 6f 6e 22   "exp+precision"
46a0: 20 74 65 73 74 20 63 61 75 73 65 73 20 6f 75 74   test causes out
46b0: 70 75 74 20 74 6f 20 62 65 20 6f 66 20 74 79 70  put to be of typ
46c0: 65 20 65 74 45 58 50 20 69 66 0a 20 20 20 20 20  e etEXP if.     
46d0: 20 20 20 2a 2a 20 74 68 65 20 70 72 65 63 69 73     ** the precis
46e0: 69 6f 6e 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ion is too large
46f0: 20 74 6f 20 66 69 74 20 69 6e 20 62 75 66 5b 5d   to fit in buf[]
4700: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
4710: 20 20 20 20 20 6e 73 64 20 3d 20 30 3b 0a 20 20       nsd = 0;.  
4720: 20 20 20 20 20 20 69 66 28 20 78 74 79 70 65 3d        if( xtype=
4730: 3d 65 74 46 4c 4f 41 54 20 26 26 20 65 78 70 2b  =etFLOAT && exp+
4740: 70 72 65 63 69 73 69 6f 6e 3c 65 74 42 55 46 53  precision<etBUFS
4750: 49 5a 45 2d 33 30 20 29 7b 0a 20 20 20 20 20 20  IZE-30 ){.      
4760: 20 20 20 20 66 6c 61 67 5f 64 70 20 3d 20 28 70      flag_dp = (p
4770: 72 65 63 69 73 69 6f 6e 3e 30 20 7c 7c 20 66 6c  recision>0 || fl
4780: 61 67 5f 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d  ag_alternateform
4790: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
47a0: 20 70 72 65 66 69 78 20 29 20 2a 28 62 75 66 70   prefix ) *(bufp
47b0: 74 2b 2b 29 20 3d 20 70 72 65 66 69 78 3b 20 20  t++) = prefix;  
47c0: 20 20 20 20 20 20 20 2f 2a 20 53 69 67 6e 20 2a         /* Sign *
47d0: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
47e0: 65 78 70 3c 30 20 29 20 20 2a 28 62 75 66 70 74  exp<0 )  *(bufpt
47f0: 2b 2b 29 20 3d 20 27 30 27 3b 20 20 20 20 20 20  ++) = '0';      
4800: 20 20 20 20 20 20 2f 2a 20 44 69 67 69 74 73 20        /* Digits 
4810: 62 65 66 6f 72 65 20 22 2e 22 20 2a 2f 0a 20 20  before "." */.  
4820: 20 20 20 20 20 20 20 20 65 6c 73 65 20 66 6f 72          else for
4830: 28 3b 20 65 78 70 3e 3d 30 3b 20 65 78 70 2d 2d  (; exp>=0; exp--
4840: 29 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20 65  ) *(bufpt++) = e
4850: 74 5f 67 65 74 64 69 67 69 74 28 26 72 65 61 6c  t_getdigit(&real
4860: 76 61 6c 75 65 2c 26 6e 73 64 29 3b 0a 20 20 20  value,&nsd);.   
4870: 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 5f         if( flag_
4880: 64 70 20 29 20 2a 28 62 75 66 70 74 2b 2b 29 20  dp ) *(bufpt++) 
4890: 3d 20 27 2e 27 3b 20 20 20 20 20 20 20 20 20 20  = '.';          
48a0: 20 2f 2a 20 54 68 65 20 64 65 63 69 6d 61 6c 20   /* The decimal 
48b0: 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  point */.       
48c0: 20 20 20 66 6f 72 28 65 78 70 2b 2b 3b 20 65 78     for(exp++; ex
48d0: 70 3c 30 20 26 26 20 70 72 65 63 69 73 69 6f 6e  p<0 && precision
48e0: 3e 30 3b 20 70 72 65 63 69 73 69 6f 6e 2d 2d 2c  >0; precision--,
48f0: 20 65 78 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20   exp++){.       
4900: 20 20 20 20 20 2a 28 62 75 66 70 74 2b 2b 29 20       *(bufpt++) 
4910: 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20  = '0';.         
4920: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 77 68 69   }.          whi
4930: 6c 65 28 20 28 70 72 65 63 69 73 69 6f 6e 2d 2d  le( (precision--
4940: 29 3e 30 20 29 20 2a 28 62 75 66 70 74 2b 2b 29  )>0 ) *(bufpt++)
4950: 20 3d 20 65 74 5f 67 65 74 64 69 67 69 74 28 26   = et_getdigit(&
4960: 72 65 61 6c 76 61 6c 75 65 2c 26 6e 73 64 29 3b  realvalue,&nsd);
4970: 0a 20 20 20 20 20 20 20 20 20 20 2a 28 62 75 66  .          *(buf
4980: 70 74 2d 2d 29 20 3d 20 30 3b 20 20 20 20 20 20  pt--) = 0;      
4990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49a0: 20 20 20 20 20 2f 2a 20 4e 75 6c 6c 20 74 65 72       /* Null ter
49b0: 6d 69 6e 61 74 65 20 2a 2f 0a 20 20 20 20 20 20  minate */.      
49c0: 20 20 20 20 69 66 28 20 66 6c 61 67 5f 72 74 7a      if( flag_rtz
49d0: 20 26 26 20 66 6c 61 67 5f 64 70 20 29 7b 20 20   && flag_dp ){  
49e0: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 72 61     /* Remove tra
49f0: 69 6c 69 6e 67 20 7a 65 72 6f 73 20 61 6e 64 20  iling zeros and 
4a00: 22 2e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  "." */.         
4a10: 20 20 20 77 68 69 6c 65 28 20 62 75 66 70 74 3e     while( bufpt>
4a20: 3d 62 75 66 20 26 26 20 2a 62 75 66 70 74 3d 3d  =buf && *bufpt==
4a30: 27 30 27 20 29 20 2a 28 62 75 66 70 74 2d 2d 29  '0' ) *(bufpt--)
4a40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
4a50: 20 20 69 66 28 20 62 75 66 70 74 3e 3d 62 75 66    if( bufpt>=buf
4a60: 20 26 26 20 2a 62 75 66 70 74 3d 3d 27 2e 27 20   && *bufpt=='.' 
4a70: 29 20 2a 28 62 75 66 70 74 2d 2d 29 20 3d 20 30  ) *(bufpt--) = 0
4a80: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
4a90: 20 20 20 20 20 20 20 20 62 75 66 70 74 2b 2b 3b          bufpt++;
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
4ac0: 6f 69 6e 74 20 74 6f 20 6e 65 78 74 20 66 72 65  oint to next fre
4ad0: 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20  e slot */.      
4ae0: 20 20 7d 65 6c 73 65 7b 20 20 20 20 2f 2a 20 65    }else{    /* e
4af0: 74 45 58 50 20 6f 72 20 65 74 47 45 4e 45 52 49  tEXP or etGENERI
4b00: 43 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66  C */.          f
4b10: 6c 61 67 5f 64 70 20 3d 20 28 70 72 65 63 69 73  lag_dp = (precis
4b20: 69 6f 6e 3e 30 20 7c 7c 20 66 6c 61 67 5f 61 6c  ion>0 || flag_al
4b30: 74 65 72 6e 61 74 65 66 6f 72 6d 29 3b 0a 20 20  ternateform);.  
4b40: 20 20 20 20 20 20 20 20 69 66 28 20 70 72 65 66          if( pref
4b50: 69 78 20 29 20 2a 28 62 75 66 70 74 2b 2b 29 20  ix ) *(bufpt++) 
4b60: 3d 20 70 72 65 66 69 78 3b 20 20 20 2f 2a 20 53  = prefix;   /* S
4b70: 69 67 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ign */.         
4b80: 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20 65 74   *(bufpt++) = et
4b90: 5f 67 65 74 64 69 67 69 74 28 26 72 65 61 6c 76  _getdigit(&realv
4ba0: 61 6c 75 65 2c 26 6e 73 64 29 3b 20 20 2f 2a 20  alue,&nsd);  /* 
4bb0: 46 69 72 73 74 20 64 69 67 69 74 20 2a 2f 0a 20  First digit */. 
4bc0: 20 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61           if( fla
4bd0: 67 5f 64 70 20 29 20 2a 28 62 75 66 70 74 2b 2b  g_dp ) *(bufpt++
4be0: 29 20 3d 20 27 2e 27 3b 20 20 20 20 20 2f 2a 20  ) = '.';     /* 
4bf0: 44 65 63 69 6d 61 6c 20 70 6f 69 6e 74 20 2a 2f  Decimal point */
4c00: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
4c10: 28 20 28 70 72 65 63 69 73 69 6f 6e 2d 2d 29 3e  ( (precision--)>
4c20: 30 20 29 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d  0 ) *(bufpt++) =
4c30: 20 65 74 5f 67 65 74 64 69 67 69 74 28 26 72 65   et_getdigit(&re
4c40: 61 6c 76 61 6c 75 65 2c 26 6e 73 64 29 3b 0a 20  alvalue,&nsd);. 
4c50: 20 20 20 20 20 20 20 20 20 62 75 66 70 74 2d 2d           bufpt--
4c60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4c80: 70 6f 69 6e 74 20 74 6f 20 6c 61 73 74 20 64 69  point to last di
4c90: 67 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  git */.         
4ca0: 20 69 66 28 20 66 6c 61 67 5f 72 74 7a 20 26 26   if( flag_rtz &&
4cb0: 20 66 6c 61 67 5f 64 70 20 29 7b 20 20 20 20 20   flag_dp ){     
4cc0: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
4cd0: 61 69 6c 20 7a 65 72 6f 73 20 2a 2f 0a 20 20 20  ail zeros */.   
4ce0: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
4cf0: 62 75 66 70 74 3e 3d 62 75 66 20 26 26 20 2a 62  bufpt>=buf && *b
4d00: 75 66 70 74 3d 3d 27 30 27 20 29 20 2a 28 62 75  ufpt=='0' ) *(bu
4d10: 66 70 74 2d 2d 29 20 3d 20 30 3b 0a 20 20 20 20  fpt--) = 0;.    
4d20: 20 20 20 20 20 20 20 20 69 66 28 20 62 75 66 70          if( bufp
4d30: 74 3e 3d 62 75 66 20 26 26 20 2a 62 75 66 70 74  t>=buf && *bufpt
4d40: 3d 3d 27 2e 27 20 29 20 2a 28 62 75 66 70 74 2d  =='.' ) *(bufpt-
4d50: 2d 29 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  -) = 0;.        
4d60: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 75    }.          bu
4d70: 66 70 74 2b 2b 3b 20 20 20 20 20 20 20 20 20 20  fpt++;          
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d90: 20 20 2f 2a 20 70 6f 69 6e 74 20 74 6f 20 6e 65    /* point to ne
4da0: 78 74 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  xt free slot */.
4db0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 78            if( ex
4dc0: 70 20 7c 7c 20 66 6c 61 67 5f 65 78 70 20 29 7b  p || flag_exp ){
4dd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 62  .            *(b
4de0: 75 66 70 74 2b 2b 29 20 3d 20 69 6e 66 6f 70 2d  ufpt++) = infop-
4df0: 3e 63 68 61 72 73 65 74 5b 30 5d 3b 0a 20 20 20  >charset[0];.   
4e00: 20 20 20 20 20 20 20 20 20 69 66 28 20 65 78 70           if( exp
4e10: 3c 30 20 29 7b 20 2a 28 62 75 66 70 74 2b 2b 29  <0 ){ *(bufpt++)
4e20: 20 3d 20 27 2d 27 3b 20 65 78 70 20 3d 20 2d 65   = '-'; exp = -e
4e30: 78 70 3b 20 7d 20 2f 2a 20 73 69 67 6e 20 6f 66  xp; } /* sign of
4e40: 20 65 78 70 20 2a 2f 0a 20 20 20 20 20 20 20 20   exp */.        
4e50: 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 7b      else       {
4e60: 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20 27 2b   *(bufpt++) = '+
4e70: 27 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20  '; }.           
4e80: 20 69 66 28 20 65 78 70 3e 3d 31 30 30 20 29 7b   if( exp>=100 ){
4e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
4ea0: 28 62 75 66 70 74 2b 2b 29 20 3d 20 28 65 78 70  (bufpt++) = (exp
4eb0: 2f 31 30 30 29 2b 27 30 27 3b 20 20 20 20 20 20  /100)+'0';      
4ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 30 30            /* 100
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 20 20 65 78 70 20 25 3d            exp %=
4ef0: 20 31 30 30 3b 0a 20 20 20 20 20 20 20 20 20 20   100;.          
4f00: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
4f10: 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20 65 78 70  *(bufpt++) = exp
4f20: 2f 31 30 2b 27 30 27 3b 20 20 20 20 20 20 20 20  /10+'0';        
4f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f40: 31 30 27 73 20 64 69 67 69 74 20 2a 2f 0a 20 20  10's digit */.  
4f50: 20 20 20 20 20 20 20 20 20 20 2a 28 62 75 66 70            *(bufp
4f60: 74 2b 2b 29 20 3d 20 65 78 70 25 31 30 2b 27 30  t++) = exp%10+'0
4f70: 27 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ';              
4f80: 20 20 20 20 20 20 20 2f 2a 20 31 27 73 20 64 69         /* 1's di
4f90: 67 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  git */.         
4fa0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
4fb0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 76       /* The conv
4fc0: 65 72 74 65 64 20 6e 75 6d 62 65 72 20 69 73 20  erted number is 
4fd0: 69 6e 20 62 75 66 5b 5d 20 61 6e 64 20 7a 65 72  in buf[] and zer
4fe0: 6f 20 74 65 72 6d 69 6e 61 74 65 64 2e 20 4f 75  o terminated. Ou
4ff0: 74 70 75 74 20 69 74 2e 0a 20 20 20 20 20 20 20  tput it..       
5000: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
5010: 65 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 74  e number is in t
5020: 68 65 20 75 73 75 61 6c 20 6f 72 64 65 72 2c 20  he usual order, 
5030: 6e 6f 74 20 72 65 76 65 72 73 65 64 20 61 73 20  not reversed as 
5040: 77 69 74 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  with.        ** 
5050: 69 6e 74 65 67 65 72 20 63 6f 6e 76 65 72 73 69  integer conversi
5060: 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ons. */.        
5070: 6c 65 6e 67 74 68 20 3d 20 62 75 66 70 74 2d 62  length = bufpt-b
5080: 75 66 3b 0a 20 20 20 20 20 20 20 20 62 75 66 70  uf;.        bufp
5090: 74 20 3d 20 62 75 66 3b 0a 0a 20 20 20 20 20 20  t = buf;..      
50a0: 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
50b0: 65 3a 20 20 41 64 64 20 6c 65 61 64 69 6e 67 20  e:  Add leading 
50c0: 7a 65 72 6f 73 20 69 66 20 74 68 65 20 66 6c 61  zeros if the fla
50d0: 67 5f 7a 65 72 6f 70 61 64 20 66 6c 61 67 20 69  g_zeropad flag i
50e0: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  s.        ** set
50f0: 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20   and we are not 
5100: 6c 65 66 74 20 6a 75 73 74 69 66 69 65 64 20 2a  left justified *
5110: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c  /.        if( fl
5120: 61 67 5f 7a 65 72 6f 70 61 64 20 26 26 20 21 66  ag_zeropad && !f
5130: 6c 61 67 5f 6c 65 66 74 6a 75 73 74 69 66 79 20  lag_leftjustify 
5140: 26 26 20 6c 65 6e 67 74 68 20 3c 20 77 69 64 74  && length < widt
5150: 68 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  h){.          in
5160: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69  t i;.          i
5170: 6e 74 20 6e 50 61 64 20 3d 20 77 69 64 74 68 20  nt nPad = width 
5180: 2d 20 6c 65 6e 67 74 68 3b 0a 20 20 20 20 20 20  - length;.      
5190: 20 20 20 20 66 6f 72 28 69 3d 77 69 64 74 68 3b      for(i=width;
51a0: 20 69 3e 3d 6e 50 61 64 3b 20 69 2d 2d 29 7b 0a   i>=nPad; i--){.
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66 70              bufp
51c0: 74 5b 69 5d 20 3d 20 62 75 66 70 74 5b 69 2d 6e  t[i] = bufpt[i-n
51d0: 50 61 64 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Pad];.          
51e0: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20  }.          i = 
51f0: 70 72 65 66 69 78 21 3d 30 3b 0a 20 20 20 20 20  prefix!=0;.     
5200: 20 20 20 20 20 77 68 69 6c 65 28 20 6e 50 61 64       while( nPad
5210: 2d 2d 20 29 20 62 75 66 70 74 5b 69 2b 2b 5d 20  -- ) bufpt[i++] 
5220: 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20  = '0';.         
5230: 20 6c 65 6e 67 74 68 20 3d 20 77 69 64 74 68 3b   length = width;
5240: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
5250: 66 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  f.        break;
5260: 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 53 49  .      case etSI
5270: 5a 45 3a 0a 20 20 20 20 20 20 20 20 2a 28 76 61  ZE:.        *(va
5280: 5f 61 72 67 28 61 70 2c 69 6e 74 2a 29 29 20 3d  _arg(ap,int*)) =
5290: 20 63 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20   count;.        
52a0: 6c 65 6e 67 74 68 20 3d 20 77 69 64 74 68 20 3d  length = width =
52b0: 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   0;.        brea
52c0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 65 74  k;.      case et
52d0: 50 45 52 43 45 4e 54 3a 0a 20 20 20 20 20 20 20  PERCENT:.       
52e0: 20 62 75 66 5b 30 5d 20 3d 20 27 25 27 3b 0a 20   buf[0] = '%';. 
52f0: 20 20 20 20 20 20 20 62 75 66 70 74 20 3d 20 62         bufpt = b
5300: 75 66 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e 67  uf;.        leng
5310: 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  th = 1;.        
5320: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
5330: 65 20 65 74 43 48 41 52 4c 49 54 3a 0a 20 20 20  e etCHARLIT:.   
5340: 20 20 20 63 61 73 65 20 65 74 43 48 41 52 58 3a     case etCHARX:
5350: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 62 75 66  .        c = buf
5360: 5b 30 5d 20 3d 20 28 78 74 79 70 65 3d 3d 65 74  [0] = (xtype==et
5370: 43 48 41 52 58 20 3f 20 76 61 5f 61 72 67 28 61  CHARX ? va_arg(a
5380: 70 2c 69 6e 74 29 20 3a 20 2a 2b 2b 66 6d 74 29  p,int) : *++fmt)
5390: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 72  ;.        if( pr
53a0: 65 63 69 73 69 6f 6e 3e 3d 30 20 29 7b 0a 20 20  ecision>=0 ){.  
53b0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 64 78 3d          for(idx=
53c0: 31 3b 20 69 64 78 3c 70 72 65 63 69 73 69 6f 6e  1; idx<precision
53d0: 3b 20 69 64 78 2b 2b 29 20 62 75 66 5b 69 64 78  ; idx++) buf[idx
53e0: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20  ] = c;.         
53f0: 20 6c 65 6e 67 74 68 20 3d 20 70 72 65 63 69 73   length = precis
5400: 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ion;.        }el
5410: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 65  se{.          le
5420: 6e 67 74 68 20 3d 31 3b 0a 20 20 20 20 20 20 20  ngth =1;.       
5430: 20 7d 0a 20 20 20 20 20 20 20 20 62 75 66 70 74   }.        bufpt
5440: 20 3d 20 62 75 66 3b 0a 20 20 20 20 20 20 20 20   = buf;.        
5450: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
5460: 65 20 65 74 53 54 52 49 4e 47 3a 0a 20 20 20 20  e etSTRING:.    
5470: 20 20 63 61 73 65 20 65 74 44 59 4e 53 54 52 49    case etDYNSTRI
5480: 4e 47 3a 0a 20 20 20 20 20 20 20 20 62 75 66 70  NG:.        bufp
5490: 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 63 68  t = va_arg(ap,ch
54a0: 61 72 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ar*);.        if
54b0: 28 20 62 75 66 70 74 3d 3d 30 20 29 7b 0a 20 20  ( bufpt==0 ){.  
54c0: 20 20 20 20 20 20 20 20 62 75 66 70 74 20 3d 20          bufpt = 
54d0: 22 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  "";.        }els
54e0: 65 20 69 66 28 20 78 74 79 70 65 3d 3d 65 74 44  e if( xtype==etD
54f0: 59 4e 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20  YNSTRING ){.    
5500: 20 20 20 20 20 20 7a 45 78 74 72 61 20 3d 20 62        zExtra = b
5510: 75 66 70 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ufpt;.        }.
5520: 20 20 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d          length =
5530: 20 73 74 72 6c 65 6e 28 62 75 66 70 74 29 3b 0a   strlen(bufpt);.
5540: 20 20 20 20 20 20 20 20 69 66 28 20 70 72 65 63          if( prec
5550: 69 73 69 6f 6e 3e 3d 30 20 26 26 20 70 72 65 63  ision>=0 && prec
5560: 69 73 69 6f 6e 3c 6c 65 6e 67 74 68 20 29 20 6c  ision<length ) l
5570: 65 6e 67 74 68 20 3d 20 70 72 65 63 69 73 69 6f  ength = precisio
5580: 6e 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  n;.        break
5590: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 53  ;.      case etS
55a0: 51 4c 45 53 43 41 50 45 3a 0a 20 20 20 20 20 20  QLESCAPE:.      
55b0: 63 61 73 65 20 65 74 53 51 4c 45 53 43 41 50 45  case etSQLESCAPE
55c0: 32 3a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  2:.        {.   
55d0: 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 2c         int i, j,
55e0: 20 6e 2c 20 63 2c 20 69 73 6e 75 6c 6c 3b 0a 20   n, c, isnull;. 
55f0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 61           char *a
5600: 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 63  rg = va_arg(ap,c
5610: 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 20 20 20  har*);.         
5620: 20 69 73 6e 75 6c 6c 20 3d 20 61 72 67 3d 3d 30   isnull = arg==0
5630: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
5640: 69 73 6e 75 6c 6c 20 29 20 61 72 67 20 3d 20 28  isnull ) arg = (
5650: 78 74 79 70 65 3d 3d 65 74 53 51 4c 45 53 43 41  xtype==etSQLESCA
5660: 50 45 32 20 3f 20 22 4e 55 4c 4c 22 20 3a 20 22  PE2 ? "NULL" : "
5670: 28 4e 55 4c 4c 29 22 29 3b 0a 20 20 20 20 20 20  (NULL)");.      
5680: 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 28      for(i=n=0; (
5690: 63 3d 61 72 67 5b 69 5d 29 21 3d 30 3b 20 69 2b  c=arg[i])!=0; i+
56a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
56b0: 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20 20 6e  if( c=='\'' )  n
56c0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
56d0: 20 20 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 69            n += i
56e0: 20 2b 20 31 20 2b 20 28 28 21 69 73 6e 75 6c 6c   + 1 + ((!isnull
56f0: 20 26 26 20 78 74 79 70 65 3d 3d 65 74 53 51 4c   && xtype==etSQL
5700: 45 53 43 41 50 45 32 29 20 3f 20 32 20 3a 20 30  ESCAPE2) ? 2 : 0
5710: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
5720: 20 6e 3e 65 74 42 55 46 53 49 5a 45 20 29 7b 0a   n>etBUFSIZE ){.
5730: 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66 70              bufp
5740: 74 20 3d 20 7a 45 78 74 72 61 20 3d 20 73 71 6c  t = zExtra = sql
5750: 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a  iteMalloc( n );.
5760: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
5770: 62 75 66 70 74 3d 3d 30 20 29 20 72 65 74 75 72  bufpt==0 ) retur
5780: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  n -1;.          
5790: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
57a0: 20 20 20 62 75 66 70 74 20 3d 20 62 75 66 3b 0a     bufpt = buf;.
57b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
57c0: 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20        j = 0;.   
57d0: 20 20 20 20 20 20 20 69 66 28 20 21 69 73 6e 75         if( !isnu
57e0: 6c 6c 20 26 26 20 78 74 79 70 65 3d 3d 65 74 53  ll && xtype==etS
57f0: 51 4c 45 53 43 41 50 45 32 20 29 20 62 75 66 70  QLESCAPE2 ) bufp
5800: 74 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20  t[j++] = '\'';. 
5810: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
5820: 3b 20 28 63 3d 61 72 67 5b 69 5d 29 21 3d 30 3b  ; (c=arg[i])!=0;
5830: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
5840: 20 20 20 62 75 66 70 74 5b 6a 2b 2b 5d 20 3d 20     bufpt[j++] = 
5850: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  c;.            i
5860: 66 28 20 63 3d 3d 27 5c 27 27 20 29 20 62 75 66  f( c=='\'' ) buf
5870: 70 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  pt[j++] = c;.   
5880: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5890: 20 20 20 69 66 28 20 21 69 73 6e 75 6c 6c 20 26     if( !isnull &
58a0: 26 20 78 74 79 70 65 3d 3d 65 74 53 51 4c 45 53  & xtype==etSQLES
58b0: 43 41 50 45 32 20 29 20 62 75 66 70 74 5b 6a 2b  CAPE2 ) bufpt[j+
58c0: 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20  +] = '\'';.     
58d0: 20 20 20 20 20 62 75 66 70 74 5b 6a 5d 20 3d 20       bufpt[j] = 
58e0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e  0;.          len
58f0: 67 74 68 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  gth = j;.       
5900: 20 20 20 69 66 28 20 70 72 65 63 69 73 69 6f 6e     if( precision
5910: 3e 3d 30 20 26 26 20 70 72 65 63 69 73 69 6f 6e  >=0 && precision
5920: 3c 6c 65 6e 67 74 68 20 29 20 6c 65 6e 67 74 68  <length ) length
5930: 20 3d 20 70 72 65 63 69 73 69 6f 6e 3b 0a 20 20   = precision;.  
5940: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5950: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
5960: 65 20 65 74 45 52 52 4f 52 3a 0a 20 20 20 20 20  e etERROR:.     
5970: 20 20 20 62 75 66 5b 30 5d 20 3d 20 27 25 27 3b     buf[0] = '%';
5980: 0a 20 20 20 20 20 20 20 20 62 75 66 5b 31 5d 20  .        buf[1] 
5990: 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 65 72 72  = c;.        err
59a0: 6f 72 66 6c 61 67 20 3d 20 30 3b 0a 20 20 20 20  orflag = 0;.    
59b0: 20 20 20 20 69 64 78 20 3d 20 31 2b 28 63 21 3d      idx = 1+(c!=
59c0: 30 29 3b 0a 20 20 20 20 20 20 20 20 28 2a 66 75  0);.        (*fu
59d0: 6e 63 29 28 61 72 67 2c 22 25 22 2c 69 64 78 29  nc)(arg,"%",idx)
59e0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 75 6e 74 20  ;.        count 
59f0: 2b 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20  += idx;.        
5a00: 69 66 28 20 63 3d 3d 30 20 29 20 66 6d 74 2d 2d  if( c==0 ) fmt--
5a10: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
5a20: 0a 20 20 20 20 7d 2f 2a 20 45 6e 64 20 73 77 69  .    }/* End swi
5a30: 74 63 68 20 6f 76 65 72 20 74 68 65 20 66 6f 72  tch over the for
5a40: 6d 61 74 20 74 79 70 65 20 2a 2f 0a 20 20 20 20  mat type */.    
5a50: 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 65  /*.    ** The te
5a60: 78 74 20 6f 66 20 74 68 65 20 63 6f 6e 76 65 72  xt of the conver
5a70: 73 69 6f 6e 20 69 73 20 70 6f 69 6e 74 65 64 20  sion is pointed 
5a80: 74 6f 20 62 79 20 22 62 75 66 70 74 22 20 61 6e  to by "bufpt" an
5a90: 64 20 69 73 0a 20 20 20 20 2a 2a 20 22 6c 65 6e  d is.    ** "len
5aa0: 67 74 68 22 20 63 68 61 72 61 63 74 65 72 73 20  gth" characters 
5ab0: 6c 6f 6e 67 2e 20 20 54 68 65 20 66 69 65 6c 64  long.  The field
5ac0: 20 77 69 64 74 68 20 69 73 20 22 77 69 64 74 68   width is "width
5ad0: 22 2e 20 20 44 6f 0a 20 20 20 20 2a 2a 20 74 68  ".  Do.    ** th
5ae0: 65 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2f  e output..    */
5af0: 0a 20 20 20 20 69 66 28 20 21 66 6c 61 67 5f 6c  .    if( !flag_l
5b00: 65 66 74 6a 75 73 74 69 66 79 20 29 7b 0a 20 20  eftjustify ){.  
5b10: 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74      register int
5b20: 20 6e 73 70 61 63 65 3b 0a 20 20 20 20 20 20 6e   nspace;.      n
5b30: 73 70 61 63 65 20 3d 20 77 69 64 74 68 2d 6c 65  space = width-le
5b40: 6e 67 74 68 3b 0a 20 20 20 20 20 20 69 66 28 20  ngth;.      if( 
5b50: 6e 73 70 61 63 65 3e 30 20 29 7b 0a 20 20 20 20  nspace>0 ){.    
5b60: 20 20 20 20 69 66 28 20 66 6c 61 67 5f 63 65 6e      if( flag_cen
5b70: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ter ){.         
5b80: 20 6e 73 70 61 63 65 20 3d 20 6e 73 70 61 63 65   nspace = nspace
5b90: 2f 32 3b 0a 20 20 20 20 20 20 20 20 20 20 77 69  /2;.          wi
5ba0: 64 74 68 20 2d 3d 20 6e 73 70 61 63 65 3b 0a 20  dth -= nspace;. 
5bb0: 20 20 20 20 20 20 20 20 20 66 6c 61 67 5f 6c 65           flag_le
5bc0: 66 74 6a 75 73 74 69 66 79 20 3d 20 31 3b 0a 20  ftjustify = 1;. 
5bd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5be0: 20 63 6f 75 6e 74 20 2b 3d 20 6e 73 70 61 63 65   count += nspace
5bf0: 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
5c00: 20 6e 73 70 61 63 65 3e 3d 65 74 53 50 41 43 45   nspace>=etSPACE
5c10: 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
5c20: 20 20 28 2a 66 75 6e 63 29 28 61 72 67 2c 73 70    (*func)(arg,sp
5c30: 61 63 65 73 2c 65 74 53 50 41 43 45 53 49 5a 45  aces,etSPACESIZE
5c40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 73 70  );.          nsp
5c50: 61 63 65 20 2d 3d 20 65 74 53 50 41 43 45 53 49  ace -= etSPACESI
5c60: 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ZE;.        }.  
5c70: 20 20 20 20 20 20 69 66 28 20 6e 73 70 61 63 65        if( nspace
5c80: 3e 30 20 29 20 28 2a 66 75 6e 63 29 28 61 72 67  >0 ) (*func)(arg
5c90: 2c 73 70 61 63 65 73 2c 6e 73 70 61 63 65 29 3b  ,spaces,nspace);
5ca0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5cb0: 20 20 20 69 66 28 20 6c 65 6e 67 74 68 3e 30 20     if( length>0 
5cc0: 29 7b 0a 20 20 20 20 20 20 28 2a 66 75 6e 63 29  ){.      (*func)
5cd0: 28 61 72 67 2c 62 75 66 70 74 2c 6c 65 6e 67 74  (arg,bufpt,lengt
5ce0: 68 29 3b 0a 20 20 20 20 20 20 63 6f 75 6e 74 20  h);.      count 
5cf0: 2b 3d 20 6c 65 6e 67 74 68 3b 0a 20 20 20 20 7d  += length;.    }
5d00: 0a 20 20 20 20 69 66 28 20 66 6c 61 67 5f 6c 65  .    if( flag_le
5d10: 66 74 6a 75 73 74 69 66 79 20 29 7b 0a 20 20 20  ftjustify ){.   
5d20: 20 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20     register int 
5d30: 6e 73 70 61 63 65 3b 0a 20 20 20 20 20 20 6e 73  nspace;.      ns
5d40: 70 61 63 65 20 3d 20 77 69 64 74 68 2d 6c 65 6e  pace = width-len
5d50: 67 74 68 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  gth;.      if( n
5d60: 73 70 61 63 65 3e 30 20 29 7b 0a 20 20 20 20 20  space>0 ){.     
5d70: 20 20 20 63 6f 75 6e 74 20 2b 3d 20 6e 73 70 61     count += nspa
5d80: 63 65 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  ce;.        whil
5d90: 65 28 20 6e 73 70 61 63 65 3e 3d 65 74 53 50 41  e( nspace>=etSPA
5da0: 43 45 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  CESIZE ){.      
5db0: 20 20 20 20 28 2a 66 75 6e 63 29 28 61 72 67 2c      (*func)(arg,
5dc0: 73 70 61 63 65 73 2c 65 74 53 50 41 43 45 53 49  spaces,etSPACESI
5dd0: 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  ZE);.          n
5de0: 73 70 61 63 65 20 2d 3d 20 65 74 53 50 41 43 45  space -= etSPACE
5df0: 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  SIZE;.        }.
5e00: 20 20 20 20 20 20 20 20 69 66 28 20 6e 73 70 61          if( nspa
5e10: 63 65 3e 30 20 29 20 28 2a 66 75 6e 63 29 28 61  ce>0 ) (*func)(a
5e20: 72 67 2c 73 70 61 63 65 73 2c 6e 73 70 61 63 65  rg,spaces,nspace
5e30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5e40: 0a 20 20 20 20 69 66 28 20 7a 45 78 74 72 61 20  .    if( zExtra 
5e50: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 78 74 79  ){.      if( xty
5e60: 70 65 3d 3d 65 74 44 59 4e 53 54 52 49 4e 47 20  pe==etDYNSTRING 
5e70: 29 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 28  ){.        free(
5e80: 7a 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d  zExtra);.      }
5e90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5ea0: 6c 69 74 65 46 72 65 65 28 7a 45 78 74 72 61 29  liteFree(zExtra)
5eb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5ec0: 20 20 7d 2f 2a 20 45 6e 64 20 66 6f 72 20 6c 6f    }/* End for lo
5ed0: 6f 70 20 6f 76 65 72 20 74 68 65 20 66 6f 72 6d  op over the form
5ee0: 61 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 72  at string */.  r
5ef0: 65 74 75 72 6e 20 65 72 72 6f 72 66 6c 61 67 20  eturn errorflag 
5f00: 3f 20 2d 31 20 3a 20 63 6f 75 6e 74 3b 0a 7d 20  ? -1 : count;.} 
5f10: 2f 2a 20 45 6e 64 20 6f 66 20 66 75 6e 63 74 69  /* End of functi
5f20: 6f 6e 20 2a 2f 0a 0a 0a 2f 2a 20 54 68 69 73 20  on */.../* This 
5f30: 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
5f40: 64 20 74 6f 20 73 74 6f 72 65 20 73 74 61 74 65  d to store state
5f50: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
5f60: 75 74 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20  ut the.** write 
5f70: 74 6f 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 69  to memory that i
5f80: 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  s currently in p
5f90: 72 6f 67 72 65 73 73 2e 0a 2a 2f 0a 73 74 72 75  rogress..*/.stru
5fa0: 63 74 20 73 67 4d 70 72 69 6e 74 66 20 7b 0a 20  ct sgMprintf {. 
5fb0: 20 63 68 61 72 20 2a 7a 42 61 73 65 3b 20 20 20   char *zBase;   
5fc0: 20 20 2f 2a 20 41 20 62 61 73 65 20 61 6c 6c 6f    /* A base allo
5fd0: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72  cation */.  char
5fe0: 20 2a 7a 54 65 78 74 3b 20 20 20 20 20 2f 2a 20   *zText;     /* 
5ff0: 54 68 65 20 73 74 72 69 6e 67 20 63 6f 6c 6c 65  The string colle
6000: 63 74 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  cted so far */. 
6010: 20 69 6e 74 20 20 6e 43 68 61 72 3b 20 20 20 20   int  nChar;    
6020: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
6030: 68 65 20 73 74 72 69 6e 67 20 73 6f 20 66 61 72  he string so far
6040: 20 2a 2f 0a 20 20 69 6e 74 20 20 6e 41 6c 6c 6f   */.  int  nAllo
6050: 63 3b 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74  c;     /* Amount
6060: 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
6070: 74 65 64 20 69 6e 20 7a 54 65 78 74 20 2a 2f 0a  ted in zText */.
6080: 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  };../* .** This 
6090: 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65  function impleme
60a0: 6e 74 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  nts the callback
60b0: 20 66 72 6f 6d 20 76 78 70 72 69 6e 74 66 2e 20   from vxprintf. 
60c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
60d0: 69 6e 65 20 61 64 64 20 6e 4e 65 77 43 68 61 72  ine add nNewChar
60e0: 20 63 68 61 72 61 63 74 65 72 73 20 6f 66 20 74   characters of t
60f0: 65 78 74 20 69 6e 20 7a 4e 65 77 54 65 78 74 20  ext in zNewText 
6100: 74 6f 0a 2a 2a 20 74 68 65 20 73 67 4d 70 72 69  to.** the sgMpri
6110: 6e 74 66 20 73 74 72 75 63 74 75 72 65 20 70 6f  ntf structure po
6120: 69 6e 74 65 64 20 74 6f 20 62 79 20 22 61 72 67  inted to by "arg
6130: 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  "..*/.static voi
6140: 64 20 6d 6f 75 74 28 76 6f 69 64 20 2a 61 72 67  d mout(void *arg
6150: 2c 20 63 68 61 72 20 2a 7a 4e 65 77 54 65 78 74  , char *zNewText
6160: 2c 20 69 6e 74 20 6e 4e 65 77 43 68 61 72 29 7b  , int nNewChar){
6170: 0a 20 20 73 74 72 75 63 74 20 73 67 4d 70 72 69  .  struct sgMpri
6180: 6e 74 66 20 2a 70 4d 20 3d 20 28 73 74 72 75 63  ntf *pM = (struc
6190: 74 20 73 67 4d 70 72 69 6e 74 66 2a 29 61 72 67  t sgMprintf*)arg
61a0: 3b 0a 20 20 69 66 28 20 70 4d 2d 3e 6e 43 68 61  ;.  if( pM->nCha
61b0: 72 20 2b 20 6e 4e 65 77 43 68 61 72 20 2b 20 31  r + nNewChar + 1
61c0: 20 3e 20 70 4d 2d 3e 6e 41 6c 6c 6f 63 20 29 7b   > pM->nAlloc ){
61d0: 0a 20 20 20 20 70 4d 2d 3e 6e 41 6c 6c 6f 63 20  .    pM->nAlloc 
61e0: 3d 20 70 4d 2d 3e 6e 43 68 61 72 20 2b 20 6e 4e  = pM->nChar + nN
61f0: 65 77 43 68 61 72 2a 32 20 2b 20 31 3b 0a 20 20  ewChar*2 + 1;.  
6200: 20 20 69 66 28 20 70 4d 2d 3e 7a 54 65 78 74 3d    if( pM->zText=
6210: 3d 70 4d 2d 3e 7a 42 61 73 65 20 29 7b 0a 20 20  =pM->zBase ){.  
6220: 20 20 20 20 70 4d 2d 3e 7a 54 65 78 74 20 3d 20      pM->zText = 
6230: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 70 4d 2d  sqliteMalloc(pM-
6240: 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  >nAlloc);.      
6250: 69 66 28 20 70 4d 2d 3e 7a 54 65 78 74 20 26 26  if( pM->zText &&
6260: 20 70 4d 2d 3e 6e 43 68 61 72 20 29 20 6d 65 6d   pM->nChar ) mem
6270: 63 70 79 28 70 4d 2d 3e 7a 54 65 78 74 2c 70 4d  cpy(pM->zText,pM
6280: 2d 3e 7a 42 61 73 65 2c 70 4d 2d 3e 6e 43 68 61  ->zBase,pM->nCha
6290: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
62a0: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73       char *z = s
62b0: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4d 2d  qliteRealloc(pM-
62c0: 3e 7a 54 65 78 74 2c 20 70 4d 2d 3e 6e 41 6c 6c  >zText, pM->nAll
62d0: 6f 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  oc);.      if( z
62e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
62f0: 71 6c 69 74 65 46 72 65 65 28 70 4d 2d 3e 7a 54  qliteFree(pM->zT
6300: 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  ext);.        pM
6310: 2d 3e 6e 43 68 61 72 20 3d 20 30 3b 0a 20 20 20  ->nChar = 0;.   
6320: 20 20 20 20 20 70 4d 2d 3e 6e 41 6c 6c 6f 63 20       pM->nAlloc 
6330: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
6340: 20 20 20 70 4d 2d 3e 7a 54 65 78 74 20 3d 20 7a     pM->zText = z
6350: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
6360: 28 20 70 4d 2d 3e 7a 54 65 78 74 20 29 7b 0a 20  ( pM->zText ){. 
6370: 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 2d 3e 7a     memcpy(&pM->z
6380: 54 65 78 74 5b 70 4d 2d 3e 6e 43 68 61 72 5d 2c  Text[pM->nChar],
6390: 20 7a 4e 65 77 54 65 78 74 2c 20 6e 4e 65 77 43   zNewText, nNewC
63a0: 68 61 72 29 3b 0a 20 20 20 20 70 4d 2d 3e 6e 43  har);.    pM->nC
63b0: 68 61 72 20 2b 3d 20 6e 4e 65 77 43 68 61 72 3b  har += nNewChar;
63c0: 0a 20 20 20 20 70 4d 2d 3e 7a 54 65 78 74 5b 70  .    pM->zText[p
63d0: 4d 2d 3e 6e 43 68 61 72 5d 20 3d 20 30 3b 0a 20  M->nChar] = 0;. 
63e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69   }.}../*.** sqli
63f0: 74 65 5f 6d 70 72 69 6e 74 66 28 29 20 77 6f 72  te_mprintf() wor
6400: 6b 73 20 6c 69 6b 65 20 70 72 69 6e 74 66 28 29  ks like printf()
6410: 2c 20 62 75 74 20 61 6c 6c 6f 63 61 74 69 6f 6e  , but allocation
6420: 73 20 6d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64  s memory to hold
6430: 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 69 6e   the.** resultin
6440: 67 20 73 74 72 69 6e 67 20 61 6e 64 20 72 65 74  g string and ret
6450: 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
6460: 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  o the allocated 
6470: 6d 65 6d 6f 72 79 2e 20 20 55 73 65 0a 2a 2a 20  memory.  Use.** 
6480: 73 71 6c 69 74 65 46 72 65 65 28 29 20 74 6f 20  sqliteFree() to 
6490: 72 65 6c 65 61 73 65 20 74 68 65 20 6d 65 6d 6f  release the memo
64a0: 72 79 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f  ry allocated..*/
64b0: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 4d 50 72  .char *sqliteMPr
64c0: 69 6e 74 66 28 63 6f 6e 73 74 20 63 68 61 72 20  intf(const char 
64d0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
64e0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
64f0: 73 74 72 75 63 74 20 73 67 4d 70 72 69 6e 74 66  struct sgMprintf
6500: 20 73 4d 70 72 69 6e 74 66 3b 0a 20 20 63 68 61   sMprintf;.  cha
6510: 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 0a 20 20  r zBuf[200];..  
6520: 73 4d 70 72 69 6e 74 66 2e 6e 43 68 61 72 20 3d  sMprintf.nChar =
6530: 20 30 3b 0a 20 20 73 4d 70 72 69 6e 74 66 2e 6e   0;.  sMprintf.n
6540: 41 6c 6c 6f 63 20 3d 20 73 69 7a 65 6f 66 28 7a  Alloc = sizeof(z
6550: 42 75 66 29 3b 0a 20 20 73 4d 70 72 69 6e 74 66  Buf);.  sMprintf
6560: 2e 7a 54 65 78 74 20 3d 20 7a 42 75 66 3b 0a 20  .zText = zBuf;. 
6570: 20 73 4d 70 72 69 6e 74 66 2e 7a 42 61 73 65 20   sMprintf.zBase 
6580: 3d 20 7a 42 75 66 3b 0a 20 20 76 61 5f 73 74 61  = zBuf;.  va_sta
6590: 72 74 28 61 70 2c 7a 46 6f 72 6d 61 74 29 3b 0a  rt(ap,zFormat);.
65a0: 20 20 76 78 70 72 69 6e 74 66 28 6d 6f 75 74 2c    vxprintf(mout,
65b0: 26 73 4d 70 72 69 6e 74 66 2c 7a 46 6f 72 6d 61  &sMprintf,zForma
65c0: 74 2c 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  t,ap);.  va_end(
65d0: 61 70 29 3b 0a 20 20 73 4d 70 72 69 6e 74 66 2e  ap);.  sMprintf.
65e0: 7a 54 65 78 74 5b 73 4d 70 72 69 6e 74 66 2e 6e  zText[sMprintf.n
65f0: 43 68 61 72 5d 20 3d 20 30 3b 0a 20 20 72 65 74  Char] = 0;.  ret
6600: 75 72 6e 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  urn sqliteReallo
6610: 63 28 73 4d 70 72 69 6e 74 66 2e 7a 54 65 78 74  c(sMprintf.zText
6620: 2c 20 73 4d 70 72 69 6e 74 66 2e 6e 43 68 61 72  , sMprintf.nChar
6630: 2b 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71  +1);.}../*.** sq
6640: 6c 69 74 65 5f 6d 70 72 69 6e 74 66 28 29 20 77  lite_mprintf() w
6650: 6f 72 6b 73 20 6c 69 6b 65 20 70 72 69 6e 74 66  orks like printf
6660: 28 29 2c 20 62 75 74 20 61 6c 6c 6f 63 61 74 69  (), but allocati
6670: 6f 6e 73 20 6d 65 6d 6f 72 79 20 74 6f 20 68 6f  ons memory to ho
6680: 6c 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  ld the.** result
6690: 69 6e 67 20 73 74 72 69 6e 67 20 61 6e 64 20 72  ing string and r
66a0: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
66b0: 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   to the allocate
66c0: 64 20 6d 65 6d 6f 72 79 2e 20 20 55 73 65 0a 2a  d memory.  Use.*
66d0: 2a 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 74  * sqliteFree() t
66e0: 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 6d 65  o release the me
66f0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  mory allocated..
6700: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 5f  */.char *sqlite_
6710: 6d 70 72 69 6e 74 66 28 63 6f 6e 73 74 20 63 68  mprintf(const ch
6720: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
6730: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
6740: 0a 20 20 73 74 72 75 63 74 20 73 67 4d 70 72 69  .  struct sgMpri
6750: 6e 74 66 20 73 4d 70 72 69 6e 74 66 3b 0a 20 20  ntf sMprintf;.  
6760: 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 63 68  char *zNew;.  ch
6770: 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 0a 20  ar zBuf[200];.. 
6780: 20 73 4d 70 72 69 6e 74 66 2e 6e 43 68 61 72 20   sMprintf.nChar 
6790: 3d 20 30 3b 0a 20 20 73 4d 70 72 69 6e 74 66 2e  = 0;.  sMprintf.
67a0: 6e 41 6c 6c 6f 63 20 3d 20 73 69 7a 65 6f 66 28  nAlloc = sizeof(
67b0: 7a 42 75 66 29 3b 0a 20 20 73 4d 70 72 69 6e 74  zBuf);.  sMprint
67c0: 66 2e 7a 54 65 78 74 20 3d 20 7a 42 75 66 3b 0a  f.zText = zBuf;.
67d0: 20 20 73 4d 70 72 69 6e 74 66 2e 7a 42 61 73 65    sMprintf.zBase
67e0: 20 3d 20 7a 42 75 66 3b 0a 20 20 76 61 5f 73 74   = zBuf;.  va_st
67f0: 61 72 74 28 61 70 2c 7a 46 6f 72 6d 61 74 29 3b  art(ap,zFormat);
6800: 0a 20 20 76 78 70 72 69 6e 74 66 28 6d 6f 75 74  .  vxprintf(mout
6810: 2c 26 73 4d 70 72 69 6e 74 66 2c 7a 46 6f 72 6d  ,&sMprintf,zForm
6820: 61 74 2c 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  at,ap);.  va_end
6830: 28 61 70 29 3b 0a 20 20 73 4d 70 72 69 6e 74 66  (ap);.  sMprintf
6840: 2e 7a 54 65 78 74 5b 73 4d 70 72 69 6e 74 66 2e  .zText[sMprintf.
6850: 6e 43 68 61 72 5d 20 3d 20 30 3b 0a 20 20 7a 4e  nChar] = 0;.  zN
6860: 65 77 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 4d 70  ew = malloc( sMp
6870: 72 69 6e 74 66 2e 6e 43 68 61 72 2b 31 20 29 3b  rintf.nChar+1 );
6880: 0a 20 20 69 66 28 20 7a 4e 65 77 20 29 20 73 74  .  if( zNew ) st
6890: 72 63 70 79 28 7a 4e 65 77 2c 73 4d 70 72 69 6e  rcpy(zNew,sMprin
68a0: 74 66 2e 7a 54 65 78 74 29 3b 0a 20 20 69 66 28  tf.zText);.  if(
68b0: 20 73 4d 70 72 69 6e 74 66 2e 7a 54 65 78 74 21   sMprintf.zText!
68c0: 3d 73 4d 70 72 69 6e 74 66 2e 7a 42 61 73 65 20  =sMprintf.zBase 
68d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
68e0: 65 28 73 4d 70 72 69 6e 74 66 2e 7a 54 65 78 74  e(sMprintf.zText
68f0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
6900: 7a 4e 65 77 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73  zNew;.}../* This
6910: 20 69 73 20 74 68 65 20 76 61 72 61 72 67 73 20   is the varargs 
6920: 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
6930: 65 5f 6d 70 72 69 6e 74 66 2e 20 20 0a 2a 2f 0a  e_mprintf.  .*/.
6940: 63 68 61 72 20 2a 73 71 6c 69 74 65 5f 76 6d 70  char *sqlite_vmp
6950: 72 69 6e 74 66 28 63 6f 6e 73 74 20 63 68 61 72  rintf(const char
6960: 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69   *zFormat, va_li
6970: 73 74 20 61 70 29 7b 0a 20 20 73 74 72 75 63 74  st ap){.  struct
6980: 20 73 67 4d 70 72 69 6e 74 66 20 73 4d 70 72 69   sgMprintf sMpri
6990: 6e 74 66 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 65  ntf;.  char *zNe
69a0: 77 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 32  w;.  char zBuf[2
69b0: 30 30 5d 3b 0a 20 20 73 4d 70 72 69 6e 74 66 2e  00];.  sMprintf.
69c0: 6e 43 68 61 72 20 3d 20 30 3b 0a 20 20 73 4d 70  nChar = 0;.  sMp
69d0: 72 69 6e 74 66 2e 7a 54 65 78 74 20 3d 20 7a 42  rintf.zText = zB
69e0: 75 66 3b 0a 20 20 73 4d 70 72 69 6e 74 66 2e 6e  uf;.  sMprintf.n
69f0: 41 6c 6c 6f 63 20 3d 20 73 69 7a 65 6f 66 28 7a  Alloc = sizeof(z
6a00: 42 75 66 29 3b 0a 20 20 73 4d 70 72 69 6e 74 66  Buf);.  sMprintf
6a10: 2e 7a 42 61 73 65 20 3d 20 7a 42 75 66 3b 0a 20  .zBase = zBuf;. 
6a20: 20 76 78 70 72 69 6e 74 66 28 6d 6f 75 74 2c 26   vxprintf(mout,&
6a30: 73 4d 70 72 69 6e 74 66 2c 7a 46 6f 72 6d 61 74  sMprintf,zFormat
6a40: 2c 61 70 29 3b 0a 20 20 73 4d 70 72 69 6e 74 66  ,ap);.  sMprintf
6a50: 2e 7a 54 65 78 74 5b 73 4d 70 72 69 6e 74 66 2e  .zText[sMprintf.
6a60: 6e 43 68 61 72 5d 20 3d 20 30 3b 0a 20 20 7a 4e  nChar] = 0;.  zN
6a70: 65 77 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 4d 70  ew = malloc( sMp
6a80: 72 69 6e 74 66 2e 6e 43 68 61 72 2b 31 20 29 3b  rintf.nChar+1 );
6a90: 0a 20 20 69 66 28 20 7a 4e 65 77 20 29 20 73 74  .  if( zNew ) st
6aa0: 72 63 70 79 28 7a 4e 65 77 2c 73 4d 70 72 69 6e  rcpy(zNew,sMprin
6ab0: 74 66 2e 7a 54 65 78 74 29 3b 0a 20 20 69 66 28  tf.zText);.  if(
6ac0: 20 73 4d 70 72 69 6e 74 66 2e 7a 54 65 78 74 21   sMprintf.zText!
6ad0: 3d 73 4d 70 72 69 6e 74 66 2e 7a 42 61 73 65 20  =sMprintf.zBase 
6ae0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
6af0: 65 28 73 4d 70 72 69 6e 74 66 2e 7a 54 65 78 74  e(sMprintf.zText
6b00: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
6b10: 7a 4e 65 77 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  zNew;.}../* .** 
6b20: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d  This function im
6b30: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 63 61 6c  plements the cal
6b40: 6c 62 61 63 6b 20 66 72 6f 6d 20 76 78 70 72 69  lback from vxpri
6b50: 6e 74 66 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ntf. .**.** This
6b60: 20 72 6f 75 74 69 6e 65 20 61 64 64 20 6e 4e 65   routine add nNe
6b70: 77 43 68 61 72 20 63 68 61 72 61 63 74 65 72 73  wChar characters
6b80: 20 6f 66 20 74 65 78 74 20 69 6e 20 7a 4e 65 77   of text in zNew
6b90: 54 65 78 74 20 74 6f 0a 2a 2a 20 74 68 65 20 73  Text to.** the s
6ba0: 67 4d 70 72 69 6e 74 66 20 73 74 72 75 63 74 75  gMprintf structu
6bb0: 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  re pointed to by
6bc0: 20 22 61 72 67 22 2e 20 20 55 6e 6c 69 6b 65 20   "arg".  Unlike 
6bd0: 6d 6f 75 74 28 29 20 61 62 6f 76 65 2c 0a 2a 2a  mout() above,.**
6be0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   this routine do
6bf0: 65 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20  es not allocate 
6c00: 6e 65 77 20 73 70 61 63 65 20 77 68 65 6e 20 74  new space when t
6c10: 68 65 20 62 75 66 66 65 72 20 66 69 6c 6c 73 2e  he buffer fills.
6c20: 0a 2a 2a 20 49 74 20 6a 75 73 74 20 74 72 75 6e  .** It just trun
6c30: 63 61 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cates..*/.static
6c40: 20 76 6f 69 64 20 73 6f 75 74 28 76 6f 69 64 20   void sout(void 
6c50: 2a 61 72 67 2c 20 63 68 61 72 20 2a 7a 4e 65 77  *arg, char *zNew
6c60: 54 65 78 74 2c 20 69 6e 74 20 6e 4e 65 77 43 68  Text, int nNewCh
6c70: 61 72 29 7b 0a 20 20 73 74 72 75 63 74 20 73 67  ar){.  struct sg
6c80: 4d 70 72 69 6e 74 66 20 2a 70 4d 20 3d 20 28 73  Mprintf *pM = (s
6c90: 74 72 75 63 74 20 73 67 4d 70 72 69 6e 74 66 2a  truct sgMprintf*
6ca0: 29 61 72 67 3b 0a 20 20 69 66 28 20 70 4d 2d 3e  )arg;.  if( pM->
6cb0: 6e 43 68 61 72 20 2b 20 6e 4e 65 77 43 68 61 72  nChar + nNewChar
6cc0: 20 2b 20 31 20 3e 20 70 4d 2d 3e 6e 41 6c 6c 6f   + 1 > pM->nAllo
6cd0: 63 20 29 7b 0a 20 20 20 20 6e 4e 65 77 43 68 61  c ){.    nNewCha
6ce0: 72 20 3d 20 70 4d 2d 3e 6e 41 6c 6c 6f 63 20 2d  r = pM->nAlloc -
6cf0: 20 70 4d 2d 3e 6e 43 68 61 72 20 2d 20 31 3b 0a   pM->nChar - 1;.
6d00: 20 20 20 20 69 66 28 20 6e 4e 65 77 43 68 61 72      if( nNewChar
6d10: 3c 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  <=0 ) return;.  
6d20: 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70 4d 2d 3e  }.  memcpy(&pM->
6d30: 7a 54 65 78 74 5b 70 4d 2d 3e 6e 43 68 61 72 5d  zText[pM->nChar]
6d40: 2c 20 7a 4e 65 77 54 65 78 74 2c 20 6e 4e 65 77  , zNewText, nNew
6d50: 43 68 61 72 29 3b 0a 20 20 70 4d 2d 3e 6e 43 68  Char);.  pM->nCh
6d60: 61 72 20 2b 3d 20 6e 4e 65 77 43 68 61 72 3b 0a  ar += nNewChar;.
6d70: 20 20 70 4d 2d 3e 7a 54 65 78 74 5b 70 4d 2d 3e    pM->zText[pM->
6d80: 6e 43 68 61 72 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f  nChar] = 0;.}../
6d90: 2a 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 70 72 69  *.** sqlite_spri
6da0: 6e 74 66 28 29 20 77 6f 72 6b 73 20 6c 69 6b 65  ntf() works like
6db0: 20 73 70 72 69 6e 74 66 28 29 20 65 78 63 65 70   sprintf() excep
6dc0: 74 20 74 68 61 74 20 69 74 20 69 67 6e 6f 72 65  t that it ignore
6dd0: 73 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  s the.** current
6de0: 20 6c 6f 63 61 6c 65 20 73 65 74 74 69 6e 67 73   locale settings
6df0: 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  .  This is impor
6e00: 74 61 6e 74 20 66 6f 72 20 53 51 4c 69 74 65 20  tant for SQLite 
6e10: 62 65 63 61 75 73 65 20 77 65 0a 2a 2a 20 61 72  because we.** ar
6e20: 65 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20 75 73  e not able to us
6e30: 65 20 61 20 22 2c 22 20 61 73 20 74 68 65 20 64  e a "," as the d
6e40: 65 63 69 6d 61 6c 20 70 6f 69 6e 74 20 69 6e 20  ecimal point in 
6e50: 70 6c 61 63 65 20 6f 66 20 22 2e 22 20 61 73 0a  place of "." as.
6e60: 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
6e70: 73 6f 6d 65 20 6c 6f 63 61 6c 65 73 2e 0a 2a 2f  some locales..*/
6e80: 0a 69 6e 74 20 73 71 6c 69 74 65 5f 73 6e 70 72  .int sqlite_snpr
6e90: 69 6e 74 66 28 69 6e 74 20 6e 2c 20 63 68 61 72  intf(int n, char
6ea0: 20 2a 7a 42 75 66 2c 20 63 6f 6e 73 74 20 63 68   *zBuf, const ch
6eb0: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
6ec0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
6ed0: 0a 20 20 73 74 72 75 63 74 20 73 67 4d 70 72 69  .  struct sgMpri
6ee0: 6e 74 66 20 73 4d 70 72 69 6e 74 66 3b 0a 0a 20  ntf sMprintf;.. 
6ef0: 20 73 4d 70 72 69 6e 74 66 2e 6e 43 68 61 72 20   sMprintf.nChar 
6f00: 3d 20 30 3b 0a 20 20 73 4d 70 72 69 6e 74 66 2e  = 0;.  sMprintf.
6f10: 6e 41 6c 6c 6f 63 20 3d 20 6e 3b 0a 20 20 73 4d  nAlloc = n;.  sM
6f20: 70 72 69 6e 74 66 2e 7a 54 65 78 74 20 3d 20 7a  printf.zText = z
6f30: 42 75 66 3b 0a 20 20 73 4d 70 72 69 6e 74 66 2e  Buf;.  sMprintf.
6f40: 7a 42 61 73 65 20 3d 20 7a 42 75 66 3b 0a 20 20  zBase = zBuf;.  
6f50: 76 61 5f 73 74 61 72 74 28 61 70 2c 7a 46 6f 72  va_start(ap,zFor
6f60: 6d 61 74 29 3b 0a 20 20 76 78 70 72 69 6e 74 66  mat);.  vxprintf
6f70: 28 73 6f 75 74 2c 26 73 4d 70 72 69 6e 74 66 2c  (sout,&sMprintf,
6f80: 7a 46 6f 72 6d 61 74 2c 61 70 29 3b 0a 20 20 76  zFormat,ap);.  v
6f90: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
6fa0: 75 72 6e 20 73 4d 70 72 69 6e 74 66 2e 6e 43 68  urn sMprintf.nCh
6fb0: 61 72 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ar;.}..../*.** T
6fc0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 75  he following fou
6fd0: 72 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65  r routines imple
6fe0: 6d 65 6e 74 20 74 68 65 20 76 61 72 61 72 67 73  ment the varargs
6ff0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
7000: 0a 2a 2a 20 73 71 6c 69 74 65 5f 65 78 65 63 28  .** sqlite_exec(
7010: 29 20 61 6e 64 20 73 71 6c 69 74 65 5f 67 65 74  ) and sqlite_get
7020: 5f 74 61 62 6c 65 28 29 20 69 6e 74 65 72 66 61  _table() interfa
7030: 63 65 73 2e 20 20 53 65 65 20 74 68 65 20 73 71  ces.  See the sq
7040: 6c 69 74 65 2e 68 0a 2a 2a 20 68 65 61 64 65 72  lite.h.** header
7050: 20 66 69 6c 65 73 20 66 6f 72 20 61 20 6d 6f 72   files for a mor
7060: 65 20 64 65 74 61 69 6c 65 64 20 64 65 73 63 72  e detailed descr
7070: 69 70 74 69 6f 6e 20 6f 66 20 68 6f 77 20 74 68  iption of how th
7080: 65 73 65 20 69 6e 74 65 72 66 61 63 65 73 0a 2a  ese interfaces.*
7090: 2a 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  * work..**.** Th
70a0: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
70b0: 20 61 6c 6c 20 6a 75 73 74 20 73 69 6d 70 6c 65   all just simple
70c0: 20 77 72 61 70 70 65 72 73 2e 0a 2a 2f 0a 69 6e   wrappers..*/.in
70d0: 74 20 73 71 6c 69 74 65 5f 65 78 65 63 5f 70 72  t sqlite_exec_pr
70e0: 69 6e 74 66 28 0a 20 20 73 71 6c 69 74 65 20 2a  intf(.  sqlite *
70f0: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
7100: 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e        /* An open
7110: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
7120: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 46 6f  onst char *sqlFo
7130: 72 6d 61 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  rmat,        /* 
7140: 70 72 69 6e 74 66 2d 73 74 79 6c 65 20 66 6f 72  printf-style for
7150: 6d 61 74 20 73 74 72 69 6e 67 20 66 6f 72 20 74  mat string for t
7160: 68 65 20 53 51 4c 20 2a 2f 0a 20 20 73 71 6c 69  he SQL */.  sqli
7170: 74 65 5f 63 61 6c 6c 62 61 63 6b 20 78 43 61 6c  te_callback xCal
7180: 6c 62 61 63 6b 2c 20 20 20 20 2f 2a 20 43 61 6c  lback,    /* Cal
7190: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a  lback function *
71a0: 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 20  /.  void *pArg, 
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71c0: 20 20 2f 2a 20 31 73 74 20 61 72 67 75 6d 65 6e    /* 1st argumen
71d0: 74 20 74 6f 20 63 61 6c 6c 62 61 63 6b 20 66 75  t to callback fu
71e0: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72  nction */.  char
71f0: 20 2a 2a 65 72 72 6d 73 67 2c 20 20 20 20 20 20   **errmsg,      
7200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
7210: 6f 72 20 6d 73 67 20 77 72 69 74 74 65 6e 20 68  or msg written h
7220: 65 72 65 20 2a 2f 0a 20 20 2e 2e 2e 20 20 20 20  ere */.  ...    
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7240: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
7250: 6e 74 73 20 74 6f 20 74 68 65 20 66 6f 72 6d 61  nts to the forma
7260: 74 20 73 74 72 69 6e 67 2e 20 2a 2f 0a 29 7b 0a  t string. */.){.
7270: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
7280: 69 6e 74 20 72 63 3b 0a 0a 20 20 76 61 5f 73 74  int rc;..  va_st
7290: 61 72 74 28 61 70 2c 20 65 72 72 6d 73 67 29 3b  art(ap, errmsg);
72a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 5f 65  .  rc = sqlite_e
72b0: 78 65 63 5f 76 70 72 69 6e 74 66 28 64 62 2c 20  xec_vprintf(db, 
72c0: 73 71 6c 46 6f 72 6d 61 74 2c 20 78 43 61 6c 6c  sqlFormat, xCall
72d0: 62 61 63 6b 2c 20 70 41 72 67 2c 20 65 72 72 6d  back, pArg, errm
72e0: 73 67 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  sg, ap);.  va_en
72f0: 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
7300: 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
7310: 5f 65 78 65 63 5f 76 70 72 69 6e 74 66 28 0a 20  _exec_vprintf(. 
7320: 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20 20   sqlite *db,    
7330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7340: 2a 20 41 6e 20 6f 70 65 6e 20 64 61 74 61 62 61  * An open databa
7350: 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  se */.  const ch
7360: 61 72 20 2a 73 71 6c 46 6f 72 6d 61 74 2c 20 20  ar *sqlFormat,  
7370: 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 66 2d        /* printf-
7380: 73 74 79 6c 65 20 66 6f 72 6d 61 74 20 73 74 72  style format str
7390: 69 6e 67 20 66 6f 72 20 74 68 65 20 53 51 4c 20  ing for the SQL 
73a0: 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 63 61 6c 6c  */.  sqlite_call
73b0: 62 61 63 6b 20 78 43 61 6c 6c 62 61 63 6b 2c 20  back xCallback, 
73c0: 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66     /* Callback f
73d0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
73e0: 64 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20  d *pArg,        
73f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 73             /* 1s
7400: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 63 61  t argument to ca
7410: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
7420: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 65 72 72 6d  */.  char **errm
7430: 73 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sg,             
7440: 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20     /* Error msg 
7450: 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
7460: 20 20 76 61 5f 6c 69 73 74 20 61 70 20 20 20 20    va_list ap    
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20  /* Arguments to 
7490: 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  the format strin
74a0: 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  g. */.){.  char 
74b0: 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  *zSql;.  int rc;
74c0: 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ..  zSql = sqlit
74d0: 65 5f 76 6d 70 72 69 6e 74 66 28 73 71 6c 46 6f  e_vmprintf(sqlFo
74e0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 72 63 20  rmat, ap);.  rc 
74f0: 3d 20 73 71 6c 69 74 65 5f 65 78 65 63 28 64 62  = sqlite_exec(db
7500: 2c 20 7a 53 71 6c 2c 20 78 43 61 6c 6c 62 61 63  , zSql, xCallbac
7510: 6b 2c 20 70 41 72 67 2c 20 65 72 72 6d 73 67 29  k, pArg, errmsg)
7520: 3b 0a 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a  ;.  free(zSql);.
7530: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
7540: 6e 74 20 73 71 6c 69 74 65 5f 67 65 74 5f 74 61  nt sqlite_get_ta
7550: 62 6c 65 5f 70 72 69 6e 74 66 28 0a 20 20 73 71  ble_printf(.  sq
7560: 6c 69 74 65 20 2a 64 62 2c 20 20 20 20 20 20 20  lite *db,       
7570: 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20       /* An open 
7580: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
7590: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 46 6f 72  nst char *sqlFor
75a0: 6d 61 74 2c 20 2f 2a 20 70 72 69 6e 74 66 2d 73  mat, /* printf-s
75b0: 74 79 6c 65 20 66 6f 72 6d 61 74 20 73 74 72 69  tyle format stri
75c0: 6e 67 20 66 6f 72 20 74 68 65 20 53 51 4c 20 2a  ng for the SQL *
75d0: 2f 0a 20 20 63 68 61 72 20 2a 2a 2a 72 65 73 75  /.  char ***resu
75e0: 6c 74 70 2c 20 20 20 20 20 20 20 2f 2a 20 52 65  ltp,       /* Re
75f0: 73 75 6c 74 20 77 72 69 74 74 65 6e 20 74 6f 20  sult written to 
7600: 61 20 63 68 61 72 20 2a 5b 5d 20 20 74 68 61 74  a char *[]  that
7610: 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20   this points to 
7620: 2a 2f 0a 20 20 69 6e 74 20 2a 6e 72 6f 77 2c 20  */.  int *nrow, 
7630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7640: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
7650: 72 6f 77 73 20 77 72 69 74 74 65 6e 20 68 65 72  rows written her
7660: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 6e 63 6f 6c  e */.  int *ncol
7670: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
7680: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
7690: 74 20 63 6f 6c 75 6d 6e 73 20 77 72 69 74 74 65  t columns writte
76a0: 6e 20 68 65 72 65 20 2a 2f 0a 20 20 63 68 61 72  n here */.  char
76b0: 20 2a 2a 65 72 72 6d 73 67 2c 20 20 20 20 20 20   **errmsg,      
76c0: 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20     /* Error msg 
76d0: 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
76e0: 20 20 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20    ...           
76f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
7700: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 6f 72  ments to the for
7710: 6d 61 74 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  mat string */.){
7720: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
7730: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 76 61 5f 73   int rc;..  va_s
7740: 74 61 72 74 28 61 70 2c 20 65 72 72 6d 73 67 29  tart(ap, errmsg)
7750: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 5f  ;.  rc = sqlite_
7760: 67 65 74 5f 74 61 62 6c 65 5f 76 70 72 69 6e 74  get_table_vprint
7770: 66 28 64 62 2c 20 73 71 6c 46 6f 72 6d 61 74 2c  f(db, sqlFormat,
7780: 20 72 65 73 75 6c 74 70 2c 20 6e 72 6f 77 2c 20   resultp, nrow, 
7790: 6e 63 6f 6c 2c 20 65 72 72 6d 73 67 2c 20 61 70  ncol, errmsg, ap
77a0: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
77b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
77c0: 69 6e 74 20 73 71 6c 69 74 65 5f 67 65 74 5f 74  int sqlite_get_t
77d0: 61 62 6c 65 5f 76 70 72 69 6e 74 66 28 0a 20 20  able_vprintf(.  
77e0: 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20 20 20  sqlite *db,     
77f0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65         /* An ope
7800: 6e 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  n database */.  
7810: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 46  const char *sqlF
7820: 6f 72 6d 61 74 2c 20 2f 2a 20 70 72 69 6e 74 66  ormat, /* printf
7830: 2d 73 74 79 6c 65 20 66 6f 72 6d 61 74 20 73 74  -style format st
7840: 72 69 6e 67 20 66 6f 72 20 74 68 65 20 53 51 4c  ring for the SQL
7850: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 2a 72 65   */.  char ***re
7860: 73 75 6c 74 70 2c 20 20 20 20 20 20 20 2f 2a 20  sultp,       /* 
7870: 52 65 73 75 6c 74 20 77 72 69 74 74 65 6e 20 74  Result written t
7880: 6f 20 61 20 63 68 61 72 20 2a 5b 5d 20 20 74 68  o a char *[]  th
7890: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74  at this points t
78a0: 6f 20 2a 2f 0a 20 20 69 6e 74 20 2a 6e 72 6f 77  o */.  int *nrow
78b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
78c0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
78d0: 74 20 72 6f 77 73 20 77 72 69 74 74 65 6e 20 68  t rows written h
78e0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 6e 63  ere */.  int *nc
78f0: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
7900: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
7910: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 77 72 69 74  ult columns writ
7920: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 63 68  ten here */.  ch
7930: 61 72 20 2a 2a 65 72 72 6d 73 67 2c 20 20 20 20  ar **errmsg,    
7940: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73       /* Error ms
7950: 67 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  g written here *
7960: 2f 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 20 20  /.  va_list ap  
7970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
7980: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66  guments to the f
7990: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 2a 2f 0a  ormat string */.
79a0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  ){.  char *zSql;
79b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 7a 53  .  int rc;..  zS
79c0: 71 6c 20 3d 20 73 71 6c 69 74 65 5f 76 6d 70 72  ql = sqlite_vmpr
79d0: 69 6e 74 66 28 73 71 6c 46 6f 72 6d 61 74 2c 20  intf(sqlFormat, 
79e0: 61 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ap);.  rc = sqli
79f0: 74 65 5f 67 65 74 5f 74 61 62 6c 65 28 64 62 2c  te_get_table(db,
7a00: 20 7a 53 71 6c 2c 20 72 65 73 75 6c 74 70 2c 20   zSql, resultp, 
7a10: 6e 72 6f 77 2c 20 6e 63 6f 6c 75 6d 6e 2c 20 65  nrow, ncolumn, e
7a20: 72 72 6d 73 67 29 3b 0a 20 20 66 72 65 65 28 7a  rrmsg);.  free(z
7a30: 53 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Sql);.  return r
7a40: 63 3b 0a 7d 0a                                   c;.}.