/ Hex Artifact Content
Login

Artifact cf929a63c3db5d893c24c89377871cb89ede44e2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 32 20 41 70 72 69 6c  /*.** 2002 April
0010: 20 32 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75   25.**.** The au
0020: 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63  thor disclaims c
0030: 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73  opyright to this
0040: 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49   source code.  I
0050: 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20  n place of.** a 
0060: 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65  legal notice, he
0070: 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67  re is a blessing
0080: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79  :.**.**    May y
0090: 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e  ou do good and n
00a0: 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d  ot evil..**    M
00b0: 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67  ay you find forg
00c0: 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72  iveness for your
00d0: 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65  self and forgive
00e0: 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d   others..**    M
00f0: 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65  ay you share fre
0100: 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e  ely, never takin
0110: 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20  g more than you 
0120: 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  give..**.*******
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 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
0180: 63 6f 6e 74 61 69 6e 73 20 68 65 6c 70 65 72 20  contains helper 
0190: 72 6f 75 74 69 6e 65 73 20 75 73 65 64 20 74 6f  routines used to
01a0: 20 74 72 61 6e 73 6c 61 74 65 20 62 69 6e 61 72   translate binar
01b0: 79 20 64 61 74 61 20 69 6e 74 6f 0a 2a 2a 20 61  y data into.** a
01c0: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
01d0: 20 73 74 72 69 6e 67 20 28 73 75 69 74 61 62 6c   string (suitabl
01e0: 65 20 66 6f 72 20 75 73 65 20 69 6e 20 53 51 4c  e for use in SQL
01f0: 69 74 65 29 20 61 6e 64 20 62 61 63 6b 20 61 67  ite) and back ag
0200: 61 69 6e 2e 0a 2a 2a 20 54 68 65 73 65 20 61 72  ain..** These ar
0210: 65 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f  e convenience ro
0220: 75 74 69 6e 65 73 20 66 6f 72 20 75 73 65 20 62  utines for use b
0230: 79 20 70 65 6f 70 6c 65 20 77 68 6f 20 77 61 6e  y people who wan
0240: 74 20 74 6f 20 73 74 6f 72 65 20 62 69 6e 61 72  t to store binar
0250: 79 0a 2a 2a 20 64 61 74 61 20 69 6e 20 61 6e 20  y.** data in an 
0260: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e  SQLite database.
0270: 20 20 54 68 65 20 63 6f 64 65 20 69 6e 20 74 68    The code in th
0280: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0290: 62 79 20 61 6e 79 20 6f 74 68 65 72 0a 2a 2a 20  by any other.** 
02a0: 70 61 72 74 20 6f 66 20 74 68 65 20 53 51 4c 69  part of the SQLi
02b0: 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a 2a  te library..**.*
02c0: 2a 20 24 49 64 3a 20 65 6e 63 6f 64 65 2e 63 2c  * $Id: encode.c,
02d0: 76 20 31 2e 31 20 32 30 30 32 2f 30 34 2f 32 35  v 1.1 2002/04/25
02e0: 20 31 31 3a 34 35 3a 34 32 20 64 72 68 20 45 78   11:45:42 drh Ex
02f0: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0300: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0310: 6e 63 6c 75 64 65 20 22 65 6e 63 6f 64 65 2e 68  nclude "encode.h
0320: 22 0a 0a 2f 2a 0a 2a 2a 20 45 6e 63 6f 64 65 20  "../*.** Encode 
0330: 61 20 62 69 6e 61 72 79 20 62 75 66 66 65 72 20  a binary buffer 
0340: 22 69 6e 22 20 6f 66 20 73 69 7a 65 20 6e 20 62  "in" of size n b
0350: 79 74 65 73 20 73 6f 20 74 68 61 74 20 69 74 20  ytes so that it 
0360: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6e 6f 20 69  contains.** no i
0370: 6e 73 74 61 6e 63 65 73 20 6f 66 20 63 68 61 72  nstances of char
0380: 61 63 74 65 72 73 20 27 5c 27 27 20 6f 72 20 27  acters '\'' or '
0390: 5c 30 30 30 27 2e 20 20 54 68 65 20 6f 75 74 70  \000'.  The outp
03a0: 75 74 20 69 73 20 0a 2a 2a 20 6e 75 6c 6c 2d 74  ut is .** null-t
03b0: 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 63 61  erminated and ca
03c0: 6e 20 62 65 20 75 73 65 64 20 61 73 20 61 20 73  n be used as a s
03d0: 74 72 69 6e 67 20 76 61 6c 75 65 20 69 6e 20 61  tring value in a
03e0: 6e 20 49 4e 53 45 52 54 0a 2a 2a 20 6f 72 20 55  n INSERT.** or U
03f0: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  PDATE statement.
0400: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
0410: 74 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  t is written int
0420: 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
0430: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 22   output buffer "
0440: 6f 75 74 22 2e 0a 2a 2a 20 22 6f 75 74 22 20 6d  out"..** "out" m
0450: 75 73 74 20 62 65 20 61 62 6c 65 20 74 6f 20 68  ust be able to h
0460: 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 32 20 2b  old at least 2 +
0470: 20 28 6e 2b 32 35 35 29 2a 33 2f 32 35 36 20 2b   (n+255)*3/256 +
0480: 20 6e 20 62 79 74 65 73 2e 0a 2a 2a 20 49 6e 20   n bytes..** In 
0490: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
04a0: 20 6f 75 74 70 75 74 20 77 69 6c 6c 20 62 65 20   output will be 
04b0: 65 78 70 61 6e 64 65 64 20 62 79 20 61 73 20 6d  expanded by as m
04c0: 75 63 68 20 61 73 20 33 0a 2a 2a 20 62 79 74 65  uch as 3.** byte
04d0: 73 20 66 6f 72 20 65 76 65 72 79 20 32 35 36 20  s for every 256 
04e0: 62 79 74 65 73 20 6f 66 20 69 6e 70 75 74 20 70  bytes of input p
04f0: 6c 75 73 20 32 20 62 79 74 65 73 20 6f 66 20 66  lus 2 bytes of f
0500: 69 78 65 64 20 6f 76 65 72 68 65 61 64 2e 0a 2a  ixed overhead..*
0510: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 5f 65 6e  /.void sqlite_en
0520: 63 6f 64 65 5f 62 69 6e 61 72 79 28 63 6f 6e 73  code_binary(cons
0530: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
0540: 2a 69 6e 2c 20 69 6e 74 20 6e 2c 20 75 6e 73 69  *in, int n, unsi
0550: 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 29 7b  gned char *out){
0560: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 65 2c 20  .  int i, j, e, 
0570: 6d 3b 0a 20 20 69 6e 74 20 63 6e 74 5b 32 35 36  m;.  int cnt[256
0580: 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 63 6e 74 2c  ];.  memset(cnt,
0590: 20 30 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29   0, sizeof(cnt))
05a0: 3b 0a 20 20 66 6f 72 28 69 3d 6e 2d 31 3b 20 69  ;.  for(i=n-1; i
05b0: 3e 3d 30 3b 20 69 2d 2d 29 7b 20 63 6e 74 5b 69  >=0; i--){ cnt[i
05c0: 6e 5b 69 5d 5d 2b 2b 3b 20 7d 0a 20 20 6d 20 3d  n[i]]++; }.  m =
05d0: 20 6e 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   n;.  for(i=1; i
05e0: 3c 32 35 36 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <256; i++){.    
05f0: 69 6e 74 20 73 75 6d 3b 0a 20 20 20 20 69 66 28  int sum;.    if(
0600: 20 69 3d 3d 27 5c 27 27 20 29 20 63 6f 6e 74 69   i=='\'' ) conti
0610: 6e 75 65 3b 0a 20 20 20 20 73 75 6d 20 3d 20 63  nue;.    sum = c
0620: 6e 74 5b 69 5d 20 2b 20 63 6e 74 5b 28 69 2b 31  nt[i] + cnt[(i+1
0630: 29 26 30 78 66 66 5d 20 2b 20 63 6e 74 5b 28 69  )&0xff] + cnt[(i
0640: 2b 27 5c 27 27 29 26 30 78 66 66 5d 3b 0a 20 20  +'\'')&0xff];.  
0650: 20 20 69 66 28 20 73 75 6d 3c 6d 20 29 7b 0a 20    if( sum<m ){. 
0660: 20 20 20 20 20 6d 20 3d 20 73 75 6d 3b 0a 20 20       m = sum;.  
0670: 20 20 20 20 65 20 3d 20 69 3b 0a 20 20 20 20 20      e = i;.     
0680: 20 69 66 28 20 6d 3d 3d 30 20 29 20 62 72 65 61   if( m==0 ) brea
0690: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6f  k;.    }.  }.  o
06a0: 75 74 5b 30 5d 20 3d 20 65 3b 0a 20 20 6a 20 3d  ut[0] = e;.  j =
06b0: 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   1;.  for(i=0; i
06c0: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  <n; i++){.    in
06d0: 74 20 63 20 3d 20 28 69 6e 5b 69 5d 20 2d 20 65  t c = (in[i] - e
06e0: 29 26 30 78 66 66 3b 0a 20 20 20 20 69 66 28 20  )&0xff;.    if( 
06f0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 75  c==0 ){.      ou
0700: 74 5b 6a 2b 2b 5d 20 3d 20 31 3b 0a 20 20 20 20  t[j++] = 1;.    
0710: 20 20 6f 75 74 5b 6a 2b 2b 5d 20 3d 20 31 3b 0a    out[j++] = 1;.
0720: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
0730: 3d 31 20 29 7b 0a 20 20 20 20 20 20 6f 75 74 5b  =1 ){.      out[
0740: 6a 2b 2b 5d 20 3d 20 31 3b 0a 20 20 20 20 20 20  j++] = 1;.      
0750: 6f 75 74 5b 6a 2b 2b 5d 20 3d 20 32 3b 0a 20 20  out[j++] = 2;.  
0760: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
0770: 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 6f 75 74  \'' ){.      out
0780: 5b 6a 2b 2b 5d 20 3d 20 31 3b 0a 20 20 20 20 20  [j++] = 1;.     
0790: 20 6f 75 74 5b 6a 2b 2b 5d 20 3d 20 33 3b 0a 20   out[j++] = 3;. 
07a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
07b0: 6f 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20  out[j++] = c;.  
07c0: 20 20 7d 0a 20 20 7d 0a 20 20 6f 75 74 5b 6a 2b    }.  }.  out[j+
07d0: 2b 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  +] = 0;.}../*.**
07e0: 20 44 65 63 6f 64 65 20 74 68 65 20 73 74 72 69   Decode the stri
07f0: 6e 67 20 22 69 6e 22 20 69 6e 74 6f 20 62 69 6e  ng "in" into bin
0800: 61 72 79 20 64 61 74 61 20 61 6e 64 20 77 72 69  ary data and wri
0810: 74 65 20 69 74 20 69 6e 74 6f 20 22 6f 75 74 22  te it into "out"
0820: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
0830: 65 20 72 65 76 65 72 73 65 73 20 74 68 65 20 65  e reverses the e
0840: 6e 63 6f 64 65 64 20 63 72 65 61 74 65 64 20 62  ncoded created b
0850: 79 20 73 71 6c 69 74 65 5f 65 6e 63 6f 64 65 5f  y sqlite_encode_
0860: 62 69 6e 61 72 79 28 29 2e 0a 2a 2a 20 54 68 65  binary()..** The
0870: 20 6f 75 74 70 75 74 20 77 69 6c 6c 20 61 6c 77   output will alw
0880: 61 79 73 20 62 65 20 61 20 66 65 77 20 62 79 74  ays be a few byt
0890: 65 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  es less than the
08a0: 20 69 6e 70 75 74 2e 20 20 54 68 65 20 6e 75 6d   input.  The num
08b0: 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20  ber.** of bytes 
08c0: 6f 66 20 6f 75 74 70 75 74 20 69 73 20 72 65 74  of output is ret
08d0: 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 69  urned.  If the i
08e0: 6e 70 75 74 20 69 73 20 6e 6f 74 20 61 20 77 65  nput is not a we
08f0: 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 65 6e 63  ll-formed.** enc
0900: 6f 64 69 6e 67 2c 20 2d 31 20 69 73 20 72 65 74  oding, -1 is ret
0910: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
0920: 20 22 69 6e 22 20 61 6e 64 20 22 6f 75 74 22 20   "in" and "out" 
0930: 70 61 72 61 6d 65 74 65 72 73 20 6d 61 79 20 70  parameters may p
0940: 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65  oint to the same
0950: 20 62 75 66 66 65 72 20 69 6e 20 6f 72 64 65 72   buffer in order
0960: 0a 2a 2a 20 74 6f 20 64 65 63 6f 64 65 20 61 20  .** to decode a 
0970: 73 74 72 69 6e 67 20 69 6e 20 70 6c 61 63 65 2e  string in place.
0980: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 5f 64  .*/.int sqlite_d
0990: 65 63 6f 64 65 5f 62 69 6e 61 72 79 28 63 6f 6e  ecode_binary(con
09a0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
09b0: 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63   *in, unsigned c
09c0: 68 61 72 20 2a 6f 75 74 29 7b 0a 20 20 69 6e 74  har *out){.  int
09d0: 20 69 2c 20 63 2c 20 65 3b 0a 20 20 65 20 3d 20   i, c, e;.  e = 
09e0: 2a 28 69 6e 2b 2b 29 3b 0a 20 20 69 20 3d 20 30  *(in++);.  i = 0
09f0: 3b 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20  ;.  while( (c = 
0a00: 2a 28 69 6e 2b 2b 29 29 21 3d 30 20 29 7b 0a 20  *(in++))!=0 ){. 
0a10: 20 20 20 69 66 28 20 63 3d 3d 31 20 29 7b 0a 20     if( c==1 ){. 
0a20: 20 20 20 20 20 63 20 3d 20 2a 28 69 6e 2b 2b 29       c = *(in++)
0a30: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 31  ;.      if( c==1
0a40: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
0a50: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
0a60: 66 28 20 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  f( c==2 ){.     
0a70: 20 20 20 63 20 3d 20 31 3b 0a 20 20 20 20 20 20     c = 1;.      
0a80: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 33 20 29  }else if( c==3 )
0a90: 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
0aa0: 27 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  '';.      }else{
0ab0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0ac0: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
0ad0: 7d 0a 20 20 20 20 6f 75 74 5b 69 2b 2b 5d 20 3d  }.    out[i++] =
0ae0: 20 28 63 20 2b 20 65 29 26 30 78 66 66 3b 0a 20   (c + e)&0xff;. 
0af0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
0b00: 0a 0a 23 69 66 64 65 66 20 45 4e 43 4f 44 45 52  ..#ifdef ENCODER
0b10: 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 65 20  _TEST./*.** The 
0b20: 73 75 62 72 6f 75 74 69 6e 65 73 20 61 62 6f 76  subroutines abov
0b30: 65 20 61 72 65 20 6e 6f 74 20 74 65 73 74 65 64  e are not tested
0b40: 20 62 79 20 74 68 65 20 75 73 75 61 6c 20 74 65   by the usual te
0b50: 73 74 20 73 75 69 74 65 2e 20 20 54 6f 20 74 65  st suite.  To te
0b60: 73 74 0a 2a 2a 20 74 68 65 73 65 20 72 6f 75 74  st.** these rout
0b70: 69 6e 65 73 2c 20 63 6f 6d 70 69 6c 65 20 6a 75  ines, compile ju
0b80: 73 74 20 74 68 69 73 20 6f 6e 65 20 66 69 6c 65  st this one file
0b90: 20 77 69 74 68 20 61 20 2d 44 45 4e 43 4f 44 45   with a -DENCODE
0ba0: 52 5f 54 45 53 54 3d 31 20 6f 70 74 69 6f 6e 0a  R_TEST=1 option.
0bb0: 2a 2a 20 61 6e 64 20 72 75 6e 20 74 68 65 20 72  ** and run the r
0bc0: 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 6d 61  esult..*/.int ma
0bd0: 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61  in(int argc, cha
0be0: 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74  r **argv){.  int
0bf0: 20 69 2c 20 6a 2c 20 6e 2c 20 6d 3b 0a 20 20 75   i, j, n, m;.  u
0c00: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 5b  nsigned char in[
0c10: 32 30 30 30 30 5d 3b 0a 20 20 75 6e 73 69 67 6e  20000];.  unsign
0c20: 65 64 20 63 68 61 72 20 6f 75 74 5b 33 30 30 30  ed char out[3000
0c30: 30 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0];..  for(i=0; 
0c40: 69 3c 31 30 30 30 30 3b 20 69 2b 2b 29 7b 0a 20  i<10000; i++){. 
0c50: 20 20 20 70 72 69 6e 74 66 28 22 54 65 73 74 20     printf("Test 
0c60: 25 64 3a 20 22 2c 20 69 2b 31 29 3b 0a 20 20 20  %d: ", i+1);.   
0c70: 20 6e 20 3d 20 72 61 6e 64 28 29 20 25 20 73 69   n = rand() % si
0c80: 7a 65 6f 66 28 69 6e 29 3b 0a 20 20 20 20 66 6f  zeof(in);.    fo
0c90: 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29  r(j=0; j<n; j++)
0ca0: 20 69 6e 5b 6a 5d 20 3d 20 72 61 6e 64 28 29 20   in[j] = rand() 
0cb0: 26 20 30 78 66 66 3b 0a 20 20 20 20 73 71 6c 69  & 0xff;.    sqli
0cc0: 74 65 5f 65 6e 63 6f 64 65 5f 62 69 6e 61 72 79  te_encode_binary
0cd0: 28 69 6e 2c 20 6e 2c 20 6f 75 74 29 3b 0a 20 20  (in, n, out);.  
0ce0: 20 20 70 72 69 6e 74 66 28 22 73 69 7a 65 20 25    printf("size %
0cf0: 64 2d 3e 25 64 20 22 2c 20 6e 2c 20 73 74 72 6c  d->%d ", n, strl
0d00: 65 6e 28 6f 75 74 29 2b 31 29 3b 0a 20 20 20 20  en(out)+1);.    
0d10: 6d 20 3d 20 32 20 2b 20 28 6e 2b 32 35 35 29 2a  m = 2 + (n+255)*
0d20: 33 2f 32 35 36 20 2b 20 6e 3b 0a 20 20 20 20 69  3/256 + n;.    i
0d30: 66 28 20 73 74 72 6c 65 6e 28 6f 75 74 29 2b 31  f( strlen(out)+1
0d40: 3e 6d 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e  >m ){.      prin
0d50: 74 66 28 22 20 45 52 52 4f 52 20 6f 75 74 70 75  tf(" ERROR outpu
0d60: 74 20 74 6f 6f 20 62 69 67 5c 6e 22 29 3b 0a 20  t too big\n");. 
0d70: 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
0d80: 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b    }.    for(j=0;
0d90: 20 6f 75 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20   out[j]; j++){. 
0da0: 20 20 20 20 20 69 66 28 20 6f 75 74 5b 6a 5d 3d       if( out[j]=
0db0: 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\'' ){.       
0dc0: 20 70 72 69 6e 74 66 28 22 20 45 52 52 4f 52 20   printf(" ERROR 
0dd0: 63 6f 6e 74 61 69 6e 73 20 28 27 29 5c 6e 22 29  contains (')\n")
0de0: 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 31  ;.        exit(1
0df0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
0e00: 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 5f  .    j = sqlite_
0e10: 64 65 63 6f 64 65 5f 62 69 6e 61 72 79 28 6f 75  decode_binary(ou
0e20: 74 2c 20 6f 75 74 29 3b 0a 20 20 20 20 69 66 28  t, out);.    if(
0e30: 20 6a 21 3d 6e 20 29 7b 0a 20 20 20 20 20 20 70   j!=n ){.      p
0e40: 72 69 6e 74 66 28 22 20 45 52 52 4f 52 20 64 65  rintf(" ERROR de
0e50: 63 6f 64 65 20 73 69 7a 65 20 25 64 5c 6e 22 2c  code size %d\n",
0e60: 20 6a 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28   j);.      exit(
0e70: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
0e80: 28 20 6d 65 6d 63 6d 70 28 69 6e 2c 20 6f 75 74  ( memcmp(in, out
0e90: 2c 20 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , n)!=0 ){.     
0ea0: 20 70 72 69 6e 74 66 28 22 20 45 52 52 4f 52 20   printf(" ERROR 
0eb0: 64 65 63 6f 64 65 20 6d 69 73 6d 61 74 63 68 5c  decode mismatch\
0ec0: 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  n");.      exit(
0ed0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72  1);.    }.    pr
0ee0: 69 6e 74 66 28 22 20 4f 4b 5c 6e 22 29 3b 0a 20  intf(" OK\n");. 
0ef0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 45   }.}.#endif /* E
0f00: 4e 43 4f 44 45 52 5f 54 45 53 54 20 2a 2f 0a     NCODER_TEST */.