/ Hex Artifact Content
Login

Artifact 1d4469ca61ab202a1fcec6543f584d2407205e8d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 37 20 41 70 72 69 6c  /*.** 2007 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 74 65  *.** Code for te
0180: 73 74 69 6e 67 20 61 6c 6c 20 73 6f 72 74 73 20  sting all sorts 
0190: 6f 66 20 53 51 4c 69 74 65 20 69 6e 74 65 72 66  of SQLite interf
01a0: 61 63 65 73 2e 20 20 54 68 69 73 20 63 6f 64 65  aces.  This code
01b0: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 54  .** implements T
01c0: 43 4c 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20  CL commands for 
01d0: 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74  reading and writ
01e0: 69 6e 67 20 74 68 65 20 62 69 6e 61 72 79 0a 2a  ing the binary.*
01f0: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  * database files
0200: 20 61 6e 64 20 64 69 73 70 6c 61 79 69 6e 67 20   and displaying 
0210: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
0220: 68 6f 73 65 20 66 69 6c 65 73 20 61 73 0a 2a 2a  hose files as.**
0230: 20 68 65 78 61 64 65 63 69 6d 61 6c 2e 20 20 57   hexadecimal.  W
0240: 65 20 63 6f 75 6c 64 2c 20 69 6e 20 74 68 65 6f  e could, in theo
0250: 72 79 2c 20 75 73 65 20 74 68 65 20 62 75 69 6c  ry, use the buil
0260: 74 2d 69 6e 20 22 62 69 6e 61 72 79 22 0a 2a 2a  t-in "binary".**
0270: 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 43 4c 20   command of TCL 
0280: 74 6f 20 64 6f 20 61 20 6c 6f 74 20 6f 66 20 74  to do a lot of t
0290: 68 69 73 2c 20 62 75 74 20 74 68 65 72 65 20 61  his, but there a
02a0: 72 65 20 73 6f 6d 65 20 69 73 73 75 65 73 0a 2a  re some issues.*
02b0: 2a 20 77 69 74 68 20 68 69 73 74 6f 72 69 63 61  * with historica
02c0: 6c 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  l versions of th
02d0: 65 20 22 62 69 6e 61 72 79 22 20 63 6f 6d 6d 61  e "binary" comma
02e0: 6e 64 2e 20 20 53 6f 20 69 74 20 73 65 65 6d 73  nd.  So it seems
02f0: 0a 2a 2a 20 65 61 73 69 65 72 20 61 6e 64 20 73  .** easier and s
0300: 61 66 65 72 20 74 6f 20 62 75 69 6c 64 20 6f 75  afer to build ou
0310: 72 20 6f 77 6e 20 6d 65 63 68 61 6e 69 73 6d 2e  r own mechanism.
0320: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0330: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 64  liteInt.h".#if d
0340: 65 66 69 6e 65 64 28 49 4e 43 4c 55 44 45 5f 53  efined(INCLUDE_S
0350: 51 4c 49 54 45 5f 54 43 4c 5f 48 29 0a 23 20 20  QLITE_TCL_H).#  
0360: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 5f  include "sqlite_
0370: 74 63 6c 2e 68 22 0a 23 65 6c 73 65 0a 23 20 20  tcl.h".#else.#  
0380: 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a  include "tcl.h".
0390: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20  #endif.#include 
03a0: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c  <stdlib.h>.#incl
03b0: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23  ude <string.h>.#
03c0: 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e  include <assert.
03d0: 68 3e 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  h>.../*.** Conve
03e0: 72 74 20 62 69 6e 61 72 79 20 74 6f 20 68 65 78  rt binary to hex
03f0: 2e 20 20 54 68 65 20 69 6e 70 75 74 20 7a 42 75  .  The input zBu
0400: 66 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 4e 20 62  f[] contains N b
0410: 79 74 65 73 20 6f 66 0a 2a 2a 20 62 69 6e 61 72  ytes of.** binar
0420: 79 20 64 61 74 61 2e 20 20 7a 42 75 66 5b 5d 20  y data.  zBuf[] 
0430: 69 73 20 32 2a 6e 2b 31 20 62 79 74 65 73 20 6c  is 2*n+1 bytes l
0440: 6f 6e 67 2e 20 20 4f 76 65 72 77 72 69 74 65 20  ong.  Overwrite 
0450: 7a 42 75 66 5b 5d 0a 2a 2a 20 77 69 74 68 20 61  zBuf[].** with a
0460: 20 68 65 78 61 64 65 63 69 6d 61 6c 20 72 65 70   hexadecimal rep
0470: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69  resentation of i
0480: 74 73 20 6f 72 69 67 69 6e 61 6c 20 62 69 6e 61  ts original bina
0490: 72 79 20 69 6e 70 75 74 2e 0a 2a 2f 0a 76 6f 69  ry input..*/.voi
04a0: 64 20 73 71 6c 69 74 65 33 54 65 73 74 42 69 6e  d sqlite3TestBin
04b0: 54 6f 48 65 78 28 75 6e 73 69 67 6e 65 64 20 63  ToHex(unsigned c
04c0: 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74 20 4e  har *zBuf, int N
04d0: 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
04e0: 6e 65 64 20 63 68 61 72 20 7a 48 65 78 5b 5d 20  ned char zHex[] 
04f0: 3d 20 22 30 31 32 33 34 35 36 37 38 39 41 42 43  = "0123456789ABC
0500: 44 45 46 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  DEF";.  int i, j
0510: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
0520: 72 20 63 3b 0a 20 20 69 20 3d 20 4e 2a 32 3b 0a  r c;.  i = N*2;.
0530: 20 20 7a 42 75 66 5b 69 2d 2d 5d 20 3d 20 30 3b    zBuf[i--] = 0;
0540: 0a 20 20 66 6f 72 28 6a 3d 4e 2d 31 3b 20 6a 3e  .  for(j=N-1; j>
0550: 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 63 20  =0; j--){.    c 
0560: 3d 20 7a 42 75 66 5b 6a 5d 3b 0a 20 20 20 20 7a  = zBuf[j];.    z
0570: 42 75 66 5b 69 2d 2d 5d 20 3d 20 7a 48 65 78 5b  Buf[i--] = zHex[
0580: 63 26 30 78 66 5d 3b 0a 20 20 20 20 7a 42 75 66  c&0xf];.    zBuf
0590: 5b 69 2d 2d 5d 20 3d 20 7a 48 65 78 5b 63 3e 3e  [i--] = zHex[c>>
05a0: 34 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  4];.  }.  assert
05b0: 28 20 69 3d 3d 2d 31 20 29 3b 0a 7d 0a 0a 2f 2a  ( i==-1 );.}../*
05c0: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 68 65 78 20  .** Convert hex 
05d0: 74 6f 20 62 69 6e 61 72 79 2e 20 20 54 68 65 20  to binary.  The 
05e0: 69 6e 70 75 74 20 7a 49 6e 5b 5d 20 63 6f 6e 74  input zIn[] cont
05f0: 61 69 6e 73 20 4e 20 62 79 74 65 73 20 6f 66 0a  ains N bytes of.
0600: 2a 2a 20 68 65 78 61 64 65 63 69 6d 61 6c 2e 20  ** hexadecimal. 
0610: 20 43 6f 6e 76 65 72 74 20 74 68 69 73 20 69 6e   Convert this in
0620: 74 6f 20 62 69 6e 61 72 79 20 61 6e 64 20 77 72  to binary and wr
0630: 69 74 65 20 61 4f 75 74 5b 5d 20 77 69 74 68 0a  ite aOut[] with.
0640: 2a 2a 20 74 68 65 20 62 69 6e 61 72 79 20 64 61  ** the binary da
0650: 74 61 2e 20 20 53 70 61 63 65 73 20 69 6e 20 74  ta.  Spaces in t
0660: 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 70 75  he original inpu
0670: 74 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a  t are ignored..*
0680: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
0690: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
06a0: 62 69 6e 61 72 79 20 72 65 6e 64 65 72 65 64 2e  binary rendered.
06b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
06c0: 65 73 74 48 65 78 54 6f 42 69 6e 28 63 6f 6e 73  estHexToBin(cons
06d0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
06e0: 2a 7a 49 6e 2c 20 69 6e 74 20 4e 2c 20 75 6e 73  *zIn, int N, uns
06f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4f 75 74  igned char *aOut
0700: 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
0710: 6e 65 64 20 63 68 61 72 20 61 4d 61 70 5b 5d 20  ned char aMap[] 
0720: 3d 20 7b 0a 20 20 20 20 20 30 2c 20 30 2c 20 30  = {.     0, 0, 0
0730: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0740: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
0750: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 30   0, 0, 0,.     0
0760: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0770: 20 30 2c 20 30 2c 20 20 30 2c 20 30 2c 20 30 2c   0, 0,  0, 0, 0,
0780: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
0790: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c       0, 0, 0, 0,
07a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 30 2c   0, 0, 0, 0,  0,
07b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
07c0: 30 2c 20 30 2c 0a 20 20 20 20 20 31 2c 20 32 2c  0, 0,.     1, 2,
07d0: 20 33 2c 20 34 2c 20 35 2c 20 36 2c 20 37 2c 20   3, 4, 5, 6, 7, 
07e0: 38 2c 20 20 39 2c 31 30 2c 20 30 2c 20 30 2c 20  8,  9,10, 0, 0, 
07f0: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20  0, 0, 0, 0,.    
0800: 20 30 2c 31 31 2c 31 32 2c 31 33 2c 31 34 2c 31   0,11,12,13,14,1
0810: 35 2c 31 36 2c 20 30 2c 20 20 30 2c 20 30 2c 20  5,16, 0,  0, 0, 
0820: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0830: 2c 0a 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  ,.     0, 0, 0, 
0840: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
0850: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0860: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 30 2c 31  , 0, 0,.     0,1
0870: 31 2c 31 32 2c 31 33 2c 31 34 2c 31 35 2c 31 36  1,12,13,14,15,16
0880: 2c 20 30 2c 20 20 30 2c 20 30 2c 20 30 2c 20 30  , 0,  0, 0, 0, 0
0890: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
08a0: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
08b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 30 2c 20 30  , 0, 0, 0,  0, 0
08c0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
08d0: 20 30 2c 0a 20 20 20 20 20 30 2c 20 30 2c 20 30   0,.     0, 0, 0
08e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
08f0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
0900: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 30   0, 0, 0,.     0
0910: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0920: 20 30 2c 20 30 2c 20 20 30 2c 20 30 2c 20 30 2c   0, 0,  0, 0, 0,
0930: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
0940: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c       0, 0, 0, 0,
0950: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 30 2c   0, 0, 0, 0,  0,
0960: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0970: 30 2c 20 30 2c 0a 20 20 20 20 20 30 2c 20 30 2c  0, 0,.     0, 0,
0980: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0990: 30 2c 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  0,  0, 0, 0, 0, 
09a0: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20  0, 0, 0, 0,.    
09b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09c0: 30 2c 20 30 2c 20 30 2c 20 20 30 2c 20 30 2c 20  0, 0, 0,  0, 0, 
09d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
09e0: 2c 0a 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  ,.     0, 0, 0, 
09f0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
0a00: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0a10: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 30 2c 20  , 0, 0,.     0, 
0a20: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0a30: 2c 20 30 2c 20 20 30 2c 20 30 2c 20 30 2c 20 30  , 0,  0, 0, 0, 0
0a40: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
0a50: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
0a60: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 30 2c 20 30  , 0, 0, 0,  0, 0
0a70: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0a80: 20 30 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   0,.  };.  int i
0a90: 2c 20 6a 3b 0a 20 20 69 6e 74 20 68 69 3d 31 3b  , j;.  int hi=1;
0aa0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
0ab0: 20 63 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30   c;..  for(i=j=0
0ac0: 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<N; i++){.   
0ad0: 20 63 20 3d 20 61 4d 61 70 5b 7a 49 6e 5b 69 5d   c = aMap[zIn[i]
0ae0: 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20  ];.    if( c==0 
0af0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
0b00: 69 66 28 20 68 69 20 29 7b 0a 20 20 20 20 20 20  if( hi ){.      
0b10: 61 4f 75 74 5b 6a 5d 20 3d 20 28 63 2d 31 29 3c  aOut[j] = (c-1)<
0b20: 3c 34 3b 0a 20 20 20 20 20 20 68 69 20 3d 20 30  <4;.      hi = 0
0b30: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
0b40: 20 20 20 61 4f 75 74 5b 6a 2b 2b 5d 20 7c 3d 20     aOut[j++] |= 
0b50: 63 2d 31 3b 0a 20 20 20 20 20 20 68 69 20 3d 20  c-1;.      hi = 
0b60: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
0b70: 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn j;.}.../*.
0b80: 2a 2a 20 55 73 61 67 65 3a 20 20 20 68 65 78 69  ** Usage:   hexi
0b90: 6f 5f 72 65 61 64 20 20 46 49 4c 45 4e 41 4d 45  o_read  FILENAME
0ba0: 20 20 4f 46 46 53 45 54 20 20 41 4d 54 0a 2a 2a    OFFSET  AMT.**
0bb0: 0a 2a 2a 20 52 65 61 64 20 41 4d 54 20 62 79 74  .** Read AMT byt
0bc0: 65 73 20 66 72 6f 6d 20 66 69 6c 65 20 46 49 4c  es from file FIL
0bd0: 45 4e 41 4d 45 20 62 65 67 69 6e 6e 69 6e 67 20  ENAME beginning 
0be0: 61 74 20 4f 46 46 53 45 54 20 66 72 6f 6d 20 74  at OFFSET from t
0bf0: 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  he.** beginning 
0c00: 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 20 43 6f  of the file.  Co
0c10: 6e 76 65 72 74 20 74 68 61 74 20 69 6e 66 6f 72  nvert that infor
0c20: 6d 61 74 69 6f 6e 20 74 6f 20 68 65 78 61 64 65  mation to hexade
0c30: 63 69 6d 61 6c 0a 2a 2a 20 61 6e 64 20 72 65 74  cimal.** and ret
0c40: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e  urn the resultin
0c50: 67 20 48 45 58 20 73 74 72 69 6e 67 2e 0a 2a 2f  g HEX string..*/
0c60: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
0c70: 54 45 5f 54 43 4c 41 50 49 20 68 65 78 69 6f 5f  TE_TCLAPI hexio_
0c80: 72 65 61 64 28 0a 20 20 76 6f 69 64 20 2a 20 63  read(.  void * c
0c90: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
0ca0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0cb0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
0cc0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
0cd0: 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6f 66  jv[].){.  int of
0ce0: 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 6d 74 2c  fset;.  int amt,
0cf0: 20 67 6f 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68   got;.  const ch
0d00: 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 75 6e 73  ar *zFile;.  uns
0d10: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 42 75 66  igned char *zBuf
0d20: 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 0a 20  ;.  FILE *in;.. 
0d30: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
0d40: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
0d50: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
0d60: 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45 20  objv, "FILENAME 
0d70: 4f 46 46 53 45 54 20 41 4d 54 22 29 3b 0a 20 20  OFFSET AMT");.  
0d80: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
0d90: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
0da0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
0db0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
0dc0: 20 26 6f 66 66 73 65 74 29 20 29 20 72 65 74 75   &offset) ) retu
0dd0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
0de0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
0df0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
0e00: 6a 76 5b 33 5d 2c 20 26 61 6d 74 29 20 29 20 72  jv[3], &amt) ) r
0e10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0e20: 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47  .  zFile = Tcl_G
0e30: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
0e40: 29 3b 0a 20 20 7a 42 75 66 20 3d 20 73 71 6c 69  );.  zBuf = sqli
0e50: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 61 6d 74 2a  te3_malloc( amt*
0e60: 32 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a 42 75  2+1 );.  if( zBu
0e70: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  f==0 ){.    retu
0e80: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
0e90: 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a  }.  in = fopen(z
0ea0: 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 69  File, "rb");.  i
0eb0: 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
0ec0: 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65  in = fopen(zFile
0ed0: 2c 20 22 72 22 29 3b 0a 20 20 7d 0a 20 20 69 66  , "r");.  }.  if
0ee0: 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 54  ( in==0 ){.    T
0ef0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
0f00: 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20  interp, "cannot 
0f10: 6f 70 65 6e 20 69 6e 70 75 74 20 66 69 6c 65 20  open input file 
0f20: 22 2c 20 7a 46 69 6c 65 2c 20 30 29 3b 0a 20 20  ", zFile, 0);.  
0f30: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
0f40: 4f 52 3b 0a 20 20 7d 0a 20 20 66 73 65 65 6b 28  OR;.  }.  fseek(
0f50: 69 6e 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b  in, offset, SEEK
0f60: 5f 53 45 54 29 3b 0a 20 20 67 6f 74 20 3d 20 28  _SET);.  got = (
0f70: 69 6e 74 29 66 72 65 61 64 28 7a 42 75 66 2c 20  int)fread(zBuf, 
0f80: 31 2c 20 61 6d 74 2c 20 69 6e 29 3b 0a 20 20 66  1, amt, in);.  f
0f90: 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 69 66 28  close(in);.  if(
0fa0: 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 67 6f   got<0 ){.    go
0fb0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  t = 0;.  }.  sql
0fc0: 69 74 65 33 54 65 73 74 42 69 6e 54 6f 48 65 78  ite3TestBinToHex
0fd0: 28 7a 42 75 66 2c 20 67 6f 74 29 3b 0a 20 20 54  (zBuf, got);.  T
0fe0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
0ff0: 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1000: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1010: 28 7a 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e  (zBuf);.  return
1020: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
1030: 2a 2a 20 55 73 61 67 65 3a 20 20 20 68 65 78 69  ** Usage:   hexi
1040: 6f 5f 77 72 69 74 65 20 20 46 49 4c 45 4e 41 4d  o_write  FILENAM
1050: 45 20 20 4f 46 46 53 45 54 20 20 44 41 54 41 0a  E  OFFSET  DATA.
1060: 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 44 41 54 41  **.** Write DATA
1070: 20 69 6e 74 6f 20 66 69 6c 65 20 46 49 4c 45 4e   into file FILEN
1080: 41 4d 45 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  AME beginning at
1090: 20 4f 46 46 53 45 54 20 66 72 6f 6d 20 74 68 65   OFFSET from the
10a0: 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  .** beginning of
10b0: 20 74 68 65 20 66 69 6c 65 2e 20 20 44 41 54 41   the file.  DATA
10c0: 20 69 73 20 65 78 70 72 65 73 73 65 64 20 69 6e   is expressed in
10d0: 20 68 65 78 61 64 65 63 69 6d 61 6c 2e 0a 2a 2f   hexadecimal..*/
10e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
10f0: 54 45 5f 54 43 4c 41 50 49 20 68 65 78 69 6f 5f  TE_TCLAPI hexio_
1100: 77 72 69 74 65 28 0a 20 20 76 6f 69 64 20 2a 20  write(.  void * 
1110: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1120: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1130: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1140: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1150: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6f  bjv[].){.  int o
1160: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 49 6e  ffset;.  int nIn
1170: 2c 20 6e 4f 75 74 2c 20 77 72 69 74 74 65 6e 3b  , nOut, written;
1180: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1190: 46 69 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  File;.  const un
11a0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e  signed char *zIn
11b0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
11c0: 72 20 2a 61 4f 75 74 3b 0a 20 20 46 49 4c 45 20  r *aOut;.  FILE 
11d0: 2a 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  *out;..  if( obj
11e0: 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
11f0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1200: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46  erp, 1, objv, "F
1210: 49 4c 45 4e 41 4d 45 20 4f 46 46 53 45 54 20 48  ILENAME OFFSET H
1220: 45 58 44 41 54 41 22 29 3b 0a 20 20 20 20 72 65  EXDATA");.    re
1230: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1240: 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
1250: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1260: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 66  rp, objv[2], &of
1270: 66 73 65 74 29 20 29 20 72 65 74 75 72 6e 20 54  fset) ) return T
1280: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 46 69 6c  CL_ERROR;.  zFil
1290: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
12a0: 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 49  g(objv[1]);.  zI
12b0: 6e 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  n = (const unsig
12c0: 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 47  ned char *)Tcl_G
12d0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
12e0: 6f 62 6a 76 5b 33 5d 2c 20 26 6e 49 6e 29 3b 0a  objv[3], &nIn);.
12f0: 20 20 61 4f 75 74 20 3d 20 73 71 6c 69 74 65 33    aOut = sqlite3
1300: 5f 6d 61 6c 6c 6f 63 28 20 6e 49 6e 2f 32 20 29  _malloc( nIn/2 )
1310: 3b 0a 20 20 69 66 28 20 61 4f 75 74 3d 3d 30 20  ;.  if( aOut==0 
1320: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
1330: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6e  L_ERROR;.  }.  n
1340: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 54 65 73  Out = sqlite3Tes
1350: 74 48 65 78 54 6f 42 69 6e 28 7a 49 6e 2c 20 6e  tHexToBin(zIn, n
1360: 49 6e 2c 20 61 4f 75 74 29 3b 0a 20 20 6f 75 74  In, aOut);.  out
1370: 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20   = fopen(zFile, 
1380: 22 72 2b 62 22 29 3b 0a 20 20 69 66 28 20 6f 75  "r+b");.  if( ou
1390: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 75 74 20  t==0 ){.    out 
13a0: 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22  = fopen(zFile, "
13b0: 72 2b 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  r+");.  }.  if( 
13c0: 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  out==0 ){.    Tc
13d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
13e0: 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f  nterp, "cannot o
13f0: 70 65 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 20  pen output file 
1400: 22 2c 20 7a 46 69 6c 65 2c 20 30 29 3b 0a 20 20  ", zFile, 0);.  
1410: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1420: 4f 52 3b 0a 20 20 7d 0a 20 20 66 73 65 65 6b 28  OR;.  }.  fseek(
1430: 6f 75 74 2c 20 6f 66 66 73 65 74 2c 20 53 45 45  out, offset, SEE
1440: 4b 5f 53 45 54 29 3b 0a 20 20 77 72 69 74 74 65  K_SET);.  writte
1450: 6e 20 3d 20 28 69 6e 74 29 66 77 72 69 74 65 28  n = (int)fwrite(
1460: 61 4f 75 74 2c 20 31 2c 20 6e 4f 75 74 2c 20 6f  aOut, 1, nOut, o
1470: 75 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ut);.  sqlite3_f
1480: 72 65 65 28 61 4f 75 74 29 3b 0a 20 20 66 63 6c  ree(aOut);.  fcl
1490: 6f 73 65 28 6f 75 74 29 3b 0a 20 20 54 63 6c 5f  ose(out);.  Tcl_
14a0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
14b0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
14c0: 62 6a 28 77 72 69 74 74 65 6e 29 29 3b 0a 20 20  bj(written));.  
14d0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
14e0: 0a 0a 2f 2a 0a 2a 2a 20 55 53 41 47 45 3a 20 20  ../*.** USAGE:  
14f0: 20 68 65 78 69 6f 5f 67 65 74 5f 69 6e 74 20 20   hexio_get_int  
1500: 20 48 45 58 44 41 54 41 0a 2a 2a 0a 2a 2a 20 49   HEXDATA.**.** I
1510: 6e 74 65 72 70 72 65 74 20 74 68 65 20 48 45 58  nterpret the HEX
1520: 44 41 54 41 20 61 72 67 75 6d 65 6e 74 20 61 73  DATA argument as
1530: 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e   a big-endian in
1540: 74 65 67 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a  teger.  Return.*
1550: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
1560: 68 61 74 20 69 6e 74 65 67 65 72 2e 20 20 48 45  hat integer.  HE
1570: 58 44 41 54 41 20 63 61 6e 20 63 6f 6e 74 61 69  XDATA can contai
1580: 6e 20 62 65 74 77 65 65 6e 20 32 20 61 6e 64 20  n between 2 and 
1590: 38 0a 2a 2a 20 68 65 78 61 64 65 63 69 6d 61 6c  8.** hexadecimal
15a0: 20 64 69 67 69 74 73 2e 0a 2a 2f 0a 73 74 61 74   digits..*/.stat
15b0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
15c0: 4c 41 50 49 20 68 65 78 69 6f 5f 67 65 74 5f 69  LAPI hexio_get_i
15d0: 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  nt(.  void * cli
15e0: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
15f0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1600: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1610: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1620: 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 76 61 6c 3b  [].){.  int val;
1630: 0a 20 20 69 6e 74 20 6e 49 6e 2c 20 6e 4f 75 74  .  int nIn, nOut
1640: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
1650: 65 64 20 63 68 61 72 20 2a 7a 49 6e 3b 0a 20 20  ed char *zIn;.  
1660: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1670: 4f 75 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  Out;.  unsigned 
1680: 63 68 61 72 20 61 4e 75 6d 5b 34 5d 3b 0a 0a 20  char aNum[4];.. 
1690: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
16a0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
16b0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
16c0: 6f 62 6a 76 2c 20 22 48 45 58 44 41 54 41 22 29  objv, "HEXDATA")
16d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
16e0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 49  _ERROR;.  }.  zI
16f0: 6e 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  n = (const unsig
1700: 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 47  ned char *)Tcl_G
1710: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
1720: 6f 62 6a 76 5b 31 5d 2c 20 26 6e 49 6e 29 3b 0a  objv[1], &nIn);.
1730: 20 20 61 4f 75 74 20 3d 20 73 71 6c 69 74 65 33    aOut = sqlite3
1740: 5f 6d 61 6c 6c 6f 63 28 20 6e 49 6e 2f 32 20 29  _malloc( nIn/2 )
1750: 3b 0a 20 20 69 66 28 20 61 4f 75 74 3d 3d 30 20  ;.  if( aOut==0 
1760: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
1770: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6e  L_ERROR;.  }.  n
1780: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 54 65 73  Out = sqlite3Tes
1790: 74 48 65 78 54 6f 42 69 6e 28 7a 49 6e 2c 20 6e  tHexToBin(zIn, n
17a0: 49 6e 2c 20 61 4f 75 74 29 3b 0a 20 20 69 66 28  In, aOut);.  if(
17b0: 20 6e 4f 75 74 3e 3d 34 20 29 7b 0a 20 20 20 20   nOut>=4 ){.    
17c0: 6d 65 6d 63 70 79 28 61 4e 75 6d 2c 20 61 4f 75  memcpy(aNum, aOu
17d0: 74 2c 20 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t, 4);.  }else{.
17e0: 20 20 20 20 6d 65 6d 73 65 74 28 61 4e 75 6d 2c      memset(aNum,
17f0: 20 30 2c 20 73 69 7a 65 6f 66 28 61 4e 75 6d 29   0, sizeof(aNum)
1800: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61  );.    memcpy(&a
1810: 4e 75 6d 5b 34 2d 6e 4f 75 74 5d 2c 20 61 4f 75  Num[4-nOut], aOu
1820: 74 2c 20 6e 4f 75 74 29 3b 0a 20 20 7d 0a 20 20  t, nOut);.  }.  
1830: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 4f 75  sqlite3_free(aOu
1840: 74 29 3b 0a 20 20 76 61 6c 20 3d 20 28 61 4e 75  t);.  val = (aNu
1850: 6d 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 4e 75  m[0]<<24) | (aNu
1860: 6d 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 4e 75  m[1]<<16) | (aNu
1870: 6d 5b 32 5d 3c 3c 38 29 20 7c 20 61 4e 75 6d 5b  m[2]<<8) | aNum[
1880: 33 5d 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  3];.  Tcl_SetObj
1890: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
18a0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 61 6c  cl_NewIntObj(val
18b0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
18c0: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
18d0: 53 41 47 45 3a 20 20 20 68 65 78 69 6f 5f 72 65  SAGE:   hexio_re
18e0: 6e 64 65 72 5f 69 6e 74 31 36 20 20 20 49 4e 54  nder_int16   INT
18f0: 45 47 45 52 0a 2a 2a 0a 2a 2a 20 52 65 6e 64 65  EGER.**.** Rende
1900: 72 20 49 4e 54 45 47 45 52 20 68 61 73 20 61 20  r INTEGER has a 
1910: 31 36 2d 62 69 74 20 62 69 67 2d 65 6e 64 69 61  16-bit big-endia
1920: 6e 20 69 6e 74 65 67 65 72 20 69 6e 20 68 65 78  n integer in hex
1930: 61 64 65 63 69 6d 61 6c 2e 0a 2a 2f 0a 73 74 61  adecimal..*/.sta
1940: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
1950: 43 4c 41 50 49 20 68 65 78 69 6f 5f 72 65 6e 64  CLAPI hexio_rend
1960: 65 72 5f 69 6e 74 31 36 28 0a 20 20 76 6f 69 64  er_int16(.  void
1970: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1980: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1990: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
19a0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
19b0: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
19c0: 74 20 76 61 6c 3b 0a 20 20 75 6e 73 69 67 6e 65  t val;.  unsigne
19d0: 64 20 63 68 61 72 20 61 4e 75 6d 5b 31 30 5d 3b  d char aNum[10];
19e0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
19f0: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1a00: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1a10: 31 2c 20 6f 62 6a 76 2c 20 22 49 4e 54 45 47 45  1, objv, "INTEGE
1a20: 52 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  R");.    return 
1a30: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1a40: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1a50: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1a60: 62 6a 76 5b 31 5d 2c 20 26 76 61 6c 29 20 29 20  bjv[1], &val) ) 
1a70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a80: 3b 0a 20 20 61 4e 75 6d 5b 30 5d 20 3d 20 76 61  ;.  aNum[0] = va
1a90: 6c 3e 3e 38 3b 0a 20 20 61 4e 75 6d 5b 31 5d 20  l>>8;.  aNum[1] 
1aa0: 3d 20 76 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33  = val;.  sqlite3
1ab0: 54 65 73 74 42 69 6e 54 6f 48 65 78 28 61 4e 75  TestBinToHex(aNu
1ac0: 6d 2c 20 32 29 3b 0a 20 20 54 63 6c 5f 53 65 74  m, 2);.  Tcl_Set
1ad0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1ae0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1af0: 62 6a 28 28 63 68 61 72 2a 29 61 4e 75 6d 2c 20  bj((char*)aNum, 
1b00: 34 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  4));.  return TC
1b10: 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
1b20: 55 53 41 47 45 3a 20 20 20 68 65 78 69 6f 5f 72  USAGE:   hexio_r
1b30: 65 6e 64 65 72 5f 69 6e 74 33 32 20 20 20 49 4e  ender_int32   IN
1b40: 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 52 65 6e 64  TEGER.**.** Rend
1b50: 65 72 20 49 4e 54 45 47 45 52 20 68 61 73 20 61  er INTEGER has a
1b60: 20 33 32 2d 62 69 74 20 62 69 67 2d 65 6e 64 69   32-bit big-endi
1b70: 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 20 68 65  an integer in he
1b80: 78 61 64 65 63 69 6d 61 6c 2e 0a 2a 2f 0a 73 74  xadecimal..*/.st
1b90: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1ba0: 54 43 4c 41 50 49 20 68 65 78 69 6f 5f 72 65 6e  TCLAPI hexio_ren
1bb0: 64 65 72 5f 69 6e 74 33 32 28 0a 20 20 76 6f 69  der_int32(.  voi
1bc0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1bd0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1be0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1bf0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1c00: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
1c10: 6e 74 20 76 61 6c 3b 0a 20 20 75 6e 73 69 67 6e  nt val;.  unsign
1c20: 65 64 20 63 68 61 72 20 61 4e 75 6d 5b 31 30 5d  ed char aNum[10]
1c30: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1c40: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1c50: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1c60: 20 31 2c 20 6f 62 6a 76 2c 20 22 49 4e 54 45 47   1, objv, "INTEG
1c70: 45 52 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ER");.    return
1c80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1c90: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1ca0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1cb0: 6f 62 6a 76 5b 31 5d 2c 20 26 76 61 6c 29 20 29  objv[1], &val) )
1cc0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1cd0: 52 3b 0a 20 20 61 4e 75 6d 5b 30 5d 20 3d 20 76  R;.  aNum[0] = v
1ce0: 61 6c 3e 3e 32 34 3b 0a 20 20 61 4e 75 6d 5b 31  al>>24;.  aNum[1
1cf0: 5d 20 3d 20 76 61 6c 3e 3e 31 36 3b 0a 20 20 61  ] = val>>16;.  a
1d00: 4e 75 6d 5b 32 5d 20 3d 20 76 61 6c 3e 3e 38 3b  Num[2] = val>>8;
1d10: 0a 20 20 61 4e 75 6d 5b 33 5d 20 3d 20 76 61 6c  .  aNum[3] = val
1d20: 3b 0a 20 20 73 71 6c 69 74 65 33 54 65 73 74 42  ;.  sqlite3TestB
1d30: 69 6e 54 6f 48 65 78 28 61 4e 75 6d 2c 20 34 29  inToHex(aNum, 4)
1d40: 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
1d50: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1d60: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
1d70: 68 61 72 2a 29 61 4e 75 6d 2c 20 38 29 29 3b 0a  har*)aNum, 8));.
1d80: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1d90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 53 41 47 45 3a  .}../*.** USAGE:
1da0: 20 20 75 74 66 38 5f 74 6f 5f 75 74 66 38 20 20    utf8_to_utf8  
1db0: 48 45 58 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72  HEX.**.** The ar
1dc0: 67 75 6d 65 6e 74 20 69 73 20 61 20 55 54 46 38  gument is a UTF8
1dd0: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
1de0: 74 65 64 20 69 6e 20 68 65 78 61 64 65 63 69 6d  ted in hexadecim
1df0: 61 6c 2e 0a 2a 2a 20 54 68 65 20 55 54 46 38 20  al..** The UTF8 
1e00: 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 77 65 6c  might not be wel
1e10: 6c 2d 66 6f 72 6d 65 64 2e 20 20 52 75 6e 20 74  l-formed.  Run t
1e20: 68 69 73 20 73 74 72 69 6e 67 20 74 68 72 6f 75  his string throu
1e30: 67 68 0a 2a 2a 20 73 71 6c 69 74 65 33 55 74 66  gh.** sqlite3Utf
1e40: 38 74 6f 38 28 29 20 63 6f 6e 76 65 72 74 20 69  8to8() convert i
1e50: 74 20 62 61 63 6b 20 74 6f 20 68 65 78 20 61 6e  t back to hex an
1e60: 64 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 73  d return the res
1e70: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
1e80: 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
1e90: 20 75 74 66 38 5f 74 6f 5f 75 74 66 38 28 0a 20   utf8_to_utf8(. 
1ea0: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1eb0: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1ec0: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1ed0: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1ee0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1ef0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1f00: 45 42 55 47 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  EBUG.  int n;.  
1f10: 69 6e 74 20 6e 4f 75 74 3b 0a 20 20 63 6f 6e 73  int nOut;.  cons
1f20: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1f30: 2a 7a 4f 72 69 67 3b 0a 20 20 75 6e 73 69 67 6e  *zOrig;.  unsign
1f40: 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  ed char *z;.  if
1f50: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1f60: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1f70: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1f80: 76 2c 20 22 48 45 58 22 29 3b 0a 20 20 20 20 72  v, "HEX");.    r
1f90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1fa0: 0a 20 20 7d 0a 20 20 7a 4f 72 69 67 20 3d 20 28  .  }.  zOrig = (
1fb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1fc0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
1fd0: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26 6e  mObj(objv[1], &n
1fe0: 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  );.  z = sqlite3
1ff0: 5f 6d 61 6c 6c 6f 63 28 20 6e 2b 33 20 29 3b 0a  _malloc( n+3 );.
2000: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 54 65 73    n = sqlite3Tes
2010: 74 48 65 78 54 6f 42 69 6e 28 7a 4f 72 69 67 2c  tHexToBin(zOrig,
2020: 20 6e 2c 20 7a 29 3b 0a 20 20 7a 5b 6e 5d 20 3d   n, z);.  z[n] =
2030: 20 30 3b 0a 20 20 6e 4f 75 74 20 3d 20 73 71 6c   0;.  nOut = sql
2040: 69 74 65 33 55 74 66 38 54 6f 38 28 7a 29 3b 0a  ite3Utf8To8(z);.
2050: 20 20 73 71 6c 69 74 65 33 54 65 73 74 42 69 6e    sqlite3TestBin
2060: 54 6f 48 65 78 28 7a 2c 6e 4f 75 74 29 3b 0a 20  ToHex(z,nOut);. 
2070: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2080: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 2a  t(interp, (char*
2090: 29 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  )z, 0);.  sqlite
20a0: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
20b0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 23 65 6c 73  urn TCL_OK;.#els
20c0: 65 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  e.  Tcl_AppendRe
20d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20  sult(interp, .  
20e0: 20 20 20 20 22 5b 75 74 66 38 5f 74 6f 5f 75 74      "[utf8_to_ut
20f0: 66 38 5d 20 75 6e 61 76 61 69 6c 61 62 6c 65 20  f8] unavailable 
2100: 2d 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 6e  - SQLITE_DEBUG n
2110: 6f 74 20 64 65 66 69 6e 65 64 22 2c 20 30 0a 20  ot defined", 0. 
2120: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   );.  return TCL
2130: 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 7d  _ERROR;.#endif.}
2140: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  ..static int get
2150: 46 74 73 33 56 61 72 69 6e 74 28 63 6f 6e 73 74  Fts3Varint(const
2160: 20 63 68 61 72 20 2a 70 2c 20 73 71 6c 69 74 65   char *p, sqlite
2170: 5f 69 6e 74 36 34 20 2a 76 29 7b 0a 20 20 63 6f  _int64 *v){.  co
2180: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
2190: 72 20 2a 71 20 3d 20 28 63 6f 6e 73 74 20 75 6e  r *q = (const un
21a0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 70  signed char *) p
21b0: 3b 0a 20 20 73 71 6c 69 74 65 5f 75 69 6e 74 36  ;.  sqlite_uint6
21c0: 34 20 78 20 3d 20 30 2c 20 79 20 3d 20 31 3b 0a  4 x = 0, y = 1;.
21d0: 20 20 77 68 69 6c 65 28 20 28 2a 71 20 26 20 30    while( (*q & 0
21e0: 78 38 30 29 20 3d 3d 20 30 78 38 30 20 29 7b 0a  x80) == 0x80 ){.
21f0: 20 20 20 20 78 20 2b 3d 20 79 20 2a 20 28 2a 71      x += y * (*q
2200: 2b 2b 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20  ++ & 0x7f);.    
2210: 79 20 3c 3c 3d 20 37 3b 0a 20 20 7d 0a 20 20 78  y <<= 7;.  }.  x
2220: 20 2b 3d 20 79 20 2a 20 28 2a 71 2b 2b 29 3b 0a   += y * (*q++);.
2230: 20 20 2a 76 20 3d 20 28 73 71 6c 69 74 65 5f 69    *v = (sqlite_i
2240: 6e 74 36 34 29 20 78 3b 0a 20 20 72 65 74 75 72  nt64) x;.  retur
2250: 6e 20 28 69 6e 74 29 20 28 71 20 2d 20 28 75 6e  n (int) (q - (un
2260: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 29  signed char *)p)
2270: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 53 41 47  ;.}.../*.** USAG
2280: 45 3a 20 20 72 65 61 64 5f 66 74 73 33 76 61 72  E:  read_fts3var
2290: 69 6e 74 20 42 4c 4f 42 20 56 41 52 4e 41 4d 45  int BLOB VARNAME
22a0: 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 61 20 76 61  .**.** Read a va
22b0: 72 69 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 74  rint from the st
22c0: 61 72 74 20 6f 66 20 42 4c 4f 42 2e 20 53 65 74  art of BLOB. Set
22d0: 20 76 61 72 69 61 62 6c 65 20 56 41 52 4e 41 4d   variable VARNAM
22e0: 45 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  E to contain.** 
22f0: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 64 20  the interpreted 
2300: 76 61 6c 75 65 2e 20 52 65 74 75 72 6e 20 74 68  value. Return th
2310: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
2320: 73 20 6f 66 20 42 4c 4f 42 20 63 6f 6e 73 75 6d  s of BLOB consum
2330: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2340: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
2350: 72 65 61 64 5f 66 74 73 33 76 61 72 69 6e 74 28  read_fts3varint(
2360: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
2370: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
2380: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
2390: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
23a0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
23b0: 29 7b 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 0a  ){.  int nBlob;.
23c0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
23d0: 2a 7a 42 6c 6f 62 3b 0a 20 20 73 71 6c 69 74 65  *zBlob;.  sqlite
23e0: 33 5f 69 6e 74 36 34 20 69 56 61 6c 3b 0a 20 20  3_int64 iVal;.  
23f0: 69 6e 74 20 6e 56 61 6c 3b 0a 0a 20 20 69 66 28  int nVal;..  if(
2400: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
2410: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2420: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2430: 2c 20 22 42 4c 4f 42 20 56 41 52 4e 41 4d 45 22  , "BLOB VARNAME"
2440: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2450: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
2460: 42 6c 6f 62 20 3d 20 54 63 6c 5f 47 65 74 42 79  Blob = Tcl_GetBy
2470: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
2480: 62 6a 76 5b 31 5d 2c 20 26 6e 42 6c 6f 62 29 3b  bjv[1], &nBlob);
2490: 0a 0a 20 20 6e 56 61 6c 20 3d 20 67 65 74 46 74  ..  nVal = getFt
24a0: 73 33 56 61 72 69 6e 74 28 28 63 68 61 72 2a 29  s3Varint((char*)
24b0: 7a 42 6c 6f 62 2c 20 28 73 71 6c 69 74 65 33 5f  zBlob, (sqlite3_
24c0: 69 6e 74 36 34 20 2a 29 28 26 69 56 61 6c 29 29  int64 *)(&iVal))
24d0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61  ;.  Tcl_ObjSetVa
24e0: 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  r2(interp, objv[
24f0: 32 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 57 69  2], 0, Tcl_NewWi
2500: 64 65 49 6e 74 4f 62 6a 28 69 56 61 6c 29 2c 20  deIntObj(iVal), 
2510: 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  0);.  Tcl_SetObj
2520: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
2530: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 56 61  cl_NewIntObj(nVa
2540: 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  l));.  return TC
2550: 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
2560: 52 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64  Register command
2570: 73 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69  s with the TCL i
2580: 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69  nterpreter..*/.i
2590: 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 68 65  nt Sqlitetest_he
25a0: 78 69 6f 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  xio_Init(Tcl_Int
25b0: 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20  erp *interp){.  
25c0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a  static struct {.
25d0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
25e0: 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d  ;.     Tcl_ObjCm
25f0: 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20  dProc *xProc;.  
2600: 7d 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a  } aObjCmd[] = {.
2610: 20 20 20 20 20 7b 20 22 68 65 78 69 6f 5f 72 65       { "hexio_re
2620: 61 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ad",            
2630: 20 20 20 20 20 20 20 68 65 78 69 6f 5f 72 65 61         hexio_rea
2640: 64 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  d            },.
2650: 20 20 20 20 20 7b 20 22 68 65 78 69 6f 5f 77 72       { "hexio_wr
2660: 69 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ite",           
2670: 20 20 20 20 20 20 20 68 65 78 69 6f 5f 77 72 69         hexio_wri
2680: 74 65 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  te           },.
2690: 20 20 20 20 20 7b 20 22 68 65 78 69 6f 5f 67 65       { "hexio_ge
26a0: 74 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20  t_int",         
26b0: 20 20 20 20 20 20 20 68 65 78 69 6f 5f 67 65 74         hexio_get
26c0: 5f 69 6e 74 20 20 20 20 20 20 20 20 20 7d 2c 0a  _int         },.
26d0: 20 20 20 20 20 7b 20 22 68 65 78 69 6f 5f 72 65       { "hexio_re
26e0: 6e 64 65 72 5f 69 6e 74 31 36 22 2c 20 20 20 20  nder_int16",    
26f0: 20 20 20 20 20 20 20 68 65 78 69 6f 5f 72 65 6e         hexio_ren
2700: 64 65 72 5f 69 6e 74 31 36 20 20 20 20 7d 2c 0a  der_int16    },.
2710: 20 20 20 20 20 7b 20 22 68 65 78 69 6f 5f 72 65       { "hexio_re
2720: 6e 64 65 72 5f 69 6e 74 33 32 22 2c 20 20 20 20  nder_int32",    
2730: 20 20 20 20 20 20 20 68 65 78 69 6f 5f 72 65 6e         hexio_ren
2740: 64 65 72 5f 69 6e 74 33 32 20 20 20 20 7d 2c 0a  der_int32    },.
2750: 20 20 20 20 20 7b 20 22 75 74 66 38 5f 74 6f 5f       { "utf8_to_
2760: 75 74 66 38 22 2c 20 20 20 20 20 20 20 20 20 20  utf8",          
2770: 20 20 20 20 20 20 20 75 74 66 38 5f 74 6f 5f 75         utf8_to_u
2780: 74 66 38 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  tf8          },.
2790: 20 20 20 20 20 7b 20 22 72 65 61 64 5f 66 74 73       { "read_fts
27a0: 33 76 61 72 69 6e 74 22 2c 20 20 20 20 20 20 20  3varint",       
27b0: 20 20 20 20 20 20 20 72 65 61 64 5f 66 74 73 33         read_fts3
27c0: 76 61 72 69 6e 74 20 20 20 20 20 20 20 7d 2c 0a  varint       },.
27d0: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
27e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
27f0: 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f  f(aObjCmd)/sizeo
2800: 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69  f(aObjCmd[0]); i
2810: 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65  ++){.    Tcl_Cre
2820: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
2830: 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d  terp, aObjCmd[i]
2840: 2e 7a 4e 61 6d 65 2c 20 61 4f 62 6a 43 6d 64 5b  .zName, aObjCmd[
2850: 69 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30 29 3b  i].xProc, 0, 0);
2860: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
2870: 4c 5f 4f 4b 3b 0a 7d 0a                          L_OK;.}.