/ Hex Artifact Content
Login

Artifact 2f1122aa3f012fa0142ee3c36ce5c902a70cd12f:


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 37 20 32  _hexio.c,v 1.7 2
0340: 30 30 38 2f 30 35 2f 31 32 20 31 36 3a 31 37 3a  008/05/12 16:17:
0350: 34 32 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a  42 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 76 6f  ary input..*/.vo
0490: 69 64 20 73 71 6c 69 74 65 33 54 65 73 74 42 69  id sqlite3TestBi
04a0: 6e 54 6f 48 65 78 28 75 6e 73 69 67 6e 65 64 20  nToHex(unsigned 
04b0: 63 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74 20  char *zBuf, int 
04c0: 4e 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  N){.  const unsi
04d0: 67 6e 65 64 20 63 68 61 72 20 7a 48 65 78 5b 5d  gned char zHex[]
04e0: 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 41 42   = "0123456789AB
04f0: 43 44 45 46 22 3b 0a 20 20 69 6e 74 20 69 2c 20  CDEF";.  int i, 
0500: 6a 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  j;.  unsigned ch
0510: 61 72 20 63 3b 0a 20 20 69 20 3d 20 4e 2a 32 3b  ar c;.  i = N*2;
0520: 0a 20 20 7a 42 75 66 5b 69 2d 2d 5d 20 3d 20 30  .  zBuf[i--] = 0
0530: 3b 0a 20 20 66 6f 72 28 6a 3d 4e 2d 31 3b 20 6a  ;.  for(j=N-1; j
0540: 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 63  >=0; j--){.    c
0550: 20 3d 20 7a 42 75 66 5b 6a 5d 3b 0a 20 20 20 20   = zBuf[j];.    
0560: 7a 42 75 66 5b 69 2d 2d 5d 20 3d 20 7a 48 65 78  zBuf[i--] = zHex
0570: 5b 63 26 30 78 66 5d 3b 0a 20 20 20 20 7a 42 75  [c&0xf];.    zBu
0580: 66 5b 69 2d 2d 5d 20 3d 20 7a 48 65 78 5b 63 3e  f[i--] = zHex[c>
0590: 3e 34 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  >4];.  }.  asser
05a0: 74 28 20 69 3d 3d 2d 31 20 29 3b 0a 7d 0a 0a 2f  t( i==-1 );.}../
05b0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 68 65 78  *.** Convert hex
05c0: 20 74 6f 20 62 69 6e 61 72 79 2e 20 20 54 68 65   to binary.  The
05d0: 20 69 6e 70 75 74 20 7a 49 6e 5b 5d 20 63 6f 6e   input zIn[] con
05e0: 74 61 69 6e 73 20 4e 20 62 79 74 65 73 20 6f 66  tains N bytes of
05f0: 0a 2a 2a 20 68 65 78 61 64 65 63 69 6d 61 6c 2e  .** hexadecimal.
0600: 20 20 43 6f 6e 76 65 72 74 20 74 68 69 73 20 69    Convert this i
0610: 6e 74 6f 20 62 69 6e 61 72 79 20 61 6e 64 20 77  nto binary and w
0620: 72 69 74 65 20 61 4f 75 74 5b 5d 20 77 69 74 68  rite aOut[] with
0630: 0a 2a 2a 20 74 68 65 20 62 69 6e 61 72 79 20 64  .** the binary d
0640: 61 74 61 2e 20 20 53 70 61 63 65 73 20 69 6e 20  ata.  Spaces in 
0650: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 70  the original inp
0660: 75 74 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a  ut are ignored..
0670: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
0680: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
0690: 20 62 69 6e 61 72 79 20 72 65 6e 64 65 72 65 64   binary rendered
06a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
06b0: 54 65 73 74 48 65 78 54 6f 42 69 6e 28 63 6f 6e  TestHexToBin(con
06c0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
06d0: 20 2a 7a 49 6e 2c 20 69 6e 74 20 4e 2c 20 75 6e   *zIn, int N, un
06e0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4f 75  signed char *aOu
06f0: 74 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  t){.  const unsi
0700: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 70 5b 5d  gned char aMap[]
0710: 20 3d 20 7b 0a 20 20 20 20 20 30 2c 20 30 2c 20   = {.     0, 0, 
0720: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0730: 2c 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  ,  0, 0, 0, 0, 0
0740: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 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 30 2c 20 30 2c 20 20 30 2c 20 30 2c 20 30  , 0, 0,  0, 0, 0
0770: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0780: 0a 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  .     0, 0, 0, 0
0790: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 30  , 0, 0, 0, 0,  0
07a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
07b0: 20 30 2c 20 30 2c 0a 20 20 20 20 20 31 2c 20 32   0, 0,.     1, 2
07c0: 2c 20 33 2c 20 34 2c 20 35 2c 20 36 2c 20 37 2c  , 3, 4, 5, 6, 7,
07d0: 20 38 2c 20 20 39 2c 31 30 2c 20 30 2c 20 30 2c   8,  9,10, 0, 0,
07e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20   0, 0, 0, 0,.   
07f0: 20 20 30 2c 31 31 2c 31 32 2c 31 33 2c 31 34 2c    0,11,12,13,14,
0800: 31 35 2c 31 36 2c 20 30 2c 20 20 30 2c 20 30 2c  15,16, 0,  0, 0,
0810: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0820: 30 2c 0a 20 20 20 20 20 30 2c 20 30 2c 20 30 2c  0,.     0, 0, 0,
0830: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 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 20 30 2c 20 30 2c 0a 20 20 20 20 20 30 2c  0, 0, 0,.     0,
0860: 31 31 2c 31 32 2c 31 33 2c 31 34 2c 31 35 2c 31  11,12,13,14,15,1
0870: 36 2c 20 30 2c 20 20 30 2c 20 30 2c 20 30 2c 20  6, 0,  0, 0, 0, 
0880: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
0890: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20      0, 0, 0, 0, 
08a0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 30 2c 20  0, 0, 0, 0,  0, 
08b0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
08c0: 2c 20 30 2c 0a 20 20 20 20 20 30 2c 20 30 2c 20  , 0,.     0, 0, 
08d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
08e0: 2c 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  ,  0, 0, 0, 0, 0
08f0: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 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 30 2c 20 30 2c 20 20 30 2c 20 30 2c 20 30  , 0, 0,  0, 0, 0
0920: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0930: 0a 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  .     0, 0, 0, 0
0940: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 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: 20 30 2c 20 30 2c 0a 20 20 20 20 20 30 2c 20 30   0, 0,.     0, 0
0970: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0980: 20 30 2c 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c   0,  0, 0, 0, 0,
0990: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20   0, 0, 0, 0,.   
09a0: 20 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 30 2c 20 30 2c 20 20 30 2c 20 30 2c   0, 0, 0,  0, 0,
09c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09d0: 30 2c 0a 20 20 20 20 20 30 2c 20 30 2c 20 30 2c  0,.     0, 0, 0,
09e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   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 20 30 2c 20 30 2c 0a 20 20 20 20 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: 30 2c 20 30 2c 20 20 30 2c 20 30 2c 20 30 2c 20  0, 0,  0, 0, 0, 
0a30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
0a40: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20      0, 0, 0, 0, 
0a50: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 30 2c 20  0, 0, 0, 0,  0, 
0a60: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0a70: 2c 20 30 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  , 0,.  };.  int 
0a80: 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 68 69 3d 31  i, j;.  int hi=1
0a90: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
0aa0: 72 20 63 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d  r c;..  for(i=j=
0ab0: 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<N; i++){.  
0ac0: 20 20 63 20 3d 20 61 4d 61 70 5b 7a 49 6e 5b 69    c = aMap[zIn[i
0ad0: 5d 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 30  ]];.    if( c==0
0ae0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
0af0: 20 69 66 28 20 68 69 20 29 7b 0a 20 20 20 20 20   if( hi ){.     
0b00: 20 61 4f 75 74 5b 6a 5d 20 3d 20 28 63 2d 31 29   aOut[j] = (c-1)
0b10: 3c 3c 34 3b 0a 20 20 20 20 20 20 68 69 20 3d 20  <<4;.      hi = 
0b20: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
0b30: 20 20 20 20 61 4f 75 74 5b 6a 2b 2b 5d 20 7c 3d      aOut[j++] |=
0b40: 20 63 2d 31 3b 0a 20 20 20 20 20 20 68 69 20 3d   c-1;.      hi =
0b50: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
0b60: 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 0a 2f 2a  return j;.}.../*
0b70: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 68 65 78  .** Usage:   hex
0b80: 69 6f 5f 72 65 61 64 20 20 46 49 4c 45 4e 41 4d  io_read  FILENAM
0b90: 45 20 20 4f 46 46 53 45 54 20 20 41 4d 54 0a 2a  E  OFFSET  AMT.*
0ba0: 2a 0a 2a 2a 20 52 65 61 64 20 41 4d 54 20 62 79  *.** Read AMT by
0bb0: 74 65 73 20 66 72 6f 6d 20 66 69 6c 65 20 46 49  tes from file FI
0bc0: 4c 45 4e 41 4d 45 20 62 65 67 69 6e 6e 69 6e 67  LENAME beginning
0bd0: 20 61 74 20 4f 46 46 53 45 54 20 66 72 6f 6d 20   at OFFSET from 
0be0: 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67  the.** beginning
0bf0: 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 20 43   of the file.  C
0c00: 6f 6e 76 65 72 74 20 74 68 61 74 20 69 6e 66 6f  onvert that info
0c10: 72 6d 61 74 69 6f 6e 20 74 6f 20 68 65 78 61 64  rmation to hexad
0c20: 65 63 69 6d 61 6c 0a 2a 2a 20 61 6e 64 20 72 65  ecimal.** and re
0c30: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 69  turn the resulti
0c40: 6e 67 20 48 45 58 20 73 74 72 69 6e 67 2e 0a 2a  ng HEX string..*
0c50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 65 78  /.static int hex
0c60: 69 6f 5f 72 65 61 64 28 0a 20 20 76 6f 69 64 20  io_read(.  void 
0c70: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
0c80: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0c90: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
0ca0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
0cb0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
0cc0: 20 6f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61   offset;.  int a
0cd0: 6d 74 2c 20 67 6f 74 3b 0a 20 20 63 6f 6e 73 74  mt, got;.  const
0ce0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20   char *zFile;.  
0cf0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
0d00: 42 75 66 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b  Buf;.  FILE *in;
0d10: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
0d20: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
0d30: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
0d40: 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41  1, objv, "FILENA
0d50: 4d 45 20 4f 46 46 53 45 54 20 41 4d 54 22 29 3b  ME OFFSET AMT");
0d60: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
0d70: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
0d80: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
0d90: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
0da0: 32 5d 2c 20 26 6f 66 66 73 65 74 29 20 29 20 72  2], &offset) ) r
0db0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0dc0: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
0dd0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
0de0: 20 6f 62 6a 76 5b 33 5d 2c 20 26 61 6d 74 29 20   objv[3], &amt) 
0df0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
0e00: 4f 52 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63  OR;.  zFile = Tc
0e10: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
0e20: 5b 31 5d 29 3b 0a 20 20 7a 42 75 66 20 3d 20 73  [1]);.  zBuf = s
0e30: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 61  qlite3_malloc( a
0e40: 6d 74 2a 32 2b 31 20 29 3b 0a 20 20 69 66 28 20  mt*2+1 );.  if( 
0e50: 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 72  zBuf==0 ){.    r
0e60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0e70: 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65  .  }.  in = fope
0e80: 6e 28 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a  n(zFile, "rb");.
0e90: 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
0ea0: 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46     in = fopen(zF
0eb0: 69 6c 65 2c 20 22 72 22 29 3b 0a 20 20 7d 0a 20  ile, "r");.  }. 
0ec0: 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
0ed0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
0ee0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e  lt(interp, "cann
0ef0: 6f 74 20 6f 70 65 6e 20 69 6e 70 75 74 20 66 69  ot open input fi
0f00: 6c 65 20 22 2c 20 7a 46 69 6c 65 2c 20 30 29 3b  le ", zFile, 0);
0f10: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
0f20: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 73 65  ERROR;.  }.  fse
0f30: 65 6b 28 69 6e 2c 20 6f 66 66 73 65 74 2c 20 53  ek(in, offset, S
0f40: 45 45 4b 5f 53 45 54 29 3b 0a 20 20 67 6f 74 20  EEK_SET);.  got 
0f50: 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20 31 2c  = fread(zBuf, 1,
0f60: 20 61 6d 74 2c 20 69 6e 29 3b 0a 20 20 66 63 6c   amt, in);.  fcl
0f70: 6f 73 65 28 69 6e 29 3b 0a 20 20 69 66 28 20 67  ose(in);.  if( g
0f80: 6f 74 3c 30 20 29 7b 0a 20 20 20 20 67 6f 74 20  ot<0 ){.    got 
0f90: 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
0fa0: 65 33 54 65 73 74 42 69 6e 54 6f 48 65 78 28 7a  e3TestBinToHex(z
0fb0: 42 75 66 2c 20 67 6f 74 29 3b 0a 20 20 54 63 6c  Buf, got);.  Tcl
0fc0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
0fd0: 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
0fe0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
0ff0: 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  Buf);.  return T
1000: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
1010: 20 55 73 61 67 65 3a 20 20 20 68 65 78 69 6f 5f   Usage:   hexio_
1020: 77 72 69 74 65 20 20 46 49 4c 45 4e 41 4d 45 20  write  FILENAME 
1030: 20 4f 46 46 53 45 54 20 20 44 41 54 41 0a 2a 2a   OFFSET  DATA.**
1040: 0a 2a 2a 20 57 72 69 74 65 20 44 41 54 41 20 69  .** Write DATA i
1050: 6e 74 6f 20 66 69 6c 65 20 46 49 4c 45 4e 41 4d  nto file FILENAM
1060: 45 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 4f  E beginning at O
1070: 46 46 53 45 54 20 66 72 6f 6d 20 74 68 65 0a 2a  FFSET from the.*
1080: 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  * beginning of t
1090: 68 65 20 66 69 6c 65 2e 20 20 44 41 54 41 20 69  he file.  DATA i
10a0: 73 20 65 78 70 72 65 73 73 65 64 20 69 6e 20 68  s expressed in h
10b0: 65 78 61 64 65 63 69 6d 61 6c 2e 0a 2a 2f 0a 73  exadecimal..*/.s
10c0: 74 61 74 69 63 20 69 6e 74 20 68 65 78 69 6f 5f  tatic int hexio_
10d0: 77 72 69 74 65 28 0a 20 20 76 6f 69 64 20 2a 20  write(.  void * 
10e0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
10f0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1100: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1110: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1120: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6f  bjv[].){.  int o
1130: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 49 6e  ffset;.  int nIn
1140: 2c 20 6e 4f 75 74 2c 20 77 72 69 74 74 65 6e 3b  , nOut, written;
1150: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1160: 46 69 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  File;.  const un
1170: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e  signed char *zIn
1180: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
1190: 72 20 2a 61 4f 75 74 3b 0a 20 20 46 49 4c 45 20  r *aOut;.  FILE 
11a0: 2a 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  *out;..  if( obj
11b0: 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
11c0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
11d0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46  erp, 1, objv, "F
11e0: 49 4c 45 4e 41 4d 45 20 4f 46 46 53 45 54 20 48  ILENAME OFFSET H
11f0: 45 58 44 41 54 41 22 29 3b 0a 20 20 20 20 72 65  EXDATA");.    re
1200: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1210: 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
1220: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1230: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 66  rp, objv[2], &of
1240: 66 73 65 74 29 20 29 20 72 65 74 75 72 6e 20 54  fset) ) return T
1250: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 46 69 6c  CL_ERROR;.  zFil
1260: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
1270: 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 49  g(objv[1]);.  zI
1280: 6e 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  n = (const unsig
1290: 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 47  ned char *)Tcl_G
12a0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
12b0: 6f 62 6a 76 5b 33 5d 2c 20 26 6e 49 6e 29 3b 0a  objv[3], &nIn);.
12c0: 20 20 61 4f 75 74 20 3d 20 73 71 6c 69 74 65 33    aOut = sqlite3
12d0: 5f 6d 61 6c 6c 6f 63 28 20 6e 49 6e 2f 32 20 29  _malloc( nIn/2 )
12e0: 3b 0a 20 20 69 66 28 20 61 4f 75 74 3d 3d 30 20  ;.  if( aOut==0 
12f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
1300: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6e  L_ERROR;.  }.  n
1310: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 54 65 73  Out = sqlite3Tes
1320: 74 48 65 78 54 6f 42 69 6e 28 7a 49 6e 2c 20 6e  tHexToBin(zIn, n
1330: 49 6e 2c 20 61 4f 75 74 29 3b 0a 20 20 6f 75 74  In, aOut);.  out
1340: 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20   = fopen(zFile, 
1350: 22 72 2b 62 22 29 3b 0a 20 20 69 66 28 20 6f 75  "r+b");.  if( ou
1360: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 75 74 20  t==0 ){.    out 
1370: 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22  = fopen(zFile, "
1380: 72 2b 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  r+");.  }.  if( 
1390: 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  out==0 ){.    Tc
13a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
13b0: 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f  nterp, "cannot o
13c0: 70 65 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 20  pen output file 
13d0: 22 2c 20 7a 46 69 6c 65 2c 20 30 29 3b 0a 20 20  ", zFile, 0);.  
13e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13f0: 4f 52 3b 0a 20 20 7d 0a 20 20 66 73 65 65 6b 28  OR;.  }.  fseek(
1400: 6f 75 74 2c 20 6f 66 66 73 65 74 2c 20 53 45 45  out, offset, SEE
1410: 4b 5f 53 45 54 29 3b 0a 20 20 77 72 69 74 74 65  K_SET);.  writte
1420: 6e 20 3d 20 66 77 72 69 74 65 28 61 4f 75 74 2c  n = fwrite(aOut,
1430: 20 31 2c 20 6e 4f 75 74 2c 20 6f 75 74 29 3b 0a   1, nOut, out);.
1440: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
1450: 4f 75 74 29 3b 0a 20 20 66 63 6c 6f 73 65 28 6f  Out);.  fclose(o
1460: 75 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ut);.  Tcl_SetOb
1470: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1480: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 77 72  Tcl_NewIntObj(wr
1490: 69 74 74 65 6e 29 29 3b 0a 20 20 72 65 74 75 72  itten));.  retur
14a0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
14b0: 2a 2a 20 55 53 41 47 45 3a 20 20 20 68 65 78 69  ** USAGE:   hexi
14c0: 6f 5f 67 65 74 5f 69 6e 74 20 20 20 48 45 58 44  o_get_int   HEXD
14d0: 41 54 41 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70  ATA.**.** Interp
14e0: 72 65 74 20 74 68 65 20 48 45 58 44 41 54 41 20  ret the HEXDATA 
14f0: 61 72 67 75 6d 65 6e 74 20 61 73 20 61 20 62 69  argument as a bi
1500: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1510: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
1520: 20 76 61 6c 75 65 20 6f 66 20 74 68 61 74 20 69   value of that i
1530: 6e 74 65 67 65 72 2e 20 20 48 45 58 44 41 54 41  nteger.  HEXDATA
1540: 20 63 61 6e 20 63 6f 6e 74 61 69 6e 20 62 65 74   can contain bet
1550: 77 65 65 6e 20 32 20 61 6e 64 20 38 0a 2a 2a 20  ween 2 and 8.** 
1560: 68 65 78 61 64 65 63 69 6d 61 6c 20 64 69 67 69  hexadecimal digi
1570: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ts..*/.static in
1580: 74 20 68 65 78 69 6f 5f 67 65 74 5f 69 6e 74 28  t hexio_get_int(
1590: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
15a0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
15b0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
15c0: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
15d0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
15e0: 29 7b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20  ){.  int val;.  
15f0: 69 6e 74 20 6e 49 6e 2c 20 6e 4f 75 74 3b 0a 20  int nIn, nOut;. 
1600: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1610: 63 68 61 72 20 2a 7a 49 6e 3b 0a 20 20 75 6e 73  char *zIn;.  uns
1620: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4f 75 74  igned char *aOut
1630: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
1640: 72 20 61 4e 75 6d 5b 34 5d 3b 0a 0a 20 20 69 66  r aNum[4];..  if
1650: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1660: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1670: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1680: 76 2c 20 22 48 45 58 44 41 54 41 22 29 3b 0a 20  v, "HEXDATA");. 
1690: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16a0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 49 6e 20 3d  ROR;.  }.  zIn =
16b0: 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
16c0: 20 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53   char *)Tcl_GetS
16d0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
16e0: 76 5b 31 5d 2c 20 26 6e 49 6e 29 3b 0a 20 20 61  v[1], &nIn);.  a
16f0: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Out = sqlite3_ma
1700: 6c 6c 6f 63 28 20 6e 49 6e 2f 32 20 29 3b 0a 20  lloc( nIn/2 );. 
1710: 20 69 66 28 20 61 4f 75 74 3d 3d 30 20 29 7b 0a   if( aOut==0 ){.
1720: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1730: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6e 4f 75 74  RROR;.  }.  nOut
1740: 20 3d 20 73 71 6c 69 74 65 33 54 65 73 74 48 65   = sqlite3TestHe
1750: 78 54 6f 42 69 6e 28 7a 49 6e 2c 20 6e 49 6e 2c  xToBin(zIn, nIn,
1760: 20 61 4f 75 74 29 3b 0a 20 20 69 66 28 20 6e 4f   aOut);.  if( nO
1770: 75 74 3e 3d 34 20 29 7b 0a 20 20 20 20 6d 65 6d  ut>=4 ){.    mem
1780: 63 70 79 28 61 4e 75 6d 2c 20 61 4f 75 74 2c 20  cpy(aNum, aOut, 
1790: 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  4);.  }else{.   
17a0: 20 6d 65 6d 73 65 74 28 61 4e 75 6d 2c 20 30 2c   memset(aNum, 0,
17b0: 20 73 69 7a 65 6f 66 28 61 4e 75 6d 29 29 3b 0a   sizeof(aNum));.
17c0: 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4e 75 6d      memcpy(&aNum
17d0: 5b 34 2d 6e 4f 75 74 5d 2c 20 61 4f 75 74 2c 20  [4-nOut], aOut, 
17e0: 6e 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  nOut);.  }.  sql
17f0: 69 74 65 33 5f 66 72 65 65 28 61 4f 75 74 29 3b  ite3_free(aOut);
1800: 0a 20 20 76 61 6c 20 3d 20 28 61 4e 75 6d 5b 30  .  val = (aNum[0
1810: 5d 3c 3c 32 34 29 20 7c 20 28 61 4e 75 6d 5b 31  ]<<24) | (aNum[1
1820: 5d 3c 3c 31 36 29 20 7c 20 28 61 4e 75 6d 5b 32  ]<<16) | (aNum[2
1830: 5d 3c 3c 38 29 20 7c 20 61 4e 75 6d 5b 33 5d 3b  ]<<8) | aNum[3];
1840: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1850: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1860: 4e 65 77 49 6e 74 4f 62 6a 28 76 61 6c 29 29 3b  NewIntObj(val));
1870: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1880: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 53 41 47  ;.}.../*.** USAG
1890: 45 3a 20 20 20 68 65 78 69 6f 5f 72 65 6e 64 65  E:   hexio_rende
18a0: 72 5f 69 6e 74 31 36 20 20 20 49 4e 54 45 47 45  r_int16   INTEGE
18b0: 52 0a 2a 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 49  R.**.** Render I
18c0: 4e 54 45 47 45 52 20 68 61 73 20 61 20 31 36 2d  NTEGER has a 16-
18d0: 62 69 74 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  bit big-endian i
18e0: 6e 74 65 67 65 72 20 69 6e 20 68 65 78 61 64 65  nteger in hexade
18f0: 63 69 6d 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  cimal..*/.static
1900: 20 69 6e 74 20 68 65 78 69 6f 5f 72 65 6e 64 65   int hexio_rende
1910: 72 5f 69 6e 74 31 36 28 0a 20 20 76 6f 69 64 20  r_int16(.  void 
1920: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1930: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1940: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1950: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1960: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
1970: 20 76 61 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64   val;.  unsigned
1980: 20 63 68 61 72 20 61 4e 75 6d 5b 31 30 5d 3b 0a   char aNum[10];.
1990: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
19a0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
19b0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
19c0: 2c 20 6f 62 6a 76 2c 20 22 49 4e 54 45 47 45 52  , objv, "INTEGER
19d0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
19e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
19f0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1a00: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1a10: 6a 76 5b 31 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[1], &val) ) r
1a20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a30: 0a 20 20 61 4e 75 6d 5b 30 5d 20 3d 20 76 61 6c  .  aNum[0] = val
1a40: 3e 3e 38 3b 0a 20 20 61 4e 75 6d 5b 31 5d 20 3d  >>8;.  aNum[1] =
1a50: 20 76 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54   val;.  sqlite3T
1a60: 65 73 74 42 69 6e 54 6f 48 65 78 28 61 4e 75 6d  estBinToHex(aNum
1a70: 2c 20 32 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  , 2);.  Tcl_SetO
1a80: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1a90: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1aa0: 6a 28 28 63 68 61 72 2a 29 61 4e 75 6d 2c 20 34  j((char*)aNum, 4
1ab0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1ac0: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
1ad0: 53 41 47 45 3a 20 20 20 68 65 78 69 6f 5f 72 65  SAGE:   hexio_re
1ae0: 6e 64 65 72 5f 69 6e 74 33 32 20 20 20 49 4e 54  nder_int32   INT
1af0: 45 47 45 52 0a 2a 2a 0a 2a 2a 20 52 65 6e 64 65  EGER.**.** Rende
1b00: 72 20 49 4e 54 45 47 45 52 20 68 61 73 20 61 20  r INTEGER has a 
1b10: 33 32 2d 62 69 74 20 62 69 67 2d 65 6e 64 69 61  32-bit big-endia
1b20: 6e 20 69 6e 74 65 67 65 72 20 69 6e 20 68 65 78  n integer in hex
1b30: 61 64 65 63 69 6d 61 6c 2e 0a 2a 2f 0a 73 74 61  adecimal..*/.sta
1b40: 74 69 63 20 69 6e 74 20 68 65 78 69 6f 5f 72 65  tic int hexio_re
1b50: 6e 64 65 72 5f 69 6e 74 33 32 28 0a 20 20 76 6f  nder_int32(.  vo
1b60: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1b70: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1b80: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1b90: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1ba0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1bb0: 69 6e 74 20 76 61 6c 3b 0a 20 20 75 6e 73 69 67  int val;.  unsig
1bc0: 6e 65 64 20 63 68 61 72 20 61 4e 75 6d 5b 31 30  ned char aNum[10
1bd0: 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
1be0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1bf0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1c00: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 49 4e 54 45  , 1, objv, "INTE
1c10: 47 45 52 22 29 3b 0a 20 20 20 20 72 65 74 75 72  GER");.    retur
1c20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1c30: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1c40: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1c50: 20 6f 62 6a 76 5b 31 5d 2c 20 26 76 61 6c 29 20   objv[1], &val) 
1c60: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1c70: 4f 52 3b 0a 20 20 61 4e 75 6d 5b 30 5d 20 3d 20  OR;.  aNum[0] = 
1c80: 76 61 6c 3e 3e 32 34 3b 0a 20 20 61 4e 75 6d 5b  val>>24;.  aNum[
1c90: 31 5d 20 3d 20 76 61 6c 3e 3e 31 36 3b 0a 20 20  1] = val>>16;.  
1ca0: 61 4e 75 6d 5b 32 5d 20 3d 20 76 61 6c 3e 3e 38  aNum[2] = val>>8
1cb0: 3b 0a 20 20 61 4e 75 6d 5b 33 5d 20 3d 20 76 61  ;.  aNum[3] = va
1cc0: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54 65 73 74  l;.  sqlite3Test
1cd0: 42 69 6e 54 6f 48 65 78 28 61 4e 75 6d 2c 20 34  BinToHex(aNum, 4
1ce0: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
1cf0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1d00: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
1d10: 63 68 61 72 2a 29 61 4e 75 6d 2c 20 38 29 29 3b  char*)aNum, 8));
1d20: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1d30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 53 41 47 45  ;.}../*.** USAGE
1d40: 3a 20 20 75 74 66 38 5f 74 6f 5f 75 74 66 38 20  :  utf8_to_utf8 
1d50: 20 48 45 58 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61   HEX.**.** The a
1d60: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 55 54 46  rgument is a UTF
1d70: 38 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  8 string represe
1d80: 6e 74 65 64 20 69 6e 20 68 65 78 61 64 65 63 69  nted in hexadeci
1d90: 6d 61 6c 2e 0a 2a 2a 20 54 68 65 20 55 54 46 38  mal..** The UTF8
1da0: 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 77 65   might not be we
1db0: 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 52 75 6e 20  ll-formed.  Run 
1dc0: 74 68 69 73 20 73 74 72 69 6e 67 20 74 68 72 6f  this string thro
1dd0: 75 67 68 0a 2a 2a 20 73 71 6c 69 74 65 33 55 74  ugh.** sqlite3Ut
1de0: 66 38 74 6f 38 28 29 20 63 6f 6e 76 65 72 74 20  f8to8() convert 
1df0: 69 74 20 62 61 63 6b 20 74 6f 20 68 65 78 20 61  it back to hex a
1e00: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  nd return the re
1e10: 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sult..*/.static 
1e20: 69 6e 74 20 75 74 66 38 5f 74 6f 5f 75 74 66 38  int utf8_to_utf8
1e30: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1e40: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1e50: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1e60: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1e70: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1e80: 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
1e90: 45 5f 44 45 42 55 47 0a 20 20 69 6e 74 20 6e 3b  E_DEBUG.  int n;
1ea0: 0a 20 20 69 6e 74 20 6e 4f 75 74 3b 0a 20 20 63  .  int nOut;.  c
1eb0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1ec0: 61 72 20 2a 7a 4f 72 69 67 3b 0a 20 20 75 6e 73  ar *zOrig;.  uns
1ed0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20  igned char *z;. 
1ee0: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1ef0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1f00: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1f10: 6f 62 6a 76 2c 20 22 48 45 58 22 29 3b 0a 20 20  objv, "HEX");.  
1f20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1f30: 4f 52 3b 0a 20 20 7d 0a 20 20 7a 4f 72 69 67 20  OR;.  }.  zOrig 
1f40: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
1f50: 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   *)Tcl_GetString
1f60: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
1f70: 20 26 6e 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69   &n);.  z = sqli
1f80: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 2b 33 20  te3_malloc( n+3 
1f90: 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
1fa0: 54 65 73 74 48 65 78 54 6f 42 69 6e 28 7a 4f 72  TestHexToBin(zOr
1fb0: 69 67 2c 20 6e 2c 20 7a 29 3b 0a 20 20 7a 5b 6e  ig, n, z);.  z[n
1fc0: 5d 20 3d 20 30 3b 0a 20 20 6e 4f 75 74 20 3d 20  ] = 0;.  nOut = 
1fd0: 73 71 6c 69 74 65 33 55 74 66 38 54 6f 38 28 7a  sqlite3Utf8To8(z
1fe0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 65 73 74  );.  sqlite3Test
1ff0: 42 69 6e 54 6f 48 65 78 28 7a 2c 6e 4f 75 74 29  BinToHex(z,nOut)
2000: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
2010: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
2020: 61 72 2a 29 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  ar*)z, 0);.  sql
2030: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65  ite3_free(z);.#e
2040: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
2050: 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
2060: 52 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64  Register command
2070: 73 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69  s with the TCL i
2080: 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69  nterpreter..*/.i
2090: 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 68 65  nt Sqlitetest_he
20a0: 78 69 6f 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  xio_Init(Tcl_Int
20b0: 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20  erp *interp){.  
20c0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a  static struct {.
20d0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
20e0: 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d  ;.     Tcl_ObjCm
20f0: 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20  dProc *xProc;.  
2100: 7d 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a  } aObjCmd[] = {.
2110: 20 20 20 20 20 7b 20 22 68 65 78 69 6f 5f 72 65       { "hexio_re
2120: 61 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ad",            
2130: 20 20 20 20 20 20 20 68 65 78 69 6f 5f 72 65 61         hexio_rea
2140: 64 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  d            },.
2150: 20 20 20 20 20 7b 20 22 68 65 78 69 6f 5f 77 72       { "hexio_wr
2160: 69 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ite",           
2170: 20 20 20 20 20 20 20 68 65 78 69 6f 5f 77 72 69         hexio_wri
2180: 74 65 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  te           },.
2190: 20 20 20 20 20 7b 20 22 68 65 78 69 6f 5f 67 65       { "hexio_ge
21a0: 74 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20  t_int",         
21b0: 20 20 20 20 20 20 20 68 65 78 69 6f 5f 67 65 74         hexio_get
21c0: 5f 69 6e 74 20 20 20 20 20 20 20 20 20 7d 2c 0a  _int         },.
21d0: 20 20 20 20 20 7b 20 22 68 65 78 69 6f 5f 72 65       { "hexio_re
21e0: 6e 64 65 72 5f 69 6e 74 31 36 22 2c 20 20 20 20  nder_int16",    
21f0: 20 20 20 20 20 20 20 68 65 78 69 6f 5f 72 65 6e         hexio_ren
2200: 64 65 72 5f 69 6e 74 31 36 20 20 20 20 7d 2c 0a  der_int16    },.
2210: 20 20 20 20 20 7b 20 22 68 65 78 69 6f 5f 72 65       { "hexio_re
2220: 6e 64 65 72 5f 69 6e 74 33 32 22 2c 20 20 20 20  nder_int32",    
2230: 20 20 20 20 20 20 20 68 65 78 69 6f 5f 72 65 6e         hexio_ren
2240: 64 65 72 5f 69 6e 74 33 32 20 20 20 20 7d 2c 0a  der_int32    },.
2250: 20 20 20 20 20 7b 20 22 75 74 66 38 5f 74 6f 5f       { "utf8_to_
2260: 75 74 66 38 22 2c 20 20 20 20 20 20 20 20 20 20  utf8",          
2270: 20 20 20 20 20 20 20 75 74 66 38 5f 74 6f 5f 75         utf8_to_u
2280: 74 66 38 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  tf8          },.
2290: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
22a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
22b0: 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f  f(aObjCmd)/sizeo
22c0: 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69  f(aObjCmd[0]); i
22d0: 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65  ++){.    Tcl_Cre
22e0: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
22f0: 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d  terp, aObjCmd[i]
2300: 2e 7a 4e 61 6d 65 2c 20 61 4f 62 6a 43 6d 64 5b  .zName, aObjCmd[
2310: 69 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30 29 3b  i].xProc, 0, 0);
2320: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
2330: 4c 5f 4f 4b 3b 0a 7d 0a                          L_OK;.}.