/ Hex Artifact Content
Login

Artifact 82916f918687502658f02533b519c38cb180db6d:


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 2a 0a 2a 2a 20 24 49 64 3a 20 74 65 73 74  .**.** $Id: test
0330: 5f 68 65 78 69 6f 2e 63 2c 76 20 31 2e 34 20 32  _hexio.c,v 1.4 2
0340: 30 30 37 2f 30 38 2f 31 36 20 30 34 3a 33 30 3a  007/08/16 04:30:
0350: 34 30 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a  40 drh Exp $.*/.
0360: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0370: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0380: 22 74 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65  "tcl.h".#include
0390: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
03a0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
03b0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
03c0: 2e 68 3e 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  .h>.../*.** Conv
03d0: 65 72 74 20 62 69 6e 61 72 79 20 74 6f 20 68 65  ert binary to he
03e0: 78 2e 20 20 54 68 65 20 69 6e 70 75 74 20 7a 42  x.  The input zB
03f0: 75 66 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 4e 20  uf[] contains N 
0400: 62 79 74 65 73 20 6f 66 0a 2a 2a 20 62 69 6e 61  bytes of.** bina
0410: 72 79 20 64 61 74 61 2e 20 20 7a 42 75 66 5b 5d  ry data.  zBuf[]
0420: 20 69 73 20 32 2a 6e 2b 31 20 62 79 74 65 73 20   is 2*n+1 bytes 
0430: 6c 6f 6e 67 2e 20 20 4f 76 65 72 77 72 69 74 65  long.  Overwrite
0440: 20 7a 42 75 66 5b 5d 0a 2a 2a 20 77 69 74 68 20   zBuf[].** with 
0450: 61 20 68 65 78 61 64 65 63 69 6d 61 6c 20 72 65  a hexadecimal re
0460: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
0470: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 62 69 6e  its original bin
0480: 61 72 79 20 69 6e 70 75 74 2e 0a 2a 2f 0a 73 74  ary input..*/.st
0490: 61 74 69 63 20 76 6f 69 64 20 62 69 6e 54 6f 48  atic void binToH
04a0: 65 78 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ex(unsigned char
04b0: 20 2a 7a 42 75 66 2c 20 69 6e 74 20 4e 29 7b 0a   *zBuf, int N){.
04c0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
04d0: 20 63 68 61 72 20 7a 48 65 78 5b 5d 20 3d 20 22   char zHex[] = "
04e0: 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46  0123456789ABCDEF
04f0: 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ";.  int i, j;. 
0500: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
0510: 3b 0a 20 20 69 20 3d 20 4e 2a 32 3b 0a 20 20 7a  ;.  i = N*2;.  z
0520: 42 75 66 5b 69 2d 2d 5d 20 3d 20 30 3b 0a 20 20  Buf[i--] = 0;.  
0530: 66 6f 72 28 6a 3d 4e 2d 31 3b 20 6a 3e 3d 30 3b  for(j=N-1; j>=0;
0540: 20 6a 2d 2d 29 7b 0a 20 20 20 20 63 20 3d 20 7a   j--){.    c = z
0550: 42 75 66 5b 6a 5d 3b 0a 20 20 20 20 7a 42 75 66  Buf[j];.    zBuf
0560: 5b 69 2d 2d 5d 20 3d 20 7a 48 65 78 5b 63 26 30  [i--] = zHex[c&0
0570: 78 66 5d 3b 0a 20 20 20 20 7a 42 75 66 5b 69 2d  xf];.    zBuf[i-
0580: 2d 5d 20 3d 20 7a 48 65 78 5b 63 3e 3e 34 5d 3b  -] = zHex[c>>4];
0590: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69  .  }.  assert( i
05a0: 3d 3d 2d 31 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ==-1 );.}../*.**
05b0: 20 43 6f 6e 76 65 72 74 20 68 65 78 20 74 6f 20   Convert hex to 
05c0: 62 69 6e 61 72 79 2e 20 20 54 68 65 20 69 6e 70  binary.  The inp
05d0: 75 74 20 7a 49 6e 5b 5d 20 63 6f 6e 74 61 69 6e  ut zIn[] contain
05e0: 73 20 4e 20 62 79 74 65 73 20 6f 66 0a 2a 2a 20  s N bytes of.** 
05f0: 68 65 78 61 64 65 63 69 6d 61 6c 2e 20 20 43 6f  hexadecimal.  Co
0600: 6e 76 65 72 74 20 74 68 69 73 20 69 6e 74 6f 20  nvert this into 
0610: 62 69 6e 61 72 79 20 61 6e 64 20 77 72 69 74 65  binary and write
0620: 20 61 4f 75 74 5b 5d 20 77 69 74 68 0a 2a 2a 20   aOut[] with.** 
0630: 74 68 65 20 62 69 6e 61 72 79 20 64 61 74 61 2e  the binary data.
0640: 20 20 53 70 61 63 65 73 20 69 6e 20 74 68 65 20    Spaces in the 
0650: 6f 72 69 67 69 6e 61 6c 20 69 6e 70 75 74 20 61  original input a
0660: 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 20 52  re ignored..** R
0670: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
0680: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 62 69 6e   of bytes of bin
0690: 61 72 79 20 72 65 6e 64 65 72 65 64 2e 0a 2a 2f  ary rendered..*/
06a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 65 78 54  .static int hexT
06b0: 6f 42 69 6e 28 63 6f 6e 73 74 20 75 6e 73 69 67  oBin(const unsig
06c0: 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 2c 20 69  ned char *zIn, i
06d0: 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
06e0: 68 61 72 20 2a 61 4f 75 74 29 7b 0a 20 20 63 6f  har *aOut){.  co
06f0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
0700: 72 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20  r aMap[] = {.   
0710: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
0720: 20 30 2c 20 30 2c 20 30 2c 20 20 30 2c 20 30 2c   0, 0, 0,  0, 0,
0730: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0740: 30 2c 0a 20 20 20 20 20 30 2c 20 30 2c 20 30 2c  0,.     0, 0, 0,
0750: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0760: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0770: 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 30 2c  0, 0, 0,.     0,
0780: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0790: 30 2c 20 30 2c 20 20 30 2c 20 30 2c 20 30 2c 20  0, 0,  0, 0, 0, 
07a0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
07b0: 20 20 20 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20      1, 2, 3, 4, 
07c0: 35 2c 20 36 2c 20 37 2c 20 38 2c 20 20 39 2c 31  5, 6, 7, 8,  9,1
07d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
07e0: 2c 20 30 2c 0a 20 20 20 20 20 30 2c 31 31 2c 31  , 0,.     0,11,1
07f0: 32 2c 31 33 2c 31 34 2c 31 35 2c 31 36 2c 20 30  2,13,14,15,16, 0
0800: 2c 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  ,  0, 0, 0, 0, 0
0810: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  , 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 20 30 2c 20 30 2c 20 20 30 2c 20 30 2c 20 30  , 0, 0,  0, 0, 0
0840: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0850: 0a 20 20 20 20 20 30 2c 31 31 2c 31 32 2c 31 33  .     0,11,12,13
0860: 2c 31 34 2c 31 35 2c 31 36 2c 20 30 2c 20 20 30  ,14,15,16, 0,  0
0870: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0880: 20 30 2c 20 30 2c 0a 20 20 20 20 20 30 2c 20 30   0, 0,.     0, 0
0890: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
08a0: 20 30 2c 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c   0,  0, 0, 0, 0,
08b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20   0, 0, 0, 0,.   
08c0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
08d0: 20 30 2c 20 30 2c 20 30 2c 20 20 30 2c 20 30 2c   0, 0, 0,  0, 0,
08e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
08f0: 30 2c 0a 20 20 20 20 20 30 2c 20 30 2c 20 30 2c  0,.     0, 0, 0,
0900: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0910: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0920: 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 30 2c  0, 0, 0,.     0,
0930: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0940: 30 2c 20 30 2c 20 20 30 2c 20 30 2c 20 30 2c 20  0, 0,  0, 0, 0, 
0950: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
0960: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20      0, 0, 0, 0, 
0970: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 30 2c 20  0, 0, 0, 0,  0, 
0980: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0990: 2c 20 30 2c 0a 20 20 20 20 20 30 2c 20 30 2c 20  , 0,.     0, 0, 
09a0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
09b0: 2c 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  ,  0, 0, 0, 0, 0
09c0: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  , 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 20 30 2c 20 30 2c 20 20 30 2c 20 30 2c 20 30  , 0, 0,  0, 0, 0
09f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0a00: 0a 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  .     0, 0, 0, 0
0a10: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 30  , 0, 0, 0, 0,  0
0a20: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0a30: 20 30 2c 20 30 2c 0a 20 20 20 20 20 30 2c 20 30   0, 0,.     0, 0
0a40: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0a50: 20 30 2c 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c   0,  0, 0, 0, 0,
0a60: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 7d   0, 0, 0, 0,.  }
0a70: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
0a80: 69 6e 74 20 68 69 3d 31 3b 0a 20 20 75 6e 73 69  int hi=1;.  unsi
0a90: 67 6e 65 64 20 63 68 61 72 20 63 3b 0a 0a 20 20  gned char c;..  
0aa0: 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 4e 3b 20  for(i=j=0; i<N; 
0ab0: 69 2b 2b 29 7b 0a 20 20 20 20 63 20 3d 20 61 4d  i++){.    c = aM
0ac0: 61 70 5b 7a 49 6e 5b 69 5d 5d 3b 0a 20 20 20 20  ap[zIn[i]];.    
0ad0: 69 66 28 20 63 3d 3d 30 20 29 20 63 6f 6e 74 69  if( c==0 ) conti
0ae0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 68 69 20  nue;.    if( hi 
0af0: 29 7b 0a 20 20 20 20 20 20 61 4f 75 74 5b 6a 5d  ){.      aOut[j]
0b00: 20 3d 20 28 63 2d 31 29 3c 3c 34 3b 0a 20 20 20   = (c-1)<<4;.   
0b10: 20 20 20 68 69 20 3d 20 30 3b 0a 20 20 20 20 7d     hi = 0;.    }
0b20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 75 74  else{.      aOut
0b30: 5b 6a 2b 2b 5d 20 7c 3d 20 63 2d 31 3b 0a 20 20  [j++] |= c-1;.  
0b40: 20 20 20 20 68 69 20 3d 20 31 3b 0a 20 20 20 20      hi = 1;.    
0b50: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a  }.  }.  return j
0b60: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
0b70: 65 3a 20 20 20 68 65 78 69 6f 5f 72 65 61 64 20  e:   hexio_read 
0b80: 20 46 49 4c 45 4e 41 4d 45 20 20 4f 46 46 53 45   FILENAME  OFFSE
0b90: 54 20 20 41 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 61  T  AMT.**.** Rea
0ba0: 64 20 41 4d 54 20 62 79 74 65 73 20 66 72 6f 6d  d AMT bytes from
0bb0: 20 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45 20 62   file FILENAME b
0bc0: 65 67 69 6e 6e 69 6e 67 20 61 74 20 4f 46 46 53  eginning at OFFS
0bd0: 45 54 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 62  ET from the.** b
0be0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0bf0: 66 69 6c 65 2e 20 20 43 6f 6e 76 65 72 74 20 74  file.  Convert t
0c00: 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  hat information 
0c10: 74 6f 20 68 65 78 61 64 65 63 69 6d 61 6c 0a 2a  to hexadecimal.*
0c20: 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  * and return the
0c30: 20 72 65 73 75 6c 74 69 6e 67 20 48 45 58 20 73   resulting HEX s
0c40: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
0c50: 20 69 6e 74 20 68 65 78 69 6f 5f 72 65 61 64 28   int hexio_read(
0c60: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
0c70: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
0c80: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
0c90: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
0ca0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
0cb0: 29 7b 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  ){.  int offset;
0cc0: 0a 20 20 69 6e 74 20 61 6d 74 2c 20 67 6f 74 3b  .  int amt, got;
0cd0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
0ce0: 46 69 6c 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64  File;.  unsigned
0cf0: 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 46   char *zBuf;.  F
0d00: 49 4c 45 20 2a 69 6e 3b 0a 0a 20 20 69 66 28 20  ILE *in;..  if( 
0d10: 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
0d20: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
0d30: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
0d40: 20 22 46 49 4c 45 4e 41 4d 45 20 4f 46 46 53 45   "FILENAME OFFSE
0d50: 54 20 41 4d 54 22 29 3b 0a 20 20 20 20 72 65 74  T AMT");.    ret
0d60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
0d70: 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
0d80: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
0d90: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 66 66  p, objv[2], &off
0da0: 73 65 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  set) ) return TC
0db0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
0dc0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
0dd0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
0de0: 2c 20 26 61 6d 74 29 20 29 20 72 65 74 75 72 6e  , &amt) ) return
0df0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 46   TCL_ERROR;.  zF
0e00: 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
0e10: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20  ing(objv[1]);.  
0e20: 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zBuf = sqlite3_m
0e30: 61 6c 6c 6f 63 28 20 61 6d 74 2a 32 2b 31 20 29  alloc( amt*2+1 )
0e40: 3b 0a 20 20 69 66 28 20 7a 42 75 66 3d 3d 30 20  ;.  if( zBuf==0 
0e50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
0e60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
0e70: 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c  n = fopen(zFile,
0e80: 20 22 72 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d   "r");.  if( in=
0e90: 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =0 ){.    Tcl_Ap
0ea0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
0eb0: 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  p, "cannot open 
0ec0: 69 6e 70 75 74 20 66 69 6c 65 20 22 2c 20 7a 46  input file ", zF
0ed0: 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ile, 0);.    ret
0ee0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
0ef0: 20 7d 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 6f   }.  fseek(in, o
0f00: 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29  ffset, SEEK_SET)
0f10: 3b 0a 20 20 67 6f 74 20 3d 20 66 72 65 61 64 28  ;.  got = fread(
0f20: 7a 42 75 66 2c 20 31 2c 20 61 6d 74 2c 20 69 6e  zBuf, 1, amt, in
0f30: 29 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  );.  fclose(in);
0f40: 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a  .  if( got<0 ){.
0f50: 20 20 20 20 67 6f 74 20 3d 20 30 3b 0a 20 20 7d      got = 0;.  }
0f60: 0a 20 20 62 69 6e 54 6f 48 65 78 28 7a 42 75 66  .  binToHex(zBuf
0f70: 2c 20 67 6f 74 29 3b 0a 20 20 54 63 6c 5f 41 70  , got);.  Tcl_Ap
0f80: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
0f90: 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 73  p, zBuf, 0);.  s
0fa0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
0fb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
0fc0: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  OK;.}.../*.** Us
0fd0: 61 67 65 3a 20 20 20 68 65 78 69 6f 5f 77 72 69  age:   hexio_wri
0fe0: 74 65 20 20 46 49 4c 45 4e 41 4d 45 20 20 4f 46  te  FILENAME  OF
0ff0: 46 53 45 54 20 20 44 41 54 41 0a 2a 2a 0a 2a 2a  FSET  DATA.**.**
1000: 20 57 72 69 74 65 20 44 41 54 41 20 69 6e 74 6f   Write DATA into
1010: 20 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45 20 62   file FILENAME b
1020: 65 67 69 6e 6e 69 6e 67 20 61 74 20 4f 46 46 53  eginning at OFFS
1030: 45 54 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 62  ET from the.** b
1040: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
1050: 66 69 6c 65 2e 20 20 44 41 54 41 20 69 73 20 65  file.  DATA is e
1060: 78 70 72 65 73 73 65 64 20 69 6e 20 68 65 78 61  xpressed in hexa
1070: 64 65 63 69 6d 61 6c 2e 0a 2a 2f 0a 73 74 61 74  decimal..*/.stat
1080: 69 63 20 69 6e 74 20 68 65 78 69 6f 5f 77 72 69  ic int hexio_wri
1090: 74 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  te(.  void * cli
10a0: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
10b0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
10c0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
10d0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
10e0: 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6f 66 66 73  [].){.  int offs
10f0: 65 74 3b 0a 20 20 69 6e 74 20 6e 49 6e 2c 20 6e  et;.  int nIn, n
1100: 4f 75 74 2c 20 77 72 69 74 74 65 6e 3b 0a 20 20  Out, written;.  
1110: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1120: 65 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  e;.  const unsig
1130: 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 3b 0a 20  ned char *zIn;. 
1140: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1150: 61 4f 75 74 3b 0a 20 20 46 49 4c 45 20 2a 6f 75  aOut;.  FILE *ou
1160: 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
1170: 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
1180: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1190: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45  , 1, objv, "FILE
11a0: 4e 41 4d 45 20 4f 46 46 53 45 54 20 48 45 58 44  NAME OFFSET HEXD
11b0: 41 54 41 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ATA");.    retur
11c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
11d0: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
11e0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
11f0: 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 66 66 73 65   objv[2], &offse
1200: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1210: 45 52 52 4f 52 3b 0a 20 20 7a 46 69 6c 65 20 3d  ERROR;.  zFile =
1220: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1230: 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 49 6e 20 3d  bjv[1]);.  zIn =
1240: 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
1250: 20 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53   char *)Tcl_GetS
1260: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
1270: 76 5b 33 5d 2c 20 26 6e 49 6e 29 3b 0a 20 20 61  v[3], &nIn);.  a
1280: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Out = sqlite3_ma
1290: 6c 6c 6f 63 28 20 6e 49 6e 2f 32 20 29 3b 0a 20  lloc( nIn/2 );. 
12a0: 20 69 66 28 20 61 4f 75 74 3d 3d 30 20 29 7b 0a   if( aOut==0 ){.
12b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12c0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6e 4f 75 74  RROR;.  }.  nOut
12d0: 20 3d 20 68 65 78 54 6f 42 69 6e 28 7a 49 6e 2c   = hexToBin(zIn,
12e0: 20 6e 49 6e 2c 20 61 4f 75 74 29 3b 0a 20 20 6f   nIn, aOut);.  o
12f0: 75 74 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65  ut = fopen(zFile
1300: 2c 20 22 72 2b 22 29 3b 0a 20 20 69 66 28 20 6f  , "r+");.  if( o
1310: 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c  ut==0 ){.    Tcl
1320: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1330: 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70  terp, "cannot op
1340: 65 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 20 22  en output file "
1350: 2c 20 7a 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20  , zFile, 0);.   
1360: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1370: 52 3b 0a 20 20 7d 0a 20 20 66 73 65 65 6b 28 6f  R;.  }.  fseek(o
1380: 75 74 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b  ut, offset, SEEK
1390: 5f 53 45 54 29 3b 0a 20 20 77 72 69 74 74 65 6e  _SET);.  written
13a0: 20 3d 20 66 77 72 69 74 65 28 61 4f 75 74 2c 20   = fwrite(aOut, 
13b0: 31 2c 20 6e 4f 75 74 2c 20 6f 75 74 29 3b 0a 20  1, nOut, out);. 
13c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 4f   sqlite3_free(aO
13d0: 75 74 29 3b 0a 20 20 66 63 6c 6f 73 65 28 6f 75  ut);.  fclose(ou
13e0: 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  t);.  Tcl_SetObj
13f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1400: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 77 72 69  cl_NewIntObj(wri
1410: 74 74 65 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e  tten));.  return
1420: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1430: 2a 20 55 53 41 47 45 3a 20 20 20 68 65 78 69 6f  * USAGE:   hexio
1440: 5f 67 65 74 5f 69 6e 74 20 20 20 48 45 58 44 41  _get_int   HEXDA
1450: 54 41 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  TA.**.** Interpr
1460: 65 74 20 74 68 65 20 48 45 58 44 41 54 41 20 61  et the HEXDATA a
1470: 72 67 75 6d 65 6e 74 20 61 73 20 61 20 62 69 67  rgument as a big
1480: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e  -endian integer.
1490: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
14a0: 76 61 6c 75 65 20 6f 66 20 74 68 61 74 20 69 6e  value of that in
14b0: 74 65 67 65 72 2e 20 20 48 45 58 44 41 54 41 20  teger.  HEXDATA 
14c0: 63 61 6e 20 63 6f 6e 74 61 69 6e 20 62 65 74 77  can contain betw
14d0: 65 65 6e 20 32 20 61 6e 64 20 38 0a 2a 2a 20 68  een 2 and 8.** h
14e0: 65 78 61 64 65 63 69 6d 61 6c 20 64 69 67 69 74  exadecimal digit
14f0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1500: 20 68 65 78 69 6f 5f 67 65 74 5f 69 6e 74 28 0a   hexio_get_int(.
1510: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1520: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1530: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1540: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1550: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1560: 7b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 69  {.  int val;.  i
1570: 6e 74 20 6e 49 6e 2c 20 6e 4f 75 74 3b 0a 20 20  nt nIn, nOut;.  
1580: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1590: 68 61 72 20 2a 7a 49 6e 3b 0a 20 20 75 6e 73 69  har *zIn;.  unsi
15a0: 67 6e 65 64 20 63 68 61 72 20 2a 61 4f 75 74 3b  gned char *aOut;
15b0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
15c0: 20 61 4e 75 6d 5b 34 5d 3b 0a 0a 20 20 69 66 28   aNum[4];..  if(
15d0: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
15e0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
15f0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1600: 2c 20 22 48 45 58 44 41 54 41 22 29 3b 0a 20 20  , "HEXDATA");.  
1610: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1620: 4f 52 3b 0a 20 20 7d 0a 20 20 7a 49 6e 20 3d 20  OR;.  }.  zIn = 
1630: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1640: 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74  char *)Tcl_GetSt
1650: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
1660: 5b 31 5d 2c 20 26 6e 49 6e 29 3b 0a 20 20 61 4f  [1], &nIn);.  aO
1670: 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ut = sqlite3_mal
1680: 6c 6f 63 28 20 6e 49 6e 2f 32 20 29 3b 0a 20 20  loc( nIn/2 );.  
1690: 69 66 28 20 61 4f 75 74 3d 3d 30 20 29 7b 0a 20  if( aOut==0 ){. 
16a0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16b0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 6e 4f 75 74 20  ROR;.  }.  nOut 
16c0: 3d 20 68 65 78 54 6f 42 69 6e 28 7a 49 6e 2c 20  = hexToBin(zIn, 
16d0: 6e 49 6e 2c 20 61 4f 75 74 29 3b 0a 20 20 69 66  nIn, aOut);.  if
16e0: 28 20 6e 4f 75 74 3e 3d 34 20 29 7b 0a 20 20 20  ( nOut>=4 ){.   
16f0: 20 6d 65 6d 63 70 79 28 61 4e 75 6d 2c 20 61 4f   memcpy(aNum, aO
1700: 75 74 2c 20 34 29 3b 0a 20 20 7d 65 6c 73 65 7b  ut, 4);.  }else{
1710: 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 4e 75 6d  .    memset(aNum
1720: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4e 75 6d  , 0, sizeof(aNum
1730: 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ));.    memcpy(&
1740: 61 4e 75 6d 5b 34 2d 6e 4f 75 74 5d 2c 20 61 4f  aNum[4-nOut], aO
1750: 75 74 2c 20 6e 4f 75 74 29 3b 0a 20 20 7d 0a 20  ut, nOut);.  }. 
1760: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 4f   sqlite3_free(aO
1770: 75 74 29 3b 0a 20 20 76 61 6c 20 3d 20 28 61 4e  ut);.  val = (aN
1780: 75 6d 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 4e  um[0]<<24) | (aN
1790: 75 6d 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 4e  um[1]<<16) | (aN
17a0: 75 6d 5b 32 5d 3c 3c 38 29 20 7c 20 61 4e 75 6d  um[2]<<8) | aNum
17b0: 5b 33 5d 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  [3];.  Tcl_SetOb
17c0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
17d0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 61  Tcl_NewIntObj(va
17e0: 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  l));.  return TC
17f0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
1800: 55 53 41 47 45 3a 20 20 20 68 65 78 69 6f 5f 72  USAGE:   hexio_r
1810: 65 6e 64 65 72 5f 69 6e 74 31 36 20 20 20 49 4e  ender_int16   IN
1820: 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 52 65 6e 64  TEGER.**.** Rend
1830: 65 72 20 49 4e 54 45 47 45 52 20 68 61 73 20 61  er INTEGER has a
1840: 20 31 36 2d 62 69 74 20 62 69 67 2d 65 6e 64 69   16-bit big-endi
1850: 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 20 68 65  an integer in he
1860: 78 61 64 65 63 69 6d 61 6c 2e 0a 2a 2f 0a 73 74  xadecimal..*/.st
1870: 61 74 69 63 20 69 6e 74 20 68 65 78 69 6f 5f 72  atic int hexio_r
1880: 65 6e 64 65 72 5f 69 6e 74 31 36 28 0a 20 20 76  ender_int16(.  v
1890: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
18a0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
18b0: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
18c0: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
18d0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
18e0: 20 69 6e 74 20 76 61 6c 3b 0a 20 20 75 6e 73 69   int val;.  unsi
18f0: 67 6e 65 64 20 63 68 61 72 20 61 4e 75 6d 5b 31  gned char aNum[1
1900: 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
1910: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
1920: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1930: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 49 4e 54  p, 1, objv, "INT
1940: 45 47 45 52 22 29 3b 0a 20 20 20 20 72 65 74 75  EGER");.    retu
1950: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1960: 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
1970: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1980: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 76 61 6c 29  , objv[1], &val)
1990: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19a0: 52 4f 52 3b 0a 20 20 61 4e 75 6d 5b 30 5d 20 3d  ROR;.  aNum[0] =
19b0: 20 76 61 6c 3e 3e 38 3b 0a 20 20 61 4e 75 6d 5b   val>>8;.  aNum[
19c0: 31 5d 20 3d 20 76 61 6c 3b 0a 20 20 62 69 6e 54  1] = val;.  binT
19d0: 6f 48 65 78 28 61 4e 75 6d 2c 20 32 29 3b 0a 20  oHex(aNum, 2);. 
19e0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
19f0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1a00: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
1a10: 2a 29 61 4e 75 6d 2c 20 34 29 29 3b 0a 20 20 72  *)aNum, 4));.  r
1a20: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1a30: 0a 0a 2f 2a 0a 2a 2a 20 55 53 41 47 45 3a 20 20  ../*.** USAGE:  
1a40: 20 68 65 78 69 6f 5f 72 65 6e 64 65 72 5f 69 6e   hexio_render_in
1a50: 74 33 32 20 20 20 49 4e 54 45 47 45 52 0a 2a 2a  t32   INTEGER.**
1a60: 0a 2a 2a 20 52 65 6e 64 65 72 20 49 4e 54 45 47  .** Render INTEG
1a70: 45 52 20 68 61 73 20 61 20 33 32 2d 62 69 74 20  ER has a 32-bit 
1a80: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1a90: 65 72 20 69 6e 20 68 65 78 61 64 65 63 69 6d 61  er in hexadecima
1aa0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1ab0: 20 68 65 78 69 6f 5f 72 65 6e 64 65 72 5f 69 6e   hexio_render_in
1ac0: 74 33 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  t32(.  void * cl
1ad0: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1ae0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1af0: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1b00: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1b10: 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 76 61 6c  v[].){.  int val
1b20: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
1b30: 72 20 61 4e 75 6d 5b 31 30 5d 3b 0a 0a 20 20 69  r aNum[10];..  i
1b40: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1b50: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1b60: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1b70: 6a 76 2c 20 22 49 4e 54 45 47 45 52 22 29 3b 0a  jv, "INTEGER");.
1b80: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1b90: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1ba0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1bb0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
1bc0: 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72  ], &val) ) retur
1bd0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 61  n TCL_ERROR;.  a
1be0: 4e 75 6d 5b 30 5d 20 3d 20 76 61 6c 3e 3e 32 34  Num[0] = val>>24
1bf0: 3b 0a 20 20 61 4e 75 6d 5b 31 5d 20 3d 20 76 61  ;.  aNum[1] = va
1c00: 6c 3e 3e 31 36 3b 0a 20 20 61 4e 75 6d 5b 32 5d  l>>16;.  aNum[2]
1c10: 20 3d 20 76 61 6c 3e 3e 38 3b 0a 20 20 61 4e 75   = val>>8;.  aNu
1c20: 6d 5b 33 5d 20 3d 20 76 61 6c 3b 0a 20 20 62 69  m[3] = val;.  bi
1c30: 6e 54 6f 48 65 78 28 61 4e 75 6d 2c 20 34 29 3b  nToHex(aNum, 4);
1c40: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1c50: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1c60: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
1c70: 61 72 2a 29 61 4e 75 6d 2c 20 38 29 29 3b 0a 20  ar*)aNum, 8));. 
1c80: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1c90: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 53 41 47 45 3a 20  }../*.** USAGE: 
1ca0: 20 75 74 66 38 5f 74 6f 5f 75 74 66 38 20 20 48   utf8_to_utf8  H
1cb0: 45 58 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 67  EX.**.** The arg
1cc0: 75 6d 65 6e 74 20 69 73 20 61 20 55 54 46 38 20  ument is a UTF8 
1cd0: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
1ce0: 65 64 20 69 6e 20 68 65 78 61 64 65 63 69 6d 61  ed in hexadecima
1cf0: 6c 2e 0a 2a 2a 20 54 68 65 20 55 54 46 38 20 6d  l..** The UTF8 m
1d00: 69 67 68 74 20 6e 6f 74 20 62 65 20 77 65 6c 6c  ight not be well
1d10: 2d 66 6f 72 6d 65 64 2e 20 20 52 75 6e 20 74 68  -formed.  Run th
1d20: 69 73 20 73 74 72 69 6e 67 20 74 68 72 6f 75 67  is string throug
1d30: 68 0a 2a 2a 20 73 71 6c 69 74 65 33 55 74 66 38  h.** sqlite3Utf8
1d40: 74 6f 38 28 29 20 63 6f 6e 76 65 72 74 20 69 74  to8() convert it
1d50: 20 62 61 63 6b 20 74 6f 20 68 65 78 20 61 6e 64   back to hex and
1d60: 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   return the resu
1d70: 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  lt..*/.static in
1d80: 74 20 75 74 66 38 5f 74 6f 5f 75 74 66 38 28 0a  t utf8_to_utf8(.
1d90: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1da0: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1db0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1dc0: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1dd0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1de0: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  {.  int n;.  int
1df0: 20 6e 4f 75 74 3b 0a 20 20 63 6f 6e 73 74 20 75   nOut;.  const u
1e00: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4f  nsigned char *zO
1e10: 72 69 67 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  rig;.  unsigned 
1e20: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 6f  char *z;.  if( o
1e30: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1e40: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1e50: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1e60: 22 48 45 58 22 29 3b 0a 20 20 20 20 72 65 74 75  "HEX");.    retu
1e70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1e80: 7d 0a 20 20 7a 4f 72 69 67 20 3d 20 28 75 6e 73  }.  zOrig = (uns
1e90: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c  igned char *)Tcl
1ea0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
1eb0: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26 6e 29 3b 0a  j(objv[1], &n);.
1ec0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    z = sqlite3_ma
1ed0: 6c 6c 6f 63 28 20 6e 2b 33 20 29 3b 0a 20 20 6e  lloc( n+3 );.  n
1ee0: 20 3d 20 68 65 78 54 6f 42 69 6e 28 7a 4f 72 69   = hexToBin(zOri
1ef0: 67 2c 20 6e 2c 20 7a 29 3b 0a 20 20 7a 5b 6e 5d  g, n, z);.  z[n]
1f00: 20 3d 20 30 3b 0a 20 20 6e 4f 75 74 20 3d 20 73   = 0;.  nOut = s
1f10: 71 6c 69 74 65 33 55 74 66 38 54 6f 38 28 7a 29  qlite3Utf8To8(z)
1f20: 3b 0a 20 20 62 69 6e 54 6f 48 65 78 28 7a 2c 6e  ;.  binToHex(z,n
1f30: 4f 75 74 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  Out);.  Tcl_Appe
1f40: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1f50: 20 28 63 68 61 72 2a 29 7a 2c 20 30 29 3b 0a 20   (char*)z, 0);. 
1f60: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
1f70: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1f80: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  K;.}.../*.** Reg
1f90: 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77  ister commands w
1fa0: 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65  ith the TCL inte
1fb0: 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  rpreter..*/.int 
1fc0: 53 71 6c 69 74 65 74 65 73 74 5f 68 65 78 69 6f  Sqlitetest_hexio
1fd0: 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1fe0: 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 73 74 61   *interp){.  sta
1ff0: 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20  tic struct {.   
2000: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
2010: 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72      Tcl_ObjCmdPr
2020: 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61  oc *xProc;.  } a
2030: 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20  ObjCmd[] = {.   
2040: 20 20 7b 20 22 68 65 78 69 6f 5f 72 65 61 64 22    { "hexio_read"
2050: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2060: 20 20 20 20 68 65 78 69 6f 5f 72 65 61 64 20 20      hexio_read  
2070: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2080: 20 20 7b 20 22 68 65 78 69 6f 5f 77 72 69 74 65    { "hexio_write
2090: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
20a0: 20 20 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20      hexio_write 
20b0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
20c0: 20 20 7b 20 22 68 65 78 69 6f 5f 67 65 74 5f 69    { "hexio_get_i
20d0: 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nt",            
20e0: 20 20 20 20 68 65 78 69 6f 5f 67 65 74 5f 69 6e      hexio_get_in
20f0: 74 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  t         },.   
2100: 20 20 7b 20 22 68 65 78 69 6f 5f 72 65 6e 64 65    { "hexio_rende
2110: 72 5f 69 6e 74 31 36 22 2c 20 20 20 20 20 20 20  r_int16",       
2120: 20 20 20 20 68 65 78 69 6f 5f 72 65 6e 64 65 72      hexio_render
2130: 5f 69 6e 74 31 36 20 20 20 20 7d 2c 0a 20 20 20  _int16    },.   
2140: 20 20 7b 20 22 68 65 78 69 6f 5f 72 65 6e 64 65    { "hexio_rende
2150: 72 5f 69 6e 74 33 32 22 2c 20 20 20 20 20 20 20  r_int32",       
2160: 20 20 20 20 68 65 78 69 6f 5f 72 65 6e 64 65 72      hexio_render
2170: 5f 69 6e 74 33 32 20 20 20 20 7d 2c 0a 20 20 20  _int32    },.   
2180: 20 20 7b 20 22 75 74 66 38 5f 74 6f 5f 75 74 66    { "utf8_to_utf
2190: 38 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  8",             
21a0: 20 20 20 20 75 74 66 38 5f 74 6f 5f 75 74 66 38      utf8_to_utf8
21b0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d            },.  }
21c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
21d0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
21e0: 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61  ObjCmd)/sizeof(a
21f0: 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29  ObjCmd[0]); i++)
2200: 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  {.    Tcl_Create
2210: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
2220: 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e  p, aObjCmd[i].zN
2230: 61 6d 65 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e  ame, aObjCmd[i].
2240: 78 50 72 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20  xProc, 0, 0);.  
2250: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
2260: 4b 3b 0a 7d 0a                                   K;.}.