/ Hex Artifact Content
Login

Artifact 43d546542880fde9a3343f285516d74e70e63de1:


0000: 2f 2a 0a 2a 2a 20 54 68 65 20 22 70 72 69 6e 74  /*.** The "print
0010: 66 22 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c  f" code that fol
0020: 6c 6f 77 73 20 64 61 74 65 73 20 66 72 6f 6d 20  lows dates from 
0030: 74 68 65 20 31 39 38 30 27 73 2e 20 20 49 74 20  the 1980's.  It 
0040: 69 73 20 69 6e 0a 2a 2a 20 74 68 65 20 70 75 62  is in.** the pub
0050: 6c 69 63 20 64 6f 6d 61 69 6e 2e 20 20 54 68 65  lic domain.  The
0060: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6d 6d 65 6e   original commen
0070: 74 73 20 61 72 65 20 69 6e 63 6c 75 64 65 64 20  ts are included 
0080: 68 65 72 65 20 66 6f 72 0a 2a 2a 20 63 6f 6d 70  here for.** comp
0090: 6c 65 74 65 6e 65 73 73 2e 20 20 54 68 65 79 20  leteness.  They 
00a0: 61 72 65 20 76 65 72 79 20 6f 75 74 2d 6f 66 2d  are very out-of-
00b0: 64 61 74 65 20 62 75 74 20 6d 69 67 68 74 20 62  date but might b
00c0: 65 20 75 73 65 66 75 6c 20 61 73 0a 2a 2a 20 61  e useful as.** a
00d0: 6e 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 66  n historical ref
00e0: 65 72 65 6e 63 65 2e 20 20 4d 6f 73 74 20 6f 66  erence.  Most of
00f0: 20 74 68 65 20 22 65 6e 68 61 6e 63 65 6d 65 6e   the "enhancemen
0100: 74 73 22 20 68 61 76 65 20 62 65 65 6e 20 62 61  ts" have been ba
0110: 63 6b 65 64 0a 2a 2a 20 6f 75 74 20 73 6f 20 74  cked.** out so t
0120: 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  hat the function
0130: 61 6c 69 74 79 20 69 73 20 6e 6f 77 20 74 68 65  ality is now the
0140: 20 73 61 6d 65 20 61 73 20 73 74 61 6e 64 61 72   same as standar
0150: 64 20 70 72 69 6e 74 66 28 29 2e 0a 2a 2a 0a 2a  d printf()..**.*
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
01a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
01b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 6f  The following mo
01c0: 64 75 6c 65 73 20 69 73 20 61 6e 20 65 6e 68 61  dules is an enha
01d0: 6e 63 65 64 20 72 65 70 6c 61 63 65 6d 65 6e 74  nced replacement
01e0: 20 66 6f 72 20 74 68 65 20 22 70 72 69 6e 74 66   for the "printf
01f0: 22 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 2a 2a  " subroutines.**
0200: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 73 74   found in the st
0210: 61 6e 64 61 72 64 20 43 20 6c 69 62 72 61 72 79  andard C library
0220: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
0230: 20 65 6e 68 61 6e 63 65 6d 65 6e 74 73 20 61 72   enhancements ar
0240: 65 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 3a 0a  e.** supported:.
0250: 2a 2a 0a 2a 2a 20 20 20 20 20 20 2b 20 20 41 64  **.**      +  Ad
0260: 64 69 74 69 6f 6e 61 6c 20 66 75 6e 63 74 69 6f  ditional functio
0270: 6e 73 2e 20 20 54 68 65 20 73 74 61 6e 64 61 72  ns.  The standar
0280: 64 20 73 65 74 20 6f 66 20 22 70 72 69 6e 74 66  d set of "printf
0290: 22 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 20  " functions.**  
02a0: 20 20 20 20 20 20 20 69 6e 63 6c 75 64 65 73 20         includes 
02b0: 70 72 69 6e 74 66 2c 20 66 70 72 69 6e 74 66 2c  printf, fprintf,
02c0: 20 73 70 72 69 6e 74 66 2c 20 76 70 72 69 6e 74   sprintf, vprint
02d0: 66 2c 20 76 66 70 72 69 6e 74 66 2c 20 61 6e 64  f, vfprintf, and
02e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 73 70 72  .**         vspr
02f0: 69 6e 74 66 2e 20 20 54 68 69 73 20 6d 6f 64 75  intf.  This modu
0300: 6c 65 20 61 64 64 73 20 74 68 65 20 66 6f 6c 6c  le adds the foll
0310: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
0320: 20 20 20 20 20 20 20 2a 20 20 73 6e 70 72 69 6e         *  snprin
0330: 74 66 20 2d 2d 20 57 6f 72 6b 73 20 6c 69 6b 65  tf -- Works like
0340: 20 73 70 72 69 6e 74 66 2c 20 62 75 74 20 68 61   sprintf, but ha
0350: 73 20 61 6e 20 65 78 74 72 61 20 61 72 67 75 6d  s an extra argum
0360: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ent.**          
0370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0380: 77 68 69 63 68 20 69 73 20 74 68 65 20 73 69 7a  which is the siz
0390: 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
03a0: 77 72 69 74 74 65 6e 20 74 6f 2e 0a 2a 2a 0a 2a  written to..**.*
03b0: 2a 20 20 20 20 20 20 20 20 20 20 20 2a 20 20 6d  *           *  m
03c0: 70 72 69 6e 74 66 20 2d 2d 20 20 53 69 6d 69 6c  printf --  Simil
03d0: 61 72 20 74 6f 20 73 70 72 69 6e 74 66 2e 20 20  ar to sprintf.  
03e0: 57 72 69 74 65 73 20 6f 75 74 70 75 74 20 74 6f  Writes output to
03f0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 20 20 20   memory.**      
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0410: 20 20 20 20 6f 62 74 61 69 6e 65 64 20 66 72 6f      obtained fro
0420: 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2a 0a 2a 2a 20  m malloc..**.** 
0430: 20 20 20 20 20 20 20 20 20 20 2a 20 20 78 70 72            *  xpr
0440: 69 6e 74 66 20 2d 2d 20 20 43 61 6c 6c 73 20 61  intf --  Calls a
0450: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 64 69 73   function to dis
0460: 70 6f 73 65 20 6f 66 20 6f 75 74 70 75 74 2e 0a  pose of output..
0470: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
0480: 2a 20 20 6e 70 72 69 6e 74 66 20 2d 2d 20 20 4e  *  nprintf --  N
0490: 6f 20 6f 75 74 70 75 74 2c 20 62 75 74 20 72 65  o output, but re
04a0: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
04b0: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 0a 2a   of characters.*
04c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
04d0: 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
04e0: 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  would have been 
04f0: 6f 75 74 70 75 74 20 62 79 20 70 72 69 6e 74 66  output by printf
0500: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  ..**.**         
0510: 20 20 2a 20 20 41 20 76 2d 20 76 65 72 73 69 6f    *  A v- versio
0520: 6e 20 28 65 78 3a 20 76 73 6e 70 72 69 6e 74 66  n (ex: vsnprintf
0530: 29 20 6f 66 20 65 76 65 72 79 20 66 75 6e 63 74  ) of every funct
0540: 69 6f 6e 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 20  ion is also.**  
0550: 20 20 20 20 20 20 20 20 20 20 20 20 73 75 70 70              supp
0560: 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lied..**.**     
0570: 20 2b 20 20 41 20 66 65 77 20 65 78 74 65 6e 73   +  A few extens
0580: 69 6f 6e 73 20 74 6f 20 74 68 65 20 66 6f 72 6d  ions to the form
0590: 61 74 74 69 6e 67 20 6e 6f 74 61 74 69 6f 6e 20  atting notation 
05a0: 61 72 65 20 73 75 70 70 6f 72 74 65 64 3a 0a 2a  are supported:.*
05b0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 2a  *.**           *
05c0: 20 20 54 68 65 20 22 3d 22 20 66 6c 61 67 20 28    The "=" flag (
05d0: 73 69 6d 69 6c 61 72 20 74 6f 20 22 2d 22 29 20  similar to "-") 
05e0: 63 61 75 73 65 73 20 74 68 65 20 6f 75 74 70 75  causes the outpu
05f0: 74 20 74 6f 20 62 65 0a 2a 2a 20 20 20 20 20 20  t to be.**      
0600: 20 20 20 20 20 20 20 20 62 65 20 63 65 6e 74 65          be cente
0610: 72 65 64 20 69 6e 20 74 68 65 20 61 70 70 72 6f  red in the appro
0620: 70 72 69 61 74 65 6c 79 20 73 69 7a 65 64 20 66  priately sized f
0630: 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ield..**.**     
0640: 20 20 20 20 20 20 2a 20 20 54 68 65 20 25 62 20        *  The %b 
0650: 66 69 65 6c 64 20 6f 75 74 70 75 74 73 20 61 6e  field outputs an
0660: 20 69 6e 74 65 67 65 72 20 69 6e 20 62 69 6e 61   integer in bina
0670: 72 79 20 6e 6f 74 61 74 69 6f 6e 2e 0a 2a 2a 0a  ry notation..**.
0680: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 2a 20 20  **           *  
0690: 54 68 65 20 25 63 20 66 69 65 6c 64 20 6e 6f 77  The %c field now
06a0: 20 61 63 63 65 70 74 73 20 61 20 70 72 65 63 69   accepts a preci
06b0: 73 69 6f 6e 2e 20 20 54 68 65 20 63 68 61 72 61  sion.  The chara
06c0: 63 74 65 72 20 6f 75 74 70 75 74 0a 2a 2a 20 20  cter output.**  
06d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 72              is r
06e0: 65 70 65 61 74 65 64 20 62 79 20 74 68 65 20 6e  epeated by the n
06f0: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
0700: 68 65 20 70 72 65 63 69 73 69 6f 6e 20 73 70 65  he precision spe
0710: 63 69 66 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  cifies..**.**   
0720: 20 20 20 20 20 20 20 20 2a 20 20 54 68 65 20 25          *  The %
0730: 27 20 66 69 65 6c 64 20 77 6f 72 6b 73 20 6c 69  ' field works li
0740: 6b 65 20 25 63 2c 20 62 75 74 20 74 61 6b 65 73  ke %c, but takes
0750: 20 61 73 20 69 74 73 20 63 68 61 72 61 63 74 65   as its characte
0760: 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  r the.**        
0770: 20 20 20 20 20 20 6e 65 78 74 20 63 68 61 72 61        next chara
0780: 63 74 65 72 20 6f 66 20 74 68 65 20 66 6f 72 6d  cter of the form
0790: 61 74 20 73 74 72 69 6e 67 2c 20 69 6e 73 74 65  at string, inste
07a0: 61 64 20 6f 66 20 74 68 65 20 6e 65 78 74 0a 2a  ad of the next.*
07b0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
07c0: 72 67 75 6d 65 6e 74 2e 20 20 46 6f 72 20 65 78  rgument.  For ex
07d0: 61 6d 70 6c 65 2c 20 20 70 72 69 6e 74 66 28 22  ample,  printf("
07e0: 25 2e 37 38 27 2d 22 29 20 20 70 72 69 6e 74 73  %.78'-")  prints
07f0: 20 37 38 20 6d 69 6e 75 73 0a 2a 2a 20 20 20 20   78 minus.**    
0800: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 73 2c            signs,
0810: 20 74 68 65 20 73 61 6d 65 20 61 73 20 20 70 72   the same as  pr
0820: 69 6e 74 66 28 22 25 2e 37 38 63 22 2c 27 2d 27  intf("%.78c",'-'
0830: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 2b 20  )..**.**      + 
0840: 20 57 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 75   When compiled u
0850: 73 69 6e 67 20 47 43 43 20 6f 6e 20 61 20 53 50  sing GCC on a SP
0860: 41 52 43 2c 20 74 68 69 73 20 76 65 72 73 69 6f  ARC, this versio
0870: 6e 20 6f 66 20 70 72 69 6e 74 66 20 69 73 0a 2a  n of printf is.*
0880: 2a 20 20 20 20 20 20 20 20 20 66 61 73 74 65 72  *         faster
0890: 20 74 68 61 6e 20 74 68 65 20 6c 69 62 72 61 72   than the librar
08a0: 79 20 70 72 69 6e 74 66 20 66 6f 72 20 53 55 4e  y printf for SUN
08b0: 20 4f 53 20 34 2e 31 2e 0a 2a 2a 0a 2a 2a 20 20   OS 4.1..**.**  
08c0: 20 20 20 20 2b 20 20 41 6c 6c 20 66 75 6e 63 74      +  All funct
08d0: 69 6f 6e 73 20 61 72 65 20 66 75 6c 6c 79 20 72  ions are fully r
08e0: 65 65 6e 74 72 61 6e 74 2e 0a 2a 2a 0a 2a 2f 0a  eentrant..**.*/.
08f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0900: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 6f  Int.h"../*.** Co
0910: 6e 76 65 72 73 69 6f 6e 20 74 79 70 65 73 20 66  nversion types f
0920: 61 6c 6c 20 69 6e 74 6f 20 76 61 72 69 6f 75 73  all into various
0930: 20 63 61 74 65 67 6f 72 69 65 73 20 61 73 20 64   categories as d
0940: 65 66 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  efined by the.**
0950: 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 6e 75 6d 65   following enume
0960: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 64 65 66 69  ration..*/.#defi
0970: 6e 65 20 65 74 52 41 44 49 58 20 20 20 20 20 20  ne etRADIX      
0980: 20 31 20 2f 2a 20 49 6e 74 65 67 65 72 20 74 79   1 /* Integer ty
0990: 70 65 73 2e 20 20 25 64 2c 20 25 78 2c 20 25 6f  pes.  %d, %x, %o
09a0: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 20 2a  , and so forth *
09b0: 2f 0a 23 64 65 66 69 6e 65 20 65 74 46 4c 4f 41  /.#define etFLOA
09c0: 54 20 20 20 20 20 20 20 32 20 2f 2a 20 46 6c 6f  T       2 /* Flo
09d0: 61 74 69 6e 67 20 70 6f 69 6e 74 2e 20 20 25 66  ating point.  %f
09e0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65 74 45 58   */.#define etEX
09f0: 50 20 20 20 20 20 20 20 20 20 33 20 2f 2a 20 45  P         3 /* E
0a00: 78 70 6f 6e 65 6e 74 69 6f 6e 61 6c 20 6e 6f 74  xponentional not
0a10: 61 74 69 6f 6e 2e 20 25 65 20 61 6e 64 20 25 45  ation. %e and %E
0a20: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65 74 47 45   */.#define etGE
0a30: 4e 45 52 49 43 20 20 20 20 20 34 20 2f 2a 20 46  NERIC     4 /* F
0a40: 6c 6f 61 74 69 6e 67 20 6f 72 20 65 78 70 6f 6e  loating or expon
0a50: 65 6e 74 69 61 6c 2c 20 64 65 70 65 6e 64 69 6e  ential, dependin
0a60: 67 20 6f 6e 20 65 78 70 6f 6e 65 6e 74 2e 20 25  g on exponent. %
0a70: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65 74 53  g */.#define etS
0a80: 49 5a 45 20 20 20 20 20 20 20 20 35 20 2f 2a 20  IZE        5 /* 
0a90: 52 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 6f 66  Return number of
0aa0: 20 63 68 61 72 61 63 74 65 72 73 20 70 72 6f 63   characters proc
0ab0: 65 73 73 65 64 20 73 6f 20 66 61 72 2e 20 25 6e  essed so far. %n
0ac0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65 74 53 54   */.#define etST
0ad0: 52 49 4e 47 20 20 20 20 20 20 36 20 2f 2a 20 53  RING      6 /* S
0ae0: 74 72 69 6e 67 73 2e 20 25 73 20 2a 2f 0a 23 64  trings. %s */.#d
0af0: 65 66 69 6e 65 20 65 74 44 59 4e 53 54 52 49 4e  efine etDYNSTRIN
0b00: 47 20 20 20 37 20 2f 2a 20 44 79 6e 61 6d 69 63  G   7 /* Dynamic
0b10: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73  ally allocated s
0b20: 74 72 69 6e 67 73 2e 20 25 7a 20 2a 2f 0a 23 64  trings. %z */.#d
0b30: 65 66 69 6e 65 20 65 74 50 45 52 43 45 4e 54 20  efine etPERCENT 
0b40: 20 20 20 20 38 20 2f 2a 20 50 65 72 63 65 6e 74      8 /* Percent
0b50: 20 73 79 6d 62 6f 6c 2e 20 25 25 20 2a 2f 0a 23   symbol. %% */.#
0b60: 64 65 66 69 6e 65 20 65 74 43 48 41 52 58 20 20  define etCHARX  
0b70: 20 20 20 20 20 39 20 2f 2a 20 43 68 61 72 61 63       9 /* Charac
0b80: 74 65 72 73 2e 20 25 63 20 2a 2f 0a 23 64 65 66  ters. %c */.#def
0b90: 69 6e 65 20 65 74 45 52 52 4f 52 20 20 20 20 20  ine etERROR     
0ba0: 20 31 30 20 2f 2a 20 55 73 65 64 20 74 6f 20 69   10 /* Used to i
0bb0: 6e 64 69 63 61 74 65 20 6e 6f 20 73 75 63 68 20  ndicate no such 
0bc0: 63 6f 6e 76 65 72 73 69 6f 6e 20 74 79 70 65 20  conversion type 
0bd0: 2a 2f 0a 2f 2a 20 54 68 65 20 72 65 73 74 20 61  */./* The rest a
0be0: 72 65 20 65 78 74 65 6e 73 69 6f 6e 73 2c 20 6e  re extensions, n
0bf0: 6f 74 20 6e 6f 72 6d 61 6c 6c 79 20 66 6f 75 6e  ot normally foun
0c00: 64 20 69 6e 20 70 72 69 6e 74 66 28 29 20 2a 2f  d in printf() */
0c10: 0a 23 64 65 66 69 6e 65 20 65 74 43 48 41 52 4c  .#define etCHARL
0c20: 49 54 20 20 20 20 31 31 20 2f 2a 20 4c 69 74 65  IT    11 /* Lite
0c30: 72 61 6c 20 63 68 61 72 61 63 74 65 72 73 2e 20  ral characters. 
0c40: 20 25 27 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65   %' */.#define e
0c50: 74 53 51 4c 45 53 43 41 50 45 20 20 31 32 20 2f  tSQLESCAPE  12 /
0c60: 2a 20 53 74 72 69 6e 67 73 20 77 69 74 68 20 27  * Strings with '
0c70: 5c 27 27 20 64 6f 75 62 6c 65 64 2e 20 20 25 71  \'' doubled.  %q
0c80: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65 74 53 51   */.#define etSQ
0c90: 4c 45 53 43 41 50 45 32 20 31 33 20 2f 2a 20 53  LESCAPE2 13 /* S
0ca0: 74 72 69 6e 67 73 20 77 69 74 68 20 27 5c 27 27  trings with '\''
0cb0: 20 64 6f 75 62 6c 65 64 20 61 6e 64 20 65 6e 63   doubled and enc
0cc0: 6c 6f 73 65 64 20 69 6e 20 27 27 2c 0a 20 20 20  losed in '',.   
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 20 20 20 20 4e 55 4c 4c 20 70 6f 69 6e         NULL poin
0cf0: 74 65 72 73 20 72 65 70 6c 61 63 65 64 20 62 79  ters replaced by
0d00: 20 53 51 4c 20 4e 55 4c 4c 2e 20 20 25 51 20 2a   SQL NULL.  %Q *
0d10: 2f 0a 23 64 65 66 69 6e 65 20 65 74 54 4f 4b 45  /.#define etTOKE
0d20: 4e 20 20 20 20 20 20 31 34 20 2f 2a 20 61 20 70  N      14 /* a p
0d30: 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 6f 6b 65  ointer to a Toke
0d40: 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 23  n structure */.#
0d50: 64 65 66 69 6e 65 20 65 74 53 52 43 4c 49 53 54  define etSRCLIST
0d60: 20 20 20 20 31 35 20 2f 2a 20 61 20 70 6f 69 6e      15 /* a poin
0d70: 74 65 72 20 74 6f 20 61 20 53 72 63 4c 69 73 74  ter to a SrcList
0d80: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 22   */.../*.** An "
0d90: 65 74 42 79 74 65 22 20 69 73 20 61 6e 20 38 2d  etByte" is an 8-
0da0: 62 69 74 20 75 6e 73 69 67 6e 65 64 20 76 61 6c  bit unsigned val
0db0: 75 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 75  ue..*/.typedef u
0dc0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 74 42  nsigned char etB
0dd0: 79 74 65 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  yte;../*.** Each
0de0: 20 62 75 69 6c 74 69 6e 20 63 6f 6e 76 65 72 73   builtin convers
0df0: 69 6f 6e 20 63 68 61 72 61 63 74 65 72 20 28 65  ion character (e
0e00: 78 3a 20 74 68 65 20 27 64 27 20 69 6e 20 22 25  x: the 'd' in "%
0e10: 64 22 29 20 69 73 20 64 65 73 63 72 69 62 65 64  d") is described
0e20: 0a 2a 2a 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  .** by an instan
0e30: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0e40: 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2f  ing structure.*/
0e50: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0e60: 65 74 5f 69 6e 66 6f 20 7b 20 20 20 2f 2a 20 49  et_info {   /* I
0e70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
0e80: 20 65 61 63 68 20 66 6f 72 6d 61 74 20 66 69 65   each format fie
0e90: 6c 64 20 2a 2f 0a 20 20 63 68 61 72 20 66 6d 74  ld */.  char fmt
0ea0: 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  type;           
0eb0: 20 2f 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66   /* The format f
0ec0: 69 65 6c 64 20 63 6f 64 65 20 6c 65 74 74 65 72  ield code letter
0ed0: 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 62 61 73   */.  etByte bas
0ee0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
0ef0: 2a 20 54 68 65 20 62 61 73 65 20 66 6f 72 20 72  * The base for r
0f00: 61 64 69 78 20 63 6f 6e 76 65 72 73 69 6f 6e 20  adix conversion 
0f10: 2a 2f 0a 20 20 65 74 42 79 74 65 20 66 6c 61 67  */.  etByte flag
0f20: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
0f30: 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   One or more of 
0f40: 46 4c 41 47 5f 20 63 6f 6e 73 74 61 6e 74 73 20  FLAG_ constants 
0f50: 62 65 6c 6f 77 20 2a 2f 0a 20 20 65 74 42 79 74  below */.  etByt
0f60: 65 20 74 79 70 65 3b 20 20 20 20 20 20 20 20 20  e type;         
0f70: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 73 69 6f      /* Conversio
0f80: 6e 20 70 61 72 61 64 69 67 6d 20 2a 2f 0a 20 20  n paradigm */.  
0f90: 63 68 61 72 20 2a 63 68 61 72 73 65 74 3b 20 20  char *charset;  
0fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0fb0: 63 68 61 72 61 63 74 65 72 20 73 65 74 20 66 6f  character set fo
0fc0: 72 20 63 6f 6e 76 65 72 73 69 6f 6e 20 2a 2f 0a  r conversion */.
0fd0: 20 20 63 68 61 72 20 2a 70 72 65 66 69 78 3b 20    char *prefix; 
0fe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
0ff0: 65 66 69 78 20 6f 6e 20 6e 6f 6e 2d 7a 65 72 6f  efix on non-zero
1000: 20 76 61 6c 75 65 73 20 69 6e 20 61 6c 74 20 66   values in alt f
1010: 6f 72 6d 61 74 20 2a 2f 0a 7d 20 65 74 5f 69 6e  ormat */.} et_in
1020: 66 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  fo;../*.** Allow
1030: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 65 74  ed values for et
1040: 5f 69 6e 66 6f 2e 66 6c 61 67 73 0a 2a 2f 0a 23  _info.flags.*/.#
1050: 64 65 66 69 6e 65 20 46 4c 41 47 5f 53 49 47 4e  define FLAG_SIGN
1060: 45 44 20 20 31 20 20 20 20 20 2f 2a 20 54 72 75  ED  1     /* Tru
1070: 65 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 74  e if the value t
1080: 6f 20 63 6f 6e 76 65 72 74 20 69 73 20 73 69 67  o convert is sig
1090: 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46  ned */.#define F
10a0: 4c 41 47 5f 49 4e 54 45 52 4e 20 20 32 20 20 20  LAG_INTERN  2   
10b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 66 6f 72    /* True if for
10c0: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f 6e   internal use on
10d0: 6c 79 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  ly */.../*.** Th
10e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
10f0: 65 20 69 73 20 73 65 61 72 63 68 65 64 20 6c 69  e is searched li
1100: 6e 65 61 72 6c 79 2c 20 73 6f 20 69 74 20 69 73  nearly, so it is
1110: 20 67 6f 6f 64 20 74 6f 20 70 75 74 20 74 68 65   good to put the
1120: 0a 2a 2a 20 6d 6f 73 74 20 66 72 65 71 75 65 6e  .** most frequen
1130: 74 6c 79 20 75 73 65 64 20 63 6f 6e 76 65 72 73  tly used convers
1140: 69 6f 6e 20 74 79 70 65 73 20 66 69 72 73 74 2e  ion types first.
1150: 0a 2a 2f 0a 73 74 61 74 69 63 20 65 74 5f 69 6e  .*/.static et_in
1160: 66 6f 20 66 6d 74 69 6e 66 6f 5b 5d 20 3d 20 7b  fo fmtinfo[] = {
1170: 0a 20 20 7b 20 20 27 64 27 2c 20 31 30 2c 20 31  .  {  'd', 10, 1
1180: 2c 20 65 74 52 41 44 49 58 2c 20 20 20 20 20 20  , etRADIX,      
1190: 22 30 31 32 33 34 35 36 37 38 39 22 2c 20 20 20  "0123456789",   
11a0: 20 20 20 20 30 20 20 20 20 7d 2c 0a 20 20 7b 20      0    },.  { 
11b0: 20 27 73 27 2c 20 20 30 2c 20 30 2c 20 65 74 53   's',  0, 0, etS
11c0: 54 52 49 4e 47 2c 20 20 20 20 20 30 2c 20 20 20  TRING,     0,   
11d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
11e0: 20 20 20 20 7d 2c 0a 20 20 7b 20 20 27 7a 27 2c      },.  {  'z',
11f0: 20 20 30 2c 20 32 2c 20 65 74 44 59 4e 53 54 52    0, 2, etDYNSTR
1200: 49 4e 47 2c 20 20 30 2c 20 20 20 20 20 20 20 20  ING,  0,        
1210: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 7d            0    }
1220: 2c 0a 20 20 7b 20 20 27 71 27 2c 20 20 30 2c 20  ,.  {  'q',  0, 
1230: 30 2c 20 65 74 53 51 4c 45 53 43 41 50 45 2c 20  0, etSQLESCAPE, 
1240: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
1250: 20 20 20 20 20 30 20 20 20 20 7d 2c 0a 20 20 7b       0    },.  {
1260: 20 20 27 51 27 2c 20 20 30 2c 20 30 2c 20 65 74    'Q',  0, 0, et
1270: 53 51 4c 45 53 43 41 50 45 32 2c 20 30 2c 20 20  SQLESCAPE2, 0,  
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 30 20 20 20 20 7d 2c 0a 20 20 7b 20 20 27 63 27  0    },.  {  'c'
12a0: 2c 20 20 30 2c 20 30 2c 20 65 74 43 48 41 52 58  ,  0, 0, etCHARX
12b0: 2c 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20  ,      0,       
12c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
12d0: 7d 2c 0a 20 20 7b 20 20 27 6f 27 2c 20 20 38 2c  },.  {  'o',  8,
12e0: 20 30 2c 20 65 74 52 41 44 49 58 2c 20 20 20 20   0, etRADIX,    
12f0: 20 20 22 30 31 32 33 34 35 36 37 22 2c 20 20 20    "01234567",   
1300: 20 20 20 20 20 20 22 30 22 20 20 7d 2c 0a 20 20        "0"  },.  
1310: 7b 20 20 27 75 27 2c 20 31 30 2c 20 30 2c 20 65  {  'u', 10, 0, e
1320: 74 52 41 44 49 58 2c 20 20 20 20 20 20 22 30 31  tRADIX,      "01
1330: 32 33 34 35 36 37 38 39 22 2c 20 20 20 20 20 20  23456789",      
1340: 20 30 20 20 20 20 7d 2c 0a 20 20 7b 20 20 27 78   0    },.  {  'x
1350: 27 2c 20 31 36 2c 20 30 2c 20 65 74 52 41 44 49  ', 16, 0, etRADI
1360: 58 2c 20 20 20 20 20 20 22 30 31 32 33 34 35 36  X,      "0123456
1370: 37 38 39 61 62 63 64 65 66 22 2c 20 22 78 30 22  789abcdef", "x0"
1380: 20 7d 2c 0a 20 20 7b 20 20 27 58 27 2c 20 31 36   },.  {  'X', 16
1390: 2c 20 30 2c 20 65 74 52 41 44 49 58 2c 20 20 20  , 0, etRADIX,   
13a0: 20 20 20 22 30 31 32 33 34 35 36 37 38 39 41 42     "0123456789AB
13b0: 43 44 45 46 22 2c 20 22 58 30 22 20 7d 2c 0a 20  CDEF", "X0" },. 
13c0: 20 7b 20 20 27 66 27 2c 20 20 30 2c 20 31 2c 20   {  'f',  0, 1, 
13d0: 65 74 46 4c 4f 41 54 2c 20 20 20 20 20 20 30 2c  etFLOAT,      0,
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 30 20 20 20 20 7d 2c 0a 20 20 7b 20 20 27    0    },.  {  '
1400: 65 27 2c 20 20 30 2c 20 31 2c 20 65 74 45 58 50  e',  0, 1, etEXP
1410: 2c 20 20 20 20 20 20 20 20 22 65 22 2c 20 20 20  ,        "e",   
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
1430: 20 20 7d 2c 0a 20 20 7b 20 20 27 45 27 2c 20 20    },.  {  'E',  
1440: 30 2c 20 31 2c 20 65 74 45 58 50 2c 20 20 20 20  0, 1, etEXP,    
1450: 20 20 20 20 22 45 22 2c 20 20 20 20 20 20 20 20      "E",        
1460: 20 20 20 20 20 20 20 20 30 20 20 20 20 7d 2c 0a          0    },.
1470: 20 20 7b 20 20 27 67 27 2c 20 20 30 2c 20 31 2c    {  'g',  0, 1,
1480: 20 65 74 47 45 4e 45 52 49 43 2c 20 20 20 20 22   etGENERIC,    "
1490: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
14a0: 20 20 20 30 20 20 20 20 7d 2c 0a 20 20 7b 20 20     0    },.  {  
14b0: 27 47 27 2c 20 20 30 2c 20 31 2c 20 65 74 47 45  'G',  0, 1, etGE
14c0: 4e 45 52 49 43 2c 20 20 20 20 22 45 22 2c 20 20  NERIC,    "E",  
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
14e0: 20 20 20 7d 2c 0a 20 20 7b 20 20 27 69 27 2c 20     },.  {  'i', 
14f0: 31 30 2c 20 31 2c 20 65 74 52 41 44 49 58 2c 20  10, 1, etRADIX, 
1500: 20 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39       "0123456789
1510: 22 2c 20 20 20 20 20 20 20 30 20 20 20 20 7d 2c  ",       0    },
1520: 0a 20 20 7b 20 20 27 6e 27 2c 20 20 30 2c 20 30  .  {  'n',  0, 0
1530: 2c 20 65 74 53 49 5a 45 2c 20 20 20 20 20 20 20  , etSIZE,       
1540: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
1550: 20 20 20 20 30 20 20 20 20 7d 2c 0a 20 20 7b 20      0    },.  { 
1560: 20 27 25 27 2c 20 20 30 2c 20 30 2c 20 65 74 50   '%',  0, 0, etP
1570: 45 52 43 45 4e 54 2c 20 20 20 20 30 2c 20 20 20  ERCENT,    0,   
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1590: 20 20 20 20 7d 2c 0a 20 20 7b 20 20 27 70 27 2c      },.  {  'p',
15a0: 20 31 30 2c 20 30 2c 20 65 74 52 41 44 49 58 2c   10, 0, etRADIX,
15b0: 20 20 20 20 20 20 22 30 31 32 33 34 35 36 37 38        "012345678
15c0: 39 22 2c 20 20 20 20 20 20 20 30 20 20 20 20 7d  9",       0    }
15d0: 2c 0a 20 20 7b 20 20 27 54 27 2c 20 20 30 2c 20  ,.  {  'T',  0, 
15e0: 32 2c 20 65 74 54 4f 4b 45 4e 2c 20 20 20 20 20  2, etTOKEN,     
15f0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
1600: 20 20 20 20 20 30 20 20 20 20 7d 2c 0a 20 20 7b       0    },.  {
1610: 20 20 27 53 27 2c 20 20 30 2c 20 32 2c 20 65 74    'S',  0, 2, et
1620: 53 52 43 4c 49 53 54 2c 20 20 20 20 30 2c 20 20  SRCLIST,    0,  
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1640: 30 20 20 20 20 7d 2c 0a 7d 3b 0a 23 64 65 66 69  0    },.};.#defi
1650: 6e 65 20 65 74 4e 49 4e 46 4f 20 20 28 73 69 7a  ne etNINFO  (siz
1660: 65 6f 66 28 66 6d 74 69 6e 66 6f 29 2f 73 69 7a  eof(fmtinfo)/siz
1670: 65 6f 66 28 66 6d 74 69 6e 66 6f 5b 30 5d 29 29  eof(fmtinfo[0]))
1680: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 4e 4f 46 4c 4f  ../*.** If NOFLO
1690: 41 54 49 4e 47 50 4f 49 4e 54 20 69 73 20 64 65  ATINGPOINT is de
16a0: 66 69 6e 65 64 2c 20 74 68 65 6e 20 6e 6f 6e 65  fined, then none
16b0: 20 6f 66 20 74 68 65 20 66 6c 6f 61 74 69 6e 67   of the floating
16c0: 20 70 6f 69 6e 74 0a 2a 2a 20 63 6f 6e 76 65 72   point.** conver
16d0: 73 69 6f 6e 73 20 77 69 6c 6c 20 77 6f 72 6b 2e  sions will work.
16e0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 65 74 4e 4f  .*/.#ifndef etNO
16f0: 46 4c 4f 41 54 49 4e 47 50 4f 49 4e 54 0a 2f 2a  FLOATINGPOINT./*
1700: 0a 2a 2a 20 22 2a 76 61 6c 22 20 69 73 20 61 20  .** "*val" is a 
1710: 64 6f 75 62 6c 65 20 73 75 63 68 20 74 68 61 74  double such that
1720: 20 30 2e 31 20 3c 3d 20 2a 76 61 6c 20 3c 20 31   0.1 <= *val < 1
1730: 30 2e 30 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  0.0.** Return th
1740: 65 20 61 73 63 69 69 20 63 6f 64 65 20 66 6f 72  e ascii code for
1750: 20 74 68 65 20 6c 65 61 64 69 6e 67 20 64 69 67   the leading dig
1760: 69 74 20 6f 66 20 2a 76 61 6c 2c 20 74 68 65 6e  it of *val, then
1770: 0a 2a 2a 20 6d 75 6c 74 69 70 6c 79 20 22 2a 76  .** multiply "*v
1780: 61 6c 22 20 62 79 20 31 30 2e 30 20 74 6f 20 72  al" by 10.0 to r
1790: 65 6e 6f 72 6d 61 6c 69 7a 65 2e 0a 2a 2a 0a 2a  enormalize..**.*
17a0: 2a 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 20 20 20  * Example:.**   
17b0: 20 20 69 6e 70 75 74 3a 20 20 20 20 20 2a 76 61    input:     *va
17c0: 6c 20 3d 20 33 2e 31 34 31 35 39 0a 2a 2a 20 20  l = 3.14159.**  
17d0: 20 20 20 6f 75 74 70 75 74 3a 20 20 20 20 2a 76     output:    *v
17e0: 61 6c 20 3d 20 31 2e 34 31 35 39 20 20 20 20 66  al = 1.4159    f
17f0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 3d  unction return =
1800: 20 27 33 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   '3'.**.** The c
1810: 6f 75 6e 74 65 72 20 2a 63 6e 74 20 69 73 20 69  ounter *cnt is i
1820: 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68 20  ncremented each 
1830: 74 69 6d 65 2e 20 20 41 66 74 65 72 20 63 6f 75  time.  After cou
1840: 6e 74 65 72 20 65 78 63 65 65 64 73 0a 2a 2a 20  nter exceeds.** 
1850: 31 36 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f  16 (the number o
1860: 66 20 73 69 67 6e 69 66 69 63 61 6e 74 20 64 69  f significant di
1870: 67 69 74 73 20 69 6e 20 61 20 36 34 2d 62 69 74  gits in a 64-bit
1880: 20 66 6c 6f 61 74 29 20 27 30 27 20 69 73 0a 2a   float) '0' is.*
1890: 2a 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 65  * always returne
18a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
18b0: 20 65 74 5f 67 65 74 64 69 67 69 74 28 4c 4f 4e   et_getdigit(LON
18c0: 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 2a 76 61  GDOUBLE_TYPE *va
18d0: 6c 2c 20 69 6e 74 20 2a 63 6e 74 29 7b 0a 20 20  l, int *cnt){.  
18e0: 69 6e 74 20 64 69 67 69 74 3b 0a 20 20 4c 4f 4e  int digit;.  LON
18f0: 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 64 3b 0a  GDOUBLE_TYPE d;.
1900: 20 20 69 66 28 20 28 2a 63 6e 74 29 2b 2b 20 3e    if( (*cnt)++ >
1910: 3d 20 31 36 20 29 20 72 65 74 75 72 6e 20 27 30  = 16 ) return '0
1920: 27 3b 0a 20 20 64 69 67 69 74 20 3d 20 28 69 6e  ';.  digit = (in
1930: 74 29 2a 76 61 6c 3b 0a 20 20 64 20 3d 20 64 69  t)*val;.  d = di
1940: 67 69 74 3b 0a 20 20 64 69 67 69 74 20 2b 3d 20  git;.  digit += 
1950: 27 30 27 3b 0a 20 20 2a 76 61 6c 20 3d 20 28 2a  '0';.  *val = (*
1960: 76 61 6c 20 2d 20 64 29 2a 31 30 2e 30 3b 0a 20  val - d)*10.0;. 
1970: 20 72 65 74 75 72 6e 20 64 69 67 69 74 3b 0a 7d   return digit;.}
1980: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
1990: 20 65 74 42 55 46 53 49 5a 45 20 31 30 30 30 20   etBUFSIZE 1000 
19a0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
19b0: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  output buffer */
19c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74  ../*.** The root
19d0: 20 70 72 6f 67 72 61 6d 2e 20 20 41 6c 6c 20 76   program.  All v
19e0: 61 72 69 61 74 69 6f 6e 73 20 63 61 6c 6c 20 74  ariations call t
19f0: 68 69 73 20 63 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20  his core..**.** 
1a00: 49 4e 50 55 54 53 3a 0a 2a 2a 20 20 20 66 75 6e  INPUTS:.**   fun
1a10: 63 20 20 20 54 68 69 73 20 69 73 20 61 20 70 6f  c   This is a po
1a20: 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
1a30: 69 6f 6e 20 74 61 6b 69 6e 67 20 74 68 72 65 65  ion taking three
1a40: 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2a 20 20 20   arguments.**   
1a50: 20 20 20 20 20 20 20 20 20 31 2e 20 41 20 70 6f           1. A po
1a60: 69 6e 74 65 72 20 74 6f 20 61 6e 79 74 68 69 6e  inter to anythin
1a70: 67 2e 20 20 53 61 6d 65 20 61 73 20 74 68 65 20  g.  Same as the 
1a80: 22 61 72 67 22 20 70 61 72 61 6d 65 74 65 72 2e  "arg" parameter.
1a90: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 32  .**            2
1aa0: 2e 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  . A pointer to t
1ab0: 68 65 20 6c 69 73 74 20 6f 66 20 63 68 61 72 61  he list of chara
1ac0: 63 74 65 72 73 20 74 6f 20 62 65 20 6f 75 74 70  cters to be outp
1ad0: 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
1ae0: 20 20 20 20 28 4e 6f 74 65 2c 20 74 68 69 73 20      (Note, this 
1af0: 6c 69 73 74 20 69 73 20 4e 4f 54 20 6e 75 6c 6c  list is NOT null
1b00: 20 74 65 72 6d 69 6e 61 74 65 64 2e 29 0a 2a 2a   terminated.).**
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 33 2e 20 41              3. A
1b20: 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
1b30: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 74   of characters t
1b40: 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 2a 2a 20  o be output..** 
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4e                (N
1b60: 6f 74 65 3a 20 54 68 69 73 20 6e 75 6d 62 65 72  ote: This number
1b70: 20 6d 69 67 68 74 20 62 65 20 7a 65 72 6f 2e 29   might be zero.)
1b80: 0a 2a 2a 0a 2a 2a 20 20 20 61 72 67 20 20 20 20  .**.**   arg    
1b90: 54 68 69 73 20 69 73 20 74 68 65 20 70 6f 69 6e  This is the poin
1ba0: 74 65 72 20 74 6f 20 61 6e 79 74 68 69 6e 67 20  ter to anything 
1bb0: 77 68 69 63 68 20 77 69 6c 6c 20 62 65 20 70 61  which will be pa
1bc0: 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 20  ssed as the.**  
1bd0: 20 20 20 20 20 20 20 20 66 69 72 73 74 20 61 72          first ar
1be0: 67 75 6d 65 6e 74 20 74 6f 20 22 66 75 6e 63 22  gument to "func"
1bf0: 2e 20 20 55 73 65 20 69 74 20 66 6f 72 20 77 68  .  Use it for wh
1c00: 61 74 65 76 65 72 20 79 6f 75 20 6c 69 6b 65 2e  atever you like.
1c10: 0a 2a 2a 0a 2a 2a 20 20 20 66 6d 74 20 20 20 20  .**.**   fmt    
1c20: 54 68 69 73 20 69 73 20 74 68 65 20 66 6f 72 6d  This is the form
1c30: 61 74 20 73 74 72 69 6e 67 2c 20 61 73 20 69 6e  at string, as in
1c40: 20 74 68 65 20 75 73 75 61 6c 20 70 72 69 6e 74   the usual print
1c50: 2e 0a 2a 2a 0a 2a 2a 20 20 20 61 70 20 20 20 20  ..**.**   ap    
1c60: 20 54 68 69 73 20 69 73 20 61 20 70 6f 69 6e 74   This is a point
1c70: 65 72 20 74 6f 20 61 20 6c 69 73 74 20 6f 66 20  er to a list of 
1c80: 61 72 67 75 6d 65 6e 74 73 2e 20 20 53 61 6d 65  arguments.  Same
1c90: 20 61 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20   as in.**       
1ca0: 20 20 20 76 66 70 72 69 6e 74 2e 0a 2a 2a 0a 2a     vfprint..**.*
1cb0: 2a 20 4f 55 54 50 55 54 53 3a 0a 2a 2a 20 20 20  * OUTPUTS:.**   
1cc0: 20 20 20 20 20 20 20 54 68 65 20 72 65 74 75 72         The retur
1cd0: 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 74  n value is the t
1ce0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63  otal number of c
1cf0: 68 61 72 61 63 74 65 72 73 20 73 65 6e 74 20 74  haracters sent t
1d00: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68  o.**          th
1d10: 65 20 66 75 6e 63 74 69 6f 6e 20 22 66 75 6e 63  e function "func
1d20: 22 2e 20 20 52 65 74 75 72 6e 73 20 2d 31 20 6f  ".  Returns -1 o
1d30: 6e 20 61 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a  n a error..**.**
1d40: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6f   Note that the o
1d50: 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 61 75  rder in which au
1d60: 74 6f 6d 61 74 69 63 20 76 61 72 69 61 62 6c 65  tomatic variable
1d70: 73 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 62  s are declared b
1d80: 65 6c 6f 77 0a 2a 2a 20 73 65 65 6d 73 20 74 6f  elow.** seems to
1d90: 20 6d 61 6b 65 20 61 20 62 69 67 20 64 69 66 66   make a big diff
1da0: 65 72 65 6e 63 65 20 69 6e 20 64 65 74 65 72 6d  erence in determ
1db0: 69 6e 69 6e 67 20 68 6f 77 20 66 61 73 74 20 74  ining how fast t
1dc0: 68 69 73 20 62 65 61 73 74 0a 2a 2a 20 77 69 6c  his beast.** wil
1dd0: 6c 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  l run..*/.static
1de0: 20 69 6e 74 20 76 78 70 72 69 6e 74 66 28 0a 20   int vxprintf(. 
1df0: 20 76 6f 69 64 20 28 2a 66 75 6e 63 29 28 76 6f   void (*func)(vo
1e00: 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  id*,const char*,
1e10: 69 6e 74 29 2c 20 20 20 20 20 2f 2a 20 43 6f 6e  int),     /* Con
1e20: 73 75 6d 65 72 20 6f 66 20 74 65 78 74 20 2a 2f  sumer of text */
1e30: 0a 20 20 76 6f 69 64 20 2a 61 72 67 2c 20 20 20  .  void *arg,   
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
1e60: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 63  rgument to the c
1e70: 6f 6e 73 75 6d 65 72 20 2a 2f 0a 20 20 69 6e 74  onsumer */.  int
1e80: 20 75 73 65 45 78 74 65 6e 64 65 64 2c 20 20 20   useExtended,   
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea0: 2f 2a 20 41 6c 6c 6f 77 20 65 78 74 65 6e 64 65  /* Allow extende
1eb0: 64 20 25 2d 63 6f 6e 76 65 72 73 69 6f 6e 73 20  d %-conversions 
1ec0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1ed0: 2a 66 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  *fmt,           
1ee0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 6d 61          /* Forma
1ef0: 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 76 61  t string */.  va
1f00: 5f 6c 69 73 74 20 61 70 20 20 20 20 20 20 20 20  _list ap        
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 2f 2a 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   /* arguments */
1f30: 0a 29 7b 0a 20 20 69 6e 74 20 63 3b 20 20 20 20  .){.  int c;    
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 20 2f 2a 20 4e 65 78 74 20 63 68 61 72 61 63 74   /* Next charact
1f60: 65 72 20 69 6e 20 74 68 65 20 66 6f 72 6d 61 74  er in the format
1f70: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61   string */.  cha
1f80: 72 20 2a 62 75 66 70 74 3b 20 20 20 20 20 20 20  r *bufpt;       
1f90: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1fa0: 65 72 20 74 6f 20 74 68 65 20 63 6f 6e 76 65 72  er to the conver
1fb0: 73 69 6f 6e 20 62 75 66 66 65 72 20 2a 2f 0a 20  sion buffer */. 
1fc0: 20 69 6e 74 20 70 72 65 63 69 73 69 6f 6e 3b 20   int precision; 
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1fe0: 72 65 63 69 73 69 6f 6e 20 6f 66 20 74 68 65 20  recision of the 
1ff0: 63 75 72 72 65 6e 74 20 66 69 65 6c 64 20 2a 2f  current field */
2000: 0a 20 20 69 6e 74 20 6c 65 6e 67 74 68 3b 20 20  .  int length;  
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2020: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 66   Length of the f
2030: 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ield */.  int id
2040: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
2050: 20 20 20 20 20 2f 2a 20 41 20 67 65 6e 65 72 61       /* A genera
2060: 6c 20 70 75 72 70 6f 73 65 20 6c 6f 6f 70 20 63  l purpose loop c
2070: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
2080: 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  count;          
2090: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
20a0: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
20b0: 74 65 72 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20  ters output */. 
20c0: 20 69 6e 74 20 77 69 64 74 68 3b 20 20 20 20 20   int width;     
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
20e0: 69 64 74 68 20 6f 66 20 74 68 65 20 63 75 72 72  idth of the curr
20f0: 65 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20 65  ent field */.  e
2100: 74 42 79 74 65 20 66 6c 61 67 5f 6c 65 66 74 6a  tByte flag_leftj
2110: 75 73 74 69 66 79 3b 20 20 20 2f 2a 20 54 72 75  ustify;   /* Tru
2120: 65 20 69 66 20 22 2d 22 20 66 6c 61 67 20 69 73  e if "-" flag is
2130: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 65 74   present */.  et
2140: 42 79 74 65 20 66 6c 61 67 5f 70 6c 75 73 73 69  Byte flag_plussi
2150: 67 6e 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  gn;      /* True
2160: 20 69 66 20 22 2b 22 20 66 6c 61 67 20 69 73 20   if "+" flag is 
2170: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 65 74 42  present */.  etB
2180: 79 74 65 20 66 6c 61 67 5f 62 6c 61 6e 6b 73 69  yte flag_blanksi
2190: 67 6e 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20  gn;     /* True 
21a0: 69 66 20 22 20 22 20 66 6c 61 67 20 69 73 20 70  if " " flag is p
21b0: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 65 74 42 79  resent */.  etBy
21c0: 74 65 20 66 6c 61 67 5f 61 6c 74 65 72 6e 61 74  te flag_alternat
21d0: 65 66 6f 72 6d 3b 20 2f 2a 20 54 72 75 65 20 69  eform; /* True i
21e0: 66 20 22 23 22 20 66 6c 61 67 20 69 73 20 70 72  f "#" flag is pr
21f0: 65 73 65 6e 74 20 2a 2f 0a 20 20 65 74 42 79 74  esent */.  etByt
2200: 65 20 66 6c 61 67 5f 7a 65 72 6f 70 61 64 3b 20  e flag_zeropad; 
2210: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2220: 20 66 69 65 6c 64 20 77 69 64 74 68 20 63 6f 6e   field width con
2230: 73 74 61 6e 74 20 73 74 61 72 74 73 20 77 69 74  stant starts wit
2240: 68 20 7a 65 72 6f 20 2a 2f 0a 20 20 65 74 42 79  h zero */.  etBy
2250: 74 65 20 66 6c 61 67 5f 6c 6f 6e 67 3b 20 20 20  te flag_long;   
2260: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2270: 66 20 22 6c 22 20 66 6c 61 67 20 69 73 20 70 72  f "l" flag is pr
2280: 65 73 65 6e 74 20 2a 2f 0a 20 20 65 74 42 79 74  esent */.  etByt
2290: 65 20 66 6c 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 3b  e flag_longlong;
22a0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
22b0: 20 74 68 65 20 22 6c 6c 22 20 66 6c 61 67 20 69   the "ll" flag i
22c0: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 55  s present */.  U
22d0: 49 4e 54 36 34 5f 54 59 50 45 20 6c 6f 6e 67 76  INT64_TYPE longv
22e0: 61 6c 75 65 3b 20 20 20 20 20 2f 2a 20 56 61 6c  alue;     /* Val
22f0: 75 65 20 66 6f 72 20 69 6e 74 65 67 65 72 20 74  ue for integer t
2300: 79 70 65 73 20 2a 2f 0a 20 20 4c 4f 4e 47 44 4f  ypes */.  LONGDO
2310: 55 42 4c 45 5f 54 59 50 45 20 72 65 61 6c 76 61  UBLE_TYPE realva
2320: 6c 75 65 3b 20 2f 2a 20 56 61 6c 75 65 20 66 6f  lue; /* Value fo
2330: 72 20 72 65 61 6c 20 74 79 70 65 73 20 2a 2f 0a  r real types */.
2340: 20 20 65 74 5f 69 6e 66 6f 20 2a 69 6e 66 6f 70    et_info *infop
2350: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2360: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  Pointer to the a
2370: 70 70 72 6f 70 72 69 61 74 65 20 69 6e 66 6f 20  ppropriate info 
2380: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 63  structure */.  c
2390: 68 61 72 20 62 75 66 5b 65 74 42 55 46 53 49 5a  har buf[etBUFSIZ
23a0: 45 5d 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  E];       /* Con
23b0: 76 65 72 73 69 6f 6e 20 62 75 66 66 65 72 20 2a  version buffer *
23c0: 2f 0a 20 20 63 68 61 72 20 70 72 65 66 69 78 3b  /.  char prefix;
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23e0: 2a 20 50 72 65 66 69 78 20 63 68 61 72 61 63 74  * Prefix charact
23f0: 65 72 2e 20 20 22 2b 22 20 6f 72 20 22 2d 22 20  er.  "+" or "-" 
2400: 6f 72 20 22 20 22 20 6f 72 20 27 5c 30 27 2e 20  or " " or '\0'. 
2410: 2a 2f 0a 20 20 65 74 42 79 74 65 20 65 72 72 6f  */.  etByte erro
2420: 72 66 6c 61 67 20 3d 20 30 3b 20 20 20 20 20 20  rflag = 0;      
2430: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 65 72  /* True if an er
2440: 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
2450: 65 64 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 78  ed */.  etByte x
2460: 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  type;           
2470: 20 20 20 2f 2a 20 43 6f 6e 76 65 72 73 69 6f 6e     /* Conversion
2480: 20 70 61 72 61 64 69 67 6d 20 2a 2f 0a 20 20 63   paradigm */.  c
2490: 68 61 72 20 2a 7a 45 78 74 72 61 3b 20 20 20 20  har *zExtra;    
24a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
24b0: 72 61 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66  ra memory used f
24c0: 6f 72 20 65 74 54 43 4c 45 53 43 41 50 45 20 63  or etTCLESCAPE c
24d0: 6f 6e 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 20 20  onversions */.  
24e0: 73 74 61 74 69 63 20 63 68 61 72 20 73 70 61 63  static char spac
24f0: 65 73 5b 5d 20 3d 20 22 20 20 20 20 20 20 20 20  es[] = "        
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 20 20 20 20 20 20 20 20 20 20 22 3b 0a 23 64 65            ";.#de
2530: 66 69 6e 65 20 65 74 53 50 41 43 45 53 49 5a 45  fine etSPACESIZE
2540: 20 28 73 69 7a 65 6f 66 28 73 70 61 63 65 73 29   (sizeof(spaces)
2550: 2d 31 29 0a 23 69 66 6e 64 65 66 20 65 74 4e 4f  -1).#ifndef etNO
2560: 46 4c 4f 41 54 49 4e 47 50 4f 49 4e 54 0a 20 20  FLOATINGPOINT.  
2570: 69 6e 74 20 20 65 78 70 3b 20 20 20 20 20 20 20  int  exp;       
2580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 65 78             /* ex
2590: 70 6f 6e 65 6e 74 20 6f 66 20 72 65 61 6c 20 6e  ponent of real n
25a0: 75 6d 62 65 72 73 20 2a 2f 0a 20 20 64 6f 75 62  umbers */.  doub
25b0: 6c 65 20 72 6f 75 6e 64 65 72 3b 20 20 20 20 20  le rounder;     
25c0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66         /* Used f
25d0: 6f 72 20 72 6f 75 6e 64 69 6e 67 20 66 6c 6f 61  or rounding floa
25e0: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
25f0: 73 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 66 6c  s */.  etByte fl
2600: 61 67 5f 64 70 3b 20 20 20 20 20 20 20 20 20 20  ag_dp;          
2610: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 64 65 63    /* True if dec
2620: 69 6d 61 6c 20 70 6f 69 6e 74 20 73 68 6f 75 6c  imal point shoul
2630: 64 20 62 65 20 73 68 6f 77 6e 20 2a 2f 0a 20 20  d be shown */.  
2640: 65 74 42 79 74 65 20 66 6c 61 67 5f 72 74 7a 3b  etByte flag_rtz;
2650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2660: 75 65 20 69 66 20 74 72 61 69 6c 69 6e 67 20 7a  ue if trailing z
2670: 65 72 6f 73 20 73 68 6f 75 6c 64 20 62 65 20 72  eros should be r
2680: 65 6d 6f 76 65 64 20 2a 2f 0a 20 20 65 74 42 79  emoved */.  etBy
2690: 74 65 20 66 6c 61 67 5f 65 78 70 3b 20 20 20 20  te flag_exp;    
26a0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
26b0: 6f 20 66 6f 72 63 65 20 64 69 73 70 6c 61 79 20  o force display 
26c0: 6f 66 20 74 68 65 20 65 78 70 6f 6e 65 6e 74 20  of the exponent 
26d0: 2a 2f 0a 20 20 69 6e 74 20 6e 73 64 3b 20 20 20  */.  int nsd;   
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 69 67  /* Number of sig
2700: 6e 69 66 69 63 61 6e 74 20 64 69 67 69 74 73 20  nificant digits 
2710: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 23 65 6e 64  returned */.#end
2720: 69 66 0a 0a 20 20 63 6f 75 6e 74 20 3d 20 6c 65  if..  count = le
2730: 6e 67 74 68 20 3d 20 30 3b 0a 20 20 62 75 66 70  ngth = 0;.  bufp
2740: 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 3b 20 28  t = 0;.  for(; (
2750: 63 3d 28 2a 66 6d 74 29 29 21 3d 30 3b 20 2b 2b  c=(*fmt))!=0; ++
2760: 66 6d 74 29 7b 0a 20 20 20 20 69 66 28 20 63 21  fmt){.    if( c!
2770: 3d 27 25 27 20 29 7b 0a 20 20 20 20 20 20 69 6e  ='%' ){.      in
2780: 74 20 61 6d 74 3b 0a 20 20 20 20 20 20 62 75 66  t amt;.      buf
2790: 70 74 20 3d 20 28 63 68 61 72 20 2a 29 66 6d 74  pt = (char *)fmt
27a0: 3b 0a 20 20 20 20 20 20 61 6d 74 20 3d 20 31 3b  ;.      amt = 1;
27b0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
27c0: 3d 28 2a 2b 2b 66 6d 74 29 29 21 3d 27 25 27 20  =(*++fmt))!='%' 
27d0: 26 26 20 63 21 3d 30 20 29 20 61 6d 74 2b 2b 3b  && c!=0 ) amt++;
27e0: 0a 20 20 20 20 20 20 28 2a 66 75 6e 63 29 28 61  .      (*func)(a
27f0: 72 67 2c 62 75 66 70 74 2c 61 6d 74 29 3b 0a 20  rg,bufpt,amt);. 
2800: 20 20 20 20 20 63 6f 75 6e 74 20 2b 3d 20 61 6d       count += am
2810: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  t;.      if( c==
2820: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
2830: 0a 20 20 20 20 69 66 28 20 28 63 3d 28 2a 2b 2b  .    if( (c=(*++
2840: 66 6d 74 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  fmt))==0 ){.    
2850: 20 20 65 72 72 6f 72 66 6c 61 67 20 3d 20 31 3b    errorflag = 1;
2860: 0a 20 20 20 20 20 20 28 2a 66 75 6e 63 29 28 61  .      (*func)(a
2870: 72 67 2c 22 25 22 2c 31 29 3b 0a 20 20 20 20 20  rg,"%",1);.     
2880: 20 63 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20   count++;.      
2890: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
28a0: 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 61   /* Find out wha
28b0: 74 20 66 6c 61 67 73 20 61 72 65 20 70 72 65 73  t flags are pres
28c0: 65 6e 74 20 2a 2f 0a 20 20 20 20 66 6c 61 67 5f  ent */.    flag_
28d0: 6c 65 66 74 6a 75 73 74 69 66 79 20 3d 20 66 6c  leftjustify = fl
28e0: 61 67 5f 70 6c 75 73 73 69 67 6e 20 3d 20 66 6c  ag_plussign = fl
28f0: 61 67 5f 62 6c 61 6e 6b 73 69 67 6e 20 3d 20 0a  ag_blanksign = .
2900: 20 20 20 20 20 66 6c 61 67 5f 61 6c 74 65 72 6e       flag_altern
2910: 61 74 65 66 6f 72 6d 20 3d 20 66 6c 61 67 5f 7a  ateform = flag_z
2920: 65 72 6f 70 61 64 20 3d 20 30 3b 0a 20 20 20 20  eropad = 0;.    
2930: 64 6f 7b 0a 20 20 20 20 20 20 73 77 69 74 63 68  do{.      switch
2940: 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ( c ){.        c
2950: 61 73 65 20 27 2d 27 3a 20 20 20 66 6c 61 67 5f  ase '-':   flag_
2960: 6c 65 66 74 6a 75 73 74 69 66 79 20 3d 20 31 3b  leftjustify = 1;
2970: 20 20 20 20 20 63 20 3d 20 30 3b 20 20 20 62 72       c = 0;   br
2980: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
2990: 65 20 27 2b 27 3a 20 20 20 66 6c 61 67 5f 70 6c  e '+':   flag_pl
29a0: 75 73 73 69 67 6e 20 3d 20 31 3b 20 20 20 20 20  ussign = 1;     
29b0: 20 20 20 63 20 3d 20 30 3b 20 20 20 62 72 65 61     c = 0;   brea
29c0: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
29d0: 27 20 27 3a 20 20 20 66 6c 61 67 5f 62 6c 61 6e  ' ':   flag_blan
29e0: 6b 73 69 67 6e 20 3d 20 31 3b 20 20 20 20 20 20  ksign = 1;      
29f0: 20 63 20 3d 20 30 3b 20 20 20 62 72 65 61 6b 3b   c = 0;   break;
2a00: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 23  .        case '#
2a10: 27 3a 20 20 20 66 6c 61 67 5f 61 6c 74 65 72 6e  ':   flag_altern
2a20: 61 74 65 66 6f 72 6d 20 3d 20 31 3b 20 20 20 63  ateform = 1;   c
2a30: 20 3d 20 30 3b 20 20 20 62 72 65 61 6b 3b 0a 20   = 0;   break;. 
2a40: 20 20 20 20 20 20 20 63 61 73 65 20 27 30 27 3a         case '0':
2a50: 20 20 20 66 6c 61 67 5f 7a 65 72 6f 70 61 64 20     flag_zeropad 
2a60: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 63 20 3d  = 1;         c =
2a70: 20 30 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20   0;   break;.   
2a80: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20       default:   
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2ac0: 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 63   }.    }while( c
2ad0: 3d 3d 30 20 26 26 20 28 63 3d 28 2a 2b 2b 66 6d  ==0 && (c=(*++fm
2ae0: 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 2f 2a  t))!=0 );.    /*
2af0: 20 47 65 74 20 74 68 65 20 66 69 65 6c 64 20 77   Get the field w
2b00: 69 64 74 68 20 2a 2f 0a 20 20 20 20 77 69 64 74  idth */.    widt
2b10: 68 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 63  h = 0;.    if( c
2b20: 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 77  =='*' ){.      w
2b30: 69 64 74 68 20 3d 20 76 61 5f 61 72 67 28 61 70  idth = va_arg(ap
2b40: 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  ,int);.      if(
2b50: 20 77 69 64 74 68 3c 30 20 29 7b 0a 20 20 20 20   width<0 ){.    
2b60: 20 20 20 20 66 6c 61 67 5f 6c 65 66 74 6a 75 73      flag_leftjus
2b70: 74 69 66 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  tify = 1;.      
2b80: 20 20 77 69 64 74 68 20 3d 20 2d 77 69 64 74 68    width = -width
2b90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ba0: 63 20 3d 20 2a 2b 2b 66 6d 74 3b 0a 20 20 20 20  c = *++fmt;.    
2bb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 68 69  }else{.      whi
2bc0: 6c 65 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c  le( c>='0' && c<
2bd0: 3d 27 39 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='9' ){.        
2be0: 77 69 64 74 68 20 3d 20 77 69 64 74 68 2a 31 30  width = width*10
2bf0: 20 2b 20 63 20 2d 20 27 30 27 3b 0a 20 20 20 20   + c - '0';.    
2c00: 20 20 20 20 63 20 3d 20 2a 2b 2b 66 6d 74 3b 0a      c = *++fmt;.
2c10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c20: 20 20 69 66 28 20 77 69 64 74 68 20 3e 20 65 74    if( width > et
2c30: 42 55 46 53 49 5a 45 2d 31 30 20 29 7b 0a 20 20  BUFSIZE-10 ){.  
2c40: 20 20 20 20 77 69 64 74 68 20 3d 20 65 74 42 55      width = etBU
2c50: 46 53 49 5a 45 2d 31 30 3b 0a 20 20 20 20 7d 0a  FSIZE-10;.    }.
2c60: 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 70      /* Get the p
2c70: 72 65 63 69 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  recision */.    
2c80: 69 66 28 20 63 3d 3d 27 2e 27 20 29 7b 0a 20 20  if( c=='.' ){.  
2c90: 20 20 20 20 70 72 65 63 69 73 69 6f 6e 20 3d 20      precision = 
2ca0: 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 2b 2b  0;.      c = *++
2cb0: 66 6d 74 3b 0a 20 20 20 20 20 20 69 66 28 20 63  fmt;.      if( c
2cc0: 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 20  =='*' ){.       
2cd0: 20 70 72 65 63 69 73 69 6f 6e 20 3d 20 76 61 5f   precision = va_
2ce0: 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
2cf0: 20 20 20 20 20 69 66 28 20 70 72 65 63 69 73 69       if( precisi
2d00: 6f 6e 3c 30 20 29 20 70 72 65 63 69 73 69 6f 6e  on<0 ) precision
2d10: 20 3d 20 2d 70 72 65 63 69 73 69 6f 6e 3b 0a 20   = -precision;. 
2d20: 20 20 20 20 20 20 20 63 20 3d 20 2a 2b 2b 66 6d         c = *++fm
2d30: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
2d40: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63          while( c
2d50: 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27 20  >='0' && c<='9' 
2d60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 65  ){.          pre
2d70: 63 69 73 69 6f 6e 20 3d 20 70 72 65 63 69 73 69  cision = precisi
2d80: 6f 6e 2a 31 30 20 2b 20 63 20 2d 20 27 30 27 3b  on*10 + c - '0';
2d90: 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2a  .          c = *
2da0: 2b 2b 66 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d  ++fmt;.        }
2db0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
2dc0: 2a 20 4c 69 6d 69 74 20 74 68 65 20 70 72 65 63  * Limit the prec
2dd0: 69 73 69 6f 6e 20 74 6f 20 70 72 65 76 65 6e 74  ision to prevent
2de0: 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20 62 75 66   overflowing buf
2df0: 5b 5d 20 64 75 72 69 6e 67 20 63 6f 6e 76 65 72  [] during conver
2e00: 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66  sion */.      if
2e10: 28 20 70 72 65 63 69 73 69 6f 6e 3e 65 74 42 55  ( precision>etBU
2e20: 46 53 49 5a 45 2d 34 30 20 29 20 70 72 65 63 69  FSIZE-40 ) preci
2e30: 73 69 6f 6e 20 3d 20 65 74 42 55 46 53 49 5a 45  sion = etBUFSIZE
2e40: 2d 34 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  -40;.    }else{.
2e50: 20 20 20 20 20 20 70 72 65 63 69 73 69 6f 6e 20        precision 
2e60: 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
2e70: 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6e 76 65  /* Get the conve
2e80: 72 73 69 6f 6e 20 74 79 70 65 20 6d 6f 64 69 66  rsion type modif
2e90: 69 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 63  ier */.    if( c
2ea0: 3d 3d 27 6c 27 20 29 7b 0a 20 20 20 20 20 20 66  =='l' ){.      f
2eb0: 6c 61 67 5f 6c 6f 6e 67 20 3d 20 31 3b 0a 20 20  lag_long = 1;.  
2ec0: 20 20 20 20 63 20 3d 20 2a 2b 2b 66 6d 74 3b 0a      c = *++fmt;.
2ed0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 6c 27        if( c=='l'
2ee0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
2ef0: 5f 6c 6f 6e 67 6c 6f 6e 67 20 3d 20 31 3b 0a 20  _longlong = 1;. 
2f00: 20 20 20 20 20 20 20 63 20 3d 20 2a 2b 2b 66 6d         c = *++fm
2f10: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
2f20: 20 20 20 20 20 20 20 20 66 6c 61 67 5f 6c 6f 6e          flag_lon
2f30: 67 6c 6f 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  glong = 0;.     
2f40: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2f50: 20 20 20 20 66 6c 61 67 5f 6c 6f 6e 67 20 3d 20      flag_long = 
2f60: 66 6c 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 20 3d 20  flag_longlong = 
2f70: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  0;.    }.    /* 
2f80: 46 65 74 63 68 20 74 68 65 20 69 6e 66 6f 20 65  Fetch the info e
2f90: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 65  ntry for the fie
2fa0: 6c 64 20 2a 2f 0a 20 20 20 20 69 6e 66 6f 70 20  ld */.    infop 
2fb0: 3d 20 30 3b 0a 20 20 20 20 78 74 79 70 65 20 3d  = 0;.    xtype =
2fc0: 20 65 74 45 52 52 4f 52 3b 0a 20 20 20 20 66 6f   etERROR;.    fo
2fd0: 72 28 69 64 78 3d 30 3b 20 69 64 78 3c 65 74 4e  r(idx=0; idx<etN
2fe0: 49 4e 46 4f 3b 20 69 64 78 2b 2b 29 7b 0a 20 20  INFO; idx++){.  
2ff0: 20 20 20 20 69 66 28 20 63 3d 3d 66 6d 74 69 6e      if( c==fmtin
3000: 66 6f 5b 69 64 78 5d 2e 66 6d 74 74 79 70 65 20  fo[idx].fmttype 
3010: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 66 6f 70  ){.        infop
3020: 20 3d 20 26 66 6d 74 69 6e 66 6f 5b 69 64 78 5d   = &fmtinfo[idx]
3030: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 73  ;.        if( us
3040: 65 45 78 74 65 6e 64 65 64 20 7c 7c 20 28 69 6e  eExtended || (in
3050: 66 6f 70 2d 3e 66 6c 61 67 73 20 26 20 46 4c 41  fop->flags & FLA
3060: 47 5f 49 4e 54 45 52 4e 29 3d 3d 30 20 29 7b 0a  G_INTERN)==0 ){.
3070: 20 20 20 20 20 20 20 20 20 20 78 74 79 70 65 20            xtype 
3080: 3d 20 69 6e 66 6f 70 2d 3e 74 79 70 65 3b 0a 20  = infop->type;. 
3090: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
30b0: 20 20 20 20 7d 0a 20 20 20 20 7a 45 78 74 72 61      }.    zExtra
30c0: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20   = 0;..    /*.  
30d0: 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69    ** At this poi
30e0: 6e 74 2c 20 76 61 72 69 61 62 6c 65 73 20 61 72  nt, variables ar
30f0: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 73  e initialized as
3100: 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a   follows:.    **
3110: 0a 20 20 20 20 2a 2a 20 20 20 66 6c 61 67 5f 61  .    **   flag_a
3120: 6c 74 65 72 6e 61 74 65 66 6f 72 6d 20 20 20 20  lternateform    
3130: 20 20 20 20 20 20 54 52 55 45 20 69 66 20 61 20        TRUE if a 
3140: 27 23 27 20 69 73 20 70 72 65 73 65 6e 74 2e 0a  '#' is present..
3150: 20 20 20 20 2a 2a 20 20 20 66 6c 61 67 5f 70 6c      **   flag_pl
3160: 75 73 73 69 67 6e 20 20 20 20 20 20 20 20 20 20  ussign          
3170: 20 20 20 20 20 54 52 55 45 20 69 66 20 61 20 27       TRUE if a '
3180: 2b 27 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  +' is present.. 
3190: 20 20 20 2a 2a 20 20 20 66 6c 61 67 5f 6c 65 66     **   flag_lef
31a0: 74 6a 75 73 74 69 66 79 20 20 20 20 20 20 20 20  tjustify        
31b0: 20 20 20 20 54 52 55 45 20 69 66 20 61 20 27 2d      TRUE if a '-
31c0: 27 20 69 73 20 70 72 65 73 65 6e 74 20 6f 72 20  ' is present or 
31d0: 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 20 20  if the.    **   
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 65 6c              fiel
3200: 64 20 77 69 64 74 68 20 77 61 73 20 6e 65 67 61  d width was nega
3210: 74 69 76 65 2e 0a 20 20 20 20 2a 2a 20 20 20 66  tive..    **   f
3220: 6c 61 67 5f 7a 65 72 6f 70 61 64 20 20 20 20 20  lag_zeropad     
3230: 20 20 20 20 20 20 20 20 20 20 20 54 52 55 45 20             TRUE 
3240: 69 66 20 74 68 65 20 77 69 64 74 68 20 62 65 67  if the width beg
3250: 61 6e 20 77 69 74 68 20 30 2e 0a 20 20 20 20 2a  an with 0..    *
3260: 2a 20 20 20 66 6c 61 67 5f 6c 6f 6e 67 20 20 20  *   flag_long   
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3280: 54 52 55 45 20 69 66 20 74 68 65 20 6c 65 74 74  TRUE if the lett
3290: 65 72 20 27 6c 27 20 28 65 6c 6c 29 20 70 72 65  er 'l' (ell) pre
32a0: 66 69 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20  fixed.    **    
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c0: 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 63             the c
32d0: 6f 6e 76 65 72 73 69 6f 6e 20 63 68 61 72 61 63  onversion charac
32e0: 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 66 6c  ter..    **   fl
32f0: 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 20 20 20 20 20  ag_longlong     
3300: 20 20 20 20 20 20 20 20 20 20 54 52 55 45 20 69            TRUE i
3310: 66 20 74 68 65 20 6c 65 74 74 65 72 20 27 6c 6c  f the letter 'll
3320: 27 20 28 65 6c 6c 20 65 6c 6c 29 20 70 72 65 66  ' (ell ell) pref
3330: 69 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20  ixed.    **     
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3350: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 63 6f            the co
3360: 6e 76 65 72 73 69 6f 6e 20 63 68 61 72 61 63 74  nversion charact
3370: 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 66 6c 61  er..    **   fla
3380: 67 5f 62 6c 61 6e 6b 73 69 67 6e 20 20 20 20 20  g_blanksign     
3390: 20 20 20 20 20 20 20 20 20 54 52 55 45 20 69 66           TRUE if
33a0: 20 61 20 27 20 27 20 69 73 20 70 72 65 73 65 6e   a ' ' is presen
33b0: 74 2e 0a 20 20 20 20 2a 2a 20 20 20 77 69 64 74  t..    **   widt
33c0: 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h               
33d0: 20 20 20 20 20 20 20 20 54 68 65 20 73 70 65 63          The spec
33e0: 69 66 69 65 64 20 66 69 65 6c 64 20 77 69 64 74  ified field widt
33f0: 68 2e 20 20 54 68 69 73 20 69 73 0a 20 20 20 20  h.  This is.    
3400: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3420: 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 6e 65 67 61   always non-nega
3430: 74 69 76 65 2e 20 20 5a 65 72 6f 20 69 73 20 74  tive.  Zero is t
3440: 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 20 20  he default..    
3450: 2a 2a 20 20 20 70 72 65 63 69 73 69 6f 6e 20 20  **   precision  
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3470: 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20 70   The specified p
3480: 72 65 63 69 73 69 6f 6e 2e 20 20 54 68 65 20 64  recision.  The d
3490: 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 20 20  efault.    **   
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 2d              is -
34c0: 31 2e 0a 20 20 20 20 2a 2a 20 20 20 78 74 79 70  1..    **   xtyp
34d0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
34e0: 20 20 20 20 20 20 20 20 54 68 65 20 63 6c 61 73          The clas
34f0: 73 20 6f 66 20 74 68 65 20 63 6f 6e 76 65 72 73  s of the convers
3500: 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20 20 20 69 6e  ion..    **   in
3510: 66 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  fop             
3520: 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65            Pointe
3530: 72 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  r to the appropr
3540: 69 61 74 65 20 69 6e 66 6f 20 73 74 72 75 63 74  iate info struct
3550: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 77 69  ..    */.    swi
3560: 74 63 68 28 20 78 74 79 70 65 20 29 7b 0a 20 20  tch( xtype ){.  
3570: 20 20 20 20 63 61 73 65 20 65 74 52 41 44 49 58      case etRADIX
3580: 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c  :.        if( fl
3590: 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 20 29 20 20 20  ag_longlong )   
35a0: 6c 6f 6e 67 76 61 6c 75 65 20 3d 20 76 61 5f 61  longvalue = va_a
35b0: 72 67 28 61 70 2c 49 4e 54 36 34 5f 54 59 50 45  rg(ap,INT64_TYPE
35c0: 29 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20  );.        else 
35d0: 69 66 28 20 66 6c 61 67 5f 6c 6f 6e 67 20 29 20  if( flag_long ) 
35e0: 20 6c 6f 6e 67 76 61 6c 75 65 20 3d 20 76 61 5f   longvalue = va_
35f0: 61 72 67 28 61 70 2c 6c 6f 6e 67 20 69 6e 74 29  arg(ap,long int)
3600: 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 20  ;.        else  
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 6c 6f 6e 67 76 61 6c 75 65 20 3d 20 76 61 5f 61  longvalue = va_a
3630: 72 67 28 61 70 2c 69 6e 74 29 3b 0a 23 69 66 20  rg(ap,int);.#if 
3640: 31 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  1.        /* For
3650: 20 74 68 65 20 66 6f 72 6d 61 74 20 25 23 78 2c   the format %#x,
3660: 20 74 68 65 20 76 61 6c 75 65 20 7a 65 72 6f 20   the value zero 
3670: 69 73 20 70 72 69 6e 74 65 64 20 22 30 22 20 6e  is printed "0" n
3680: 6f 74 20 22 30 78 30 22 2e 0a 20 20 20 20 20 20  ot "0x0"..      
3690: 20 20 2a 2a 20 49 20 74 68 69 6e 6b 20 74 68 69    ** I think thi
36a0: 73 20 69 73 20 73 74 75 70 69 64 2e 20 2a 2f 0a  s is stupid. */.
36b0: 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
36c0: 76 61 6c 75 65 3d 3d 30 20 29 20 66 6c 61 67 5f  value==0 ) flag_
36d0: 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d 20 3d 20  alternateform = 
36e0: 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  0;.#else.       
36f0: 20 2f 2a 20 4d 6f 72 65 20 73 65 6e 73 69 62 6c   /* More sensibl
3700: 65 3a 20 74 75 72 6e 20 6f 66 66 20 74 68 65 20  e: turn off the 
3710: 70 72 65 66 69 78 20 66 6f 72 20 6f 63 74 61 6c  prefix for octal
3720: 20 28 74 6f 20 70 72 65 76 65 6e 74 20 22 30 30   (to prevent "00
3730: 22 29 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  "),.        ** b
3740: 75 74 20 6c 65 61 76 65 20 74 68 65 20 70 72 65  ut leave the pre
3750: 66 69 78 20 66 6f 72 20 68 65 78 2e 20 2a 2f 0a  fix for hex. */.
3760: 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
3770: 76 61 6c 75 65 3d 3d 30 20 26 26 20 69 6e 66 6f  value==0 && info
3780: 70 2d 3e 62 61 73 65 3d 3d 38 20 29 20 66 6c 61  p->base==8 ) fla
3790: 67 5f 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d 20  g_alternateform 
37a0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 0;.#endif.    
37b0: 20 20 20 20 69 66 28 20 69 6e 66 6f 70 2d 3e 66      if( infop->f
37c0: 6c 61 67 73 20 26 20 46 4c 41 47 5f 53 49 47 4e  lags & FLAG_SIGN
37d0: 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ED ){.          
37e0: 69 66 28 20 2a 28 6c 6f 6e 67 2a 29 26 6c 6f 6e  if( *(long*)&lon
37f0: 67 76 61 6c 75 65 3c 30 20 29 7b 0a 20 20 20 20  gvalue<0 ){.    
3800: 20 20 20 20 20 20 20 20 6c 6f 6e 67 76 61 6c 75          longvalu
3810: 65 20 3d 20 2d 2a 28 6c 6f 6e 67 2a 29 26 6c 6f  e = -*(long*)&lo
3820: 6e 67 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  ngvalue;.       
3830: 20 20 20 20 20 70 72 65 66 69 78 20 3d 20 27 2d       prefix = '-
3840: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  ';.          }el
3850: 73 65 20 69 66 28 20 66 6c 61 67 5f 70 6c 75 73  se if( flag_plus
3860: 73 69 67 6e 20 29 20 20 70 72 65 66 69 78 20 3d  sign )  prefix =
3870: 20 27 2b 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '+';.          
3880: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 5f 62 6c  else if( flag_bl
3890: 61 6e 6b 73 69 67 6e 20 29 20 20 70 72 65 66 69  anksign )  prefi
38a0: 78 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20  x = ' ';.       
38b0: 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20     else         
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
38d0: 65 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  efix = 0;.      
38e0: 20 20 7d 65 6c 73 65 20 20 20 20 20 20 20 20 20    }else         
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3900: 72 65 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 20  refix = 0;.     
3910: 20 20 20 69 66 28 20 66 6c 61 67 5f 7a 65 72 6f     if( flag_zero
3920: 70 61 64 20 26 26 20 70 72 65 63 69 73 69 6f 6e  pad && precision
3930: 3c 77 69 64 74 68 2d 28 70 72 65 66 69 78 21 3d  <width-(prefix!=
3940: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
3950: 70 72 65 63 69 73 69 6f 6e 20 3d 20 77 69 64 74  precision = widt
3960: 68 2d 28 70 72 65 66 69 78 21 3d 30 29 3b 0a 20  h-(prefix!=0);. 
3970: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3980: 20 62 75 66 70 74 20 3d 20 26 62 75 66 5b 65 74   bufpt = &buf[et
3990: 42 55 46 53 49 5a 45 2d 31 5d 3b 0a 20 20 20 20  BUFSIZE-1];.    
39a0: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
39b0: 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 63  register char *c
39c0: 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 55 73 65  set;      /* Use
39d0: 20 72 65 67 69 73 74 65 72 73 20 66 6f 72 20 73   registers for s
39e0: 70 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  peed */.        
39f0: 20 20 72 65 67 69 73 74 65 72 20 69 6e 74 20 62    register int b
3a00: 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ase;.          c
3a10: 73 65 74 20 3d 20 69 6e 66 6f 70 2d 3e 63 68 61  set = infop->cha
3a20: 72 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20  rset;.          
3a30: 62 61 73 65 20 3d 20 69 6e 66 6f 70 2d 3e 62 61  base = infop->ba
3a40: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f  se;.          do
3a50: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
3a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
3a80: 6f 6e 76 65 72 74 20 74 6f 20 61 73 63 69 69 20  onvert to ascii 
3a90: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  */.            *
3aa0: 28 2d 2d 62 75 66 70 74 29 20 3d 20 63 73 65 74  (--bufpt) = cset
3ab0: 5b 6c 6f 6e 67 76 61 6c 75 65 25 62 61 73 65 5d  [longvalue%base]
3ac0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f  ;.            lo
3ad0: 6e 67 76 61 6c 75 65 20 3d 20 6c 6f 6e 67 76 61  ngvalue = longva
3ae0: 6c 75 65 2f 62 61 73 65 3b 0a 20 20 20 20 20 20  lue/base;.      
3af0: 20 20 20 20 7d 77 68 69 6c 65 28 20 6c 6f 6e 67      }while( long
3b00: 76 61 6c 75 65 3e 30 20 29 3b 0a 20 20 20 20 20  value>0 );.     
3b10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 65 6e     }.        len
3b20: 67 74 68 20 3d 20 26 62 75 66 5b 65 74 42 55 46  gth = &buf[etBUF
3b30: 53 49 5a 45 2d 31 5d 2d 62 75 66 70 74 3b 0a 20  SIZE-1]-bufpt;. 
3b40: 20 20 20 20 20 20 20 66 6f 72 28 69 64 78 3d 70         for(idx=p
3b50: 72 65 63 69 73 69 6f 6e 2d 6c 65 6e 67 74 68 3b  recision-length;
3b60: 20 69 64 78 3e 30 3b 20 69 64 78 2d 2d 29 7b 0a   idx>0; idx--){.
3b70: 20 20 20 20 20 20 20 20 20 20 2a 28 2d 2d 62 75            *(--bu
3b80: 66 70 74 29 20 3d 20 27 30 27 3b 20 20 20 20 20  fpt) = '0';     
3b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ba0: 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20          /* Zero 
3bb0: 70 61 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  pad */.        }
3bc0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 72 65  .        if( pre
3bd0: 66 69 78 20 29 20 2a 28 2d 2d 62 75 66 70 74 29  fix ) *(--bufpt)
3be0: 20 3d 20 70 72 65 66 69 78 3b 20 20 20 20 20 20   = prefix;      
3bf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
3c00: 73 69 67 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  sign */.        
3c10: 69 66 28 20 66 6c 61 67 5f 61 6c 74 65 72 6e 61  if( flag_alterna
3c20: 74 65 66 6f 72 6d 20 26 26 20 69 6e 66 6f 70 2d  teform && infop-
3c30: 3e 70 72 65 66 69 78 20 29 7b 20 20 20 20 20 20  >prefix ){      
3c40: 2f 2a 20 41 64 64 20 22 30 22 20 6f 72 20 22 30  /* Add "0" or "0
3c50: 78 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x" */.          
3c60: 63 68 61 72 20 2a 70 72 65 2c 20 78 3b 0a 20 20  char *pre, x;.  
3c70: 20 20 20 20 20 20 20 20 70 72 65 20 3d 20 69 6e          pre = in
3c80: 66 6f 70 2d 3e 70 72 65 66 69 78 3b 0a 20 20 20  fop->prefix;.   
3c90: 20 20 20 20 20 20 20 69 66 28 20 2a 62 75 66 70         if( *bufp
3ca0: 74 21 3d 70 72 65 5b 30 5d 20 29 7b 0a 20 20 20  t!=pre[0] ){.   
3cb0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 70 72 65           for(pre
3cc0: 3d 69 6e 66 6f 70 2d 3e 70 72 65 66 69 78 3b 20  =infop->prefix; 
3cd0: 28 78 3d 28 2a 70 72 65 29 29 21 3d 30 3b 20 70  (x=(*pre))!=0; p
3ce0: 72 65 2b 2b 29 20 2a 28 2d 2d 62 75 66 70 74 29  re++) *(--bufpt)
3cf0: 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 20 20   = x;.          
3d00: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
3d10: 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 26 62 75      length = &bu
3d20: 66 5b 65 74 42 55 46 53 49 5a 45 2d 31 5d 2d 62  f[etBUFSIZE-1]-b
3d30: 75 66 70 74 3b 0a 20 20 20 20 20 20 20 20 62 72  ufpt;.        br
3d40: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
3d50: 65 74 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20 63  etFLOAT:.      c
3d60: 61 73 65 20 65 74 45 58 50 3a 0a 20 20 20 20 20  ase etEXP:.     
3d70: 20 63 61 73 65 20 65 74 47 45 4e 45 52 49 43 3a   case etGENERIC:
3d80: 0a 20 20 20 20 20 20 20 20 72 65 61 6c 76 61 6c  .        realval
3d90: 75 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 64  ue = va_arg(ap,d
3da0: 6f 75 62 6c 65 29 3b 0a 23 69 66 6e 64 65 66 20  ouble);.#ifndef 
3db0: 65 74 4e 4f 46 4c 4f 41 54 49 4e 47 50 4f 49 4e  etNOFLOATINGPOIN
3dc0: 54 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 72  T.        if( pr
3dd0: 65 63 69 73 69 6f 6e 3c 30 20 29 20 70 72 65 63  ecision<0 ) prec
3de0: 69 73 69 6f 6e 20 3d 20 36 3b 20 20 20 20 20 20  ision = 6;      
3df0: 20 20 20 2f 2a 20 53 65 74 20 64 65 66 61 75 6c     /* Set defaul
3e00: 74 20 70 72 65 63 69 73 69 6f 6e 20 2a 2f 0a 20  t precision */. 
3e10: 20 20 20 20 20 20 20 69 66 28 20 70 72 65 63 69         if( preci
3e20: 73 69 6f 6e 3e 65 74 42 55 46 53 49 5a 45 2d 31  sion>etBUFSIZE-1
3e30: 30 20 29 20 70 72 65 63 69 73 69 6f 6e 20 3d 20  0 ) precision = 
3e40: 65 74 42 55 46 53 49 5a 45 2d 31 30 3b 0a 20 20  etBUFSIZE-10;.  
3e50: 20 20 20 20 20 20 69 66 28 20 72 65 61 6c 76 61        if( realva
3e60: 6c 75 65 3c 30 2e 30 20 29 7b 0a 20 20 20 20 20  lue<0.0 ){.     
3e70: 20 20 20 20 20 72 65 61 6c 76 61 6c 75 65 20 3d       realvalue =
3e80: 20 2d 72 65 61 6c 76 61 6c 75 65 3b 0a 20 20 20   -realvalue;.   
3e90: 20 20 20 20 20 20 20 70 72 65 66 69 78 20 3d 20         prefix = 
3ea0: 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  '-';.        }el
3eb0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
3ec0: 28 20 66 6c 61 67 5f 70 6c 75 73 73 69 67 6e 20  ( flag_plussign 
3ed0: 29 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69  )          prefi
3ee0: 78 20 3d 20 27 2b 27 3b 0a 20 20 20 20 20 20 20  x = '+';.       
3ef0: 20 20 20 65 6c 73 65 20 69 66 28 20 66 6c 61 67     else if( flag
3f00: 5f 62 6c 61 6e 6b 73 69 67 6e 20 29 20 20 20 20  _blanksign )    
3f10: 70 72 65 66 69 78 20 3d 20 27 20 27 3b 0a 20 20  prefix = ' ';.  
3f20: 20 20 20 20 20 20 20 20 65 6c 73 65 20 20 20 20          else    
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f40: 20 20 20 20 20 70 72 65 66 69 78 20 3d 20 30 3b       prefix = 0;
3f50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3f60: 20 20 20 69 66 28 20 69 6e 66 6f 70 2d 3e 74 79     if( infop->ty
3f70: 70 65 3d 3d 65 74 47 45 4e 45 52 49 43 20 26 26  pe==etGENERIC &&
3f80: 20 70 72 65 63 69 73 69 6f 6e 3e 30 20 29 20 70   precision>0 ) p
3f90: 72 65 63 69 73 69 6f 6e 2d 2d 3b 0a 20 20 20 20  recision--;.    
3fa0: 20 20 20 20 72 6f 75 6e 64 65 72 20 3d 20 30 2e      rounder = 0.
3fb0: 30 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 20  0;.#if 0.       
3fc0: 20 2f 2a 20 52 6f 75 6e 64 69 6e 67 20 77 6f 72   /* Rounding wor
3fd0: 6b 73 20 6c 69 6b 65 20 42 53 44 20 77 68 65 6e  ks like BSD when
3fe0: 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 30 2e   the constant 0.
3ff0: 34 39 39 39 20 69 73 20 75 73 65 64 2e 20 20 57  4999 is used.  W
4000: 69 65 72 64 21 20 2a 2f 0a 20 20 20 20 20 20 20  ierd! */.       
4010: 20 66 6f 72 28 69 64 78 3d 70 72 65 63 69 73 69   for(idx=precisi
4020: 6f 6e 2c 20 72 6f 75 6e 64 65 72 3d 30 2e 34 39  on, rounder=0.49
4030: 39 39 3b 20 69 64 78 3e 30 3b 20 69 64 78 2d 2d  99; idx>0; idx--
4040: 2c 20 72 6f 75 6e 64 65 72 2a 3d 30 2e 31 29 3b  , rounder*=0.1);
4050: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 2f  .#else.        /
4060: 2a 20 49 74 20 6d 61 6b 65 73 20 6d 6f 72 65 20  * It makes more 
4070: 73 65 6e 73 65 20 74 6f 20 75 73 65 20 30 2e 35  sense to use 0.5
4080: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
4090: 69 64 78 3d 70 72 65 63 69 73 69 6f 6e 2c 20 72  idx=precision, r
40a0: 6f 75 6e 64 65 72 3d 30 2e 35 3b 20 69 64 78 3e  ounder=0.5; idx>
40b0: 30 3b 20 69 64 78 2d 2d 2c 20 72 6f 75 6e 64 65  0; idx--, rounde
40c0: 72 2a 3d 30 2e 31 29 3b 0a 23 65 6e 64 69 66 0a  r*=0.1);.#endif.
40d0: 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
40e0: 70 2d 3e 74 79 70 65 3d 3d 65 74 46 4c 4f 41 54  p->type==etFLOAT
40f0: 20 29 20 72 65 61 6c 76 61 6c 75 65 20 2b 3d 20   ) realvalue += 
4100: 72 6f 75 6e 64 65 72 3b 0a 20 20 20 20 20 20 20  rounder;.       
4110: 20 2f 2a 20 4e 6f 72 6d 61 6c 69 7a 65 20 72 65   /* Normalize re
4120: 61 6c 76 61 6c 75 65 20 74 6f 20 77 69 74 68 69  alvalue to withi
4130: 6e 20 31 30 2e 30 20 3e 20 72 65 61 6c 76 61 6c  n 10.0 > realval
4140: 75 65 20 3e 3d 20 31 2e 30 20 2a 2f 0a 20 20 20  ue >= 1.0 */.   
4150: 20 20 20 20 20 65 78 70 20 3d 20 30 3b 0a 20 20       exp = 0;.  
4160: 20 20 20 20 20 20 69 66 28 20 72 65 61 6c 76 61        if( realva
4170: 6c 75 65 3e 30 2e 30 20 29 7b 0a 20 20 20 20 20  lue>0.0 ){.     
4180: 20 20 20 20 20 77 68 69 6c 65 28 20 72 65 61 6c       while( real
4190: 76 61 6c 75 65 3e 3d 31 65 38 20 26 26 20 65 78  value>=1e8 && ex
41a0: 70 3c 3d 33 35 30 20 29 7b 20 72 65 61 6c 76 61  p<=350 ){ realva
41b0: 6c 75 65 20 2a 3d 20 31 65 2d 38 3b 20 65 78 70  lue *= 1e-8; exp
41c0: 2b 3d 38 3b 20 7d 0a 20 20 20 20 20 20 20 20 20  +=8; }.         
41d0: 20 77 68 69 6c 65 28 20 72 65 61 6c 76 61 6c 75   while( realvalu
41e0: 65 3e 3d 31 30 2e 30 20 26 26 20 65 78 70 3c 3d  e>=10.0 && exp<=
41f0: 33 35 30 20 29 7b 20 72 65 61 6c 76 61 6c 75 65  350 ){ realvalue
4200: 20 2a 3d 20 30 2e 31 3b 20 65 78 70 2b 2b 3b 20   *= 0.1; exp++; 
4210: 7d 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  }.          whil
4220: 65 28 20 72 65 61 6c 76 61 6c 75 65 3c 31 65 2d  e( realvalue<1e-
4230: 38 20 26 26 20 65 78 70 3e 3d 2d 33 35 30 20 29  8 && exp>=-350 )
4240: 7b 20 72 65 61 6c 76 61 6c 75 65 20 2a 3d 20 31  { realvalue *= 1
4250: 65 38 3b 20 65 78 70 2d 3d 38 3b 20 7d 0a 20 20  e8; exp-=8; }.  
4260: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 72          while( r
4270: 65 61 6c 76 61 6c 75 65 3c 31 2e 30 20 26 26 20  ealvalue<1.0 && 
4280: 65 78 70 3e 3d 2d 33 35 30 20 29 7b 20 72 65 61  exp>=-350 ){ rea
4290: 6c 76 61 6c 75 65 20 2a 3d 20 31 30 2e 30 3b 20  lvalue *= 10.0; 
42a0: 65 78 70 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  exp--; }.       
42b0: 20 20 20 69 66 28 20 65 78 70 3e 33 35 30 20 7c     if( exp>350 |
42c0: 7c 20 65 78 70 3c 2d 33 35 30 20 29 7b 0a 20 20  | exp<-350 ){.  
42d0: 20 20 20 20 20 20 20 20 20 20 62 75 66 70 74 20            bufpt 
42e0: 3d 20 22 4e 61 4e 22 3b 0a 20 20 20 20 20 20 20  = "NaN";.       
42f0: 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 33 3b       length = 3;
4300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
4310: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
4320: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4330: 20 20 62 75 66 70 74 20 3d 20 62 75 66 3b 0a 20    bufpt = buf;. 
4340: 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20         /*.      
4350: 20 20 2a 2a 20 49 66 20 74 68 65 20 66 69 65 6c    ** If the fiel
4360: 64 20 74 79 70 65 20 69 73 20 65 74 47 45 4e 45  d type is etGENE
4370: 52 49 43 2c 20 74 68 65 6e 20 63 6f 6e 76 65 72  RIC, then conver
4380: 74 20 74 6f 20 65 69 74 68 65 72 20 65 74 45 58  t to either etEX
4390: 50 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  P.        ** or 
43a0: 65 74 46 4c 4f 41 54 2c 20 61 73 20 61 70 70 72  etFLOAT, as appr
43b0: 6f 70 72 69 61 74 65 2e 0a 20 20 20 20 20 20 20  opriate..       
43c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6c 61 67   */.        flag
43d0: 5f 65 78 70 20 3d 20 78 74 79 70 65 3d 3d 65 74  _exp = xtype==et
43e0: 45 58 50 3b 0a 20 20 20 20 20 20 20 20 69 66 28  EXP;.        if(
43f0: 20 78 74 79 70 65 21 3d 65 74 46 4c 4f 41 54 20   xtype!=etFLOAT 
4400: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 61  ){.          rea
4410: 6c 76 61 6c 75 65 20 2b 3d 20 72 6f 75 6e 64 65  lvalue += rounde
4420: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  r;.          if(
4430: 20 72 65 61 6c 76 61 6c 75 65 3e 3d 31 30 2e 30   realvalue>=10.0
4440: 20 29 7b 20 72 65 61 6c 76 61 6c 75 65 20 2a 3d   ){ realvalue *=
4450: 20 30 2e 31 3b 20 65 78 70 2b 2b 3b 20 7d 0a 20   0.1; exp++; }. 
4460: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4470: 20 69 66 28 20 78 74 79 70 65 3d 3d 65 74 47 45   if( xtype==etGE
4480: 4e 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 20  NERIC ){.       
4490: 20 20 20 66 6c 61 67 5f 72 74 7a 20 3d 20 21 66     flag_rtz = !f
44a0: 6c 61 67 5f 61 6c 74 65 72 6e 61 74 65 66 6f 72  lag_alternatefor
44b0: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  m;.          if(
44c0: 20 65 78 70 3c 2d 34 20 7c 7c 20 65 78 70 3e 70   exp<-4 || exp>p
44d0: 72 65 63 69 73 69 6f 6e 20 29 7b 0a 20 20 20 20  recision ){.    
44e0: 20 20 20 20 20 20 20 20 78 74 79 70 65 20 3d 20          xtype = 
44f0: 65 74 45 58 50 3b 0a 20 20 20 20 20 20 20 20 20  etEXP;.         
4500: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4510: 20 20 20 20 70 72 65 63 69 73 69 6f 6e 20 3d 20      precision = 
4520: 70 72 65 63 69 73 69 6f 6e 20 2d 20 65 78 70 3b  precision - exp;
4530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 74 79  .            xty
4540: 70 65 20 3d 20 65 74 46 4c 4f 41 54 3b 0a 20 20  pe = etFLOAT;.  
4550: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4560: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4570: 20 20 20 66 6c 61 67 5f 72 74 7a 20 3d 20 30 3b     flag_rtz = 0;
4580: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4590: 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a     /*.        **
45a0: 20 54 68 65 20 22 65 78 70 2b 70 72 65 63 69 73   The "exp+precis
45b0: 69 6f 6e 22 20 74 65 73 74 20 63 61 75 73 65 73  ion" test causes
45c0: 20 6f 75 74 70 75 74 20 74 6f 20 62 65 20 6f 66   output to be of
45d0: 20 74 79 70 65 20 65 74 45 58 50 20 69 66 0a 20   type etEXP if. 
45e0: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72         ** the pr
45f0: 65 63 69 73 69 6f 6e 20 69 73 20 74 6f 6f 20 6c  ecision is too l
4600: 61 72 67 65 20 74 6f 20 66 69 74 20 69 6e 20 62  arge to fit in b
4610: 75 66 5b 5d 2e 0a 20 20 20 20 20 20 20 20 2a 2f  uf[]..        */
4620: 0a 20 20 20 20 20 20 20 20 6e 73 64 20 3d 20 30  .        nsd = 0
4630: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 74  ;.        if( xt
4640: 79 70 65 3d 3d 65 74 46 4c 4f 41 54 20 26 26 20  ype==etFLOAT && 
4650: 65 78 70 2b 70 72 65 63 69 73 69 6f 6e 3c 65 74  exp+precision<et
4660: 42 55 46 53 49 5a 45 2d 33 30 20 29 7b 0a 20 20  BUFSIZE-30 ){.  
4670: 20 20 20 20 20 20 20 20 66 6c 61 67 5f 64 70 20          flag_dp 
4680: 3d 20 28 70 72 65 63 69 73 69 6f 6e 3e 30 20 7c  = (precision>0 |
4690: 7c 20 66 6c 61 67 5f 61 6c 74 65 72 6e 61 74 65  | flag_alternate
46a0: 66 6f 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  form);.         
46b0: 20 69 66 28 20 70 72 65 66 69 78 20 29 20 2a 28   if( prefix ) *(
46c0: 62 75 66 70 74 2b 2b 29 20 3d 20 70 72 65 66 69  bufpt++) = prefi
46d0: 78 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  x;         /* Si
46e0: 67 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  gn */.          
46f0: 69 66 28 20 65 78 70 3c 30 20 29 20 20 2a 28 62  if( exp<0 )  *(b
4700: 75 66 70 74 2b 2b 29 20 3d 20 27 30 27 3b 20 20  ufpt++) = '0';  
4710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 67            /* Dig
4720: 69 74 73 20 62 65 66 6f 72 65 20 22 2e 22 20 2a  its before "." *
4730: 2f 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73 65  /.          else
4740: 20 66 6f 72 28 3b 20 65 78 70 3e 3d 30 3b 20 65   for(; exp>=0; e
4750: 78 70 2d 2d 29 20 2a 28 62 75 66 70 74 2b 2b 29  xp--) *(bufpt++)
4760: 20 3d 20 65 74 5f 67 65 74 64 69 67 69 74 28 26   = et_getdigit(&
4770: 72 65 61 6c 76 61 6c 75 65 2c 26 6e 73 64 29 3b  realvalue,&nsd);
4780: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66  .          if( f
4790: 6c 61 67 5f 64 70 20 29 20 2a 28 62 75 66 70 74  lag_dp ) *(bufpt
47a0: 2b 2b 29 20 3d 20 27 2e 27 3b 20 20 20 20 20 20  ++) = '.';      
47b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 65 63 69       /* The deci
47c0: 6d 61 6c 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  mal point */.   
47d0: 20 20 20 20 20 20 20 66 6f 72 28 65 78 70 2b 2b         for(exp++
47e0: 3b 20 65 78 70 3c 30 20 26 26 20 70 72 65 63 69  ; exp<0 && preci
47f0: 73 69 6f 6e 3e 30 3b 20 70 72 65 63 69 73 69 6f  sion>0; precisio
4800: 6e 2d 2d 2c 20 65 78 70 2b 2b 29 7b 0a 20 20 20  n--, exp++){.   
4810: 20 20 20 20 20 20 20 20 20 2a 28 62 75 66 70 74           *(bufpt
4820: 2b 2b 29 20 3d 20 27 30 27 3b 0a 20 20 20 20 20  ++) = '0';.     
4830: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4840: 20 77 68 69 6c 65 28 20 28 70 72 65 63 69 73 69   while( (precisi
4850: 6f 6e 2d 2d 29 3e 30 20 29 20 2a 28 62 75 66 70  on--)>0 ) *(bufp
4860: 74 2b 2b 29 20 3d 20 65 74 5f 67 65 74 64 69 67  t++) = et_getdig
4870: 69 74 28 26 72 65 61 6c 76 61 6c 75 65 2c 26 6e  it(&realvalue,&n
4880: 73 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  sd);.          *
4890: 28 62 75 66 70 74 2d 2d 29 20 3d 20 30 3b 20 20  (bufpt--) = 0;  
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 6c           /* Null
48c0: 20 74 65 72 6d 69 6e 61 74 65 20 2a 2f 0a 20 20   terminate */.  
48d0: 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67          if( flag
48e0: 5f 72 74 7a 20 26 26 20 66 6c 61 67 5f 64 70 20  _rtz && flag_dp 
48f0: 29 7b 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  ){     /* Remove
4900: 20 74 72 61 69 6c 69 6e 67 20 7a 65 72 6f 73 20   trailing zeros 
4910: 61 6e 64 20 22 2e 22 20 2a 2f 0a 20 20 20 20 20  and "." */.     
4920: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 62 75         while( bu
4930: 66 70 74 3e 3d 62 75 66 20 26 26 20 2a 62 75 66  fpt>=buf && *buf
4940: 70 74 3d 3d 27 30 27 20 29 20 2a 28 62 75 66 70  pt=='0' ) *(bufp
4950: 74 2d 2d 29 20 3d 20 30 3b 0a 20 20 20 20 20 20  t--) = 0;.      
4960: 20 20 20 20 20 20 69 66 28 20 62 75 66 70 74 3e        if( bufpt>
4970: 3d 62 75 66 20 26 26 20 2a 62 75 66 70 74 3d 3d  =buf && *bufpt==
4980: 27 2e 27 20 29 20 2a 28 62 75 66 70 74 2d 2d 29  '.' ) *(bufpt--)
4990: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
49a0: 7d 0a 20 20 20 20 20 20 20 20 20 20 62 75 66 70  }.          bufp
49b0: 74 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20  t++;            
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49d0: 2f 2a 20 70 6f 69 6e 74 20 74 6f 20 6e 65 78 74  /* point to next
49e0: 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20   free slot */.  
49f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 20 20 20        }else{    
4a00: 2f 2a 20 65 74 45 58 50 20 6f 72 20 65 74 47 45  /* etEXP or etGE
4a10: 4e 45 52 49 43 20 2a 2f 0a 20 20 20 20 20 20 20  NERIC */.       
4a20: 20 20 20 66 6c 61 67 5f 64 70 20 3d 20 28 70 72     flag_dp = (pr
4a30: 65 63 69 73 69 6f 6e 3e 30 20 7c 7c 20 66 6c 61  ecision>0 || fla
4a40: 67 5f 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d 29  g_alternateform)
4a50: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
4a60: 70 72 65 66 69 78 20 29 20 2a 28 62 75 66 70 74  prefix ) *(bufpt
4a70: 2b 2b 29 20 3d 20 70 72 65 66 69 78 3b 20 20 20  ++) = prefix;   
4a80: 2f 2a 20 53 69 67 6e 20 2a 2f 0a 20 20 20 20 20  /* Sign */.     
4a90: 20 20 20 20 20 2a 28 62 75 66 70 74 2b 2b 29 20       *(bufpt++) 
4aa0: 3d 20 65 74 5f 67 65 74 64 69 67 69 74 28 26 72  = et_getdigit(&r
4ab0: 65 61 6c 76 61 6c 75 65 2c 26 6e 73 64 29 3b 20  ealvalue,&nsd); 
4ac0: 20 2f 2a 20 46 69 72 73 74 20 64 69 67 69 74 20   /* First digit 
4ad0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
4ae0: 20 66 6c 61 67 5f 64 70 20 29 20 2a 28 62 75 66   flag_dp ) *(buf
4af0: 70 74 2b 2b 29 20 3d 20 27 2e 27 3b 20 20 20 20  pt++) = '.';    
4b00: 20 2f 2a 20 44 65 63 69 6d 61 6c 20 70 6f 69 6e   /* Decimal poin
4b10: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77  t */.          w
4b20: 68 69 6c 65 28 20 28 70 72 65 63 69 73 69 6f 6e  hile( (precision
4b30: 2d 2d 29 3e 30 20 29 20 2a 28 62 75 66 70 74 2b  --)>0 ) *(bufpt+
4b40: 2b 29 20 3d 20 65 74 5f 67 65 74 64 69 67 69 74  +) = et_getdigit
4b50: 28 26 72 65 61 6c 76 61 6c 75 65 2c 26 6e 73 64  (&realvalue,&nsd
4b60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 75 66  );.          buf
4b70: 70 74 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20  pt--;           
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b90: 20 2f 2a 20 70 6f 69 6e 74 20 74 6f 20 6c 61 73   /* point to las
4ba0: 74 20 64 69 67 69 74 20 2a 2f 0a 20 20 20 20 20  t digit */.     
4bb0: 20 20 20 20 20 69 66 28 20 66 6c 61 67 5f 72 74       if( flag_rt
4bc0: 7a 20 26 26 20 66 6c 61 67 5f 64 70 20 29 7b 20  z && flag_dp ){ 
4bd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f           /* Remo
4be0: 76 65 20 74 61 69 6c 20 7a 65 72 6f 73 20 2a 2f  ve tail zeros */
4bf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69  .            whi
4c00: 6c 65 28 20 62 75 66 70 74 3e 3d 62 75 66 20 26  le( bufpt>=buf &
4c10: 26 20 2a 62 75 66 70 74 3d 3d 27 30 27 20 29 20  & *bufpt=='0' ) 
4c20: 2a 28 62 75 66 70 74 2d 2d 29 20 3d 20 30 3b 0a  *(bufpt--) = 0;.
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
4c40: 62 75 66 70 74 3e 3d 62 75 66 20 26 26 20 2a 62  bufpt>=buf && *b
4c50: 75 66 70 74 3d 3d 27 2e 27 20 29 20 2a 28 62 75  ufpt=='.' ) *(bu
4c60: 66 70 74 2d 2d 29 20 3d 20 30 3b 0a 20 20 20 20  fpt--) = 0;.    
4c70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4c80: 20 20 62 75 66 70 74 2b 2b 3b 20 20 20 20 20 20    bufpt++;      
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ca0: 20 20 20 20 20 20 2f 2a 20 70 6f 69 6e 74 20 74        /* point t
4cb0: 6f 20 6e 65 78 74 20 66 72 65 65 20 73 6c 6f 74  o next free slot
4cc0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
4cd0: 28 20 65 78 70 20 7c 7c 20 66 6c 61 67 5f 65 78  ( exp || flag_ex
4ce0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  p ){.           
4cf0: 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20 69 6e   *(bufpt++) = in
4d00: 66 6f 70 2d 3e 63 68 61 72 73 65 74 5b 30 5d 3b  fop->charset[0];
4d10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
4d20: 20 65 78 70 3c 30 20 29 7b 20 2a 28 62 75 66 70   exp<0 ){ *(bufp
4d30: 74 2b 2b 29 20 3d 20 27 2d 27 3b 20 65 78 70 20  t++) = '-'; exp 
4d40: 3d 20 2d 65 78 70 3b 20 7d 20 2f 2a 20 73 69 67  = -exp; } /* sig
4d50: 6e 20 6f 66 20 65 78 70 20 2a 2f 0a 20 20 20 20  n of exp */.    
4d60: 20 20 20 20 20 20 20 20 65 6c 73 65 20 20 20 20          else    
4d70: 20 20 20 7b 20 2a 28 62 75 66 70 74 2b 2b 29 20     { *(bufpt++) 
4d80: 3d 20 27 2b 27 3b 20 7d 0a 20 20 20 20 20 20 20  = '+'; }.       
4d90: 20 20 20 20 20 69 66 28 20 65 78 70 3e 3d 31 30       if( exp>=10
4da0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
4db0: 20 20 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20     *(bufpt++) = 
4dc0: 28 65 78 70 2f 31 30 30 29 2b 27 30 27 3b 20 20  (exp/100)+'0';  
4dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4de0: 20 31 30 30 27 73 20 64 69 67 69 74 20 2a 2f 0a   100's digit */.
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
4e00: 70 20 25 3d 20 31 30 30 3b 0a 20 20 20 20 20 20  p %= 100;.      
4e10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4e20: 20 20 20 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d      *(bufpt++) =
4e30: 20 65 78 70 2f 31 30 2b 27 30 27 3b 20 20 20 20   exp/10+'0';    
4e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e50: 20 2f 2a 20 31 30 27 73 20 64 69 67 69 74 20 2a   /* 10's digit *
4e60: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 28  /.            *(
4e70: 62 75 66 70 74 2b 2b 29 20 3d 20 65 78 70 25 31  bufpt++) = exp%1
4e80: 30 2b 27 30 27 3b 20 20 20 20 20 20 20 20 20 20  0+'0';          
4e90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 27             /* 1'
4ea0: 73 20 64 69 67 69 74 20 2a 2f 0a 20 20 20 20 20  s digit */.     
4eb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
4ec0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
4ed0: 63 6f 6e 76 65 72 74 65 64 20 6e 75 6d 62 65 72  converted number
4ee0: 20 69 73 20 69 6e 20 62 75 66 5b 5d 20 61 6e 64   is in buf[] and
4ef0: 20 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64   zero terminated
4f00: 2e 20 4f 75 74 70 75 74 20 69 74 2e 0a 20 20 20  . Output it..   
4f10: 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
4f20: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 69 73 20  t the number is 
4f30: 69 6e 20 74 68 65 20 75 73 75 61 6c 20 6f 72 64  in the usual ord
4f40: 65 72 2c 20 6e 6f 74 20 72 65 76 65 72 73 65 64  er, not reversed
4f50: 20 61 73 20 77 69 74 68 0a 20 20 20 20 20 20 20   as with.       
4f60: 20 2a 2a 20 69 6e 74 65 67 65 72 20 63 6f 6e 76   ** integer conv
4f70: 65 72 73 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20  ersions. */.    
4f80: 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 62 75 66      length = buf
4f90: 70 74 2d 62 75 66 3b 0a 20 20 20 20 20 20 20 20  pt-buf;.        
4fa0: 62 75 66 70 74 20 3d 20 62 75 66 3b 0a 0a 20 20  bufpt = buf;..  
4fb0: 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 61 6c        /* Special
4fc0: 20 63 61 73 65 3a 20 20 41 64 64 20 6c 65 61 64   case:  Add lead
4fd0: 69 6e 67 20 7a 65 72 6f 73 20 69 66 20 74 68 65  ing zeros if the
4fe0: 20 66 6c 61 67 5f 7a 65 72 6f 70 61 64 20 66 6c   flag_zeropad fl
4ff0: 61 67 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a  ag is.        **
5000: 20 73 65 74 20 61 6e 64 20 77 65 20 61 72 65 20   set and we are 
5010: 6e 6f 74 20 6c 65 66 74 20 6a 75 73 74 69 66 69  not left justifi
5020: 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ed */.        if
5030: 28 20 66 6c 61 67 5f 7a 65 72 6f 70 61 64 20 26  ( flag_zeropad &
5040: 26 20 21 66 6c 61 67 5f 6c 65 66 74 6a 75 73 74  & !flag_leftjust
5050: 69 66 79 20 26 26 20 6c 65 6e 67 74 68 20 3c 20  ify && length < 
5060: 77 69 64 74 68 29 7b 0a 20 20 20 20 20 20 20 20  width){.        
5070: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
5080: 20 20 20 69 6e 74 20 6e 50 61 64 20 3d 20 77 69     int nPad = wi
5090: 64 74 68 20 2d 20 6c 65 6e 67 74 68 3b 0a 20 20  dth - length;.  
50a0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 77 69          for(i=wi
50b0: 64 74 68 3b 20 69 3e 3d 6e 50 61 64 3b 20 69 2d  dth; i>=nPad; i-
50c0: 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -){.            
50d0: 62 75 66 70 74 5b 69 5d 20 3d 20 62 75 66 70 74  bufpt[i] = bufpt
50e0: 5b 69 2d 6e 50 61 64 5d 3b 0a 20 20 20 20 20 20  [i-nPad];.      
50f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5100: 69 20 3d 20 70 72 65 66 69 78 21 3d 30 3b 0a 20  i = prefix!=0;. 
5110: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
5120: 6e 50 61 64 2d 2d 20 29 20 62 75 66 70 74 5b 69  nPad-- ) bufpt[i
5130: 2b 2b 5d 20 3d 20 27 30 27 3b 0a 20 20 20 20 20  ++] = '0';.     
5140: 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 77 69       length = wi
5150: 64 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  dth;.        }.#
5160: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 62 72  endif.        br
5170: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
5180: 65 74 53 49 5a 45 3a 0a 20 20 20 20 20 20 20 20  etSIZE:.        
5190: 2a 28 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 2a  *(va_arg(ap,int*
51a0: 29 29 20 3d 20 63 6f 75 6e 74 3b 0a 20 20 20 20  )) = count;.    
51b0: 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 77 69 64      length = wid
51c0: 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  th = 0;.        
51d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
51e0: 65 20 65 74 50 45 52 43 45 4e 54 3a 0a 20 20 20  e etPERCENT:.   
51f0: 20 20 20 20 20 62 75 66 5b 30 5d 20 3d 20 27 25       buf[0] = '%
5200: 27 3b 0a 20 20 20 20 20 20 20 20 62 75 66 70 74  ';.        bufpt
5210: 20 3d 20 62 75 66 3b 0a 20 20 20 20 20 20 20 20   = buf;.        
5220: 6c 65 6e 67 74 68 20 3d 20 31 3b 0a 20 20 20 20  length = 1;.    
5230: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5240: 20 63 61 73 65 20 65 74 43 48 41 52 4c 49 54 3a   case etCHARLIT:
5250: 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 43 48  .      case etCH
5260: 41 52 58 3a 0a 20 20 20 20 20 20 20 20 63 20 3d  ARX:.        c =
5270: 20 62 75 66 5b 30 5d 20 3d 20 28 78 74 79 70 65   buf[0] = (xtype
5280: 3d 3d 65 74 43 48 41 52 58 20 3f 20 76 61 5f 61  ==etCHARX ? va_a
5290: 72 67 28 61 70 2c 69 6e 74 29 20 3a 20 2a 2b 2b  rg(ap,int) : *++
52a0: 66 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  fmt);.        if
52b0: 28 20 70 72 65 63 69 73 69 6f 6e 3e 3d 30 20 29  ( precision>=0 )
52c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
52d0: 69 64 78 3d 31 3b 20 69 64 78 3c 70 72 65 63 69  idx=1; idx<preci
52e0: 73 69 6f 6e 3b 20 69 64 78 2b 2b 29 20 62 75 66  sion; idx++) buf
52f0: 5b 69 64 78 5d 20 3d 20 63 3b 0a 20 20 20 20 20  [idx] = c;.     
5300: 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 70 72       length = pr
5310: 65 63 69 73 69 6f 6e 3b 0a 20 20 20 20 20 20 20  ecision;.       
5320: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5330: 20 20 6c 65 6e 67 74 68 20 3d 31 3b 0a 20 20 20    length =1;.   
5340: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
5350: 75 66 70 74 20 3d 20 62 75 66 3b 0a 20 20 20 20  ufpt = buf;.    
5360: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5370: 20 63 61 73 65 20 65 74 53 54 52 49 4e 47 3a 0a   case etSTRING:.
5380: 20 20 20 20 20 20 63 61 73 65 20 65 74 44 59 4e        case etDYN
5390: 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20 20 20  STRING:.        
53a0: 62 75 66 70 74 20 3d 20 76 61 5f 61 72 67 28 61  bufpt = va_arg(a
53b0: 70 2c 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20  p,char*);.      
53c0: 20 20 69 66 28 20 62 75 66 70 74 3d 3d 30 20 29    if( bufpt==0 )
53d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 62 75 66 70  {.          bufp
53e0: 74 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20  t = "";.        
53f0: 7d 65 6c 73 65 20 69 66 28 20 78 74 79 70 65 3d  }else if( xtype=
5400: 3d 65 74 44 59 4e 53 54 52 49 4e 47 20 29 7b 0a  =etDYNSTRING ){.
5410: 20 20 20 20 20 20 20 20 20 20 7a 45 78 74 72 61            zExtra
5420: 20 3d 20 62 75 66 70 74 3b 0a 20 20 20 20 20 20   = bufpt;.      
5430: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 65 6e 67    }.        leng
5440: 74 68 20 3d 20 73 74 72 6c 65 6e 28 62 75 66 70  th = strlen(bufp
5450: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
5460: 70 72 65 63 69 73 69 6f 6e 3e 3d 30 20 26 26 20  precision>=0 && 
5470: 70 72 65 63 69 73 69 6f 6e 3c 6c 65 6e 67 74 68  precision<length
5480: 20 29 20 6c 65 6e 67 74 68 20 3d 20 70 72 65 63   ) length = prec
5490: 69 73 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 62  ision;.        b
54a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
54b0: 20 65 74 53 51 4c 45 53 43 41 50 45 3a 0a 20 20   etSQLESCAPE:.  
54c0: 20 20 20 20 63 61 73 65 20 65 74 53 51 4c 45 53      case etSQLES
54d0: 43 41 50 45 32 3a 0a 20 20 20 20 20 20 20 20 7b  CAPE2:.        {
54e0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
54f0: 2c 20 6a 2c 20 6e 2c 20 63 2c 20 69 73 6e 75 6c  , j, n, c, isnul
5500: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  l;.          cha
5510: 72 20 2a 61 72 67 20 3d 20 76 61 5f 61 72 67 28  r *arg = va_arg(
5520: 61 70 2c 63 68 61 72 2a 29 3b 0a 20 20 20 20 20  ap,char*);.     
5530: 20 20 20 20 20 69 73 6e 75 6c 6c 20 3d 20 61 72       isnull = ar
5540: 67 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  g==0;.          
5550: 69 66 28 20 69 73 6e 75 6c 6c 20 29 20 61 72 67  if( isnull ) arg
5560: 20 3d 20 28 78 74 79 70 65 3d 3d 65 74 53 51 4c   = (xtype==etSQL
5570: 45 53 43 41 50 45 32 20 3f 20 22 4e 55 4c 4c 22  ESCAPE2 ? "NULL"
5580: 20 3a 20 22 28 4e 55 4c 4c 29 22 29 3b 0a 20 20   : "(NULL)");.  
5590: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6e 3d          for(i=n=
55a0: 30 3b 20 28 63 3d 61 72 67 5b 69 5d 29 21 3d 30  0; (c=arg[i])!=0
55b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
55c0: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20      if( c=='\'' 
55d0: 29 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  )  n++;.        
55e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6e 20    }.          n 
55f0: 2b 3d 20 69 20 2b 20 31 20 2b 20 28 28 21 69 73  += i + 1 + ((!is
5600: 6e 75 6c 6c 20 26 26 20 78 74 79 70 65 3d 3d 65  null && xtype==e
5610: 74 53 51 4c 45 53 43 41 50 45 32 29 20 3f 20 32  tSQLESCAPE2) ? 2
5620: 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20   : 0);.         
5630: 20 69 66 28 20 6e 3e 65 74 42 55 46 53 49 5a 45   if( n>etBUFSIZE
5640: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5650: 62 75 66 70 74 20 3d 20 7a 45 78 74 72 61 20 3d  bufpt = zExtra =
5660: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e   sqliteMalloc( n
5670: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
5680: 69 66 28 20 62 75 66 70 74 3d 3d 30 20 29 20 72  if( bufpt==0 ) r
5690: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
56a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
56b0: 20 20 20 20 20 20 20 62 75 66 70 74 20 3d 20 62         bufpt = b
56c0: 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  uf;.          }.
56d0: 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b            j = 0;
56e0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
56f0: 69 73 6e 75 6c 6c 20 26 26 20 78 74 79 70 65 3d  isnull && xtype=
5700: 3d 65 74 53 51 4c 45 53 43 41 50 45 32 20 29 20  =etSQLESCAPE2 ) 
5710: 62 75 66 70 74 5b 6a 2b 2b 5d 20 3d 20 27 5c 27  bufpt[j++] = '\'
5720: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ';.          for
5730: 28 69 3d 30 3b 20 28 63 3d 61 72 67 5b 69 5d 29  (i=0; (c=arg[i])
5740: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  !=0; i++){.     
5750: 20 20 20 20 20 20 20 62 75 66 70 74 5b 6a 2b 2b         bufpt[j++
5760: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20  ] = c;.         
5770: 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29     if( c=='\'' )
5780: 20 62 75 66 70 74 5b 6a 2b 2b 5d 20 3d 20 63 3b   bufpt[j++] = c;
5790: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
57a0: 20 20 20 20 20 20 20 69 66 28 20 21 69 73 6e 75         if( !isnu
57b0: 6c 6c 20 26 26 20 78 74 79 70 65 3d 3d 65 74 53  ll && xtype==etS
57c0: 51 4c 45 53 43 41 50 45 32 20 29 20 62 75 66 70  QLESCAPE2 ) bufp
57d0: 74 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20  t[j++] = '\'';. 
57e0: 20 20 20 20 20 20 20 20 20 62 75 66 70 74 5b 6a           bufpt[j
57f0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
5800: 20 6c 65 6e 67 74 68 20 3d 20 6a 3b 0a 20 20 20   length = j;.   
5810: 20 20 20 20 20 20 20 69 66 28 20 70 72 65 63 69         if( preci
5820: 73 69 6f 6e 3e 3d 30 20 26 26 20 70 72 65 63 69  sion>=0 && preci
5830: 73 69 6f 6e 3c 6c 65 6e 67 74 68 20 29 20 6c 65  sion<length ) le
5840: 6e 67 74 68 20 3d 20 70 72 65 63 69 73 69 6f 6e  ngth = precision
5850: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5860: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5870: 20 63 61 73 65 20 65 74 54 4f 4b 45 4e 3a 20 7b   case etTOKEN: {
5880: 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a  .        Token *
5890: 70 54 6f 6b 65 6e 20 3d 20 76 61 5f 61 72 67 28  pToken = va_arg(
58a0: 61 70 2c 20 54 6f 6b 65 6e 2a 29 3b 0a 20 20 20  ap, Token*);.   
58b0: 20 20 20 20 20 28 2a 66 75 6e 63 29 28 61 72 67       (*func)(arg
58c0: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
58d0: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
58e0: 20 6c 65 6e 67 74 68 20 3d 20 77 69 64 74 68 20   length = width 
58f0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 0;.        bre
5900: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5910: 20 20 63 61 73 65 20 65 74 53 52 43 4c 49 53 54    case etSRCLIST
5920: 3a 20 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c  : {.        SrcL
5930: 69 73 74 20 2a 70 53 72 63 20 3d 20 76 61 5f 61  ist *pSrc = va_a
5940: 72 67 28 61 70 2c 20 53 72 63 4c 69 73 74 2a 29  rg(ap, SrcList*)
5950: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 20  ;.        int k 
5960: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5970: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  );.        struc
5980: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
5990: 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  pItem = &pSrc->a
59a0: 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73  [k];.        ass
59b0: 65 72 74 28 20 6b 3e 3d 30 20 26 26 20 6b 3c 70  ert( k>=0 && k<p
59c0: 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20  Src->nSrc );.   
59d0: 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
59e0: 7a 44 61 74 61 62 61 73 65 20 26 26 20 70 49 74  zDatabase && pIt
59f0: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 5b 30 5d  em->zDatabase[0]
5a00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 28 2a   ){.          (*
5a10: 66 75 6e 63 29 28 61 72 67 2c 20 70 49 74 65 6d  func)(arg, pItem
5a20: 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20 73 74 72  ->zDatabase, str
5a30: 6c 65 6e 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61  len(pItem->zData
5a40: 62 61 73 65 29 29 3b 0a 20 20 20 20 20 20 20 20  base));.        
5a50: 20 20 28 2a 66 75 6e 63 29 28 61 72 67 2c 20 22    (*func)(arg, "
5a60: 2e 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  .", 1);.        
5a70: 7d 0a 20 20 20 20 20 20 20 20 28 2a 66 75 6e 63  }.        (*func
5a80: 29 28 61 72 67 2c 20 70 49 74 65 6d 2d 3e 7a 4e  )(arg, pItem->zN
5a90: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 74 65  ame, strlen(pIte
5aa0: 6d 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  m->zName));.    
5ab0: 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 77 69 64      length = wid
5ac0: 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  th = 0;.        
5ad0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5ae0: 20 20 20 20 20 63 61 73 65 20 65 74 45 52 52 4f       case etERRO
5af0: 52 3a 0a 20 20 20 20 20 20 20 20 62 75 66 5b 30  R:.        buf[0
5b00: 5d 20 3d 20 27 25 27 3b 0a 20 20 20 20 20 20 20  ] = '%';.       
5b10: 20 62 75 66 5b 31 5d 20 3d 20 63 3b 0a 20 20 20   buf[1] = c;.   
5b20: 20 20 20 20 20 65 72 72 6f 72 66 6c 61 67 20 3d       errorflag =
5b30: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20   0;.        idx 
5b40: 3d 20 31 2b 28 63 21 3d 30 29 3b 0a 20 20 20 20  = 1+(c!=0);.    
5b50: 20 20 20 20 28 2a 66 75 6e 63 29 28 61 72 67 2c      (*func)(arg,
5b60: 22 25 22 2c 69 64 78 29 3b 0a 20 20 20 20 20 20  "%",idx);.      
5b70: 20 20 63 6f 75 6e 74 20 2b 3d 20 69 64 78 3b 0a    count += idx;.
5b80: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30          if( c==0
5b90: 20 29 20 66 6d 74 2d 2d 3b 0a 20 20 20 20 20 20   ) fmt--;.      
5ba0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 2f 2a    break;.    }/*
5bb0: 20 45 6e 64 20 73 77 69 74 63 68 20 6f 76 65 72   End switch over
5bc0: 20 74 68 65 20 66 6f 72 6d 61 74 20 74 79 70 65   the format type
5bd0: 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   */.    /*.    *
5be0: 2a 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68  * The text of th
5bf0: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20  e conversion is 
5c00: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 22 62  pointed to by "b
5c10: 75 66 70 74 22 20 61 6e 64 20 69 73 0a 20 20 20  ufpt" and is.   
5c20: 20 2a 2a 20 22 6c 65 6e 67 74 68 22 20 63 68 61   ** "length" cha
5c30: 72 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20 20 54  racters long.  T
5c40: 68 65 20 66 69 65 6c 64 20 77 69 64 74 68 20 69  he field width i
5c50: 73 20 22 77 69 64 74 68 22 2e 20 20 44 6f 0a 20  s "width".  Do. 
5c60: 20 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74     ** the output
5c70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
5c80: 20 21 66 6c 61 67 5f 6c 65 66 74 6a 75 73 74 69   !flag_leftjusti
5c90: 66 79 20 29 7b 0a 20 20 20 20 20 20 72 65 67 69  fy ){.      regi
5ca0: 73 74 65 72 20 69 6e 74 20 6e 73 70 61 63 65 3b  ster int nspace;
5cb0: 0a 20 20 20 20 20 20 6e 73 70 61 63 65 20 3d 20  .      nspace = 
5cc0: 77 69 64 74 68 2d 6c 65 6e 67 74 68 3b 0a 20 20  width-length;.  
5cd0: 20 20 20 20 69 66 28 20 6e 73 70 61 63 65 3e 30      if( nspace>0
5ce0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 75 6e   ){.        coun
5cf0: 74 20 2b 3d 20 6e 73 70 61 63 65 3b 0a 20 20 20  t += nspace;.   
5d00: 20 20 20 20 20 77 68 69 6c 65 28 20 6e 73 70 61       while( nspa
5d10: 63 65 3e 3d 65 74 53 50 41 43 45 53 49 5a 45 20  ce>=etSPACESIZE 
5d20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 28 2a 66  ){.          (*f
5d30: 75 6e 63 29 28 61 72 67 2c 73 70 61 63 65 73 2c  unc)(arg,spaces,
5d40: 65 74 53 50 41 43 45 53 49 5a 45 29 3b 0a 20 20  etSPACESIZE);.  
5d50: 20 20 20 20 20 20 20 20 6e 73 70 61 63 65 20 2d          nspace -
5d60: 3d 20 65 74 53 50 41 43 45 53 49 5a 45 3b 0a 20  = etSPACESIZE;. 
5d70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5d80: 20 69 66 28 20 6e 73 70 61 63 65 3e 30 20 29 20   if( nspace>0 ) 
5d90: 28 2a 66 75 6e 63 29 28 61 72 67 2c 73 70 61 63  (*func)(arg,spac
5da0: 65 73 2c 6e 73 70 61 63 65 29 3b 0a 20 20 20 20  es,nspace);.    
5db0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
5dc0: 28 20 6c 65 6e 67 74 68 3e 30 20 29 7b 0a 20 20  ( length>0 ){.  
5dd0: 20 20 20 20 28 2a 66 75 6e 63 29 28 61 72 67 2c      (*func)(arg,
5de0: 62 75 66 70 74 2c 6c 65 6e 67 74 68 29 3b 0a 20  bufpt,length);. 
5df0: 20 20 20 20 20 63 6f 75 6e 74 20 2b 3d 20 6c 65       count += le
5e00: 6e 67 74 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ngth;.    }.    
5e10: 69 66 28 20 66 6c 61 67 5f 6c 65 66 74 6a 75 73  if( flag_leftjus
5e20: 74 69 66 79 20 29 7b 0a 20 20 20 20 20 20 72 65  tify ){.      re
5e30: 67 69 73 74 65 72 20 69 6e 74 20 6e 73 70 61 63  gister int nspac
5e40: 65 3b 0a 20 20 20 20 20 20 6e 73 70 61 63 65 20  e;.      nspace 
5e50: 3d 20 77 69 64 74 68 2d 6c 65 6e 67 74 68 3b 0a  = width-length;.
5e60: 20 20 20 20 20 20 69 66 28 20 6e 73 70 61 63 65        if( nspace
5e70: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  >0 ){.        co
5e80: 75 6e 74 20 2b 3d 20 6e 73 70 61 63 65 3b 0a 20  unt += nspace;. 
5e90: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 73         while( ns
5ea0: 70 61 63 65 3e 3d 65 74 53 50 41 43 45 53 49 5a  pace>=etSPACESIZ
5eb0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 28  E ){.          (
5ec0: 2a 66 75 6e 63 29 28 61 72 67 2c 73 70 61 63 65  *func)(arg,space
5ed0: 73 2c 65 74 53 50 41 43 45 53 49 5a 45 29 3b 0a  s,etSPACESIZE);.
5ee0: 20 20 20 20 20 20 20 20 20 20 6e 73 70 61 63 65            nspace
5ef0: 20 2d 3d 20 65 74 53 50 41 43 45 53 49 5a 45 3b   -= etSPACESIZE;
5f00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5f10: 20 20 20 69 66 28 20 6e 73 70 61 63 65 3e 30 20     if( nspace>0 
5f20: 29 20 28 2a 66 75 6e 63 29 28 61 72 67 2c 73 70  ) (*func)(arg,sp
5f30: 61 63 65 73 2c 6e 73 70 61 63 65 29 3b 0a 20 20  aces,nspace);.  
5f40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5f50: 69 66 28 20 7a 45 78 74 72 61 20 29 7b 0a 20 20  if( zExtra ){.  
5f60: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
5f70: 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20  Extra);.    }.  
5f80: 7d 2f 2a 20 45 6e 64 20 66 6f 72 20 6c 6f 6f 70  }/* End for loop
5f90: 20 6f 76 65 72 20 74 68 65 20 66 6f 72 6d 61 74   over the format
5fa0: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 72 65 74   string */.  ret
5fb0: 75 72 6e 20 65 72 72 6f 72 66 6c 61 67 20 3f 20  urn errorflag ? 
5fc0: 2d 31 20 3a 20 63 6f 75 6e 74 3b 0a 7d 20 2f 2a  -1 : count;.} /*
5fd0: 20 45 6e 64 20 6f 66 20 66 75 6e 63 74 69 6f 6e   End of function
5fe0: 20 2a 2f 0a 0a 0a 2f 2a 20 54 68 69 73 20 73 74   */.../* This st
5ff0: 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20  ructure is used 
6000: 74 6f 20 73 74 6f 72 65 20 73 74 61 74 65 20 69  to store state i
6010: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
6020: 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 74 6f   the.** write to
6030: 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 69 73 20   memory that is 
6040: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
6050: 67 72 65 73 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  gress..*/.struct
6060: 20 73 67 4d 70 72 69 6e 74 66 20 7b 0a 20 20 63   sgMprintf {.  c
6070: 68 61 72 20 2a 7a 42 61 73 65 3b 20 20 20 20 20  har *zBase;     
6080: 2f 2a 20 41 20 62 61 73 65 20 61 6c 6c 6f 63 61  /* A base alloca
6090: 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tion */.  char *
60a0: 7a 54 65 78 74 3b 20 20 20 20 20 2f 2a 20 54 68  zText;     /* Th
60b0: 65 20 73 74 72 69 6e 67 20 63 6f 6c 6c 65 63 74  e string collect
60c0: 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 69  ed so far */.  i
60d0: 6e 74 20 20 6e 43 68 61 72 3b 20 20 20 20 20 20  nt  nChar;      
60e0: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65  /* Length of the
60f0: 20 73 74 72 69 6e 67 20 73 6f 20 66 61 72 20 2a   string so far *
6100: 2f 0a 20 20 69 6e 74 20 20 6e 54 6f 74 61 6c 3b  /.  int  nTotal;
6110: 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 73       /* Output s
6120: 69 7a 65 20 69 66 20 75 6e 63 6f 6e 73 74 72 61  ize if unconstra
6130: 69 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 20 6e  ined */.  int  n
6140: 41 6c 6c 6f 63 3b 20 20 20 20 20 2f 2a 20 41 6d  Alloc;     /* Am
6150: 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c  ount of space al
6160: 6c 6f 63 61 74 65 64 20 69 6e 20 7a 54 65 78 74  located in zText
6170: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 28 2a 78 52   */.  void *(*xR
6180: 65 61 6c 6c 6f 63 29 28 76 6f 69 64 2a 2c 69 6e  ealloc)(void*,in
6190: 74 29 3b 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  t);  /* Function
61a0: 20 75 73 65 64 20 74 6f 20 72 65 61 6c 6c 6f 63   used to realloc
61b0: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 7d 3b 0a 0a 2f   memory */.};../
61c0: 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  * .** This funct
61d0: 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ion implements t
61e0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 72 6f 6d  he callback from
61f0: 20 76 78 70 72 69 6e 74 66 2e 20 0a 2a 2a 0a 2a   vxprintf. .**.*
6200: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
6210: 64 64 20 6e 4e 65 77 43 68 61 72 20 63 68 61 72  dd nNewChar char
6220: 61 63 74 65 72 73 20 6f 66 20 74 65 78 74 20 69  acters of text i
6230: 6e 20 7a 4e 65 77 54 65 78 74 20 74 6f 0a 2a 2a  n zNewText to.**
6240: 20 74 68 65 20 73 67 4d 70 72 69 6e 74 66 20 73   the sgMprintf s
6250: 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
6260: 20 74 6f 20 62 79 20 22 61 72 67 22 2e 0a 2a 2f   to by "arg"..*/
6270: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 75  .static void mou
6280: 74 28 76 6f 69 64 20 2a 61 72 67 2c 20 63 6f 6e  t(void *arg, con
6290: 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 54 65 78  st char *zNewTex
62a0: 74 2c 20 69 6e 74 20 6e 4e 65 77 43 68 61 72 29  t, int nNewChar)
62b0: 7b 0a 20 20 73 74 72 75 63 74 20 73 67 4d 70 72  {.  struct sgMpr
62c0: 69 6e 74 66 20 2a 70 4d 20 3d 20 28 73 74 72 75  intf *pM = (stru
62d0: 63 74 20 73 67 4d 70 72 69 6e 74 66 2a 29 61 72  ct sgMprintf*)ar
62e0: 67 3b 0a 20 20 70 4d 2d 3e 6e 54 6f 74 61 6c 20  g;.  pM->nTotal 
62f0: 2b 3d 20 6e 4e 65 77 43 68 61 72 3b 0a 20 20 69  += nNewChar;.  i
6300: 66 28 20 70 4d 2d 3e 6e 43 68 61 72 20 2b 20 6e  f( pM->nChar + n
6310: 4e 65 77 43 68 61 72 20 2b 20 31 20 3e 20 70 4d  NewChar + 1 > pM
6320: 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
6330: 69 66 28 20 70 4d 2d 3e 78 52 65 61 6c 6c 6f 63  if( pM->xRealloc
6340: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4e 65  ==0 ){.      nNe
6350: 77 43 68 61 72 20 3d 20 20 70 4d 2d 3e 6e 41 6c  wChar =  pM->nAl
6360: 6c 6f 63 20 2d 20 70 4d 2d 3e 6e 43 68 61 72 20  loc - pM->nChar 
6370: 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  - 1;.    }else{.
6380: 20 20 20 20 20 20 70 4d 2d 3e 6e 41 6c 6c 6f 63        pM->nAlloc
6390: 20 3d 20 70 4d 2d 3e 6e 43 68 61 72 20 2b 20 6e   = pM->nChar + n
63a0: 4e 65 77 43 68 61 72 2a 32 20 2b 20 31 3b 0a 20  NewChar*2 + 1;. 
63b0: 20 20 20 20 20 69 66 28 20 70 4d 2d 3e 7a 54 65       if( pM->zTe
63c0: 78 74 3d 3d 70 4d 2d 3e 7a 42 61 73 65 20 29 7b  xt==pM->zBase ){
63d0: 0a 20 20 20 20 20 20 20 20 70 4d 2d 3e 7a 54 65  .        pM->zTe
63e0: 78 74 20 3d 20 70 4d 2d 3e 78 52 65 61 6c 6c 6f  xt = pM->xReallo
63f0: 63 28 30 2c 20 70 4d 2d 3e 6e 41 6c 6c 6f 63 29  c(0, pM->nAlloc)
6400: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d  ;.        if( pM
6410: 2d 3e 7a 54 65 78 74 20 26 26 20 70 4d 2d 3e 6e  ->zText && pM->n
6420: 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Char ){.        
6430: 20 20 6d 65 6d 63 70 79 28 70 4d 2d 3e 7a 54 65    memcpy(pM->zTe
6440: 78 74 2c 20 70 4d 2d 3e 7a 42 61 73 65 2c 20 70  xt, pM->zBase, p
6450: 4d 2d 3e 6e 43 68 61 72 29 3b 0a 20 20 20 20 20  M->nChar);.     
6460: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
6470: 7b 0a 20 20 20 20 20 20 20 20 70 4d 2d 3e 7a 54  {.        pM->zT
6480: 65 78 74 20 3d 20 70 4d 2d 3e 78 52 65 61 6c 6c  ext = pM->xReall
6490: 6f 63 28 70 4d 2d 3e 7a 54 65 78 74 2c 20 70 4d  oc(pM->zText, pM
64a0: 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  ->nAlloc);.     
64b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
64c0: 66 28 20 70 4d 2d 3e 7a 54 65 78 74 20 26 26 20  f( pM->zText && 
64d0: 6e 4e 65 77 43 68 61 72 3e 30 20 29 7b 0a 20 20  nNewChar>0 ){.  
64e0: 20 20 6d 65 6d 63 70 79 28 26 70 4d 2d 3e 7a 54    memcpy(&pM->zT
64f0: 65 78 74 5b 70 4d 2d 3e 6e 43 68 61 72 5d 2c 20  ext[pM->nChar], 
6500: 7a 4e 65 77 54 65 78 74 2c 20 6e 4e 65 77 43 68  zNewText, nNewCh
6510: 61 72 29 3b 0a 20 20 20 20 70 4d 2d 3e 6e 43 68  ar);.    pM->nCh
6520: 61 72 20 2b 3d 20 6e 4e 65 77 43 68 61 72 3b 0a  ar += nNewChar;.
6530: 20 20 20 20 70 4d 2d 3e 7a 54 65 78 74 5b 70 4d      pM->zText[pM
6540: 2d 3e 6e 43 68 61 72 5d 20 3d 20 30 3b 0a 20 20  ->nChar] = 0;.  
6550: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
6560: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72 61  routine is a wra
6570: 70 70 65 72 20 61 72 6f 75 6e 64 20 78 70 72 69  pper around xpri
6580: 6e 74 66 28 29 20 74 68 61 74 20 69 6e 76 6f 6b  ntf() that invok
6590: 65 73 20 6d 6f 75 74 28 29 20 61 73 0a 2a 2a 20  es mout() as.** 
65a0: 74 68 65 20 63 6f 6e 73 75 6d 65 72 2e 20 20 0a  the consumer.  .
65b0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
65c0: 62 61 73 65 5f 76 70 72 69 6e 74 66 28 0a 20 20  base_vprintf(.  
65d0: 76 6f 69 64 20 2a 28 2a 78 52 65 61 6c 6c 6f 63  void *(*xRealloc
65e0: 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 20 20 20  )(void*,int),   
65f0: 2f 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 72 65  /* Routine to re
6600: 61 6c 6c 6f 63 20 6d 65 6d 6f 72 79 2e 20 4d 61  alloc memory. Ma
6610: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
6620: 6e 74 20 75 73 65 49 6e 74 65 72 6e 61 6c 2c 20  nt useInternal, 
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6640: 2a 20 55 73 65 20 69 6e 74 65 72 6e 61 6c 20 25  * Use internal %
6650: 2d 63 6f 6e 76 65 72 73 69 6f 6e 73 20 69 66 20  -conversions if 
6660: 74 72 75 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  true */.  char *
6670: 7a 49 6e 69 74 42 75 66 2c 20 20 20 20 20 20 20  zInitBuf,       
6680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
6690: 74 69 61 6c 6c 79 20 77 72 69 74 65 20 68 65 72  tially write her
66a0: 65 2c 20 62 65 66 6f 72 65 20 6d 61 6c 6c 6f 63  e, before malloc
66b0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e  ing */.  int nIn
66c0: 69 74 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  itBuf,          
66d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
66e0: 20 6f 66 20 7a 49 6e 69 74 42 75 66 5b 5d 20 2a   of zInitBuf[] *
66f0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
6700: 7a 46 6f 72 6d 61 74 2c 20 20 20 20 20 20 20 20  zFormat,        
6710: 20 20 20 20 2f 2a 20 66 6f 72 6d 61 74 20 73 74      /* format st
6720: 72 69 6e 67 20 2a 2f 0a 20 20 76 61 5f 6c 69 73  ring */.  va_lis
6730: 74 20 61 70 20 20 20 20 20 20 20 20 20 20 20 20  t ap            
6740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 72 67            /* arg
6750: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
6760: 74 72 75 63 74 20 73 67 4d 70 72 69 6e 74 66 20  truct sgMprintf 
6770: 73 4d 3b 0a 20 20 73 4d 2e 7a 42 61 73 65 20 3d  sM;.  sM.zBase =
6780: 20 73 4d 2e 7a 54 65 78 74 20 3d 20 7a 49 6e 69   sM.zText = zIni
6790: 74 42 75 66 3b 0a 20 20 73 4d 2e 6e 43 68 61 72  tBuf;.  sM.nChar
67a0: 20 3d 20 73 4d 2e 6e 54 6f 74 61 6c 20 3d 20 30   = sM.nTotal = 0
67b0: 3b 0a 20 20 73 4d 2e 6e 41 6c 6c 6f 63 20 3d 20  ;.  sM.nAlloc = 
67c0: 6e 49 6e 69 74 42 75 66 3b 0a 20 20 73 4d 2e 78  nInitBuf;.  sM.x
67d0: 52 65 61 6c 6c 6f 63 20 3d 20 78 52 65 61 6c 6c  Realloc = xReall
67e0: 6f 63 3b 0a 20 20 76 78 70 72 69 6e 74 66 28 6d  oc;.  vxprintf(m
67f0: 6f 75 74 2c 20 26 73 4d 2c 20 75 73 65 49 6e 74  out, &sM, useInt
6800: 65 72 6e 61 6c 2c 20 7a 46 6f 72 6d 61 74 2c 20  ernal, zFormat, 
6810: 61 70 29 3b 0a 20 20 69 66 28 20 78 52 65 61 6c  ap);.  if( xReal
6820: 6c 6f 63 20 29 7b 0a 20 20 20 20 69 66 28 20 73  loc ){.    if( s
6830: 4d 2e 7a 54 65 78 74 3d 3d 73 4d 2e 7a 42 61 73  M.zText==sM.zBas
6840: 65 20 29 7b 0a 20 20 20 20 20 20 73 4d 2e 7a 54  e ){.      sM.zT
6850: 65 78 74 20 3d 20 78 52 65 61 6c 6c 6f 63 28 30  ext = xRealloc(0
6860: 2c 20 73 4d 2e 6e 43 68 61 72 2b 31 29 3b 0a 20  , sM.nChar+1);. 
6870: 20 20 20 20 20 6d 65 6d 63 70 79 28 73 4d 2e 7a       memcpy(sM.z
6880: 54 65 78 74 2c 20 73 4d 2e 7a 42 61 73 65 2c 20  Text, sM.zBase, 
6890: 73 4d 2e 6e 43 68 61 72 2b 31 29 3b 0a 20 20 20  sM.nChar+1);.   
68a0: 20 7d 65 6c 73 65 20 69 66 28 20 73 4d 2e 6e 41   }else if( sM.nA
68b0: 6c 6c 6f 63 3e 73 4d 2e 6e 43 68 61 72 2b 31 30  lloc>sM.nChar+10
68c0: 20 29 7b 0a 20 20 20 20 20 20 73 4d 2e 7a 54 65   ){.      sM.zTe
68d0: 78 74 20 3d 20 78 52 65 61 6c 6c 6f 63 28 73 4d  xt = xRealloc(sM
68e0: 2e 7a 54 65 78 74 2c 20 73 4d 2e 6e 43 68 61 72  .zText, sM.nChar
68f0: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +1);.    }.  }. 
6900: 20 72 65 74 75 72 6e 20 73 4d 2e 7a 54 65 78 74   return sM.zText
6910: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 6c 6c  ;.}../*.** Reall
6920: 6f 63 20 74 68 61 74 20 69 73 20 61 20 72 65 61  oc that is a rea
6930: 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 6e 6f 74 20  l function, not 
6940: 61 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 73 74 61 74  a macro..*/.stat
6950: 69 63 20 76 6f 69 64 20 2a 70 72 69 6e 74 66 5f  ic void *printf_
6960: 72 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 6f 6c  realloc(void *ol
6970: 64 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20  d, int size){.  
6980: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 52 65 61  return sqliteRea
6990: 6c 6c 6f 63 28 6f 6c 64 2c 73 69 7a 65 29 3b 0a  lloc(old,size);.
69a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 69  }../*.** Print i
69b0: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
69c0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
69d0: 61 6c 6c 6f 63 28 29 2e 20 20 55 73 65 20 74 68  alloc().  Use th
69e0: 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 25 2d  e internal.** %-
69f0: 63 6f 6e 76 65 72 73 69 6f 6e 20 65 78 74 65 6e  conversion exten
6a00: 73 69 6f 6e 73 2e 0a 2a 2f 0a 63 68 61 72 20 2a  sions..*/.char *
6a10: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
6a20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
6a30: 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29  mat, va_list ap)
6a40: 7b 0a 20 20 63 68 61 72 20 7a 42 61 73 65 5b 31  {.  char zBase[1
6a50: 30 30 30 5d 3b 0a 20 20 72 65 74 75 72 6e 20 62  000];.  return b
6a60: 61 73 65 5f 76 70 72 69 6e 74 66 28 70 72 69 6e  ase_vprintf(prin
6a70: 74 66 5f 72 65 61 6c 6c 6f 63 2c 20 31 2c 20 7a  tf_realloc, 1, z
6a80: 42 61 73 65 2c 20 73 69 7a 65 6f 66 28 7a 42 61  Base, sizeof(zBa
6a90: 73 65 29 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  se), zFormat, ap
6aa0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  );.}../*.** Prin
6ab0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  t into memory ob
6ac0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
6ad0: 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 20 55 73 65  teMalloc().  Use
6ae0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   the internal.**
6af0: 20 25 2d 63 6f 6e 76 65 72 73 69 6f 6e 20 65 78   %-conversion ex
6b00: 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 63 68 61  tensions..*/.cha
6b10: 72 20 2a 73 71 6c 69 74 65 33 4d 50 72 69 6e 74  r *sqlite3MPrint
6b20: 66 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  f(const char *zF
6b30: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
6b40: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61  a_list ap;.  cha
6b50: 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 7a 42 61  r *z;.  char zBa
6b60: 73 65 5b 31 30 30 30 5d 3b 0a 20 20 76 61 5f 73  se[1000];.  va_s
6b70: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
6b80: 29 3b 0a 20 20 7a 20 3d 20 62 61 73 65 5f 76 70  );.  z = base_vp
6b90: 72 69 6e 74 66 28 70 72 69 6e 74 66 5f 72 65 61  rintf(printf_rea
6ba0: 6c 6c 6f 63 2c 20 31 2c 20 7a 42 61 73 65 2c 20  lloc, 1, zBase, 
6bb0: 73 69 7a 65 6f 66 28 7a 42 61 73 65 29 2c 20 7a  sizeof(zBase), z
6bc0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
6bd0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
6be0: 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn z;.}../*.** 
6bf0: 50 72 69 6e 74 20 69 6e 74 6f 20 6d 65 6d 6f 72  Print into memor
6c00: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
6c10: 6d 61 6c 6c 6f 63 28 29 2e 20 20 44 6f 20 6e 6f  malloc().  Do no
6c20: 74 20 75 73 65 20 74 68 65 20 69 6e 74 65 72 6e  t use the intern
6c30: 61 6c 0a 2a 2a 20 25 2d 63 6f 6e 76 65 72 73 69  al.** %-conversi
6c40: 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 20  on extensions.  
6c50: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
6c60: 66 6f 72 20 75 73 65 20 62 79 20 65 78 74 65 72  for use by exter
6c70: 6e 61 6c 20 75 73 65 72 73 2e 0a 2a 2f 0a 63 68  nal users..*/.ch
6c80: 61 72 20 2a 73 71 6c 69 74 65 5f 6d 70 72 69 6e  ar *sqlite_mprin
6c90: 74 66 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  tf(const char *z
6ca0: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
6cb0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
6cc0: 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 7a 42  ar *z;.  char zB
6cd0: 75 66 5b 32 30 30 5d 3b 0a 0a 20 20 76 61 5f 73  uf[200];..  va_s
6ce0: 74 61 72 74 28 61 70 2c 7a 46 6f 72 6d 61 74 29  tart(ap,zFormat)
6cf0: 3b 0a 20 20 7a 20 3d 20 62 61 73 65 5f 76 70 72  ;.  z = base_vpr
6d00: 69 6e 74 66 28 28 76 6f 69 64 2a 28 2a 29 28 76  intf((void*(*)(v
6d10: 6f 69 64 2a 2c 69 6e 74 29 29 72 65 61 6c 6c 6f  oid*,int))reallo
6d20: 63 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  c, 0, .         
6d30: 20 20 20 20 20 20 20 20 20 20 7a 42 75 66 2c 20            zBuf, 
6d40: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 46  sizeof(zBuf), zF
6d50: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
6d60: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
6d70: 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73  rn z;.}../* This
6d80: 20 69 73 20 74 68 65 20 76 61 72 61 72 67 73 20   is the varargs 
6d90: 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
6da0: 65 5f 6d 70 72 69 6e 74 66 2e 20 20 0a 2a 2f 0a  e_mprintf.  .*/.
6db0: 63 68 61 72 20 2a 73 71 6c 69 74 65 5f 76 6d 70  char *sqlite_vmp
6dc0: 72 69 6e 74 66 28 63 6f 6e 73 74 20 63 68 61 72  rintf(const char
6dd0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69   *zFormat, va_li
6de0: 73 74 20 61 70 29 7b 0a 20 20 63 68 61 72 20 7a  st ap){.  char z
6df0: 42 75 66 5b 32 30 30 5d 3b 0a 20 20 72 65 74 75  Buf[200];.  retu
6e00: 72 6e 20 62 61 73 65 5f 76 70 72 69 6e 74 66 28  rn base_vprintf(
6e10: 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c  (void*(*)(void*,
6e20: 69 6e 74 29 29 72 65 61 6c 6c 6f 63 2c 20 30 2c  int))realloc, 0,
6e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6e40: 20 20 20 20 20 20 20 7a 42 75 66 2c 20 73 69 7a         zBuf, siz
6e50: 65 6f 66 28 7a 42 75 66 29 2c 20 7a 46 6f 72 6d  eof(zBuf), zForm
6e60: 61 74 2c 20 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  at, ap);.}../*.*
6e70: 2a 20 73 71 6c 69 74 65 5f 73 6e 70 72 69 6e 74  * sqlite_snprint
6e80: 66 28 29 20 77 6f 72 6b 73 20 6c 69 6b 65 20 73  f() works like s
6e90: 6e 70 72 69 6e 74 66 28 29 20 65 78 63 65 70 74  nprintf() except
6ea0: 20 74 68 61 74 20 69 74 20 69 67 6e 6f 72 65 73   that it ignores
6eb0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
6ec0: 6c 6f 63 61 6c 65 20 73 65 74 74 69 6e 67 73 2e  locale settings.
6ed0: 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74    This is import
6ee0: 61 6e 74 20 66 6f 72 20 53 51 4c 69 74 65 20 62  ant for SQLite b
6ef0: 65 63 61 75 73 65 20 77 65 0a 2a 2a 20 61 72 65  ecause we.** are
6f00: 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20 75 73 65   not able to use
6f10: 20 61 20 22 2c 22 20 61 73 20 74 68 65 20 64 65   a "," as the de
6f20: 63 69 6d 61 6c 20 70 6f 69 6e 74 20 69 6e 20 70  cimal point in p
6f30: 6c 61 63 65 20 6f 66 20 22 2e 22 20 61 73 0a 2a  lace of "." as.*
6f40: 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 73  * specified by s
6f50: 6f 6d 65 20 6c 6f 63 61 6c 65 73 2e 0a 2a 2f 0a  ome locales..*/.
6f60: 63 68 61 72 20 2a 73 71 6c 69 74 65 5f 73 6e 70  char *sqlite_snp
6f70: 72 69 6e 74 66 28 69 6e 74 20 6e 2c 20 63 68 61  rintf(int n, cha
6f80: 72 20 2a 7a 42 75 66 2c 20 63 6f 6e 73 74 20 63  r *zBuf, const c
6f90: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
6fa0: 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
6fb0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 0a 20 20   va_list ap;..  
6fc0: 76 61 5f 73 74 61 72 74 28 61 70 2c 7a 46 6f 72  va_start(ap,zFor
6fd0: 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 62 61 73 65  mat);.  z = base
6fe0: 5f 76 70 72 69 6e 74 66 28 30 2c 20 30 2c 20 7a  _vprintf(0, 0, z
6ff0: 42 75 66 2c 20 6e 2c 20 7a 46 6f 72 6d 61 74 2c  Buf, n, zFormat,
7000: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
7010: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a  p);.  return z;.
7020: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
7030: 6c 6f 77 69 6e 67 20 66 6f 75 72 20 72 6f 75 74  lowing four rout
7040: 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ines implement t
7050: 68 65 20 76 61 72 61 72 67 73 20 76 65 72 73 69  he varargs versi
7060: 6f 6e 73 20 6f 66 20 74 68 65 0a 2a 2a 20 73 71  ons of the.** sq
7070: 6c 69 74 65 5f 65 78 65 63 28 29 20 61 6e 64 20  lite_exec() and 
7080: 73 71 6c 69 74 65 5f 67 65 74 5f 74 61 62 6c 65  sqlite_get_table
7090: 28 29 20 69 6e 74 65 72 66 61 63 65 73 2e 20 20  () interfaces.  
70a0: 53 65 65 20 74 68 65 20 73 71 6c 69 74 65 2e 68  See the sqlite.h
70b0: 0a 2a 2a 20 68 65 61 64 65 72 20 66 69 6c 65 73  .** header files
70c0: 20 66 6f 72 20 61 20 6d 6f 72 65 20 64 65 74 61   for a more deta
70d0: 69 6c 65 64 20 64 65 73 63 72 69 70 74 69 6f 6e  iled description
70e0: 20 6f 66 20 68 6f 77 20 74 68 65 73 65 20 69 6e   of how these in
70f0: 74 65 72 66 61 63 65 73 0a 2a 2a 20 77 6f 72 6b  terfaces.** work
7100: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
7110: 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6a  utines are all j
7120: 75 73 74 20 73 69 6d 70 6c 65 20 77 72 61 70 70  ust simple wrapp
7130: 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ers..*/.int sqli
7140: 74 65 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 0a  te_exec_printf(.
7150: 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20    sqlite *db,   
7160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7170: 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61 74 61 62  /* An open datab
7180: 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ase */.  const c
7190: 68 61 72 20 2a 73 71 6c 46 6f 72 6d 61 74 2c 20  har *sqlFormat, 
71a0: 20 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 66         /* printf
71b0: 2d 73 74 79 6c 65 20 66 6f 72 6d 61 74 20 73 74  -style format st
71c0: 72 69 6e 67 20 66 6f 72 20 74 68 65 20 53 51 4c  ring for the SQL
71d0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 63 61 6c   */.  sqlite_cal
71e0: 6c 62 61 63 6b 20 78 43 61 6c 6c 62 61 63 6b 2c  lback xCallback,
71f0: 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20      /* Callback 
7200: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
7210: 69 64 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20  id *pArg,       
7220: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
7230: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 63  st argument to c
7240: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
7250: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 65 72 72   */.  char **err
7260: 6d 73 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  msg,            
7270: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67      /* Error msg
7280: 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
7290: 0a 20 20 2e 2e 2e 20 20 20 20 20 20 20 20 20 20  .  ...          
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72b0: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f   /* Arguments to
72c0: 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69   the format stri
72d0: 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 76 61 5f 6c  ng. */.){.  va_l
72e0: 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63  ist ap;.  int rc
72f0: 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  ;..  va_start(ap
7300: 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 72 63 20  , errmsg);.  rc 
7310: 3d 20 73 71 6c 69 74 65 5f 65 78 65 63 5f 76 70  = sqlite_exec_vp
7320: 72 69 6e 74 66 28 64 62 2c 20 73 71 6c 46 6f 72  rintf(db, sqlFor
7330: 6d 61 74 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20  mat, xCallback, 
7340: 70 41 72 67 2c 20 65 72 72 6d 73 67 2c 20 61 70  pArg, errmsg, ap
7350: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
7360: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7370: 69 6e 74 20 73 71 6c 69 74 65 5f 65 78 65 63 5f  int sqlite_exec_
7380: 76 70 72 69 6e 74 66 28 0a 20 20 73 71 6c 69 74  vprintf(.  sqlit
7390: 65 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  e *db,          
73a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f           /* An o
73b0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  pen database */.
73c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71    const char *sq
73d0: 6c 46 6f 72 6d 61 74 2c 20 20 20 20 20 20 20 20  lFormat,        
73e0: 2f 2a 20 70 72 69 6e 74 66 2d 73 74 79 6c 65 20  /* printf-style 
73f0: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 66 6f  format string fo
7400: 72 20 74 68 65 20 53 51 4c 20 2a 2f 0a 20 20 73  r the SQL */.  s
7410: 71 6c 69 74 65 5f 63 61 6c 6c 62 61 63 6b 20 78  qlite_callback x
7420: 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 2f 2a 20  Callback,    /* 
7430: 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  Callback functio
7440: 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  n */.  void *pAr
7450: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
7460: 20 20 20 20 20 2f 2a 20 31 73 74 20 61 72 67 75       /* 1st argu
7470: 6d 65 6e 74 20 74 6f 20 63 61 6c 6c 62 61 63 6b  ment to callback
7480: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63   function */.  c
7490: 68 61 72 20 2a 2a 65 72 72 6d 73 67 2c 20 20 20  har **errmsg,   
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
74b0: 45 72 72 6f 72 20 6d 73 67 20 77 72 69 74 74 65  Error msg writte
74c0: 6e 20 68 65 72 65 20 2a 2f 0a 20 20 76 61 5f 6c  n here */.  va_l
74d0: 69 73 74 20 61 70 20 20 20 20 20 20 20 20 20 20  ist ap          
74e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
74f0: 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 6f  uments to the fo
7500: 72 6d 61 74 20 73 74 72 69 6e 67 2e 20 2a 2f 0a  rmat string. */.
7510: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  ){.  char *zSql;
7520: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 7a 53  .  int rc;..  zS
7530: 71 6c 20 3d 20 73 71 6c 69 74 65 5f 76 6d 70 72  ql = sqlite_vmpr
7540: 69 6e 74 66 28 73 71 6c 46 6f 72 6d 61 74 2c 20  intf(sqlFormat, 
7550: 61 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ap);.  rc = sqli
7560: 74 65 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c  te_exec(db, zSql
7570: 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20 70 41 72  , xCallback, pAr
7580: 67 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 66 72  g, errmsg);.  fr
7590: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 72 65 74 75  ee(zSql);.  retu
75a0: 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
75b0: 69 74 65 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  ite_get_table_pr
75c0: 69 6e 74 66 28 0a 20 20 73 71 6c 69 74 65 20 2a  intf(.  sqlite *
75d0: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
75e0: 2a 20 41 6e 20 6f 70 65 6e 20 64 61 74 61 62 61  * An open databa
75f0: 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  se */.  const ch
7600: 61 72 20 2a 73 71 6c 46 6f 72 6d 61 74 2c 20 2f  ar *sqlFormat, /
7610: 2a 20 70 72 69 6e 74 66 2d 73 74 79 6c 65 20 66  * printf-style f
7620: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 66 6f 72  ormat string for
7630: 20 74 68 65 20 53 51 4c 20 2a 2f 0a 20 20 63 68   the SQL */.  ch
7640: 61 72 20 2a 2a 2a 72 65 73 75 6c 74 70 2c 20 20  ar ***resultp,  
7650: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 77       /* Result w
7660: 72 69 74 74 65 6e 20 74 6f 20 61 20 63 68 61 72  ritten to a char
7670: 20 2a 5b 5d 20 20 74 68 61 74 20 74 68 69 73 20   *[]  that this 
7680: 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 69  points to */.  i
7690: 6e 74 20 2a 6e 72 6f 77 2c 20 20 20 20 20 20 20  nt *nrow,       
76a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
76b0: 6f 66 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77  of result rows w
76c0: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20  ritten here */. 
76d0: 20 69 6e 74 20 2a 6e 63 6f 6c 2c 20 20 20 20 20   int *ncol,     
76e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
76f0: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
7700: 6d 6e 73 20 77 72 69 74 74 65 6e 20 68 65 72 65  mns written here
7710: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 65 72 72   */.  char **err
7720: 6d 73 67 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  msg,         /* 
7730: 45 72 72 6f 72 20 6d 73 67 20 77 72 69 74 74 65  Error msg writte
7740: 6e 20 68 65 72 65 20 2a 2f 0a 20 20 2e 2e 2e 20  n here */.  ... 
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7760: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20     /* Arguments 
7770: 74 6f 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74  to the format st
7780: 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 76 61 5f  ring */.){.  va_
7790: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
77a0: 63 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61  c;..  va_start(a
77b0: 70 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 72 63  p, errmsg);.  rc
77c0: 20 3d 20 73 71 6c 69 74 65 5f 67 65 74 5f 74 61   = sqlite_get_ta
77d0: 62 6c 65 5f 76 70 72 69 6e 74 66 28 64 62 2c 20  ble_vprintf(db, 
77e0: 73 71 6c 46 6f 72 6d 61 74 2c 20 72 65 73 75 6c  sqlFormat, resul
77f0: 74 70 2c 20 6e 72 6f 77 2c 20 6e 63 6f 6c 2c 20  tp, nrow, ncol, 
7800: 65 72 72 6d 73 67 2c 20 61 70 29 3b 0a 20 20 76  errmsg, ap);.  v
7810: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
7820: 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
7830: 6c 69 74 65 5f 67 65 74 5f 74 61 62 6c 65 5f 76  lite_get_table_v
7840: 70 72 69 6e 74 66 28 0a 20 20 73 71 6c 69 74 65  printf(.  sqlite
7850: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
7860: 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61 74 61   /* An open data
7870: 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
7880: 63 68 61 72 20 2a 73 71 6c 46 6f 72 6d 61 74 2c  char *sqlFormat,
7890: 20 2f 2a 20 70 72 69 6e 74 66 2d 73 74 79 6c 65   /* printf-style
78a0: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 66   format string f
78b0: 6f 72 20 74 68 65 20 53 51 4c 20 2a 2f 0a 20 20  or the SQL */.  
78c0: 63 68 61 72 20 2a 2a 2a 72 65 73 75 6c 74 70 2c  char ***resultp,
78d0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
78e0: 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 63 68   written to a ch
78f0: 61 72 20 2a 5b 5d 20 20 74 68 61 74 20 74 68 69  ar *[]  that thi
7900: 73 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20  s points to */. 
7910: 20 69 6e 74 20 2a 6e 72 6f 77 2c 20 20 20 20 20   int *nrow,     
7920: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7930: 72 20 6f 66 20 72 65 73 75 6c 74 20 72 6f 77 73  r of result rows
7940: 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
7950: 0a 20 20 69 6e 74 20 2a 6e 63 6f 6c 75 6d 6e 2c  .  int *ncolumn,
7960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7970: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
7980: 6c 75 6d 6e 73 20 77 72 69 74 74 65 6e 20 68 65  lumns written he
7990: 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 65  re */.  char **e
79a0: 72 72 6d 73 67 2c 20 20 20 20 20 20 20 20 20 2f  rrmsg,         /
79b0: 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72 69 74  * Error msg writ
79c0: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 76 61  ten here */.  va
79d0: 5f 6c 69 73 74 20 61 70 20 20 20 20 20 20 20 20  _list ap        
79e0: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
79f0: 73 20 74 6f 20 74 68 65 20 66 6f 72 6d 61 74 20  s to the format 
7a00: 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63  string */.){.  c
7a10: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74  har *zSql;.  int
7a20: 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73   rc;..  zSql = s
7a30: 71 6c 69 74 65 5f 76 6d 70 72 69 6e 74 66 28 73  qlite_vmprintf(s
7a40: 71 6c 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20  qlFormat, ap);. 
7a50: 20 72 63 20 3d 20 73 71 6c 69 74 65 5f 67 65 74   rc = sqlite_get
7a60: 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53 71 6c 2c  _table(db, zSql,
7a70: 20 72 65 73 75 6c 74 70 2c 20 6e 72 6f 77 2c 20   resultp, nrow, 
7a80: 6e 63 6f 6c 75 6d 6e 2c 20 65 72 72 6d 73 67 29  ncolumn, errmsg)
7a90: 3b 0a 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a  ;.  free(zSql);.
7aa0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7ab0: 0a 0a                                            ..