/ Hex Artifact Content
Login

Artifact 0853ca2986c0cad788eb322b747cc1cbc1f1d31b:


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 6e 63 6c  liteInt.h".#incl
0340: 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 69 6e 63  ude "tcl.h".#inc
0350: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
0360: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
0370: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73  .h>.#include <as
0380: 73 65 72 74 2e 68 3e 0a 0a 0a 2f 2a 0a 2a 2a 20  sert.h>.../*.** 
0390: 43 6f 6e 76 65 72 74 20 62 69 6e 61 72 79 20 74  Convert binary t
03a0: 6f 20 68 65 78 2e 20 20 54 68 65 20 69 6e 70 75  o hex.  The inpu
03b0: 74 20 7a 42 75 66 5b 5d 20 63 6f 6e 74 61 69 6e  t zBuf[] contain
03c0: 73 20 4e 20 62 79 74 65 73 20 6f 66 0a 2a 2a 20  s N bytes of.** 
03d0: 62 69 6e 61 72 79 20 64 61 74 61 2e 20 20 7a 42  binary data.  zB
03e0: 75 66 5b 5d 20 69 73 20 32 2a 6e 2b 31 20 62 79  uf[] is 2*n+1 by
03f0: 74 65 73 20 6c 6f 6e 67 2e 20 20 4f 76 65 72 77  tes long.  Overw
0400: 72 69 74 65 20 7a 42 75 66 5b 5d 0a 2a 2a 20 77  rite zBuf[].** w
0410: 69 74 68 20 61 20 68 65 78 61 64 65 63 69 6d 61  ith a hexadecima
0420: 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  l representation
0430: 20 6f 66 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   of its original
0440: 20 62 69 6e 61 72 79 20 69 6e 70 75 74 2e 0a 2a   binary input..*
0450: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54 65  /.void sqlite3Te
0460: 73 74 42 69 6e 54 6f 48 65 78 28 75 6e 73 69 67  stBinToHex(unsig
0470: 6e 65 64 20 63 68 61 72 20 2a 7a 42 75 66 2c 20  ned char *zBuf, 
0480: 69 6e 74 20 4e 29 7b 0a 20 20 63 6f 6e 73 74 20  int N){.  const 
0490: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 48  unsigned char zH
04a0: 65 78 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37  ex[] = "01234567
04b0: 38 39 41 42 43 44 45 46 22 3b 0a 20 20 69 6e 74  89ABCDEF";.  int
04c0: 20 69 2c 20 6a 3b 0a 20 20 75 6e 73 69 67 6e 65   i, j;.  unsigne
04d0: 64 20 63 68 61 72 20 63 3b 0a 20 20 69 20 3d 20  d char c;.  i = 
04e0: 4e 2a 32 3b 0a 20 20 7a 42 75 66 5b 69 2d 2d 5d  N*2;.  zBuf[i--]
04f0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6a 3d 4e 2d   = 0;.  for(j=N-
0500: 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
0510: 20 20 20 63 20 3d 20 7a 42 75 66 5b 6a 5d 3b 0a     c = zBuf[j];.
0520: 20 20 20 20 7a 42 75 66 5b 69 2d 2d 5d 20 3d 20      zBuf[i--] = 
0530: 7a 48 65 78 5b 63 26 30 78 66 5d 3b 0a 20 20 20  zHex[c&0xf];.   
0540: 20 7a 42 75 66 5b 69 2d 2d 5d 20 3d 20 7a 48 65   zBuf[i--] = zHe
0550: 78 5b 63 3e 3e 34 5d 3b 0a 20 20 7d 0a 20 20 61  x[c>>4];.  }.  a
0560: 73 73 65 72 74 28 20 69 3d 3d 2d 31 20 29 3b 0a  ssert( i==-1 );.
0570: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
0580: 20 68 65 78 20 74 6f 20 62 69 6e 61 72 79 2e 20   hex to binary. 
0590: 20 54 68 65 20 69 6e 70 75 74 20 7a 49 6e 5b 5d   The input zIn[]
05a0: 20 63 6f 6e 74 61 69 6e 73 20 4e 20 62 79 74 65   contains N byte
05b0: 73 20 6f 66 0a 2a 2a 20 68 65 78 61 64 65 63 69  s of.** hexadeci
05c0: 6d 61 6c 2e 20 20 43 6f 6e 76 65 72 74 20 74 68  mal.  Convert th
05d0: 69 73 20 69 6e 74 6f 20 62 69 6e 61 72 79 20 61  is into binary a
05e0: 6e 64 20 77 72 69 74 65 20 61 4f 75 74 5b 5d 20  nd write aOut[] 
05f0: 77 69 74 68 0a 2a 2a 20 74 68 65 20 62 69 6e 61  with.** the bina
0600: 72 79 20 64 61 74 61 2e 20 20 53 70 61 63 65 73  ry data.  Spaces
0610: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
0620: 20 69 6e 70 75 74 20 61 72 65 20 69 67 6e 6f 72   input are ignor
0630: 65 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ed..** Return th
0640: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
0650: 73 20 6f 66 20 62 69 6e 61 72 79 20 72 65 6e 64  s of binary rend
0660: 65 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ered..*/.int sql
0670: 69 74 65 33 54 65 73 74 48 65 78 54 6f 42 69 6e  ite3TestHexToBin
0680: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
0690: 63 68 61 72 20 2a 7a 49 6e 2c 20 69 6e 74 20 4e  char *zIn, int N
06a0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
06b0: 2a 61 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20  *aOut){.  const 
06c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
06d0: 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c  ap[] = {.     0,
06e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
06f0: 30 2c 20 30 2c 20 20 30 2c 20 30 2c 20 30 2c 20  0, 0,  0, 0, 0, 
0700: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
0710: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20      0, 0, 0, 0, 
0720: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 30 2c 20  0, 0, 0, 0,  0, 
0730: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0740: 2c 20 30 2c 0a 20 20 20 20 20 30 2c 20 30 2c 20  , 0,.     0, 0, 
0750: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0760: 2c 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  ,  0, 0, 0, 0, 0
0770: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  , 0, 0, 0,.     
0780: 31 2c 20 32 2c 20 33 2c 20 34 2c 20 35 2c 20 36  1, 2, 3, 4, 5, 6
0790: 2c 20 37 2c 20 38 2c 20 20 39 2c 31 30 2c 20 30  , 7, 8,  9,10, 0
07a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
07b0: 0a 20 20 20 20 20 30 2c 31 31 2c 31 32 2c 31 33  .     0,11,12,13
07c0: 2c 31 34 2c 31 35 2c 31 36 2c 20 30 2c 20 20 30  ,14,15,16, 0,  0
07d0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
07e0: 20 30 2c 20 30 2c 0a 20 20 20 20 20 30 2c 20 30   0, 0,.     0, 0
07f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0800: 20 30 2c 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c   0,  0, 0, 0, 0,
0810: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20   0, 0, 0, 0,.   
0820: 20 20 30 2c 31 31 2c 31 32 2c 31 33 2c 31 34 2c    0,11,12,13,14,
0830: 31 35 2c 31 36 2c 20 30 2c 20 20 30 2c 20 30 2c  15,16, 0,  0, 0,
0840: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0850: 30 2c 0a 20 20 20 20 20 30 2c 20 30 2c 20 30 2c  0,.     0, 0, 0,
0860: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0870: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0880: 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 30 2c  0, 0, 0,.     0,
0890: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
08a0: 30 2c 20 30 2c 20 20 30 2c 20 30 2c 20 30 2c 20  0, 0,  0, 0, 0, 
08b0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
08c0: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20      0, 0, 0, 0, 
08d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 30 2c 20  0, 0, 0, 0,  0, 
08e0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
08f0: 2c 20 30 2c 0a 20 20 20 20 20 30 2c 20 30 2c 20  , 0,.     0, 0, 
0900: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0910: 2c 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  ,  0, 0, 0, 0, 0
0920: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  , 0, 0, 0,.     
0930: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0940: 2c 20 30 2c 20 30 2c 20 20 30 2c 20 30 2c 20 30  , 0, 0,  0, 0, 0
0950: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0960: 0a 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  .     0, 0, 0, 0
0970: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 30  , 0, 0, 0, 0,  0
0980: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0990: 20 30 2c 20 30 2c 0a 20 20 20 20 20 30 2c 20 30   0, 0,.     0, 0
09a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
09b0: 20 30 2c 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c   0,  0, 0, 0, 0,
09c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20   0, 0, 0, 0,.   
09d0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
09e0: 20 30 2c 20 30 2c 20 30 2c 20 20 30 2c 20 30 2c   0, 0, 0,  0, 0,
09f0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0a00: 30 2c 0a 20 20 20 20 20 30 2c 20 30 2c 20 30 2c  0,.     0, 0, 0,
0a10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0a20: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0a30: 30 2c 20 30 2c 20 30 2c 0a 20 20 7d 3b 0a 20 20  0, 0, 0,.  };.  
0a40: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
0a50: 68 69 3d 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64  hi=1;.  unsigned
0a60: 20 63 68 61 72 20 63 3b 0a 0a 20 20 66 6f 72 28   char c;..  for(
0a70: 69 3d 6a 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29  i=j=0; i<N; i++)
0a80: 7b 0a 20 20 20 20 63 20 3d 20 61 4d 61 70 5b 7a  {.    c = aMap[z
0a90: 49 6e 5b 69 5d 5d 3b 0a 20 20 20 20 69 66 28 20  In[i]];.    if( 
0aa0: 63 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  c==0 ) continue;
0ab0: 0a 20 20 20 20 69 66 28 20 68 69 20 29 7b 0a 20  .    if( hi ){. 
0ac0: 20 20 20 20 20 61 4f 75 74 5b 6a 5d 20 3d 20 28       aOut[j] = (
0ad0: 63 2d 31 29 3c 3c 34 3b 0a 20 20 20 20 20 20 68  c-1)<<4;.      h
0ae0: 69 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  i = 0;.    }else
0af0: 7b 0a 20 20 20 20 20 20 61 4f 75 74 5b 6a 2b 2b  {.      aOut[j++
0b00: 5d 20 7c 3d 20 63 2d 31 3b 0a 20 20 20 20 20 20  ] |= c-1;.      
0b10: 68 69 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  hi = 1;.    }.  
0b20: 7d 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a  }.  return j;.}.
0b30: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
0b40: 20 68 65 78 69 6f 5f 72 65 61 64 20 20 46 49 4c   hexio_read  FIL
0b50: 45 4e 41 4d 45 20 20 4f 46 46 53 45 54 20 20 41  ENAME  OFFSET  A
0b60: 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 41 4d  MT.**.** Read AM
0b70: 54 20 62 79 74 65 73 20 66 72 6f 6d 20 66 69 6c  T bytes from fil
0b80: 65 20 46 49 4c 45 4e 41 4d 45 20 62 65 67 69 6e  e FILENAME begin
0b90: 6e 69 6e 67 20 61 74 20 4f 46 46 53 45 54 20 66  ning at OFFSET f
0ba0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e  rom the.** begin
0bb0: 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65  ning of the file
0bc0: 2e 20 20 43 6f 6e 76 65 72 74 20 74 68 61 74 20  .  Convert that 
0bd0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 68  information to h
0be0: 65 78 61 64 65 63 69 6d 61 6c 0a 2a 2a 20 61 6e  exadecimal.** an
0bf0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 73  d return the res
0c00: 75 6c 74 69 6e 67 20 48 45 58 20 73 74 72 69 6e  ulting HEX strin
0c10: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
0c20: 20 68 65 78 69 6f 5f 72 65 61 64 28 0a 20 20 76   hexio_read(.  v
0c30: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
0c40: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
0c50: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
0c60: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
0c70: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
0c80: 20 69 6e 74 20 6f 66 66 73 65 74 3b 0a 20 20 69   int offset;.  i
0c90: 6e 74 20 61 6d 74 2c 20 67 6f 74 3b 0a 20 20 63  nt amt, got;.  c
0ca0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
0cb0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
0cc0: 72 20 2a 7a 42 75 66 3b 0a 20 20 46 49 4c 45 20  r *zBuf;.  FILE 
0cd0: 2a 69 6e 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  *in;..  if( objc
0ce0: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
0cf0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
0d00: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49  rp, 1, objv, "FI
0d10: 4c 45 4e 41 4d 45 20 4f 46 46 53 45 54 20 41 4d  LENAME OFFSET AM
0d20: 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  T");.    return 
0d30: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
0d40: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
0d50: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
0d60: 62 6a 76 5b 32 5d 2c 20 26 6f 66 66 73 65 74 29  bjv[2], &offset)
0d70: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
0d80: 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
0d90: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
0da0: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 61  erp, objv[3], &a
0db0: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
0dc0: 5f 45 52 52 4f 52 3b 0a 20 20 7a 46 69 6c 65 20  _ERROR;.  zFile 
0dd0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
0de0: 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 42 75 66  objv[1]);.  zBuf
0df0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
0e00: 63 28 20 61 6d 74 2a 32 2b 31 20 29 3b 0a 20 20  c( amt*2+1 );.  
0e10: 69 66 28 20 7a 42 75 66 3d 3d 30 20 29 7b 0a 20  if( zBuf==0 ){. 
0e20: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
0e30: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20  ROR;.  }.  in = 
0e40: 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72 62  fopen(zFile, "rb
0e50: 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20  ");.  if( in==0 
0e60: 29 7b 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65  ){.    in = fope
0e70: 6e 28 7a 46 69 6c 65 2c 20 22 72 22 29 3b 0a 20  n(zFile, "r");. 
0e80: 20 7d 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29   }.  if( in==0 )
0e90: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
0ea0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
0eb0: 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 69 6e 70 75  cannot open inpu
0ec0: 74 20 66 69 6c 65 20 22 2c 20 7a 46 69 6c 65 2c  t file ", zFile,
0ed0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
0ee0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
0ef0: 20 66 73 65 65 6b 28 69 6e 2c 20 6f 66 66 73 65   fseek(in, offse
0f00: 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
0f10: 67 6f 74 20 3d 20 66 72 65 61 64 28 7a 42 75 66  got = fread(zBuf
0f20: 2c 20 31 2c 20 61 6d 74 2c 20 69 6e 29 3b 0a 20  , 1, amt, in);. 
0f30: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 69   fclose(in);.  i
0f40: 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
0f50: 67 6f 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  got = 0;.  }.  s
0f60: 71 6c 69 74 65 33 54 65 73 74 42 69 6e 54 6f 48  qlite3TestBinToH
0f70: 65 78 28 7a 42 75 66 2c 20 67 6f 74 29 3b 0a 20  ex(zBuf, got);. 
0f80: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
0f90: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
0fa0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
0fb0: 65 65 28 7a 42 75 66 29 3b 0a 20 20 72 65 74 75  ee(zBuf);.  retu
0fc0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
0fd0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 68 65  *.** Usage:   he
0fe0: 78 69 6f 5f 77 72 69 74 65 20 20 46 49 4c 45 4e  xio_write  FILEN
0ff0: 41 4d 45 20 20 4f 46 46 53 45 54 20 20 44 41 54  AME  OFFSET  DAT
1000: 41 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 44 41  A.**.** Write DA
1010: 54 41 20 69 6e 74 6f 20 66 69 6c 65 20 46 49 4c  TA into file FIL
1020: 45 4e 41 4d 45 20 62 65 67 69 6e 6e 69 6e 67 20  ENAME beginning 
1030: 61 74 20 4f 46 46 53 45 54 20 66 72 6f 6d 20 74  at OFFSET from t
1040: 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  he.** beginning 
1050: 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 20 44 41  of the file.  DA
1060: 54 41 20 69 73 20 65 78 70 72 65 73 73 65 64 20  TA is expressed 
1070: 69 6e 20 68 65 78 61 64 65 63 69 6d 61 6c 2e 0a  in hexadecimal..
1080: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 65  */.static int he
1090: 78 69 6f 5f 77 72 69 74 65 28 0a 20 20 76 6f 69  xio_write(.  voi
10a0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
10b0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
10c0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
10d0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
10e0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
10f0: 6e 74 20 6f 66 66 73 65 74 3b 0a 20 20 69 6e 74  nt offset;.  int
1100: 20 6e 49 6e 2c 20 6e 4f 75 74 2c 20 77 72 69 74   nIn, nOut, writ
1110: 74 65 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ten;.  const cha
1120: 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 6f 6e 73  r *zFile;.  cons
1130: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1140: 2a 7a 49 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64  *zIn;.  unsigned
1150: 20 63 68 61 72 20 2a 61 4f 75 74 3b 0a 20 20 46   char *aOut;.  F
1160: 49 4c 45 20 2a 6f 75 74 3b 0a 0a 20 20 69 66 28  ILE *out;..  if(
1170: 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
1180: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1190: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
11a0: 2c 20 22 46 49 4c 45 4e 41 4d 45 20 4f 46 46 53  , "FILENAME OFFS
11b0: 45 54 20 48 45 58 44 41 54 41 22 29 3b 0a 20 20  ET HEXDATA");.  
11c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11d0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
11e0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
11f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1200: 20 26 6f 66 66 73 65 74 29 20 29 20 72 65 74 75   &offset) ) retu
1210: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1220: 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  zFile = Tcl_GetS
1230: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a  tring(objv[1]);.
1240: 20 20 7a 49 6e 20 3d 20 28 63 6f 6e 73 74 20 75    zIn = (const u
1250: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54  nsigned char *)T
1260: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
1270: 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 49  Obj(objv[3], &nI
1280: 6e 29 3b 0a 20 20 61 4f 75 74 20 3d 20 73 71 6c  n);.  aOut = sql
1290: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 49 6e  ite3_malloc( nIn
12a0: 2f 32 20 29 3b 0a 20 20 69 66 28 20 61 4f 75 74  /2 );.  if( aOut
12b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
12c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
12d0: 0a 20 20 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65  .  nOut = sqlite
12e0: 33 54 65 73 74 48 65 78 54 6f 42 69 6e 28 7a 49  3TestHexToBin(zI
12f0: 6e 2c 20 6e 49 6e 2c 20 61 4f 75 74 29 3b 0a 20  n, nIn, aOut);. 
1300: 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28 7a 46 69   out = fopen(zFi
1310: 6c 65 2c 20 22 72 2b 62 22 29 3b 0a 20 20 69 66  le, "r+b");.  if
1320: 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( out==0 ){.    
1330: 6f 75 74 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c  out = fopen(zFil
1340: 65 2c 20 22 72 2b 22 29 3b 0a 20 20 7d 0a 20 20  e, "r+");.  }.  
1350: 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20  if( out==0 ){.  
1360: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1370: 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e  lt(interp, "cann
1380: 6f 74 20 6f 70 65 6e 20 6f 75 74 70 75 74 20 66  ot open output f
1390: 69 6c 65 20 22 2c 20 7a 46 69 6c 65 2c 20 30 29  ile ", zFile, 0)
13a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
13b0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 73  _ERROR;.  }.  fs
13c0: 65 65 6b 28 6f 75 74 2c 20 6f 66 66 73 65 74 2c  eek(out, offset,
13d0: 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 77 72   SEEK_SET);.  wr
13e0: 69 74 74 65 6e 20 3d 20 66 77 72 69 74 65 28 61  itten = fwrite(a
13f0: 4f 75 74 2c 20 31 2c 20 6e 4f 75 74 2c 20 6f 75  Out, 1, nOut, ou
1400: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
1410: 65 65 28 61 4f 75 74 29 3b 0a 20 20 66 63 6c 6f  ee(aOut);.  fclo
1420: 73 65 28 6f 75 74 29 3b 0a 20 20 54 63 6c 5f 53  se(out);.  Tcl_S
1430: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1440: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1450: 6a 28 77 72 69 74 74 65 6e 29 29 3b 0a 20 20 72  j(written));.  r
1460: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1470: 0a 2f 2a 0a 2a 2a 20 55 53 41 47 45 3a 20 20 20  ./*.** USAGE:   
1480: 68 65 78 69 6f 5f 67 65 74 5f 69 6e 74 20 20 20  hexio_get_int   
1490: 48 45 58 44 41 54 41 0a 2a 2a 0a 2a 2a 20 49 6e  HEXDATA.**.** In
14a0: 74 65 72 70 72 65 74 20 74 68 65 20 48 45 58 44  terpret the HEXD
14b0: 41 54 41 20 61 72 67 75 6d 65 6e 74 20 61 73 20  ATA argument as 
14c0: 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  a big-endian int
14d0: 65 67 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  eger.  Return.**
14e0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
14f0: 61 74 20 69 6e 74 65 67 65 72 2e 20 20 48 45 58  at integer.  HEX
1500: 44 41 54 41 20 63 61 6e 20 63 6f 6e 74 61 69 6e  DATA can contain
1510: 20 62 65 74 77 65 65 6e 20 32 20 61 6e 64 20 38   between 2 and 8
1520: 0a 2a 2a 20 68 65 78 61 64 65 63 69 6d 61 6c 20  .** hexadecimal 
1530: 64 69 67 69 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  digits..*/.stati
1540: 63 20 69 6e 74 20 68 65 78 69 6f 5f 67 65 74 5f  c int hexio_get_
1550: 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  int(.  void * cl
1560: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1570: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1580: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1590: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
15a0: 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 76 61 6c  v[].){.  int val
15b0: 3b 0a 20 20 69 6e 74 20 6e 49 6e 2c 20 6e 4f 75  ;.  int nIn, nOu
15c0: 74 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  t;.  const unsig
15d0: 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 3b 0a 20  ned char *zIn;. 
15e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
15f0: 61 4f 75 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64  aOut;.  unsigned
1600: 20 63 68 61 72 20 61 4e 75 6d 5b 34 5d 3b 0a 0a   char aNum[4];..
1610: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
1620: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1630: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1640: 20 6f 62 6a 76 2c 20 22 48 45 58 44 41 54 41 22   objv, "HEXDATA"
1650: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1660: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
1670: 49 6e 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  In = (const unsi
1680: 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f  gned char *)Tcl_
1690: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
16a0: 28 6f 62 6a 76 5b 31 5d 2c 20 26 6e 49 6e 29 3b  (objv[1], &nIn);
16b0: 0a 20 20 61 4f 75 74 20 3d 20 73 71 6c 69 74 65  .  aOut = sqlite
16c0: 33 5f 6d 61 6c 6c 6f 63 28 20 6e 49 6e 2f 32 20  3_malloc( nIn/2 
16d0: 29 3b 0a 20 20 69 66 28 20 61 4f 75 74 3d 3d 30  );.  if( aOut==0
16e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
16f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1700: 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 54 65  nOut = sqlite3Te
1710: 73 74 48 65 78 54 6f 42 69 6e 28 7a 49 6e 2c 20  stHexToBin(zIn, 
1720: 6e 49 6e 2c 20 61 4f 75 74 29 3b 0a 20 20 69 66  nIn, aOut);.  if
1730: 28 20 6e 4f 75 74 3e 3d 34 20 29 7b 0a 20 20 20  ( nOut>=4 ){.   
1740: 20 6d 65 6d 63 70 79 28 61 4e 75 6d 2c 20 61 4f   memcpy(aNum, aO
1750: 75 74 2c 20 34 29 3b 0a 20 20 7d 65 6c 73 65 7b  ut, 4);.  }else{
1760: 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 4e 75 6d  .    memset(aNum
1770: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4e 75 6d  , 0, sizeof(aNum
1780: 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ));.    memcpy(&
1790: 61 4e 75 6d 5b 34 2d 6e 4f 75 74 5d 2c 20 61 4f  aNum[4-nOut], aO
17a0: 75 74 2c 20 6e 4f 75 74 29 3b 0a 20 20 7d 0a 20  ut, nOut);.  }. 
17b0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 4f   sqlite3_free(aO
17c0: 75 74 29 3b 0a 20 20 76 61 6c 20 3d 20 28 61 4e  ut);.  val = (aN
17d0: 75 6d 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 4e  um[0]<<24) | (aN
17e0: 75 6d 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 4e  um[1]<<16) | (aN
17f0: 75 6d 5b 32 5d 3c 3c 38 29 20 7c 20 61 4e 75 6d  um[2]<<8) | aNum
1800: 5b 33 5d 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  [3];.  Tcl_SetOb
1810: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1820: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 61  Tcl_NewIntObj(va
1830: 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  l));.  return TC
1840: 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
1850: 55 53 41 47 45 3a 20 20 20 68 65 78 69 6f 5f 72  USAGE:   hexio_r
1860: 65 6e 64 65 72 5f 69 6e 74 31 36 20 20 20 49 4e  ender_int16   IN
1870: 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 52 65 6e 64  TEGER.**.** Rend
1880: 65 72 20 49 4e 54 45 47 45 52 20 68 61 73 20 61  er INTEGER has a
1890: 20 31 36 2d 62 69 74 20 62 69 67 2d 65 6e 64 69   16-bit big-endi
18a0: 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 20 68 65  an integer in he
18b0: 78 61 64 65 63 69 6d 61 6c 2e 0a 2a 2f 0a 73 74  xadecimal..*/.st
18c0: 61 74 69 63 20 69 6e 74 20 68 65 78 69 6f 5f 72  atic int hexio_r
18d0: 65 6e 64 65 72 5f 69 6e 74 31 36 28 0a 20 20 76  ender_int16(.  v
18e0: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
18f0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1900: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1910: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1920: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1930: 20 69 6e 74 20 76 61 6c 3b 0a 20 20 75 6e 73 69   int val;.  unsi
1940: 67 6e 65 64 20 63 68 61 72 20 61 4e 75 6d 5b 31  gned char aNum[1
1950: 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
1960: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
1970: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1980: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 49 4e 54  p, 1, objv, "INT
1990: 45 47 45 52 22 29 3b 0a 20 20 20 20 72 65 74 75  EGER");.    retu
19a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19b0: 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
19c0: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
19d0: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 76 61 6c 29  , objv[1], &val)
19e0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19f0: 52 4f 52 3b 0a 20 20 61 4e 75 6d 5b 30 5d 20 3d  ROR;.  aNum[0] =
1a00: 20 76 61 6c 3e 3e 38 3b 0a 20 20 61 4e 75 6d 5b   val>>8;.  aNum[
1a10: 31 5d 20 3d 20 76 61 6c 3b 0a 20 20 73 71 6c 69  1] = val;.  sqli
1a20: 74 65 33 54 65 73 74 42 69 6e 54 6f 48 65 78 28  te3TestBinToHex(
1a30: 61 4e 75 6d 2c 20 32 29 3b 0a 20 20 54 63 6c 5f  aNum, 2);.  Tcl_
1a40: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1a50: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
1a60: 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 61 4e 75  ngObj((char*)aNu
1a70: 6d 2c 20 34 29 29 3b 0a 20 20 72 65 74 75 72 6e  m, 4));.  return
1a80: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
1a90: 2a 2a 20 55 53 41 47 45 3a 20 20 20 68 65 78 69  ** USAGE:   hexi
1aa0: 6f 5f 72 65 6e 64 65 72 5f 69 6e 74 33 32 20 20  o_render_int32  
1ab0: 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 52   INTEGER.**.** R
1ac0: 65 6e 64 65 72 20 49 4e 54 45 47 45 52 20 68 61  ender INTEGER ha
1ad0: 73 20 61 20 33 32 2d 62 69 74 20 62 69 67 2d 65  s a 32-bit big-e
1ae0: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 69 6e  ndian integer in
1af0: 20 68 65 78 61 64 65 63 69 6d 61 6c 2e 0a 2a 2f   hexadecimal..*/
1b00: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 65 78 69  .static int hexi
1b10: 6f 5f 72 65 6e 64 65 72 5f 69 6e 74 33 32 28 0a  o_render_int32(.
1b20: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1b30: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1b40: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1b50: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1b60: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1b70: 7b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 75  {.  int val;.  u
1b80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4e 75  nsigned char aNu
1b90: 6d 5b 31 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  m[10];..  if( ob
1ba0: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1bb0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1bc0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1bd0: 49 4e 54 45 47 45 52 22 29 3b 0a 20 20 20 20 72  INTEGER");.    r
1be0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1bf0: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
1c00: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
1c10: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 76  erp, objv[1], &v
1c20: 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
1c30: 5f 45 52 52 4f 52 3b 0a 20 20 61 4e 75 6d 5b 30  _ERROR;.  aNum[0
1c40: 5d 20 3d 20 76 61 6c 3e 3e 32 34 3b 0a 20 20 61  ] = val>>24;.  a
1c50: 4e 75 6d 5b 31 5d 20 3d 20 76 61 6c 3e 3e 31 36  Num[1] = val>>16
1c60: 3b 0a 20 20 61 4e 75 6d 5b 32 5d 20 3d 20 76 61  ;.  aNum[2] = va
1c70: 6c 3e 3e 38 3b 0a 20 20 61 4e 75 6d 5b 33 5d 20  l>>8;.  aNum[3] 
1c80: 3d 20 76 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33  = val;.  sqlite3
1c90: 54 65 73 74 42 69 6e 54 6f 48 65 78 28 61 4e 75  TestBinToHex(aNu
1ca0: 6d 2c 20 34 29 3b 0a 20 20 54 63 6c 5f 53 65 74  m, 4);.  Tcl_Set
1cb0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1cc0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1cd0: 62 6a 28 28 63 68 61 72 2a 29 61 4e 75 6d 2c 20  bj((char*)aNum, 
1ce0: 38 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  8));.  return TC
1cf0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1d00: 53 41 47 45 3a 20 20 75 74 66 38 5f 74 6f 5f 75  SAGE:  utf8_to_u
1d10: 74 66 38 20 20 48 45 58 0a 2a 2a 0a 2a 2a 20 54  tf8  HEX.**.** T
1d20: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  he argument is a
1d30: 20 55 54 46 38 20 73 74 72 69 6e 67 20 72 65 70   UTF8 string rep
1d40: 72 65 73 65 6e 74 65 64 20 69 6e 20 68 65 78 61  resented in hexa
1d50: 64 65 63 69 6d 61 6c 2e 0a 2a 2a 20 54 68 65 20  decimal..** The 
1d60: 55 54 46 38 20 6d 69 67 68 74 20 6e 6f 74 20 62  UTF8 might not b
1d70: 65 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20  e well-formed.  
1d80: 52 75 6e 20 74 68 69 73 20 73 74 72 69 6e 67 20  Run this string 
1d90: 74 68 72 6f 75 67 68 0a 2a 2a 20 73 71 6c 69 74  through.** sqlit
1da0: 65 33 55 74 66 38 74 6f 38 28 29 20 63 6f 6e 76  e3Utf8to8() conv
1db0: 65 72 74 20 69 74 20 62 61 63 6b 20 74 6f 20 68  ert it back to h
1dc0: 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ex and return th
1dd0: 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61  e result..*/.sta
1de0: 74 69 63 20 69 6e 74 20 75 74 66 38 5f 74 6f 5f  tic int utf8_to_
1df0: 75 74 66 38 28 0a 20 20 76 6f 69 64 20 2a 20 63  utf8(.  void * c
1e00: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1e10: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1e20: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1e30: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1e40: 6a 76 5b 5d 0a 29 7b 0a 23 69 66 64 65 66 20 53  jv[].){.#ifdef S
1e50: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e  QLITE_DEBUG.  in
1e60: 74 20 6e 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 3b  t n;.  int nOut;
1e70: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1e80: 64 20 63 68 61 72 20 2a 7a 4f 72 69 67 3b 0a 20  d char *zOrig;. 
1e90: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1ea0: 7a 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  z;.  if( objc!=2
1eb0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1ec0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1ed0: 20 31 2c 20 6f 62 6a 76 2c 20 22 48 45 58 22 29   1, objv, "HEX")
1ee0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1ef0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 4f  _ERROR;.  }.  zO
1f00: 72 69 67 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  rig = (unsigned 
1f10: 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74  char *)Tcl_GetSt
1f20: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
1f30: 5b 31 5d 2c 20 26 6e 29 3b 0a 20 20 7a 20 3d 20  [1], &n);.  z = 
1f40: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
1f50: 6e 2b 33 20 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  n+3 );.  n = sql
1f60: 69 74 65 33 54 65 73 74 48 65 78 54 6f 42 69 6e  ite3TestHexToBin
1f70: 28 7a 4f 72 69 67 2c 20 6e 2c 20 7a 29 3b 0a 20  (zOrig, n, z);. 
1f80: 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 6e 4f 75   z[n] = 0;.  nOu
1f90: 74 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 54  t = sqlite3Utf8T
1fa0: 6f 38 28 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33  o8(z);.  sqlite3
1fb0: 54 65 73 74 42 69 6e 54 6f 48 65 78 28 7a 2c 6e  TestBinToHex(z,n
1fc0: 4f 75 74 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  Out);.  Tcl_Appe
1fd0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1fe0: 20 28 63 68 61 72 2a 29 7a 2c 20 30 29 3b 0a 20   (char*)z, 0);. 
1ff0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
2000: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
2010: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  n TCL_OK;.}..sta
2020: 74 69 63 20 69 6e 74 20 67 65 74 46 74 73 33 56  tic int getFts3V
2030: 61 72 69 6e 74 28 63 6f 6e 73 74 20 63 68 61 72  arint(const char
2040: 20 2a 70 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36   *p, sqlite_int6
2050: 34 20 2a 76 29 7b 0a 20 20 63 6f 6e 73 74 20 75  4 *v){.  const u
2060: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 71 20  nsigned char *q 
2070: 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
2080: 64 20 63 68 61 72 20 2a 29 20 70 3b 0a 20 20 73  d char *) p;.  s
2090: 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 78 20 3d  qlite_uint64 x =
20a0: 20 30 2c 20 79 20 3d 20 31 3b 0a 20 20 77 68 69   0, y = 1;.  whi
20b0: 6c 65 28 20 28 2a 71 20 26 20 30 78 38 30 29 20  le( (*q & 0x80) 
20c0: 3d 3d 20 30 78 38 30 20 29 7b 0a 20 20 20 20 78  == 0x80 ){.    x
20d0: 20 2b 3d 20 79 20 2a 20 28 2a 71 2b 2b 20 26 20   += y * (*q++ & 
20e0: 30 78 37 66 29 3b 0a 20 20 20 20 79 20 3c 3c 3d  0x7f);.    y <<=
20f0: 20 37 3b 0a 20 20 7d 0a 20 20 78 20 2b 3d 20 79   7;.  }.  x += y
2100: 20 2a 20 28 2a 71 2b 2b 29 3b 0a 20 20 2a 76 20   * (*q++);.  *v 
2110: 3d 20 28 73 71 6c 69 74 65 5f 69 6e 74 36 34 29  = (sqlite_int64)
2120: 20 78 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e   x;.  return (in
2130: 74 29 20 28 71 20 2d 20 28 75 6e 73 69 67 6e 65  t) (q - (unsigne
2140: 64 20 63 68 61 72 20 2a 29 70 29 3b 0a 7d 0a 0a  d char *)p);.}..
2150: 0a 2f 2a 0a 2a 2a 20 55 53 41 47 45 3a 20 20 72  ./*.** USAGE:  r
2160: 65 61 64 5f 76 61 72 69 6e 74 20 42 4c 4f 42 20  ead_varint BLOB 
2170: 56 41 52 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65  VARNAME.**.** Re
2180: 61 64 20 61 20 76 61 72 69 6e 74 20 66 72 6f 6d  ad a varint from
2190: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 42 4c   the start of BL
21a0: 4f 42 2e 20 53 65 74 20 76 61 72 69 61 62 6c 65  OB. Set variable
21b0: 20 56 41 52 4e 41 4d 45 20 74 6f 20 63 6f 6e 74   VARNAME to cont
21c0: 61 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72  ain.** the inter
21d0: 70 72 65 74 65 64 20 76 61 6c 75 65 2e 20 52 65  preted value. Re
21e0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
21f0: 6f 66 20 62 79 74 65 73 20 6f 66 20 42 4c 4f 42  of bytes of BLOB
2200: 20 63 6f 6e 73 75 6d 65 64 2e 0a 2a 2f 0a 73 74   consumed..*/.st
2210: 61 74 69 63 20 69 6e 74 20 72 65 61 64 5f 76 61  atic int read_va
2220: 72 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  rint(.  void * c
2230: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
2240: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2250: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
2260: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2270: 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  jv[].){.  int nB
2280: 6c 6f 62 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  lob;.  unsigned 
2290: 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 73  char *zBlob;.  s
22a0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 56 61  qlite3_int64 iVa
22b0: 6c 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 3b 0a 0a  l;.  int nVal;..
22c0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
22d0: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
22e0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
22f0: 20 6f 62 6a 76 2c 20 22 42 4c 4f 42 20 56 41 52   objv, "BLOB VAR
2300: 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75  NAME");.    retu
2310: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2320: 7d 0a 20 20 7a 42 6c 6f 62 20 3d 20 54 63 6c 5f  }.  zBlob = Tcl_
2330: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
2340: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26 6e 42  Obj(objv[1], &nB
2350: 6c 6f 62 29 3b 0a 0a 20 20 6e 56 61 6c 20 3d 20  lob);..  nVal = 
2360: 67 65 74 46 74 73 33 56 61 72 69 6e 74 28 7a 42  getFts3Varint(zB
2370: 6c 6f 62 2c 20 28 73 71 6c 69 74 65 33 5f 75 69  lob, (sqlite3_ui
2380: 6e 74 36 34 20 2a 29 28 26 69 56 61 6c 29 29 3b  nt64 *)(&iVal));
2390: 0a 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72  .  Tcl_ObjSetVar
23a0: 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  2(interp, objv[2
23b0: 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 57 69 64  ], 0, Tcl_NewWid
23c0: 65 49 6e 74 4f 62 6a 28 69 56 61 6c 29 2c 20 30  eIntObj(iVal), 0
23d0: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
23e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
23f0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 56 61 6c  l_NewIntObj(nVal
2400: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
2410: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  _OK;.}.../*.** R
2420: 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73  egister commands
2430: 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e   with the TCL in
2440: 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e  terpreter..*/.in
2450: 74 20 53 71 6c 69 74 65 74 65 73 74 5f 68 65 78  t Sqlitetest_hex
2460: 69 6f 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  io_Init(Tcl_Inte
2470: 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 73  rp *interp){.  s
2480: 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20  tatic struct {. 
2490: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
24a0: 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64  .     Tcl_ObjCmd
24b0: 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 7d  Proc *xProc;.  }
24c0: 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20   aObjCmd[] = {. 
24d0: 20 20 20 20 7b 20 22 68 65 78 69 6f 5f 72 65 61      { "hexio_rea
24e0: 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  d",             
24f0: 20 20 20 20 20 20 68 65 78 69 6f 5f 72 65 61 64        hexio_read
2500: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2510: 20 20 20 20 7b 20 22 68 65 78 69 6f 5f 77 72 69      { "hexio_wri
2520: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
2530: 20 20 20 20 20 20 68 65 78 69 6f 5f 77 72 69 74        hexio_writ
2540: 65 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  e           },. 
2550: 20 20 20 20 7b 20 22 68 65 78 69 6f 5f 67 65 74      { "hexio_get
2560: 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  _int",          
2570: 20 20 20 20 20 20 68 65 78 69 6f 5f 67 65 74 5f        hexio_get_
2580: 69 6e 74 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  int         },. 
2590: 20 20 20 20 7b 20 22 68 65 78 69 6f 5f 72 65 6e      { "hexio_ren
25a0: 64 65 72 5f 69 6e 74 31 36 22 2c 20 20 20 20 20  der_int16",     
25b0: 20 20 20 20 20 20 68 65 78 69 6f 5f 72 65 6e 64        hexio_rend
25c0: 65 72 5f 69 6e 74 31 36 20 20 20 20 7d 2c 0a 20  er_int16    },. 
25d0: 20 20 20 20 7b 20 22 68 65 78 69 6f 5f 72 65 6e      { "hexio_ren
25e0: 64 65 72 5f 69 6e 74 33 32 22 2c 20 20 20 20 20  der_int32",     
25f0: 20 20 20 20 20 20 68 65 78 69 6f 5f 72 65 6e 64        hexio_rend
2600: 65 72 5f 69 6e 74 33 32 20 20 20 20 7d 2c 0a 20  er_int32    },. 
2610: 20 20 20 20 7b 20 22 75 74 66 38 5f 74 6f 5f 75      { "utf8_to_u
2620: 74 66 38 22 2c 20 20 20 20 20 20 20 20 20 20 20  tf8",           
2630: 20 20 20 20 20 20 75 74 66 38 5f 74 6f 5f 75 74        utf8_to_ut
2640: 66 38 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  f8          },. 
2650: 20 20 20 20 7b 20 22 72 65 61 64 5f 76 61 72 69      { "read_vari
2660: 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nt",            
2670: 20 20 20 20 20 20 72 65 61 64 5f 76 61 72 69 6e        read_varin
2680: 74 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  t           },. 
2690: 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   };.  int i;.  f
26a0: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
26b0: 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66  (aObjCmd)/sizeof
26c0: 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b  (aObjCmd[0]); i+
26d0: 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  +){.    Tcl_Crea
26e0: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
26f0: 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e  erp, aObjCmd[i].
2700: 7a 4e 61 6d 65 2c 20 61 4f 62 6a 43 6d 64 5b 69  zName, aObjCmd[i
2710: 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30 29 3b 0a  ].xProc, 0, 0);.
2720: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
2730: 5f 4f 4b 3b 0a 7d 0a                             _OK;.}.