System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 1d21f7f5ad8f417d1736ce8dac515e0c0966bdef:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 31 33 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75   13.**.** 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 72 6f 75 74 69 6e 65  contains routine
0190: 73 20 75 73 65 64 20 74 6f 20 74 72 61 6e 73 6c  s used to transl
01a0: 61 74 65 20 62 65 74 77 65 65 6e 20 55 54 46 2d  ate between UTF-
01b0: 38 2c 20 0a 2a 2a 20 55 54 46 2d 31 36 2c 20 55  8, .** UTF-16, U
01c0: 54 46 2d 31 36 42 45 2c 20 61 6e 64 20 55 54 46  TF-16BE, and UTF
01d0: 2d 31 36 4c 45 2e 0a 2a 2a 0a 2a 2a 20 24 49 64  -16LE..**.** $Id
01e0: 3a 20 75 74 66 2e 63 2c 76 20 31 2e 31 20 32 30  : utf.c,v 1.1 20
01f0: 30 38 2f 30 38 2f 30 36 20 32 31 3a 34 38 3a 30  08/08/06 21:48:0
0200: 37 20 72 6d 73 69 6d 70 73 6f 6e 20 45 78 70 20  7 rmsimpson Exp 
0210: 24 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73 20 6f 6e  $.**.** Notes on
0220: 20 55 54 46 2d 38 3a 0a 2a 2a 0a 2a 2a 20 20 20   UTF-8:.**.**   
0230: 42 79 74 65 2d 30 20 20 20 20 42 79 74 65 2d 31  Byte-0    Byte-1
0240: 20 20 20 20 42 79 74 65 2d 32 20 20 20 20 42 79      Byte-2    By
0250: 74 65 2d 33 20 20 20 20 56 61 6c 75 65 0a 2a 2a  te-3    Value.**
0260: 20 20 30 78 78 78 78 78 78 78 20 20 20 20 20 20    0xxxxxxx      
0270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0280: 20 20 20 20 20 20 20 20 20 20 20 30 30 30 30 30             00000
0290: 30 30 30 20 30 30 30 30 30 30 30 30 20 30 78 78  000 00000000 0xx
02a0: 78 78 78 78 78 0a 2a 2a 20 20 31 31 30 79 79 79  xxxxx.**  110yyy
02b0: 79 79 20 20 31 30 78 78 78 78 78 78 20 20 20 20  yy  10xxxxxx    
02c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02d0: 20 20 20 30 30 30 30 30 30 30 30 20 30 30 30 30     00000000 0000
02e0: 30 79 79 79 20 79 79 78 78 78 78 78 78 0a 2a 2a  0yyy yyxxxxxx.**
02f0: 20 20 31 31 31 30 7a 7a 7a 7a 20 20 31 30 79 79    1110zzzz  10yy
0300: 79 79 79 79 20 20 31 30 78 78 78 78 78 78 20 20  yyyy  10xxxxxx  
0310: 20 20 20 20 20 20 20 20 20 20 20 30 30 30 30 30             00000
0320: 30 30 30 20 7a 7a 7a 7a 79 79 79 79 20 79 79 78  000 zzzzyyyy yyx
0330: 78 78 78 78 78 0a 2a 2a 20 20 31 31 31 31 30 75  xxxxx.**  11110u
0340: 75 75 20 20 31 30 75 75 7a 7a 7a 7a 20 20 31 30  uu  10uuzzzz  10
0350: 79 79 79 79 79 79 20 20 31 30 78 78 78 78 78 78  yyyyyy  10xxxxxx
0360: 20 20 20 30 30 30 75 75 75 75 75 20 7a 7a 7a 7a     000uuuuu zzzz
0370: 79 79 79 79 20 79 79 78 78 78 78 78 78 0a 2a 2a  yyyy yyxxxxxx.**
0380: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73 20 6f 6e 20  .**.** Notes on 
0390: 55 54 46 2d 31 36 3a 20 20 28 77 69 74 68 20 77  UTF-16:  (with w
03a0: 77 77 77 2b 31 3d 3d 75 75 75 75 75 29 0a 2a 2a  www+1==uuuuu).**
03b0: 0a 2a 2a 20 20 20 20 20 20 57 6f 72 64 2d 30 20  .**      Word-0 
03c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 6f                Wo
03d0: 72 64 2d 31 20 20 20 20 20 20 20 20 20 20 56 61  rd-1          Va
03e0: 6c 75 65 0a 2a 2a 20 20 31 31 30 31 31 30 77 77  lue.**  110110ww
03f0: 20 77 77 7a 7a 7a 7a 79 79 20 20 20 31 31 30 31   wwzzzzyy   1101
0400: 31 31 79 79 20 79 79 78 78 78 78 78 78 20 20 20  11yy yyxxxxxx   
0410: 20 30 30 30 75 75 75 75 75 20 7a 7a 7a 7a 79 79   000uuuuu zzzzyy
0420: 79 79 20 79 79 78 78 78 78 78 78 0a 2a 2a 20 20  yy yyxxxxxx.**  
0430: 7a 7a 7a 7a 79 79 79 79 20 79 79 78 78 78 78 78  zzzzyyyy yyxxxxx
0440: 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
0450: 20 20 20 20 20 20 20 20 20 30 30 30 30 30 30 30           0000000
0460: 30 20 7a 7a 7a 7a 79 79 79 79 20 79 79 78 78 78  0 zzzzyyyy yyxxx
0470: 78 78 78 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 42 4f 4d  xxx.**.**.** BOM
0480: 20 6f 72 20 42 79 74 65 20 4f 72 64 65 72 20 4d   or Byte Order M
0490: 61 72 6b 3a 0a 2a 2a 20 20 20 20 20 30 78 66 66  ark:.**     0xff
04a0: 20 30 78 66 65 20 20 20 6c 69 74 74 6c 65 2d 65   0xfe   little-e
04b0: 6e 64 69 61 6e 20 75 74 66 2d 31 36 20 66 6f 6c  ndian utf-16 fol
04c0: 6c 6f 77 73 0a 2a 2a 20 20 20 20 20 30 78 66 65  lows.**     0xfe
04d0: 20 30 78 66 66 20 20 20 62 69 67 2d 65 6e 64 69   0xff   big-endi
04e0: 61 6e 20 75 74 66 2d 31 36 20 66 6f 6c 6c 6f 77  an utf-16 follow
04f0: 73 0a 2a 2a 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  s.**.*/.#include
0500: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23   "sqliteInt.h".#
0510: 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e  include <assert.
0520: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 76 64 62  h>.#include "vdb
0530: 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54  eInt.h"../*.** T
0540: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
0550: 73 74 61 6e 74 20 76 61 6c 75 65 20 69 73 20 75  stant value is u
0560: 73 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  sed by the SQLIT
0570: 45 5f 42 49 47 45 4e 44 49 41 4e 20 61 6e 64 0a  E_BIGENDIAN and.
0580: 2a 2a 20 53 51 4c 49 54 45 5f 4c 49 54 54 4c 45  ** SQLITE_LITTLE
0590: 45 4e 44 49 41 4e 20 6d 61 63 72 6f 73 2e 0a 2a  ENDIAN macros..*
05a0: 2f 0a 63 6f 6e 73 74 20 69 6e 74 20 73 71 6c 69  /.const int sqli
05b0: 74 65 33 6f 6e 65 20 3d 20 31 3b 0a 0a 2f 2a 0a  te3one = 1;../*.
05c0: 2a 2a 20 54 68 69 73 20 6c 6f 6f 6b 75 70 20 74  ** This lookup t
05d0: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
05e0: 68 65 6c 70 20 64 65 63 6f 64 65 20 74 68 65 20  help decode the 
05f0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a  first byte of.**
0600: 20 61 20 6d 75 6c 74 69 2d 62 79 74 65 20 55 54   a multi-byte UT
0610: 46 38 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  F8 character..*/
0620: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
0630: 73 69 67 6e 65 64 20 63 68 61 72 20 73 71 6c 69  signed char sqli
0640: 74 65 33 55 74 66 54 72 61 6e 73 31 5b 5d 20 3d  te3UtfTrans1[] =
0650: 20 7b 0a 20 20 30 78 30 30 2c 20 30 78 30 31 2c   {.  0x00, 0x01,
0660: 20 30 78 30 32 2c 20 30 78 30 33 2c 20 30 78 30   0x02, 0x03, 0x0
0670: 34 2c 20 30 78 30 35 2c 20 30 78 30 36 2c 20 30  4, 0x05, 0x06, 0
0680: 78 30 37 2c 0a 20 20 30 78 30 38 2c 20 30 78 30  x07,.  0x08, 0x0
0690: 39 2c 20 30 78 30 61 2c 20 30 78 30 62 2c 20 30  9, 0x0a, 0x0b, 0
06a0: 78 30 63 2c 20 30 78 30 64 2c 20 30 78 30 65 2c  x0c, 0x0d, 0x0e,
06b0: 20 30 78 30 66 2c 0a 20 20 30 78 31 30 2c 20 30   0x0f,.  0x10, 0
06c0: 78 31 31 2c 20 30 78 31 32 2c 20 30 78 31 33 2c  x11, 0x12, 0x13,
06d0: 20 30 78 31 34 2c 20 30 78 31 35 2c 20 30 78 31   0x14, 0x15, 0x1
06e0: 36 2c 20 30 78 31 37 2c 0a 20 20 30 78 31 38 2c  6, 0x17,.  0x18,
06f0: 20 30 78 31 39 2c 20 30 78 31 61 2c 20 30 78 31   0x19, 0x1a, 0x1
0700: 62 2c 20 30 78 31 63 2c 20 30 78 31 64 2c 20 30  b, 0x1c, 0x1d, 0
0710: 78 31 65 2c 20 30 78 31 66 2c 0a 20 20 30 78 30  x1e, 0x1f,.  0x0
0720: 30 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20 30  0, 0x01, 0x02, 0
0730: 78 30 33 2c 20 30 78 30 34 2c 20 30 78 30 35 2c  x03, 0x04, 0x05,
0740: 20 30 78 30 36 2c 20 30 78 30 37 2c 0a 20 20 30   0x06, 0x07,.  0
0750: 78 30 38 2c 20 30 78 30 39 2c 20 30 78 30 61 2c  x08, 0x09, 0x0a,
0760: 20 30 78 30 62 2c 20 30 78 30 63 2c 20 30 78 30   0x0b, 0x0c, 0x0
0770: 64 2c 20 30 78 30 65 2c 20 30 78 30 66 2c 0a 20  d, 0x0e, 0x0f,. 
0780: 20 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30   0x00, 0x01, 0x0
0790: 32 2c 20 30 78 30 33 2c 20 30 78 30 34 2c 20 30  2, 0x03, 0x04, 0
07a0: 78 30 35 2c 20 30 78 30 36 2c 20 30 78 30 37 2c  x05, 0x06, 0x07,
07b0: 0a 20 20 30 78 30 30 2c 20 30 78 30 31 2c 20 30  .  0x00, 0x01, 0
07c0: 78 30 32 2c 20 30 78 30 33 2c 20 30 78 30 30 2c  x02, 0x03, 0x00,
07d0: 20 30 78 30 31 2c 20 30 78 30 30 2c 20 30 78 30   0x01, 0x00, 0x0
07e0: 30 2c 0a 7d 3b 0a 0a 0a 23 64 65 66 69 6e 65 20  0,.};...#define 
07f0: 57 52 49 54 45 5f 55 54 46 38 28 7a 4f 75 74 2c  WRITE_UTF8(zOut,
0800: 20 63 29 20 7b 20 20 20 20 20 20 20 20 20 20 20   c) {           
0810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
0820: 0a 20 20 69 66 28 20 63 3c 30 78 30 30 30 38 30  .  if( c<0x00080
0830: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a          \.    *z
0860: 4f 75 74 2b 2b 20 3d 20 28 63 26 30 78 46 46 29  Out++ = (c&0xFF)
0870: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0890: 20 5c 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20   \.  }          
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 65 6c            \.  el
08d0: 73 65 20 69 66 28 20 63 3c 30 78 30 30 38 30 30  se if( c<0x00800
08e0: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b     \.    *zOut++
0910: 20 3d 20 30 78 43 30 20 2b 20 28 28 63 3e 3e 36   = 0xC0 + ((c>>6
0920: 29 26 30 78 31 46 29 3b 20 20 20 20 20 20 20 20  )&0x1F);        
0930: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
0940: 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30    *zOut++ = 0x80
0950: 20 2b 20 28 63 20 26 20 30 78 33 46 29 3b 20 20   + (c & 0x3F);  
0960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0970: 20 20 20 20 20 5c 0a 20 20 7d 20 20 20 20 20 20       \.  }      
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
09b0: 20 20 65 6c 73 65 20 69 66 28 20 63 3c 30 78 31    else if( c<0x1
09c0: 30 30 30 30 20 29 7b 20 20 20 20 20 20 20 20 20  0000 ){         
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f         \.    *zO
09f0: 75 74 2b 2b 20 3d 20 30 78 45 30 20 2b 20 28 28  ut++ = 0xE0 + ((
0a00: 63 3e 3e 31 32 29 26 30 78 30 46 29 3b 20 20 20  c>>12)&0x0F);   
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a20: 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20  \.    *zOut++ = 
0a30: 30 78 38 30 20 2b 20 28 28 63 3e 3e 36 29 20 26  0x80 + ((c>>6) &
0a40: 20 30 78 33 46 29 3b 20 20 20 20 20 20 20 20 20   0x3F);         
0a50: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a           \.    *
0a60: 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20  zOut++ = 0x80 + 
0a70: 28 63 20 26 20 30 78 33 46 29 3b 20 20 20 20 20  (c & 0x3F);     
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20    \.  }else{    
0aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
0ad0: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 46 30 20   *zOut++ = 0xF0 
0ae0: 2b 20 28 28 63 3e 3e 31 38 29 20 26 20 30 78 30  + ((c>>18) & 0x0
0af0: 37 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  7);             
0b00: 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b      \.    *zOut+
0b10: 2b 20 3d 20 30 78 38 30 20 2b 20 28 28 63 3e 3e  + = 0x80 + ((c>>
0b20: 31 32 29 20 26 20 30 78 33 46 29 3b 20 20 20 20  12) & 0x3F);    
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
0b40: 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38     *zOut++ = 0x8
0b50: 30 20 2b 20 28 28 63 3e 3e 36 29 20 26 20 30 78  0 + ((c>>6) & 0x
0b60: 33 46 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  3F);            
0b70: 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75        \.    *zOu
0b80: 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 63 20  t++ = 0x80 + (c 
0b90: 26 20 30 78 33 46 29 3b 20 20 20 20 20 20 20 20  & 0x3F);        
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
0bb0: 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  .  }            
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65          \.}..#de
0bf0: 66 69 6e 65 20 57 52 49 54 45 5f 55 54 46 31 36  fine WRITE_UTF16
0c00: 4c 45 28 7a 4f 75 74 2c 20 63 29 20 7b 20 20 20  LE(zOut, c) {   
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
0c30: 20 69 66 28 20 63 3c 3d 30 78 46 46 46 46 20 29   if( c<=0xFFFF )
0c40: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
0c70: 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28  .    *zOut++ = (
0c80: 63 26 30 78 30 30 46 46 29 3b 20 20 20 20 20 20  c&0x00FF);      
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cb0: 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d   \.    *zOut++ =
0cc0: 20 28 28 63 3e 3e 38 29 26 30 78 30 30 46 46 29   ((c>>8)&0x00FF)
0cd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cf0: 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20     \.  }else{   
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74       \.    *zOut
0d40: 2b 2b 20 3d 20 28 28 28 63 3e 3e 31 30 29 26 30  ++ = (((c>>10)&0
0d50: 78 30 30 33 46 29 20 2b 20 28 28 28 63 2d 30 78  x003F) + (((c-0x
0d60: 31 30 30 30 30 29 3e 3e 31 30 29 26 30 78 30 30  10000)>>10)&0x00
0d70: 43 30 29 29 3b 20 20 5c 0a 20 20 20 20 2a 7a 4f  C0));  \.    *zO
0d80: 75 74 2b 2b 20 3d 20 28 30 78 30 30 44 38 20 2b  ut++ = (0x00D8 +
0d90: 20 28 28 28 63 2d 30 78 31 30 30 30 30 29 3e 3e   (((c-0x10000)>>
0da0: 31 38 29 26 30 78 30 33 29 29 3b 20 20 20 20 20  18)&0x03));     
0db0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a           \.    *
0dc0: 7a 4f 75 74 2b 2b 20 3d 20 28 63 26 30 78 30 30  zOut++ = (c&0x00
0dd0: 46 46 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  FF);            
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0df0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
0e00: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 30 78 30 30   *zOut++ = (0x00
0e10: 44 43 20 2b 20 28 28 63 3e 3e 38 29 26 30 78 30  DC + ((c>>8)&0x0
0e20: 33 29 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  3));            
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
0e40: 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
0e80: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 57 52 49 54  .}..#define WRIT
0e90: 45 5f 55 54 46 31 36 42 45 28 7a 4f 75 74 2c 20  E_UTF16BE(zOut, 
0ea0: 63 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  c) {            
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ec0: 20 20 20 20 5c 0a 20 20 69 66 28 20 63 3c 3d 30      \.  if( c<=0
0ed0: 78 46 46 46 46 20 29 7b 20 20 20 20 20 20 20 20  xFFFF ){        
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f00: 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75        \.    *zOu
0f10: 74 2b 2b 20 3d 20 28 28 63 3e 3e 38 29 26 30 78  t++ = ((c>>8)&0x
0f20: 30 30 46 46 29 3b 20 20 20 20 20 20 20 20 20 20  00FF);          
0f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f40: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a          \.    *z
0f50: 4f 75 74 2b 2b 20 3d 20 28 63 26 30 78 30 30 46  Out++ = (c&0x00F
0f60: 46 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  F);             
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f80: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65            \.  }e
0f90: 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20  lse{            
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
0fd0: 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 30 78 30    *zOut++ = (0x0
0fe0: 30 44 38 20 2b 20 28 28 28 63 2d 30 78 31 30 30  0D8 + (((c-0x100
0ff0: 30 30 29 3e 3e 31 38 29 26 30 78 30 33 29 29 3b  00)>>18)&0x03));
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1010: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 28      *zOut++ = ((
1020: 28 63 3e 3e 31 30 29 26 30 78 30 30 33 46 29 20  (c>>10)&0x003F) 
1030: 2b 20 28 28 28 63 2d 30 78 31 30 30 30 30 29 3e  + (((c-0x10000)>
1040: 3e 31 30 29 26 30 78 30 30 43 30 29 29 3b 20 20  >10)&0x00C0));  
1050: 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20  \.    *zOut++ = 
1060: 28 30 78 30 30 44 43 20 2b 20 28 28 63 3e 3e 38  (0x00DC + ((c>>8
1070: 29 26 30 78 30 33 29 29 3b 20 20 20 20 20 20 20  )&0x03));       
1080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1090: 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20    \.    *zOut++ 
10a0: 3d 20 28 63 26 30 78 30 30 46 46 29 3b 20 20 20  = (c&0x00FF);   
10b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d0: 20 20 20 20 5c 0a 20 20 7d 20 20 20 20 20 20 20      \.  }       
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1110: 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66 69        \.}..#defi
1120: 6e 65 20 52 45 41 44 5f 55 54 46 31 36 4c 45 28  ne READ_UTF16LE(
1130: 7a 49 6e 2c 20 63 29 7b 20 20 20 20 20 20 20 20  zIn, c){        
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1160: 20 5c 0a 20 20 63 20 3d 20 28 2a 7a 49 6e 2b 2b   \.  c = (*zIn++
1170: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 63 20 2b           \.  c +
11b0: 3d 20 28 28 2a 7a 49 6e 2b 2b 29 3c 3c 38 29 3b  = ((*zIn++)<<8);
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f0: 20 5c 0a 20 20 69 66 28 20 63 3e 3d 30 78 44 38   \.  if( c>=0xD8
1200: 30 30 20 26 26 20 63 3c 30 78 45 30 30 30 20 29  00 && c<0xE000 )
1210: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1230: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e          \.    in
1240: 74 20 63 32 20 3d 20 28 2a 7a 49 6e 2b 2b 29 3b  t c2 = (*zIn++);
1250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1280: 5c 0a 20 20 20 20 63 32 20 2b 3d 20 28 28 2a 7a  \.    c2 += ((*z
1290: 49 6e 2b 2b 29 3c 3c 38 29 3b 20 20 20 20 20 20  In++)<<8);      
12a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c0: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 63 20          \.    c 
12d0: 3d 20 28 63 32 26 30 78 30 33 46 46 29 20 2b 20  = (c2&0x03FF) + 
12e0: 28 28 63 26 30 78 30 30 33 46 29 3c 3c 31 30 29  ((c&0x003F)<<10)
12f0: 20 2b 20 28 28 28 63 26 30 78 30 33 43 30 29 2b   + (((c&0x03C0)+
1300: 30 78 30 30 34 30 29 3c 3c 31 30 29 3b 20 20 20  0x0040)<<10);   
1310: 5c 0a 20 20 20 20 69 66 28 20 28 63 20 26 20 30  \.    if( (c & 0
1320: 78 46 46 46 46 30 30 30 30 29 3d 3d 30 20 29 20  xFFFF0000)==0 ) 
1330: 63 20 3d 20 30 78 46 46 46 44 3b 20 20 20 20 20  c = 0xFFFD;     
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 20 20 20          \.  }   
1360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a0: 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 52 45 41  \.}..#define REA
13b0: 44 5f 55 54 46 31 36 42 45 28 7a 49 6e 2c 20 63  D_UTF16BE(zIn, c
13c0: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 63             \.  c
13f0: 20 3d 20 28 28 2a 7a 49 6e 2b 2b 29 3c 3c 38 29   = ((*zIn++)<<8)
1400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 20 5c 0a 20 20 63 20 2b 3d 20 28 2a 7a 49     \.  c += (*zI
1440: 6e 2b 2b 29 3b 20 20 20 20 20 20 20 20 20 20 20  n++);           
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1470: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
1480: 66 28 20 63 3e 3d 30 78 44 38 30 30 20 26 26 20  f( c>=0xD800 && 
1490: 63 3c 30 78 45 30 30 30 20 29 7b 20 20 20 20 20  c<0xE000 ){     
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c0: 20 20 5c 0a 20 20 20 20 69 6e 74 20 63 32 20 3d    \.    int c2 =
14d0: 20 28 28 2a 7a 49 6e 2b 2b 29 3c 3c 38 29 3b 20   ((*zIn++)<<8); 
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1500: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
1510: 63 32 20 2b 3d 20 28 2a 7a 49 6e 2b 2b 29 3b 20  c2 += (*zIn++); 
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1550: 20 20 5c 0a 20 20 20 20 63 20 3d 20 28 63 32 26    \.    c = (c2&
1560: 30 78 30 33 46 46 29 20 2b 20 28 28 63 26 30 78  0x03FF) + ((c&0x
1570: 30 30 33 46 29 3c 3c 31 30 29 20 2b 20 28 28 28  003F)<<10) + (((
1580: 63 26 30 78 30 33 43 30 29 2b 30 78 30 30 34 30  c&0x03C0)+0x0040
1590: 29 3c 3c 31 30 29 3b 20 20 20 5c 0a 20 20 20 20  )<<10);   \.    
15a0: 69 66 28 20 28 63 20 26 20 30 78 46 46 46 46 30  if( (c & 0xFFFF0
15b0: 30 30 30 29 3d 3d 30 20 29 20 63 20 3d 20 30 78  000)==0 ) c = 0x
15c0: 46 46 46 44 3b 20 20 20 20 20 20 20 20 20 20 20  FFFD;           
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e0: 20 20 5c 0a 20 20 7d 20 20 20 20 20 20 20 20 20    \.  }         
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1620: 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f            \.}../
1630: 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 61  *.** Translate a
1640: 20 73 69 6e 67 6c 65 20 55 54 46 2d 38 20 63 68   single UTF-8 ch
1650: 61 72 61 63 74 65 72 2e 20 20 52 65 74 75 72 6e  aracter.  Return
1660: 20 74 68 65 20 75 6e 69 63 6f 64 65 20 76 61 6c   the unicode val
1670: 75 65 2e 0a 2a 2a 0a 2a 2a 20 44 75 72 69 6e 67  ue..**.** During
1680: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 61 73   translation, as
1690: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 62 79  sume that the by
16a0: 74 65 20 74 68 61 74 20 7a 54 65 72 6d 20 70 6f  te that zTerm po
16b0: 69 6e 74 73 0a 2a 2a 20 69 73 20 61 20 30 78 30  ints.** is a 0x0
16c0: 30 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61  0..**.** Write a
16d0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
16e0: 6e 65 78 74 20 75 6e 72 65 61 64 20 62 79 74 65  next unread byte
16f0: 20 62 61 63 6b 20 69 6e 74 6f 20 2a 70 7a 4e 65   back into *pzNe
1700: 78 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73 20  xt..**.** Notes 
1710: 4f 6e 20 49 6e 76 61 6c 69 64 20 55 54 46 2d 38  On Invalid UTF-8
1720: 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 20 54 68 69 73  :.**.**  *  This
1730: 20 72 6f 75 74 69 6e 65 20 6e 65 76 65 72 20 61   routine never a
1740: 6c 6c 6f 77 73 20 61 20 37 2d 62 69 74 20 63 68  llows a 7-bit ch
1750: 61 72 61 63 74 65 72 20 28 30 78 30 30 20 74 68  aracter (0x00 th
1760: 72 6f 75 67 68 20 30 78 37 66 29 20 74 6f 0a 2a  rough 0x7f) to.*
1770: 2a 20 20 20 20 20 62 65 20 65 6e 63 6f 64 65 64  *     be encoded
1780: 20 61 73 20 61 20 6d 75 6c 74 69 2d 62 79 74 65   as a multi-byte
1790: 20 63 68 61 72 61 63 74 65 72 2e 20 20 41 6e 79   character.  Any
17a0: 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68 61 72   multi-byte char
17b0: 61 63 74 65 72 20 74 68 61 74 0a 2a 2a 20 20 20  acter that.**   
17c0: 20 20 61 74 74 65 6d 70 74 73 20 74 6f 20 65 6e    attempts to en
17d0: 63 6f 64 65 20 61 20 76 61 6c 75 65 20 62 65 74  code a value bet
17e0: 77 65 65 6e 20 30 78 30 30 20 61 6e 64 20 30 78  ween 0x00 and 0x
17f0: 37 66 20 69 73 20 72 65 6e 64 65 72 65 64 20 61  7f is rendered a
1800: 73 20 30 78 66 66 66 64 2e 0a 2a 2a 0a 2a 2a 20  s 0xfffd..**.** 
1810: 20 2a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65   *  This routine
1820: 20 6e 65 76 65 72 20 61 6c 6c 6f 77 73 20 61 20   never allows a 
1830: 55 54 46 31 36 20 73 75 72 72 6f 67 61 74 65 20  UTF16 surrogate 
1840: 76 61 6c 75 65 20 74 6f 20 62 65 20 65 6e 63 6f  value to be enco
1850: 64 65 64 2e 0a 2a 2a 20 20 20 20 20 49 66 20 61  ded..**     If a
1860: 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68 61 72   multi-byte char
1870: 61 63 74 65 72 20 61 74 74 65 6d 70 74 73 20 74  acter attempts t
1880: 6f 20 65 6e 63 6f 64 65 20 61 20 76 61 6c 75 65  o encode a value
1890: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 20 20 20 20   between.**     
18a0: 30 78 64 38 30 30 20 61 6e 64 20 30 78 65 30 30  0xd800 and 0xe00
18b0: 30 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 6e  0 then it is ren
18c0: 64 65 72 65 64 20 61 73 20 30 78 66 66 66 64 2e  dered as 0xfffd.
18d0: 0a 2a 2a 0a 2a 2a 20 20 2a 20 20 42 79 74 65 73  .**.**  *  Bytes
18e0: 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 6f 66   in the range of
18f0: 20 30 78 38 30 20 74 68 72 6f 75 67 68 20 30 78   0x80 through 0x
1900: 62 66 20 77 68 69 63 68 20 6f 63 63 75 72 20 61  bf which occur a
1910: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 20  s the first.**  
1920: 20 20 20 62 79 74 65 20 6f 66 20 61 20 63 68 61     byte of a cha
1930: 72 61 63 74 65 72 20 61 72 65 20 69 6e 74 65 72  racter are inter
1940: 70 72 65 74 65 64 20 61 73 20 73 69 6e 67 6c 65  preted as single
1950: 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72 73  -byte characters
1960: 0a 2a 2a 20 20 20 20 20 61 6e 64 20 72 65 6e 64  .**     and rend
1970: 65 72 65 64 20 61 73 20 74 68 65 6d 73 65 6c 76  ered as themselv
1980: 65 73 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  es even though t
1990: 68 65 79 20 61 72 65 20 74 65 63 68 6e 69 63 61  hey are technica
19a0: 6c 6c 79 0a 2a 2a 20 20 20 20 20 69 6e 76 61 6c  lly.**     inval
19b0: 69 64 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  id characters..*
19c0: 2a 0a 2a 2a 20 20 2a 20 20 54 68 69 73 20 72 6f  *.**  *  This ro
19d0: 75 74 69 6e 65 20 61 63 63 65 70 74 73 20 61 6e  utine accepts an
19e0: 20 69 6e 66 69 6e 69 74 65 20 6e 75 6d 62 65 72   infinite number
19f0: 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 55 54   of different UT
1a00: 46 38 20 65 6e 63 6f 64 69 6e 67 73 0a 2a 2a 20  F8 encodings.** 
1a10: 20 20 20 20 66 6f 72 20 75 6e 69 63 6f 64 65 20      for unicode 
1a20: 76 61 6c 75 65 73 20 30 78 38 30 20 61 6e 64 20  values 0x80 and 
1a30: 67 72 65 61 74 65 72 2e 20 20 49 74 20 64 6f 20  greater.  It do 
1a40: 6e 6f 74 20 63 68 61 6e 67 65 20 6f 76 65 72 2d  not change over-
1a50: 6c 65 6e 67 74 68 0a 2a 2a 20 20 20 20 20 65 6e  length.**     en
1a60: 63 6f 64 69 6e 67 73 20 74 6f 20 30 78 66 66 66  codings to 0xfff
1a70: 64 20 61 73 20 73 6f 6d 65 20 73 79 73 74 65 6d  d as some system
1a80: 73 20 72 65 63 6f 6d 6d 65 6e 64 2e 0a 2a 2f 0a  s recommend..*/.
1a90: 23 64 65 66 69 6e 65 20 52 45 41 44 5f 55 54 46  #define READ_UTF
1aa0: 38 28 7a 49 6e 2c 20 7a 54 65 72 6d 2c 20 63 29  8(zIn, zTerm, c)
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 63             \.  c
1ad0: 20 3d 20 2a 28 7a 49 6e 2b 2b 29 3b 20 20 20 20   = *(zIn++);    
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20          \.  if( 
1b10: 63 3e 3d 30 78 63 30 20 29 7b 20 20 20 20 20 20  c>=0xc0 ){      
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b40: 20 20 20 20 20 5c 0a 20 20 20 20 63 20 3d 20 73       \.    c = s
1b50: 71 6c 69 74 65 33 55 74 66 54 72 61 6e 73 31 5b  qlite3UtfTrans1[
1b60: 63 2d 30 78 63 30 5d 3b 20 20 20 20 20 20 20 20  c-0xc0];        
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b80: 20 20 5c 0a 20 20 20 20 77 68 69 6c 65 28 20 7a    \.    while( z
1b90: 49 6e 21 3d 7a 54 65 72 6d 20 26 26 20 28 2a 7a  In!=zTerm && (*z
1ba0: 49 6e 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30  In & 0xc0)==0x80
1bb0: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 5c   ){            \
1bc0: 0a 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 36  .      c = (c<<6
1bd0: 29 20 2b 20 28 30 78 33 66 20 26 20 2a 28 7a 49  ) + (0x3f & *(zI
1be0: 6e 2b 2b 29 29 3b 20 20 20 20 20 20 20 20 20 20  n++));          
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1c00: 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20    }             
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c30: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69           \.    i
1c40: 66 28 20 63 3c 30 78 38 30 20 20 20 20 20 20 20  f( c<0x80       
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20 20        \.        
1c80: 7c 7c 20 28 63 26 30 78 46 46 46 46 46 38 30 30  || (c&0xFFFFF800
1c90: 29 3d 3d 30 78 44 38 30 30 20 20 20 20 20 20 20  )==0xD800       
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 20 20 20 5c 0a 20 20 20 20 20 20 20 20 7c 7c 20     \.        || 
1cc0: 28 63 26 30 78 46 46 46 46 46 46 46 45 29 3d 3d  (c&0xFFFFFFFE)==
1cd0: 30 78 46 46 46 45 20 29 7b 20 20 63 20 3d 20 30  0xFFFE ){  c = 0
1ce0: 78 46 46 46 44 3b 20 7d 20 20 20 20 20 20 20 20  xFFFD; }        
1cf0: 5c 0a 20 20 7d 0a 69 6e 74 20 73 71 6c 69 74 65  \.  }.int sqlite
1d00: 33 55 74 66 38 52 65 61 64 28 0a 20 20 63 6f 6e  3Utf8Read(.  con
1d10: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1d20: 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   *z,         /* 
1d30: 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 55 54  First byte of UT
1d40: 46 2d 38 20 63 68 61 72 61 63 74 65 72 20 2a 2f  F-8 character */
1d50: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1d60: 64 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20  d char *zTerm,  
1d70: 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 74 68     /* Pretend th
1d80: 69 73 20 62 79 74 65 20 69 73 20 30 78 30 30 20  is byte is 0x00 
1d90: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  */.  const unsig
1da0: 6e 65 64 20 63 68 61 72 20 2a 2a 70 7a 4e 65 78  ned char **pzNex
1db0: 74 20 20 20 20 2f 2a 20 57 72 69 74 65 20 66 69  t    /* Write fi
1dc0: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 55 54  rst byte past UT
1dd0: 46 2d 38 20 63 68 61 72 20 68 65 72 65 20 2a 2f  F-8 char here */
1de0: 0a 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 52  .){.  int c;.  R
1df0: 45 41 44 5f 55 54 46 38 28 7a 2c 20 7a 54 65 72  EAD_UTF8(z, zTer
1e00: 6d 2c 20 63 29 3b 0a 20 20 2a 70 7a 4e 65 78 74  m, c);.  *pzNext
1e10: 20 3d 20 7a 3b 0a 20 20 72 65 74 75 72 6e 20 63   = z;.  return c
1e20: 3b 0a 7d 0a 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  ;.}...../*.** If
1e30: 20 74 68 65 20 54 52 41 4e 53 4c 41 54 45 5f 54   the TRANSLATE_T
1e40: 52 41 43 45 20 6d 61 63 72 6f 20 69 73 20 64 65  RACE macro is de
1e50: 66 69 6e 65 64 2c 20 74 68 65 20 76 61 6c 75 65  fined, the value
1e60: 20 6f 66 20 65 61 63 68 20 4d 65 6d 20 69 73 0a   of each Mem is.
1e70: 2a 2a 20 70 72 69 6e 74 65 64 20 6f 6e 20 73 74  ** printed on st
1e80: 64 65 72 72 20 6f 6e 20 74 68 65 20 77 61 79 20  derr on the way 
1e90: 69 6e 74 6f 20 61 6e 64 20 6f 75 74 20 6f 66 20  into and out of 
1ea0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54 72  sqlite3VdbeMemTr
1eb0: 61 6e 73 6c 61 74 65 28 29 2e 0a 2a 2f 20 0a 2f  anslate()..*/ ./
1ec0: 2a 20 23 64 65 66 69 6e 65 20 54 52 41 4e 53 4c  * #define TRANSL
1ed0: 41 54 45 5f 54 52 41 43 45 20 31 20 2a 2f 0a 0a  ATE_TRACE 1 */..
1ee0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ef0: 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
1f00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61  This routine tra
1f10: 6e 73 66 6f 72 6d 73 20 74 68 65 20 69 6e 74 65  nsforms the inte
1f20: 72 6e 61 6c 20 74 65 78 74 20 65 6e 63 6f 64 69  rnal text encodi
1f30: 6e 67 20 75 73 65 64 20 62 79 20 70 4d 65 6d 20  ng used by pMem 
1f40: 74 6f 0a 2a 2a 20 64 65 73 69 72 65 64 45 6e 63  to.** desiredEnc
1f50: 2e 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72  . It is an error
1f60: 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 20 69   if the string i
1f70: 73 20 61 6c 72 65 61 64 79 20 6f 66 20 74 68 65  s already of the
1f80: 20 64 65 73 69 72 65 64 0a 2a 2a 20 65 6e 63 6f   desired.** enco
1f90: 64 69 6e 67 2c 20 6f 72 20 69 66 20 2a 70 4d 65  ding, or if *pMe
1fa0: 6d 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  m does not conta
1fb0: 69 6e 20 61 20 73 74 72 69 6e 67 20 76 61 6c 75  in a string valu
1fc0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1fd0: 33 56 64 62 65 4d 65 6d 54 72 61 6e 73 6c 61 74  3VdbeMemTranslat
1fe0: 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 38 20  e(Mem *pMem, u8 
1ff0: 64 65 73 69 72 65 64 45 6e 63 29 7b 0a 20 20 69  desiredEnc){.  i
2000: 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  nt len;         
2010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2020: 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20  ximum length of 
2030: 6f 75 74 70 75 74 20 73 74 72 69 6e 67 20 69 6e  output string in
2040: 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69   bytes */.  unsi
2050: 67 6e 65 64 20 63 68 61 72 20 2a 7a 4f 75 74 3b  gned char *zOut;
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
2080: 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  er */.  unsigned
2090: 20 63 68 61 72 20 2a 7a 49 6e 3b 20 20 20 20 20   char *zIn;     
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20b0: 20 49 6e 70 75 74 20 69 74 65 72 61 74 6f 72 20   Input iterator 
20c0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
20d0: 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20  ar *zTerm;      
20e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
20f0: 64 20 6f 66 20 69 6e 70 75 74 20 2a 2f 0a 20 20  d of input */.  
2100: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
2110: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2120: 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
2130: 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 6e  iterator */.  un
2140: 73 69 67 6e 65 64 20 69 6e 74 20 63 3b 0a 0a 20  signed int c;.. 
2150: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
2160: 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  b==0 || sqlite3_
2170: 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d  mutex_held(pMem-
2180: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
2190: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66   assert( pMem->f
21a0: 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 3b 0a  lags&MEM_Str );.
21b0: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
21c0: 65 6e 63 21 3d 64 65 73 69 72 65 64 45 6e 63 20  enc!=desiredEnc 
21d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65  );.  assert( pMe
21e0: 6d 2d 3e 65 6e 63 21 3d 30 20 29 3b 0a 20 20 61  m->enc!=0 );.  a
21f0: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d  ssert( pMem->n>=
2200: 30 20 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  0 );..#if define
2210: 64 28 54 52 41 4e 53 4c 41 54 45 5f 54 52 41 43  d(TRANSLATE_TRAC
2220: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
2230: 4c 49 54 45 5f 44 45 42 55 47 29 0a 20 20 7b 0a  LITE_DEBUG).  {.
2240: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30      char zBuf[10
2250: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0];.    sqlite3V
2260: 64 62 65 4d 65 6d 50 72 65 74 74 79 50 72 69 6e  dbeMemPrettyPrin
2270: 74 28 70 4d 65 6d 2c 20 7a 42 75 66 29 3b 0a 20  t(pMem, zBuf);. 
2280: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
2290: 72 2c 20 22 49 4e 50 55 54 3a 20 20 25 73 5c 6e  r, "INPUT:  %s\n
22a0: 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65  ", zBuf);.  }.#e
22b0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
22c0: 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73  e translation is
22d0: 20 62 65 74 77 65 65 6e 20 55 54 46 2d 31 36 20   between UTF-16 
22e0: 6c 69 74 74 6c 65 20 61 6e 64 20 62 69 67 20 65  little and big e
22f0: 6e 64 69 61 6e 2c 20 74 68 65 6e 20 0a 20 20 2a  ndian, then .  *
2300: 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65  * all that is re
2310: 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 77 61  quired is to swa
2320: 70 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  p the byte order
2330: 2e 20 54 68 69 73 20 63 61 73 65 20 69 73 20 68  . This case is h
2340: 61 6e 64 6c 65 64 0a 20 20 2a 2a 20 64 69 66 66  andled.  ** diff
2350: 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65  erently from the
2360: 20 6f 74 68 65 72 73 2e 0a 20 20 2a 2f 0a 20 20   others..  */.  
2370: 69 66 28 20 70 4d 65 6d 2d 3e 65 6e 63 21 3d 53  if( pMem->enc!=S
2380: 51 4c 49 54 45 5f 55 54 46 38 20 26 26 20 64 65  QLITE_UTF8 && de
2390: 73 69 72 65 64 45 6e 63 21 3d 53 51 4c 49 54 45  siredEnc!=SQLITE
23a0: 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 75 38 20  _UTF8 ){.    u8 
23b0: 74 65 6d 70 3b 0a 20 20 20 20 69 6e 74 20 72 63  temp;.    int rc
23c0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
23d0: 65 33 56 64 62 65 4d 65 6d 4d 61 6b 65 57 72 69  e3VdbeMemMakeWri
23e0: 74 65 61 62 6c 65 28 70 4d 65 6d 29 3b 0a 20 20  teable(pMem);.  
23f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2400: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
2410: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2420: 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 72  NOMEM );.      r
2430: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2440: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49  EM;.    }.    zI
2450: 6e 20 3d 20 28 75 38 2a 29 70 4d 65 6d 2d 3e 7a  n = (u8*)pMem->z
2460: 3b 0a 20 20 20 20 7a 54 65 72 6d 20 3d 20 26 7a  ;.    zTerm = &z
2470: 49 6e 5b 70 4d 65 6d 2d 3e 6e 5d 3b 0a 20 20 20  In[pMem->n];.   
2480: 20 77 68 69 6c 65 28 20 7a 49 6e 3c 7a 54 65 72   while( zIn<zTer
2490: 6d 20 29 7b 0a 20 20 20 20 20 20 74 65 6d 70 20  m ){.      temp 
24a0: 3d 20 2a 7a 49 6e 3b 0a 20 20 20 20 20 20 2a 7a  = *zIn;.      *z
24b0: 49 6e 20 3d 20 2a 28 7a 49 6e 2b 31 29 3b 0a 20  In = *(zIn+1);. 
24c0: 20 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20       zIn++;.    
24d0: 20 20 2a 7a 49 6e 2b 2b 20 3d 20 74 65 6d 70 3b    *zIn++ = temp;
24e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d  .    }.    pMem-
24f0: 3e 65 6e 63 20 3d 20 64 65 73 69 72 65 64 45 6e  >enc = desiredEn
2500: 63 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  c;.    goto tran
2510: 73 6c 61 74 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  slate_out;.  }..
2520: 20 20 2f 2a 20 53 65 74 20 6c 65 6e 20 74 6f 20    /* Set len to 
2530: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
2540: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
2550: 69 72 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70  ired in the outp
2560: 75 74 20 62 75 66 66 65 72 2e 20 2a 2f 0a 20 20  ut buffer. */.  
2570: 69 66 28 20 64 65 73 69 72 65 64 45 6e 63 3d 3d  if( desiredEnc==
2580: 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20  SQLITE_UTF8 ){. 
2590: 20 20 20 2f 2a 20 57 68 65 6e 20 63 6f 6e 76 65     /* When conve
25a0: 72 74 69 6e 67 20 66 72 6f 6d 20 55 54 46 2d 31  rting from UTF-1
25b0: 36 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 67  6, the maximum g
25c0: 72 6f 77 74 68 20 72 65 73 75 6c 74 73 20 66 72  rowth results fr
25d0: 6f 6d 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 6c  om.    ** transl
25e0: 61 74 69 6e 67 20 61 20 32 2d 62 79 74 65 20 63  ating a 2-byte c
25f0: 68 61 72 61 63 74 65 72 20 74 6f 20 61 20 34 2d  haracter to a 4-
2600: 62 79 74 65 20 55 54 46 2d 38 20 63 68 61 72 61  byte UTF-8 chara
2610: 63 74 65 72 2e 0a 20 20 20 20 2a 2a 20 41 20 73  cter..    ** A s
2620: 69 6e 67 6c 65 20 62 79 74 65 20 69 73 20 72 65  ingle byte is re
2630: 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 6f  quired for the o
2640: 75 74 70 75 74 20 73 74 72 69 6e 67 0a 20 20 20  utput string.   
2650: 20 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   ** nul-terminat
2660: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c  or..    */.    l
2670: 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 20 2a 20 32  en = pMem->n * 2
2680: 20 2b 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   + 1;.  }else{. 
2690: 20 20 20 2f 2a 20 57 68 65 6e 20 63 6f 6e 76 65     /* When conve
26a0: 72 74 69 6e 67 20 66 72 6f 6d 20 55 54 46 2d 38  rting from UTF-8
26b0: 20 74 6f 20 55 54 46 2d 31 36 20 74 68 65 20 6d   to UTF-16 the m
26c0: 61 78 69 6d 75 6d 20 67 72 6f 77 74 68 20 69 73  aximum growth is
26d0: 20 63 61 75 73 65 64 0a 20 20 20 20 2a 2a 20 77   caused.    ** w
26e0: 68 65 6e 20 61 20 31 2d 62 79 74 65 20 55 54 46  hen a 1-byte UTF
26f0: 2d 38 20 63 68 61 72 61 63 74 65 72 20 69 73 20  -8 character is 
2700: 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20  translated into 
2710: 61 20 32 2d 62 79 74 65 20 55 54 46 2d 31 36 0a  a 2-byte UTF-16.
2720: 20 20 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72      ** character
2730: 2e 20 54 77 6f 20 62 79 74 65 73 20 61 72 65 20  . Two bytes are 
2740: 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65 20  required in the 
2750: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 66 6f  output buffer fo
2760: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6c  r the.    ** nul
2770: 2d 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 20 20 20  -terminator..   
2780: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d   */.    len = pM
2790: 65 6d 2d 3e 6e 20 2a 20 32 20 2b 20 32 3b 0a 20  em->n * 2 + 2;. 
27a0: 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 7a 49 6e   }..  /* Set zIn
27b0: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
27c0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 6e   start of the in
27d0: 70 75 74 20 62 75 66 66 65 72 20 61 6e 64 20 7a  put buffer and z
27e0: 54 65 72 6d 20 74 6f 20 70 6f 69 6e 74 20 31 0a  Term to point 1.
27f0: 20 20 2a 2a 20 62 79 74 65 20 70 61 73 74 20 74    ** byte past t
2800: 68 65 20 65 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a  he end..  **.  *
2810: 2a 20 56 61 72 69 61 62 6c 65 20 7a 4f 75 74 20  * Variable zOut 
2820: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
2830: 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  at the output bu
2840: 66 66 65 72 2c 20 73 70 61 63 65 20 6f 62 74 61  ffer, space obta
2850: 69 6e 65 64 0a 20 20 2a 2a 20 66 72 6f 6d 20 73  ined.  ** from s
2860: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
2870: 0a 20 20 2a 2f 0a 20 20 7a 49 6e 20 3d 20 28 75  .  */.  zIn = (u
2880: 38 2a 29 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 7a 54  8*)pMem->z;.  zT
2890: 65 72 6d 20 3d 20 26 7a 49 6e 5b 70 4d 65 6d 2d  erm = &zIn[pMem-
28a0: 3e 6e 5d 3b 0a 20 20 7a 4f 75 74 20 3d 20 73 71  >n];.  zOut = sq
28b0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
28c0: 28 70 4d 65 6d 2d 3e 64 62 2c 20 6c 65 6e 29 3b  (pMem->db, len);
28d0: 0a 20 20 69 66 28 20 21 7a 4f 75 74 20 29 7b 0a  .  if( !zOut ){.
28e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 7a  E_NOMEM;.  }.  z
2900: 20 3d 20 7a 4f 75 74 3b 0a 0a 20 20 69 66 28 20   = zOut;..  if( 
2910: 70 4d 65 6d 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  pMem->enc==SQLIT
2920: 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 69 66  E_UTF8 ){.    if
2930: 28 20 64 65 73 69 72 65 64 45 6e 63 3d 3d 53 51  ( desiredEnc==SQ
2940: 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 29 7b 0a  LITE_UTF16LE ){.
2950: 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 2d        /* UTF-8 -
2960: 3e 20 55 54 46 2d 31 36 20 4c 69 74 74 6c 65 2d  > UTF-16 Little-
2970: 65 6e 64 69 61 6e 20 2a 2f 0a 20 20 20 20 20 20  endian */.      
2980: 77 68 69 6c 65 28 20 7a 49 6e 3c 7a 54 65 72 6d  while( zIn<zTerm
2990: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63   ){.        /* c
29a0: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65   = sqlite3Utf8Re
29b0: 61 64 28 7a 49 6e 2c 20 7a 54 65 72 6d 2c 20 28  ad(zIn, zTerm, (
29c0: 63 6f 6e 73 74 20 75 38 2a 2a 29 26 7a 49 6e 29  const u8**)&zIn)
29d0: 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 52 45 41  ; */.        REA
29e0: 44 5f 55 54 46 38 28 7a 49 6e 2c 20 7a 54 65 72  D_UTF8(zIn, zTer
29f0: 6d 2c 20 63 29 3b 0a 20 20 20 20 20 20 20 20 57  m, c);.        W
2a00: 52 49 54 45 5f 55 54 46 31 36 4c 45 28 7a 2c 20  RITE_UTF16LE(z, 
2a10: 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
2a20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
2a30: 65 72 74 28 20 64 65 73 69 72 65 64 45 6e 63 3d  ert( desiredEnc=
2a40: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  =SQLITE_UTF16BE 
2a50: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 55 54 46 2d  );.      /* UTF-
2a60: 38 20 2d 3e 20 55 54 46 2d 31 36 20 42 69 67 2d  8 -> UTF-16 Big-
2a70: 65 6e 64 69 61 6e 20 2a 2f 0a 20 20 20 20 20 20  endian */.      
2a80: 77 68 69 6c 65 28 20 7a 49 6e 3c 7a 54 65 72 6d  while( zIn<zTerm
2a90: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63   ){.        /* c
2aa0: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65   = sqlite3Utf8Re
2ab0: 61 64 28 7a 49 6e 2c 20 7a 54 65 72 6d 2c 20 28  ad(zIn, zTerm, (
2ac0: 63 6f 6e 73 74 20 75 38 2a 2a 29 26 7a 49 6e 29  const u8**)&zIn)
2ad0: 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 52 45 41  ; */.        REA
2ae0: 44 5f 55 54 46 38 28 7a 49 6e 2c 20 7a 54 65 72  D_UTF8(zIn, zTer
2af0: 6d 2c 20 63 29 3b 0a 20 20 20 20 20 20 20 20 57  m, c);.        W
2b00: 52 49 54 45 5f 55 54 46 31 36 42 45 28 7a 2c 20  RITE_UTF16BE(z, 
2b10: 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
2b20: 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20  }.    pMem->n = 
2b30: 7a 20 2d 20 7a 4f 75 74 3b 0a 20 20 20 20 2a 7a  z - zOut;.    *z
2b40: 2b 2b 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ++ = 0;.  }else{
2b50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73  .    assert( des
2b60: 69 72 65 64 45 6e 63 3d 3d 53 51 4c 49 54 45 5f  iredEnc==SQLITE_
2b70: 55 54 46 38 20 29 3b 0a 20 20 20 20 69 66 28 20  UTF8 );.    if( 
2b80: 70 4d 65 6d 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  pMem->enc==SQLIT
2b90: 45 5f 55 54 46 31 36 4c 45 20 29 7b 0a 20 20 20  E_UTF16LE ){.   
2ba0: 20 20 20 2f 2a 20 55 54 46 2d 31 36 20 4c 69 74     /* UTF-16 Lit
2bb0: 74 6c 65 2d 65 6e 64 69 61 6e 20 2d 3e 20 55 54  tle-endian -> UT
2bc0: 46 2d 38 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  F-8 */.      whi
2bd0: 6c 65 28 20 7a 49 6e 3c 7a 54 65 72 6d 20 29 7b  le( zIn<zTerm ){
2be0: 0a 20 20 20 20 20 20 20 20 52 45 41 44 5f 55 54  .        READ_UT
2bf0: 46 31 36 4c 45 28 7a 49 6e 2c 20 63 29 3b 20 0a  F16LE(zIn, c); .
2c00: 20 20 20 20 20 20 20 20 57 52 49 54 45 5f 55 54          WRITE_UT
2c10: 46 38 28 7a 2c 20 63 29 3b 0a 20 20 20 20 20 20  F8(z, c);.      
2c20: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2c30: 20 20 20 2f 2a 20 55 54 46 2d 31 36 20 42 69 67     /* UTF-16 Big
2c40: 2d 65 6e 64 69 61 6e 20 2d 3e 20 55 54 46 2d 38  -endian -> UTF-8
2c50: 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
2c60: 20 7a 49 6e 3c 7a 54 65 72 6d 20 29 7b 0a 20 20   zIn<zTerm ){.  
2c70: 20 20 20 20 20 20 52 45 41 44 5f 55 54 46 31 36        READ_UTF16
2c80: 42 45 28 7a 49 6e 2c 20 63 29 3b 20 0a 20 20 20  BE(zIn, c); .   
2c90: 20 20 20 20 20 57 52 49 54 45 5f 55 54 46 38 28       WRITE_UTF8(
2ca0: 7a 2c 20 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, c);.      }. 
2cb0: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e     }.    pMem->n
2cc0: 20 3d 20 7a 20 2d 20 7a 4f 75 74 3b 0a 20 20 7d   = z - zOut;.  }
2cd0: 0a 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 61 73 73  .  *z = 0;.  ass
2ce0: 65 72 74 28 20 28 70 4d 65 6d 2d 3e 6e 2b 28 64  ert( (pMem->n+(d
2cf0: 65 73 69 72 65 64 45 6e 63 3d 3d 53 51 4c 49 54  esiredEnc==SQLIT
2d00: 45 5f 55 54 46 38 3f 31 3a 32 29 29 3c 3d 6c 65  E_UTF8?1:2))<=le
2d10: 6e 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56  n );..  sqlite3V
2d20: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d  dbeMemRelease(pM
2d30: 65 6d 29 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61  em);.  pMem->fla
2d40: 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 53 74 61 74  gs &= ~(MEM_Stat
2d50: 69 63 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45  ic|MEM_Dyn|MEM_E
2d60: 70 68 65 6d 29 3b 0a 20 20 70 4d 65 6d 2d 3e 65  phem);.  pMem->e
2d70: 6e 63 20 3d 20 64 65 73 69 72 65 64 45 6e 63 3b  nc = desiredEnc;
2d80: 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 7c  .  pMem->flags |
2d90: 3d 20 28 4d 45 4d 5f 54 65 72 6d 7c 4d 45 4d 5f  = (MEM_Term|MEM_
2da0: 44 79 6e 29 3b 0a 20 20 70 4d 65 6d 2d 3e 7a 20  Dyn);.  pMem->z 
2db0: 3d 20 28 63 68 61 72 2a 29 7a 4f 75 74 3b 0a 20  = (char*)zOut;. 
2dc0: 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d   pMem->zMalloc =
2dd0: 20 70 4d 65 6d 2d 3e 7a 3b 0a 0a 74 72 61 6e 73   pMem->z;..trans
2de0: 6c 61 74 65 5f 6f 75 74 3a 0a 23 69 66 20 64 65  late_out:.#if de
2df0: 66 69 6e 65 64 28 54 52 41 4e 53 4c 41 54 45 5f  fined(TRANSLATE_
2e00: 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65  TRACE) && define
2e10: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
2e20: 20 20 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75    {.    char zBu
2e30: 66 5b 31 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69  f[100];.    sqli
2e40: 74 65 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79  te3VdbeMemPretty
2e50: 50 72 69 6e 74 28 70 4d 65 6d 2c 20 7a 42 75 66  Print(pMem, zBuf
2e60: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  );.    fprintf(s
2e70: 74 64 65 72 72 2c 20 22 4f 55 54 50 55 54 3a 20  tderr, "OUTPUT: 
2e80: 25 73 5c 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20  %s\n", zBuf);.  
2e90: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
2ea0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2eb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2ec0: 6e 65 20 63 68 65 63 6b 73 20 66 6f 72 20 61 20  ne checks for a 
2ed0: 62 79 74 65 2d 6f 72 64 65 72 20 6d 61 72 6b 20  byte-order mark 
2ee0: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
2ef0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 55 54 46 2d   of the .** UTF-
2f00: 31 36 20 73 74 72 69 6e 67 20 73 74 6f 72 65 64  16 string stored
2f10: 20 69 6e 20 2a 70 4d 65 6d 2e 20 49 66 20 6f 6e   in *pMem. If on
2f20: 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74  e is present, it
2f30: 20 69 73 20 72 65 6d 6f 76 65 64 20 61 6e 64 0a   is removed and.
2f40: 2a 2a 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  ** the encoding 
2f50: 6f 66 20 74 68 65 20 4d 65 6d 20 61 64 6a 75 73  of the Mem adjus
2f60: 74 65 64 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ted. This routin
2f70: 65 20 64 6f 65 73 20 6e 6f 74 20 64 6f 20 61 6e  e does not do an
2f80: 79 0a 2a 2a 20 62 79 74 65 2d 73 77 61 70 70 69  y.** byte-swappi
2f90: 6e 67 2c 20 69 74 20 6a 75 73 74 20 73 65 74 73  ng, it just sets
2fa0: 20 4d 65 6d 2e 65 6e 63 20 61 70 70 72 6f 70 72   Mem.enc appropr
2fb0: 69 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  iately..**.** Th
2fc0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 28 73 74  e allocation (st
2fd0: 61 74 69 63 2c 20 64 79 6e 61 6d 69 63 20 65 74  atic, dynamic et
2fe0: 63 2e 29 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67  c.) and encoding
2ff0: 20 6f 66 20 74 68 65 20 4d 65 6d 20 6d 61 79 20   of the Mem may 
3000: 62 65 0a 2a 2a 20 63 68 61 6e 67 65 64 20 62 79  be.** changed by
3010: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
3020: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
3030: 62 65 4d 65 6d 48 61 6e 64 6c 65 42 6f 6d 28 4d  beMemHandleBom(M
3040: 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 6e 74  em *pMem){.  int
3050: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
3060: 0a 20 20 75 38 20 62 6f 6d 20 3d 20 30 3b 0a 0a  .  u8 bom = 0;..
3070: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 6e 3c 30 20    if( pMem->n<0 
3080: 7c 7c 20 70 4d 65 6d 2d 3e 6e 3e 31 20 29 7b 0a  || pMem->n>1 ){.
3090: 20 20 20 20 75 38 20 62 31 20 3d 20 2a 28 75 38      u8 b1 = *(u8
30a0: 20 2a 29 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   *)pMem->z;.    
30b0: 75 38 20 62 32 20 3d 20 2a 28 28 28 75 38 20 2a  u8 b2 = *(((u8 *
30c0: 29 70 4d 65 6d 2d 3e 7a 29 20 2b 20 31 29 3b 0a  )pMem->z) + 1);.
30d0: 20 20 20 20 69 66 28 20 62 31 3d 3d 30 78 46 45      if( b1==0xFE
30e0: 20 26 26 20 62 32 3d 3d 30 78 46 46 20 29 7b 0a   && b2==0xFF ){.
30f0: 20 20 20 20 20 20 62 6f 6d 20 3d 20 53 51 4c 49        bom = SQLI
3100: 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 20 20  TE_UTF16BE;.    
3110: 7d 0a 20 20 20 20 69 66 28 20 62 31 3d 3d 30 78  }.    if( b1==0x
3120: 46 46 20 26 26 20 62 32 3d 3d 30 78 46 45 20 29  FF && b2==0xFE )
3130: 7b 0a 20 20 20 20 20 20 62 6f 6d 20 3d 20 53 51  {.      bom = SQ
3140: 4c 49 54 45 5f 55 54 46 31 36 4c 45 3b 0a 20 20  LITE_UTF16LE;.  
3150: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28    }.  }.  .  if(
3160: 20 62 6f 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d   bom ){.    rc =
3170: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d   sqlite3VdbeMemM
3180: 61 6b 65 57 72 69 74 65 61 62 6c 65 28 70 4d 65  akeWriteable(pMe
3190: 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  m);.    if( rc==
31a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31b0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 2d 3d 20 32 3b     pMem->n -= 2;
31c0: 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  .      memmove(p
31d0: 4d 65 6d 2d 3e 7a 2c 20 26 70 4d 65 6d 2d 3e 7a  Mem->z, &pMem->z
31e0: 5b 32 5d 2c 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20  [2], pMem->n);. 
31f0: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 5b 70 4d 65       pMem->z[pMe
3200: 6d 2d 3e 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  m->n] = '\0';.  
3210: 20 20 20 20 70 4d 65 6d 2d 3e 7a 5b 70 4d 65 6d      pMem->z[pMem
3220: 2d 3e 6e 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20  ->n+1] = '\0';. 
3230: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
3240: 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20   |= MEM_Term;.  
3250: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
3260: 62 6f 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  bom;.    }.  }. 
3270: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
3280: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
3290: 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a  MIT_UTF16 */../*
32a0: 0a 2a 2a 20 70 5a 20 69 73 20 61 20 55 54 46 2d  .** pZ is a UTF-
32b0: 38 20 65 6e 63 6f 64 65 64 20 75 6e 69 63 6f 64  8 encoded unicod
32c0: 65 20 73 74 72 69 6e 67 2e 20 49 66 20 6e 42 79  e string. If nBy
32d0: 74 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  te is less than 
32e0: 7a 65 72 6f 2c 0a 2a 2a 20 72 65 74 75 72 6e 20  zero,.** return 
32f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e  the number of un
3300: 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 73  icode characters
3310: 20 69 6e 20 70 5a 20 75 70 20 74 6f 20 28 62 75   in pZ up to (bu
3320: 74 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 29  t not including)
3330: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 30 78  .** the first 0x
3340: 30 30 20 62 79 74 65 2e 20 49 66 20 6e 42 79 74  00 byte. If nByt
3350: 65 20 69 73 20 6e 6f 74 20 6c 65 73 73 20 74 68  e is not less th
3360: 61 6e 20 7a 65 72 6f 2c 20 72 65 74 75 72 6e 20  an zero, return 
3370: 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
3380: 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74   unicode charact
3390: 65 72 73 20 69 6e 20 74 68 65 20 66 69 72 73 74  ers in the first
33a0: 20 6e 42 79 74 65 20 6f 66 20 70 5a 20 28 6f 72   nByte of pZ (or
33b0: 20 75 70 20 74 6f 20 0a 2a 2a 20 74 68 65 20 66   up to .** the f
33c0: 69 72 73 74 20 30 78 30 30 2c 20 77 68 69 63 68  irst 0x00, which
33d0: 65 76 65 72 20 63 6f 6d 65 73 20 66 69 72 73 74  ever comes first
33e0: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
33f0: 33 55 74 66 38 43 68 61 72 4c 65 6e 28 63 6f 6e  3Utf8CharLen(con
3400: 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20 69 6e  st char *zIn, in
3410: 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20  t nByte){.  int 
3420: 72 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75  r = 0;.  const u
3430: 38 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38  8 *z = (const u8
3440: 2a 29 7a 49 6e 3b 0a 20 20 63 6f 6e 73 74 20 75  *)zIn;.  const u
3450: 38 20 2a 7a 54 65 72 6d 3b 0a 20 20 69 66 28 20  8 *zTerm;.  if( 
3460: 6e 42 79 74 65 3e 3d 30 20 29 7b 0a 20 20 20 20  nByte>=0 ){.    
3470: 7a 54 65 72 6d 20 3d 20 26 7a 5b 6e 42 79 74 65  zTerm = &z[nByte
3480: 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
3490: 7a 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20 75  zTerm = (const u
34a0: 38 2a 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 61  8*)(-1);.  }.  a
34b0: 73 73 65 72 74 28 20 7a 3c 3d 7a 54 65 72 6d 20  ssert( z<=zTerm 
34c0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 21 3d  );.  while( *z!=
34d0: 30 20 26 26 20 7a 3c 7a 54 65 72 6d 20 29 7b 0a  0 && z<zTerm ){.
34e0: 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f      SQLITE_SKIP_
34f0: 55 54 46 38 28 7a 29 3b 0a 20 20 20 20 72 2b 2b  UTF8(z);.    r++
3500: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
3510: 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 74 65 73  ;.}../* This tes
3520: 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  t function is no
3530: 74 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65 64  t currently used
3540: 20 62 79 20 74 68 65 20 61 75 74 6f 6d 61 74 65   by the automate
3550: 64 20 74 65 73 74 2d 73 75 69 74 65 2e 20 0a 2a  d test-suite. .*
3560: 2a 20 48 65 6e 63 65 20 69 74 20 69 73 20 6f 6e  * Hence it is on
3570: 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ly available in 
3580: 64 65 62 75 67 20 62 75 69 6c 64 73 2e 0a 2a 2f  debug builds..*/
3590: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
35a0: 49 54 45 5f 54 45 53 54 29 20 26 26 20 64 65 66  ITE_TEST) && def
35b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
35c0: 47 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  G)./*.** Transla
35d0: 74 65 20 55 54 46 2d 38 20 74 6f 20 55 54 46 2d  te UTF-8 to UTF-
35e0: 38 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 68 61  8..**.** This ha
35f0: 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
3600: 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68 61 74  making sure that
3610: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 77   the string is w
3620: 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 55 54  ell-formed.** UT
3630: 46 2d 38 2e 20 20 4d 69 73 63 6f 64 65 64 20 63  F-8.  Miscoded c
3640: 68 61 72 61 63 74 65 72 73 20 61 72 65 20 72 65  haracters are re
3650: 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  moved..**.** The
3660: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20   translation is 
3670: 64 6f 6e 65 20 69 6e 2d 70 6c 61 63 65 20 28 73  done in-place (s
3680: 69 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73  ince it is impos
3690: 73 69 62 6c 65 20 66 6f 72 20 74 68 65 0a 2a 2a  sible for the.**
36a0: 20 63 6f 72 72 65 63 74 20 55 54 46 2d 38 20 65   correct UTF-8 e
36b0: 6e 63 6f 64 69 6e 67 20 74 6f 20 62 65 20 6c 6f  ncoding to be lo
36c0: 6e 67 65 72 20 74 68 61 6e 20 61 20 6d 61 6c 66  nger than a malf
36d0: 6f 72 6d 65 64 20 65 6e 63 6f 64 69 6e 67 29 2e  ormed encoding).
36e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55  .*/.int sqlite3U
36f0: 74 66 38 54 6f 38 28 75 6e 73 69 67 6e 65 64 20  tf8To8(unsigned 
3700: 63 68 61 72 20 2a 7a 49 6e 29 7b 0a 20 20 75 6e  char *zIn){.  un
3710: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4f 75  signed char *zOu
3720: 74 20 3d 20 7a 49 6e 3b 0a 20 20 75 6e 73 69 67  t = zIn;.  unsig
3730: 6e 65 64 20 63 68 61 72 20 2a 7a 53 74 61 72 74  ned char *zStart
3740: 20 3d 20 7a 49 6e 3b 0a 20 20 75 6e 73 69 67 6e   = zIn;.  unsign
3750: 65 64 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 0a  ed char *zTerm;.
3760: 20 20 75 33 32 20 63 3b 0a 0a 20 20 77 68 69 6c    u32 c;..  whil
3770: 65 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20  e( zIn[0] ){.   
3780: 20 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38   c = sqlite3Utf8
3790: 52 65 61 64 28 7a 49 6e 2c 20 7a 54 65 72 6d 2c  Read(zIn, zTerm,
37a0: 20 28 63 6f 6e 73 74 20 75 38 2a 2a 29 26 7a 49   (const u8**)&zI
37b0: 6e 29 3b 0a 20 20 20 20 69 66 28 20 63 21 3d 30  n);.    if( c!=0
37c0: 78 66 66 66 64 20 29 7b 0a 20 20 20 20 20 20 57  xfffd ){.      W
37d0: 52 49 54 45 5f 55 54 46 38 28 7a 4f 75 74 2c 20  RITE_UTF8(zOut, 
37e0: 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  c);.    }.  }.  
37f0: 2a 7a 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74  *zOut = 0;.  ret
3800: 75 72 6e 20 7a 4f 75 74 20 2d 20 7a 53 74 61 72  urn zOut - zStar
3810: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  t;.}.#endif..#if
3820: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3830: 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 43 6f 6e  _UTF16./*.** Con
3840: 76 65 72 74 20 61 20 55 54 46 2d 31 36 20 73 74  vert a UTF-16 st
3850: 72 69 6e 67 20 69 6e 20 74 68 65 20 6e 61 74 69  ring in the nati
3860: 76 65 20 65 6e 63 6f 64 69 6e 67 20 69 6e 74 6f  ve encoding into
3870: 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e   a UTF-8 string.
3880: 0a 2a 2a 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f  .** Memory to ho
3890: 6c 64 20 74 68 65 20 55 54 46 2d 38 20 73 74 72  ld the UTF-8 str
38a0: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
38b0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
38c0: 6c 6f 63 20 61 6e 64 20 6d 75 73 74 0a 2a 2a 20  loc and must.** 
38d0: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
38e0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
38f0: 2e 0a 2a 2a 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20  ..**.** NULL is 
3900: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 72  returned if ther
3910: 65 20 69 73 20 61 6e 20 61 6c 6c 6f 63 61 74 69  e is an allocati
3920: 6f 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 68 61  on error..*/.cha
3930: 72 20 2a 73 71 6c 69 74 65 33 55 74 66 31 36 74  r *sqlite3Utf16t
3940: 6f 38 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  o8(sqlite3 *db, 
3950: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 2c 20 69  const void *z, i
3960: 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 4d 65 6d  nt nByte){.  Mem
3970: 20 6d 3b 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c   m;.  memset(&m,
3980: 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a   0, sizeof(m));.
3990: 20 20 6d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73    m.db = db;.  s
39a0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
39b0: 53 74 72 28 26 6d 2c 20 7a 2c 20 6e 42 79 74 65  Str(&m, z, nByte
39c0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
39d0: 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41  TIVE, SQLITE_STA
39e0: 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  TIC);.  sqlite3V
39f0: 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e  dbeChangeEncodin
3a00: 67 28 26 6d 2c 20 53 51 4c 49 54 45 5f 55 54 46  g(&m, SQLITE_UTF
3a10: 38 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  8);.  if( db->ma
3a20: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
3a30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
3a40: 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 20  Release(&m);.   
3a50: 20 6d 2e 7a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   m.z = 0;.  }.  
3a60: 61 73 73 65 72 74 28 20 28 6d 2e 66 6c 61 67 73  assert( (m.flags
3a70: 20 26 20 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20   & MEM_Term)!=0 
3a80: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
3a90: 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  led );.  assert(
3aa0: 20 28 6d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   (m.flags & MEM_
3ab0: 53 74 72 29 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  Str)!=0 || db->m
3ac0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
3ad0: 20 72 65 74 75 72 6e 20 28 6d 2e 66 6c 61 67 73   return (m.flags
3ae0: 20 26 20 4d 45 4d 5f 44 79 6e 29 21 3d 30 20 3f   & MEM_Dyn)!=0 ?
3af0: 20 6d 2e 7a 20 3a 20 73 71 6c 69 74 65 33 44 62   m.z : sqlite3Db
3b00: 53 74 72 44 75 70 28 64 62 2c 20 6d 2e 7a 29 3b  StrDup(db, m.z);
3b10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 5a 20 69 73 20  .}../*.** pZ is 
3b20: 61 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64  a UTF-16 encoded
3b30: 20 75 6e 69 63 6f 64 65 20 73 74 72 69 6e 67 2e   unicode string.
3b40: 20 49 66 20 6e 43 68 61 72 20 69 73 20 6c 65 73   If nChar is les
3b50: 73 20 74 68 61 6e 20 7a 65 72 6f 2c 0a 2a 2a 20  s than zero,.** 
3b60: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
3b70: 72 20 6f 66 20 62 79 74 65 73 20 75 70 20 74 6f  r of bytes up to
3b80: 20 28 62 75 74 20 6e 6f 74 20 69 6e 63 6c 75 64   (but not includ
3b90: 69 6e 67 29 2c 20 74 68 65 20 66 69 72 73 74 20  ing), the first 
3ba0: 70 61 69 72 0a 2a 2a 20 6f 66 20 63 6f 6e 73 65  pair.** of conse
3bb0: 63 75 74 69 76 65 20 30 78 30 30 20 62 79 74 65  cutive 0x00 byte
3bc0: 73 20 69 6e 20 70 5a 2e 20 49 66 20 6e 43 68 61  s in pZ. If nCha
3bd0: 72 20 69 73 20 6e 6f 74 20 6c 65 73 73 20 74 68  r is not less th
3be0: 61 6e 20 7a 65 72 6f 2c 0a 2a 2a 20 74 68 65 6e  an zero,.** then
3bf0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
3c00: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
3c10: 68 65 20 66 69 72 73 74 20 6e 43 68 61 72 20 75  he first nChar u
3c20: 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72  nicode character
3c30: 73 0a 2a 2a 20 69 6e 20 70 5a 20 28 6f 72 20 75  s.** in pZ (or u
3c40: 70 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  p until the firs
3c50: 74 20 70 61 69 72 20 6f 66 20 30 78 30 30 20 62  t pair of 0x00 b
3c60: 79 74 65 73 2c 20 77 68 69 63 68 65 76 65 72 20  ytes, whichever 
3c70: 63 6f 6d 65 73 20 66 69 72 73 74 29 2e 0a 2a 2f  comes first)..*/
3c80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 74 66 31  .int sqlite3Utf1
3c90: 36 42 79 74 65 4c 65 6e 28 63 6f 6e 73 74 20 76  6ByteLen(const v
3ca0: 6f 69 64 20 2a 7a 49 6e 2c 20 69 6e 74 20 6e 43  oid *zIn, int nC
3cb0: 68 61 72 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  har){.  unsigned
3cc0: 20 69 6e 74 20 63 20 3d 20 31 3b 0a 20 20 63 68   int c = 1;.  ch
3cd0: 61 72 20 63 6f 6e 73 74 20 2a 7a 20 3d 20 7a 49  ar const *z = zI
3ce0: 6e 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  n;.  int n = 0;.
3cf0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 55 54 46    if( SQLITE_UTF
3d00: 31 36 4e 41 54 49 56 45 3d 3d 53 51 4c 49 54 45  16NATIVE==SQLITE
3d10: 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20  _UTF16BE ){.    
3d20: 2f 2a 20 55 73 69 6e 67 20 61 6e 20 22 69 66 20  /* Using an "if 
3d30: 28 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54  (SQLITE_UTF16NAT
3d40: 49 56 45 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  IVE==SQLITE_UTF1
3d50: 36 42 45 29 22 20 63 6f 6e 73 74 72 75 63 74 20  6BE)" construct 
3d60: 68 65 72 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  here.    ** and 
3d70: 69 6e 20 6f 74 68 65 72 20 70 61 72 74 73 20 6f  in other parts o
3d80: 66 20 74 68 69 73 20 66 69 6c 65 20 6d 65 61 6e  f this file mean
3d90: 73 20 74 68 61 74 20 61 74 20 6f 6e 65 20 62 72  s that at one br
3da0: 61 6e 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  anch will.    **
3db0: 20 6e 6f 74 20 62 65 20 63 6f 76 65 72 65 64 20   not be covered 
3dc0: 62 79 20 63 6f 76 65 72 61 67 65 20 74 65 73 74  by coverage test
3dd0: 69 6e 67 20 6f 6e 20 61 6e 79 20 73 69 6e 67 6c  ing on any singl
3de0: 65 20 68 6f 73 74 2e 20 42 75 74 20 63 6f 76 65  e host. But cove
3df0: 72 61 67 65 0a 20 20 20 20 2a 2a 20 77 69 6c 6c  rage.    ** will
3e00: 20 62 65 20 63 6f 6d 70 6c 65 74 65 20 69 66 20   be complete if 
3e10: 74 68 65 20 74 65 73 74 73 20 61 72 65 20 72 75  the tests are ru
3e20: 6e 20 6f 6e 20 62 6f 74 68 20 61 20 6c 69 74 74  n on both a litt
3e30: 6c 65 2d 65 6e 64 69 61 6e 20 61 6e 64 20 0a 20  le-endian and . 
3e40: 20 20 20 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e     ** big-endian
3e50: 20 68 6f 73 74 2e 20 42 65 63 61 75 73 65 20 62   host. Because b
3e60: 6f 74 68 20 74 68 65 20 55 54 46 31 36 4e 41 54  oth the UTF16NAT
3e70: 49 56 45 20 61 6e 64 20 53 51 4c 49 54 45 5f 55  IVE and SQLITE_U
3e80: 54 46 31 36 42 45 0a 20 20 20 20 2a 2a 20 6d 61  TF16BE.    ** ma
3e90: 63 72 6f 73 20 61 72 65 20 63 6f 6e 73 74 61 6e  cros are constan
3ea0: 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  t at compile tim
3eb0: 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63  e the compiler c
3ec0: 61 6e 20 64 65 74 65 72 6d 69 6e 65 0a 20 20 20  an determine.   
3ed0: 20 2a 2a 20 77 68 69 63 68 20 62 72 61 6e 63 68   ** which branch
3ee0: 20 77 69 6c 6c 20 62 65 20 66 6f 6c 6c 6f 77 65   will be followe
3ef0: 64 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f  d. It is therefo
3f00: 72 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  re assumed that 
3f10: 6e 6f 20 72 75 6e 74 69 6d 65 0a 20 20 20 20 2a  no runtime.    *
3f20: 2a 20 70 65 6e 61 6c 74 79 20 69 73 20 70 61 69  * penalty is pai
3f30: 64 20 66 6f 72 20 74 68 69 73 20 22 69 66 22 20  d for this "if" 
3f40: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a  statement..    *
3f50: 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 63 20 26  /.    while( c &
3f60: 26 20 28 28 6e 43 68 61 72 3c 30 29 20 7c 7c 20  & ((nChar<0) || 
3f70: 6e 3c 6e 43 68 61 72 29 20 29 7b 0a 20 20 20 20  n<nChar) ){.    
3f80: 20 20 52 45 41 44 5f 55 54 46 31 36 42 45 28 7a    READ_UTF16BE(z
3f90: 2c 20 63 29 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b  , c);.      n++;
3fa0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
3fb0: 20 20 20 20 77 68 69 6c 65 28 20 63 20 26 26 20      while( c && 
3fc0: 28 28 6e 43 68 61 72 3c 30 29 20 7c 7c 20 6e 3c  ((nChar<0) || n<
3fd0: 6e 43 68 61 72 29 20 29 7b 0a 20 20 20 20 20 20  nChar) ){.      
3fe0: 52 45 41 44 5f 55 54 46 31 36 4c 45 28 7a 2c 20  READ_UTF16LE(z, 
3ff0: 63 29 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  c);.      n++;. 
4000: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
4010: 6e 20 28 7a 2d 28 63 68 61 72 20 63 6f 6e 73 74  n (z-(char const
4020: 20 2a 29 7a 49 6e 29 2d 28 28 63 3d 3d 30 29 3f   *)zIn)-((c==0)?
4030: 32 3a 30 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  2:0);.}..#if def
4040: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
4050: 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  )./*.** This rou
4060: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
4070: 72 6f 6d 20 74 68 65 20 54 43 4c 20 74 65 73 74  rom the TCL test
4080: 20 66 75 6e 63 74 69 6f 6e 20 22 74 72 61 6e 73   function "trans
4090: 6c 61 74 65 5f 73 65 6c 66 74 65 73 74 22 2e 0a  late_selftest"..
40a0: 2a 2a 20 49 74 20 63 68 65 63 6b 73 20 74 68 61  ** It checks tha
40b0: 74 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 73  t the primitives
40c0: 20 66 6f 72 20 73 65 72 69 61 6c 69 7a 69 6e 67   for serializing
40d0: 20 61 6e 64 20 64 65 73 65 72 69 61 6c 69 7a 69   and deserializi
40e0: 6e 67 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  ng.** characters
40f0: 20 69 6e 20 65 61 63 68 20 65 6e 63 6f 64 69 6e   in each encodin
4100: 67 20 61 72 65 20 69 6e 76 65 72 73 65 73 20 6f  g are inverses o
4110: 66 20 65 61 63 68 20 6f 74 68 65 72 2e 0a 2a 2f  f each other..*/
4120: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 74 66  .void sqlite3Utf
4130: 53 65 6c 66 54 65 73 74 28 29 7b 0a 20 20 75 6e  SelfTest(){.  un
4140: 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 74 3b  signed int i, t;
4150: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4160: 20 7a 42 75 66 5b 32 30 5d 3b 0a 20 20 75 6e 73   zBuf[20];.  uns
4170: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20  igned char *z;. 
4180: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4190: 7a 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 3b 0a  zTerm;.  int n;.
41a0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63    unsigned int c
41b0: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
41c0: 30 78 30 30 31 31 30 30 30 30 3b 20 69 2b 2b 29  0x00110000; i++)
41d0: 7b 0a 20 20 20 20 7a 20 3d 20 7a 42 75 66 3b 0a  {.    z = zBuf;.
41e0: 20 20 20 20 57 52 49 54 45 5f 55 54 46 38 28 7a      WRITE_UTF8(z
41f0: 2c 20 69 29 3b 0a 20 20 20 20 6e 20 3d 20 7a 2d  , i);.    n = z-
4200: 7a 42 75 66 3b 0a 20 20 20 20 7a 5b 30 5d 20 3d  zBuf;.    z[0] =
4210: 20 30 3b 0a 20 20 20 20 7a 54 65 72 6d 20 3d 20   0;.    zTerm = 
4220: 7a 3b 0a 20 20 20 20 7a 20 3d 20 7a 42 75 66 3b  z;.    z = zBuf;
4230: 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33  .    c = sqlite3
4240: 55 74 66 38 52 65 61 64 28 7a 2c 20 7a 54 65 72  Utf8Read(z, zTer
4250: 6d 2c 20 28 63 6f 6e 73 74 20 75 38 2a 2a 29 26  m, (const u8**)&
4260: 7a 29 3b 0a 20 20 20 20 74 20 3d 20 69 3b 0a 20  z);.    t = i;. 
4270: 20 20 20 69 66 28 20 69 3e 3d 30 78 44 38 30 30     if( i>=0xD800
4280: 20 26 26 20 69 3c 3d 30 78 44 46 46 46 20 29 20   && i<=0xDFFF ) 
4290: 74 20 3d 20 30 78 46 46 46 44 3b 0a 20 20 20 20  t = 0xFFFD;.    
42a0: 69 66 28 20 28 69 26 30 78 46 46 46 46 46 46 46  if( (i&0xFFFFFFF
42b0: 45 29 3d 3d 30 78 46 46 46 45 20 29 20 74 20 3d  E)==0xFFFE ) t =
42c0: 20 30 78 46 46 46 44 3b 0a 20 20 20 20 61 73 73   0xFFFD;.    ass
42d0: 65 72 74 28 20 63 3d 3d 74 20 29 3b 0a 20 20 20  ert( c==t );.   
42e0: 20 61 73 73 65 72 74 28 20 28 7a 2d 7a 42 75 66   assert( (z-zBuf
42f0: 29 3d 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 66 6f  )==n );.  }.  fo
4300: 72 28 69 3d 30 3b 20 69 3c 30 78 30 30 31 31 30  r(i=0; i<0x00110
4310: 30 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  000; i++){.    i
4320: 66 28 20 69 3e 3d 30 78 44 38 30 30 20 26 26 20  f( i>=0xD800 && 
4330: 69 3c 30 78 45 30 30 30 20 29 20 63 6f 6e 74 69  i<0xE000 ) conti
4340: 6e 75 65 3b 0a 20 20 20 20 7a 20 3d 20 7a 42 75  nue;.    z = zBu
4350: 66 3b 0a 20 20 20 20 57 52 49 54 45 5f 55 54 46  f;.    WRITE_UTF
4360: 31 36 4c 45 28 7a 2c 20 69 29 3b 0a 20 20 20 20  16LE(z, i);.    
4370: 6e 20 3d 20 7a 2d 7a 42 75 66 3b 0a 20 20 20 20  n = z-zBuf;.    
4380: 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7a 20  z[0] = 0;.    z 
4390: 3d 20 7a 42 75 66 3b 0a 20 20 20 20 52 45 41 44  = zBuf;.    READ
43a0: 5f 55 54 46 31 36 4c 45 28 7a 2c 20 63 29 3b 0a  _UTF16LE(z, c);.
43b0: 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 69      assert( c==i
43c0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
43d0: 28 7a 2d 7a 42 75 66 29 3d 3d 6e 20 29 3b 0a 20  (z-zBuf)==n );. 
43e0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
43f0: 30 78 30 30 31 31 30 30 30 30 3b 20 69 2b 2b 29  0x00110000; i++)
4400: 7b 0a 20 20 20 20 69 66 28 20 69 3e 3d 30 78 44  {.    if( i>=0xD
4410: 38 30 30 20 26 26 20 69 3c 30 78 45 30 30 30 20  800 && i<0xE000 
4420: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
4430: 7a 20 3d 20 7a 42 75 66 3b 0a 20 20 20 20 57 52  z = zBuf;.    WR
4440: 49 54 45 5f 55 54 46 31 36 42 45 28 7a 2c 20 69  ITE_UTF16BE(z, i
4450: 29 3b 0a 20 20 20 20 6e 20 3d 20 7a 2d 7a 42 75  );.    n = z-zBu
4460: 66 3b 0a 20 20 20 20 7a 5b 30 5d 20 3d 20 30 3b  f;.    z[0] = 0;
4470: 0a 20 20 20 20 7a 20 3d 20 7a 42 75 66 3b 0a 20  .    z = zBuf;. 
4480: 20 20 20 52 45 41 44 5f 55 54 46 31 36 42 45 28     READ_UTF16BE(
4490: 7a 2c 20 63 29 3b 0a 20 20 20 20 61 73 73 65 72  z, c);.    asser
44a0: 74 28 20 63 3d 3d 69 20 29 3b 0a 20 20 20 20 61  t( c==i );.    a
44b0: 73 73 65 72 74 28 20 28 7a 2d 7a 42 75 66 29 3d  ssert( (z-zBuf)=
44c0: 3d 6e 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  =n );.  }.}.#end
44d0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53  if /* SQLITE_TES
44e0: 54 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53  T */.#endif /* S
44f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
4500: 20 2a 2f 0a                                       */.