/ Hex Artifact Content
Login

Artifact 890c67dcfcc7a74623c95baac7535aadfe265e84:


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 4e 6f 74  -16LE..**.** Not
01e0: 65 73 20 6f 6e 20 55 54 46 2d 38 3a 0a 2a 2a 0a  es on UTF-8:.**.
01f0: 2a 2a 20 20 20 42 79 74 65 2d 30 20 20 20 20 42  **   Byte-0    B
0200: 79 74 65 2d 31 20 20 20 20 42 79 74 65 2d 32 20  yte-1    Byte-2 
0210: 20 20 20 42 79 74 65 2d 33 20 20 20 20 56 61 6c     Byte-3    Val
0220: 75 65 0a 2a 2a 20 20 30 78 78 78 78 78 78 78 20  ue.**  0xxxxxxx 
0230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0250: 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30  00000000 0000000
0260: 30 20 30 78 78 78 78 78 78 78 0a 2a 2a 20 20 31  0 0xxxxxxx.**  1
0270: 31 30 79 79 79 79 79 20 20 31 30 78 78 78 78 78  10yyyyy  10xxxxx
0280: 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
0290: 20 20 20 20 20 20 20 20 30 30 30 30 30 30 30 30          00000000
02a0: 20 30 30 30 30 30 79 79 79 20 79 79 78 78 78 78   00000yyy yyxxxx
02b0: 78 78 0a 2a 2a 20 20 31 31 31 30 7a 7a 7a 7a 20  xx.**  1110zzzz 
02c0: 20 31 30 79 79 79 79 79 79 20 20 31 30 78 78 78   10yyyyyy  10xxx
02d0: 78 78 78 20 20 20 20 20 20 20 20 20 20 20 20 20  xxx             
02e0: 30 30 30 30 30 30 30 30 20 7a 7a 7a 7a 79 79 79  00000000 zzzzyyy
02f0: 79 20 79 79 78 78 78 78 78 78 0a 2a 2a 20 20 31  y yyxxxxxx.**  1
0300: 31 31 31 30 75 75 75 20 20 31 30 75 75 7a 7a 7a  1110uuu  10uuzzz
0310: 7a 20 20 31 30 79 79 79 79 79 79 20 20 31 30 78  z  10yyyyyy  10x
0320: 78 78 78 78 78 20 20 20 30 30 30 75 75 75 75 75  xxxxx   000uuuuu
0330: 20 7a 7a 7a 7a 79 79 79 79 20 79 79 78 78 78 78   zzzzyyyy yyxxxx
0340: 78 78 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  xx.**.**.** Note
0350: 73 20 6f 6e 20 55 54 46 2d 31 36 3a 20 20 28 77  s on UTF-16:  (w
0360: 69 74 68 20 77 77 77 77 2b 31 3d 3d 75 75 75 75  ith wwww+1==uuuu
0370: 75 29 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 57 6f  u).**.**      Wo
0380: 72 64 2d 30 20 20 20 20 20 20 20 20 20 20 20 20  rd-0            
0390: 20 20 20 57 6f 72 64 2d 31 20 20 20 20 20 20 20     Word-1       
03a0: 20 20 20 56 61 6c 75 65 0a 2a 2a 20 20 31 31 30     Value.**  110
03b0: 31 31 30 77 77 20 77 77 7a 7a 7a 7a 79 79 20 20  110ww wwzzzzyy  
03c0: 20 31 31 30 31 31 31 79 79 20 79 79 78 78 78 78   110111yy yyxxxx
03d0: 78 78 20 20 20 20 30 30 30 75 75 75 75 75 20 7a  xx    000uuuuu z
03e0: 7a 7a 7a 79 79 79 79 20 79 79 78 78 78 78 78 78  zzzyyyy yyxxxxxx
03f0: 0a 2a 2a 20 20 7a 7a 7a 7a 79 79 79 79 20 79 79  .**  zzzzyyyy yy
0400: 78 78 78 78 78 78 20 20 20 20 20 20 20 20 20 20  xxxxxx          
0410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 30                00
0420: 30 30 30 30 30 30 20 7a 7a 7a 7a 79 79 79 79 20  000000 zzzzyyyy 
0430: 79 79 78 78 78 78 78 78 0a 2a 2a 0a 2a 2a 0a 2a  yyxxxxxx.**.**.*
0440: 2a 20 42 4f 4d 20 6f 72 20 42 79 74 65 20 4f 72  * BOM or Byte Or
0450: 64 65 72 20 4d 61 72 6b 3a 0a 2a 2a 20 20 20 20  der Mark:.**    
0460: 20 30 78 66 66 20 30 78 66 65 20 20 20 6c 69 74   0xff 0xfe   lit
0470: 74 6c 65 2d 65 6e 64 69 61 6e 20 75 74 66 2d 31  tle-endian utf-1
0480: 36 20 66 6f 6c 6c 6f 77 73 0a 2a 2a 20 20 20 20  6 follows.**    
0490: 20 30 78 66 65 20 30 78 66 66 20 20 20 62 69 67   0xfe 0xff   big
04a0: 2d 65 6e 64 69 61 6e 20 75 74 66 2d 31 36 20 66  -endian utf-16 f
04b0: 6f 6c 6c 6f 77 73 0a 2a 2a 0a 2a 2f 0a 23 69 6e  ollows.**.*/.#in
04c0: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74  clude "sqliteInt
04d0: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73  .h".#include <as
04e0: 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  sert.h>.#include
04f0: 20 22 76 64 62 65 49 6e 74 2e 68 22 0a 0a 23 69   "vdbeInt.h"..#i
0500: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41  fndef SQLITE_AMA
0510: 4c 47 41 4d 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  LGAMATION./*.** 
0520: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
0530: 6e 73 74 61 6e 74 20 76 61 6c 75 65 20 69 73 20  nstant value is 
0540: 75 73 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  used by the SQLI
0550: 54 45 5f 42 49 47 45 4e 44 49 41 4e 20 61 6e 64  TE_BIGENDIAN and
0560: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 49 54 54 4c  .** SQLITE_LITTL
0570: 45 45 4e 44 49 41 4e 20 6d 61 63 72 6f 73 2e 0a  EENDIAN macros..
0580: 2a 2f 0a 63 6f 6e 73 74 20 69 6e 74 20 73 71 6c  */.const int sql
0590: 69 74 65 33 6f 6e 65 20 3d 20 31 3b 0a 23 65 6e  ite3one = 1;.#en
05a0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 41 4d  dif /* SQLITE_AM
05b0: 41 4c 47 41 4d 41 54 49 4f 4e 20 2a 2f 0a 0a 2f  ALGAMATION */../
05c0: 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 6f 6b 75 70  *.** This lookup
05d0: 20 74 61 62 6c 65 20 69 73 20 75 73 65 64 20 74   table is used t
05e0: 6f 20 68 65 6c 70 20 64 65 63 6f 64 65 20 74 68  o help decode th
05f0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 0a  e first byte of.
0600: 2a 2a 20 61 20 6d 75 6c 74 69 2d 62 79 74 65 20  ** a multi-byte 
0610: 55 54 46 38 20 63 68 61 72 61 63 74 65 72 2e 0a  UTF8 character..
0620: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
0630: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 71  unsigned char sq
0640: 6c 69 74 65 33 55 74 66 38 54 72 61 6e 73 31 5b  lite3Utf8Trans1[
0650: 5d 20 3d 20 7b 0a 20 20 30 78 30 30 2c 20 30 78  ] = {.  0x00, 0x
0660: 30 31 2c 20 30 78 30 32 2c 20 30 78 30 33 2c 20  01, 0x02, 0x03, 
0670: 30 78 30 34 2c 20 30 78 30 35 2c 20 30 78 30 36  0x04, 0x05, 0x06
0680: 2c 20 30 78 30 37 2c 0a 20 20 30 78 30 38 2c 20  , 0x07,.  0x08, 
0690: 30 78 30 39 2c 20 30 78 30 61 2c 20 30 78 30 62  0x09, 0x0a, 0x0b
06a0: 2c 20 30 78 30 63 2c 20 30 78 30 64 2c 20 30 78  , 0x0c, 0x0d, 0x
06b0: 30 65 2c 20 30 78 30 66 2c 0a 20 20 30 78 31 30  0e, 0x0f,.  0x10
06c0: 2c 20 30 78 31 31 2c 20 30 78 31 32 2c 20 30 78  , 0x11, 0x12, 0x
06d0: 31 33 2c 20 30 78 31 34 2c 20 30 78 31 35 2c 20  13, 0x14, 0x15, 
06e0: 30 78 31 36 2c 20 30 78 31 37 2c 0a 20 20 30 78  0x16, 0x17,.  0x
06f0: 31 38 2c 20 30 78 31 39 2c 20 30 78 31 61 2c 20  18, 0x19, 0x1a, 
0700: 30 78 31 62 2c 20 30 78 31 63 2c 20 30 78 31 64  0x1b, 0x1c, 0x1d
0710: 2c 20 30 78 31 65 2c 20 30 78 31 66 2c 0a 20 20  , 0x1e, 0x1f,.  
0720: 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32  0x00, 0x01, 0x02
0730: 2c 20 30 78 30 33 2c 20 30 78 30 34 2c 20 30 78  , 0x03, 0x04, 0x
0740: 30 35 2c 20 30 78 30 36 2c 20 30 78 30 37 2c 0a  05, 0x06, 0x07,.
0750: 20 20 30 78 30 38 2c 20 30 78 30 39 2c 20 30 78    0x08, 0x09, 0x
0760: 30 61 2c 20 30 78 30 62 2c 20 30 78 30 63 2c 20  0a, 0x0b, 0x0c, 
0770: 30 78 30 64 2c 20 30 78 30 65 2c 20 30 78 30 66  0x0d, 0x0e, 0x0f
0780: 2c 0a 20 20 30 78 30 30 2c 20 30 78 30 31 2c 20  ,.  0x00, 0x01, 
0790: 30 78 30 32 2c 20 30 78 30 33 2c 20 30 78 30 34  0x02, 0x03, 0x04
07a0: 2c 20 30 78 30 35 2c 20 30 78 30 36 2c 20 30 78  , 0x05, 0x06, 0x
07b0: 30 37 2c 0a 20 20 30 78 30 30 2c 20 30 78 30 31  07,.  0x00, 0x01
07c0: 2c 20 30 78 30 32 2c 20 30 78 30 33 2c 20 30 78  , 0x02, 0x03, 0x
07d0: 30 30 2c 20 30 78 30 31 2c 20 30 78 30 30 2c 20  00, 0x01, 0x00, 
07e0: 30 78 30 30 2c 0a 7d 3b 0a 0a 0a 23 64 65 66 69  0x00,.};...#defi
07f0: 6e 65 20 57 52 49 54 45 5f 55 54 46 38 28 7a 4f  ne WRITE_UTF8(zO
0800: 75 74 2c 20 63 29 20 7b 20 20 20 20 20 20 20 20  ut, c) {        
0810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0820: 20 20 5c 0a 20 20 69 66 28 20 63 3c 30 78 30 30    \.  if( c<0x00
0830: 30 38 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  080 ){          
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 20 20 20 5c 0a 20 20 20             \.   
0860: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 75 38 29 28   *zOut++ = (u8)(
0870: 63 26 30 78 46 46 29 3b 20 20 20 20 20 20 20 20  c&0xFF);        
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0890: 20 20 20 20 5c 0a 20 20 7d 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 20 20 20 5c 0a 20               \. 
08d0: 20 65 6c 73 65 20 69 66 28 20 63 3c 30 78 30 30   else if( c<0x00
08e0: 38 30 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  800 ){          
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75        \.    *zOu
0910: 74 2b 2b 20 3d 20 30 78 43 30 20 2b 20 28 75 38  t++ = 0xC0 + (u8
0920: 29 28 28 63 3e 3e 36 29 26 30 78 31 46 29 3b 20  )((c>>6)&0x1F); 
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
0940: 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30  .    *zOut++ = 0
0950: 78 38 30 20 2b 20 28 75 38 29 28 63 20 26 20 30  x80 + (u8)(c & 0
0960: 78 33 46 29 3b 20 20 20 20 20 20 20 20 20 20 20  x3F);           
0970: 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 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 20 20                  
09b0: 20 5c 0a 20 20 65 6c 73 65 20 69 66 28 20 63 3c   \.  else if( c<
09c0: 30 78 31 30 30 30 30 20 29 7b 20 20 20 20 20 20  0x10000 ){      
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 20 20 20 5c 0a 20 20 20 20            \.    
09f0: 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 45 30 20 2b  *zOut++ = 0xE0 +
0a00: 20 28 75 38 29 28 28 63 3e 3e 31 32 29 26 30 78   (u8)((c>>12)&0x
0a10: 30 46 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0F);            
0a20: 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b     \.    *zOut++
0a30: 20 3d 20 30 78 38 30 20 2b 20 28 75 38 29 28 28   = 0x80 + (u8)((
0a40: 63 3e 3e 36 29 20 26 20 30 78 33 46 29 3b 20 20  c>>6) & 0x3F);  
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
0a60: 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30    *zOut++ = 0x80
0a70: 20 2b 20 28 75 38 29 28 63 20 26 20 30 78 33 46   + (u8)(c & 0x3F
0a80: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
0a90: 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 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 20 20 20 5c 0a                \.
0ad0: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78      *zOut++ = 0x
0ae0: 46 30 20 2b 20 28 75 38 29 28 28 63 3e 3e 31 38  F0 + (u8)((c>>18
0af0: 29 20 26 20 30 78 30 37 29 3b 20 20 20 20 20 20  ) & 0x07);      
0b00: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f         \.    *zO
0b10: 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75  ut++ = 0x80 + (u
0b20: 38 29 28 28 63 3e 3e 31 32 29 20 26 20 30 78 33  8)((c>>12) & 0x3
0b30: 46 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  F);             
0b40: 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20  \.    *zOut++ = 
0b50: 30 78 38 30 20 2b 20 28 75 38 29 28 28 63 3e 3e  0x80 + (u8)((c>>
0b60: 36 29 20 26 20 30 78 33 46 29 3b 20 20 20 20 20  6) & 0x3F);     
0b70: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a           \.    *
0b80: 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20  zOut++ = 0x80 + 
0b90: 28 75 38 29 28 63 20 26 20 30 78 33 46 29 3b 20  (u8)(c & 0x3F); 
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 5c 0a 20 20 7d 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 20 20 20 5c 0a 7d 0a 0a             \.}..
0bf0: 23 64 65 66 69 6e 65 20 57 52 49 54 45 5f 55 54  #define WRITE_UT
0c00: 46 31 36 4c 45 28 7a 4f 75 74 2c 20 63 29 20 7b  F16LE(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 20 20 20                  
0c30: 20 20 20 20 5c 0a 20 20 69 66 28 20 63 3c 3d 30      \.  if( c<=0
0c40: 78 46 46 46 46 20 29 7b 20 20 20 20 20 20 20 20  xFFFF ){        
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 20                  
0c70: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
0c80: 2a 7a 4f 75 74 2b 2b 20 3d 20 28 75 38 29 28 63  *zOut++ = (u8)(c
0c90: 26 30 78 30 30 46 46 29 3b 20 20 20 20 20 20 20  &0x00FF);       
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20  \.    *zOut++ = 
0cd0: 28 75 38 29 28 28 63 3e 3e 38 29 26 30 78 30 30  (u8)((c>>8)&0x00
0ce0: 46 46 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  FF);            
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b        \.  }else{
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 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
0d50: 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 75 38 29    *zOut++ = (u8)
0d60: 28 28 28 63 3e 3e 31 30 29 26 30 78 30 30 33 46  (((c>>10)&0x003F
0d70: 29 20 2b 20 28 28 28 63 2d 30 78 31 30 30 30 30  ) + (((c-0x10000
0d80: 29 3e 3e 31 30 29 26 30 78 30 30 43 30 29 29 3b  )>>10)&0x00C0));
0d90: 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20    \.    *zOut++ 
0da0: 3d 20 28 75 38 29 28 30 78 30 30 44 38 20 2b 20  = (u8)(0x00D8 + 
0db0: 28 28 28 63 2d 30 78 31 30 30 30 30 29 3e 3e 31  (((c-0x10000)>>1
0dc0: 38 29 26 30 78 30 33 29 29 3b 20 20 20 20 20 20  8)&0x03));      
0dd0: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a          \.    *z
0de0: 4f 75 74 2b 2b 20 3d 20 28 75 38 29 28 63 26 30  Out++ = (u8)(c&0
0df0: 78 30 30 46 46 29 3b 20 20 20 20 20 20 20 20 20  x00FF);         
0e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
0e20: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 75      *zOut++ = (u
0e30: 38 29 28 30 78 30 30 44 43 20 2b 20 28 28 63 3e  8)(0x00DC + ((c>
0e40: 3e 38 29 26 30 78 30 33 29 29 3b 20 20 20 20 20  >8)&0x03));     
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e60: 20 20 20 20 5c 0a 20 20 7d 20 20 20 20 20 20 20      \.  }       
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ea0: 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23            \.}..#
0eb0: 64 65 66 69 6e 65 20 57 52 49 54 45 5f 55 54 46  define WRITE_UTF
0ec0: 31 36 42 45 28 7a 4f 75 74 2c 20 63 29 20 7b 20  16BE(zOut, c) { 
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ef0: 20 20 20 5c 0a 20 20 69 66 28 20 63 3c 3d 30 78     \.  if( c<=0x
0f00: 46 46 46 46 20 29 7b 20 20 20 20 20 20 20 20 20  FFFF ){         
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f30: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a           \.    *
0f40: 7a 4f 75 74 2b 2b 20 3d 20 28 75 38 29 28 28 63  zOut++ = (u8)((c
0f50: 3e 3e 38 29 26 30 78 30 30 46 46 29 3b 20 20 20  >>8)&0x00FF);   
0f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
0f80: 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28  .    *zOut++ = (
0f90: 75 38 29 28 63 26 30 78 30 30 46 46 29 3b 20 20  u8)(c&0x00FF);  
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 5c 0a 20 20 7d 65 6c 73 65 7b 20       \.  }else{ 
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1000: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1010: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 75 38 29 28   *zOut++ = (u8)(
1020: 30 78 30 30 44 38 20 2b 20 28 28 28 63 2d 30 78  0x00D8 + (((c-0x
1030: 31 30 30 30 30 29 3e 3e 31 38 29 26 30 78 30 33  10000)>>18)&0x03
1040: 29 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ));             
1050: 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d   \.    *zOut++ =
1060: 20 28 75 38 29 28 28 28 63 3e 3e 31 30 29 26 30   (u8)(((c>>10)&0
1070: 78 30 30 33 46 29 20 2b 20 28 28 28 63 2d 30 78  x003F) + (((c-0x
1080: 31 30 30 30 30 29 3e 3e 31 30 29 26 30 78 30 30  10000)>>10)&0x00
1090: 43 30 29 29 3b 20 20 5c 0a 20 20 20 20 2a 7a 4f  C0));  \.    *zO
10a0: 75 74 2b 2b 20 3d 20 28 75 38 29 28 30 78 30 30  ut++ = (u8)(0x00
10b0: 44 43 20 2b 20 28 28 63 3e 3e 38 29 26 30 78 30  DC + ((c>>8)&0x0
10c0: 33 29 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  3));            
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
10e0: 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 75 38     *zOut++ = (u8
10f0: 29 28 63 26 30 78 30 30 46 46 29 3b 20 20 20 20  )(c&0x00FF);    
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1120: 20 20 20 5c 0a 20 20 7d 20 20 20 20 20 20 20 20     \.  }        
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64           \.}..#d
1170: 65 66 69 6e 65 20 52 45 41 44 5f 55 54 46 31 36  efine READ_UTF16
1180: 4c 45 28 7a 49 6e 2c 20 54 45 52 4d 2c 20 63 29  LE(zIn, TERM, c)
1190: 7b 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 20 20 20 20 20 20 20                  
11b0: 20 20 20 20 5c 0a 20 20 63 20 3d 20 28 2a 7a 49      \.  c = (*zI
11c0: 6e 2b 2b 29 3b 20 20 20 20 20 20 20 20 20 20 20  n++);           
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 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1200: 63 20 2b 3d 20 28 28 2a 7a 49 6e 2b 2b 29 3c 3c  c += ((*zIn++)<<
1210: 38 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  8);             
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 20 20 20 20 20 20 20 20                  
1240: 20 20 20 20 5c 0a 20 20 69 66 28 20 63 3e 3d 30      \.  if( c>=0
1250: 78 44 38 30 30 20 26 26 20 63 3c 30 78 45 30 30  xD800 && c<0xE00
1260: 30 20 26 26 20 54 45 52 4d 20 29 7b 20 20 20 20  0 && TERM ){    
1270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1280: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1290: 20 20 69 6e 74 20 63 32 20 3d 20 28 2a 7a 49 6e    int c2 = (*zIn
12a0: 2b 2b 29 3b 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 20 20 20 20 20 20 20 20                  
12d0: 20 20 20 20 5c 0a 20 20 20 20 63 32 20 2b 3d 20      \.    c2 += 
12e0: 28 28 2a 7a 49 6e 2b 2b 29 3c 3c 38 29 3b 20 20  ((*zIn++)<<8);  
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1310: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1320: 20 20 63 20 3d 20 28 63 32 26 30 78 30 33 46 46    c = (c2&0x03FF
1330: 29 20 2b 20 28 28 63 26 30 78 30 30 33 46 29 3c  ) + ((c&0x003F)<
1340: 3c 31 30 29 20 2b 20 28 28 28 63 26 30 78 30 33  <10) + (((c&0x03
1350: 43 30 29 2b 30 78 30 30 34 30 29 3c 3c 31 30 29  C0)+0x0040)<<10)
1360: 3b 20 20 20 5c 0a 20 20 7d 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: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a              \.}.
13b0: 0a 23 64 65 66 69 6e 65 20 52 45 41 44 5f 55 54  .#define READ_UT
13c0: 46 31 36 42 45 28 7a 49 6e 2c 20 54 45 52 4d 2c  F16BE(zIn, TERM,
13d0: 20 63 29 7b 20 20 20 20 20 20 20 20 20 20 20 20   c){            
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 20 20 5c 0a 20 20 63 20 3d 20 28         \.  c = (
1400: 28 2a 7a 49 6e 2b 2b 29 3c 3c 38 29 3b 20 20 20  (*zIn++)<<8);   
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 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1440: 0a 20 20 63 20 2b 3d 20 28 2a 7a 49 6e 2b 2b 29  .  c += (*zIn++)
1450: 3b 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 20 20 20 20 20                  
1480: 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 63         \.  if( c
1490: 3e 3d 30 78 44 38 30 30 20 26 26 20 63 3c 30 78  >=0xD800 && c<0x
14a0: 45 30 30 30 20 26 26 20 54 45 52 4d 20 29 7b 20  E000 && TERM ){ 
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
14d0: 0a 20 20 20 20 69 6e 74 20 63 32 20 3d 20 28 28  .    int c2 = ((
14e0: 2a 7a 49 6e 2b 2b 29 3c 3c 38 29 3b 20 20 20 20  *zIn++)<<8);    
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 20 20 20 20 20 20                  
1510: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 63 32 20         \.    c2 
1520: 2b 3d 20 28 2a 7a 49 6e 2b 2b 29 3b 20 20 20 20  += (*zIn++);    
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 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1560: 0a 20 20 20 20 63 20 3d 20 28 63 32 26 30 78 30  .    c = (c2&0x0
1570: 33 46 46 29 20 2b 20 28 28 63 26 30 78 30 30 33  3FF) + ((c&0x003
1580: 46 29 3c 3c 31 30 29 20 2b 20 28 28 28 63 26 30  F)<<10) + (((c&0
1590: 78 30 33 43 30 29 2b 30 78 30 30 34 30 29 3c 3c  x03C0)+0x0040)<<
15a0: 31 30 29 3b 20 20 20 5c 0a 20 20 7d 20 20 20 20  10);   \.  }    
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
15f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c  .}../*.** Transl
1600: 61 74 65 20 61 20 73 69 6e 67 6c 65 20 55 54 46  ate a single UTF
1610: 2d 38 20 63 68 61 72 61 63 74 65 72 2e 20 20 52  -8 character.  R
1620: 65 74 75 72 6e 20 74 68 65 20 75 6e 69 63 6f 64  eturn the unicod
1630: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 44  e value..**.** D
1640: 75 72 69 6e 67 20 74 72 61 6e 73 6c 61 74 69 6f  uring translatio
1650: 6e 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  n, assume that t
1660: 68 65 20 62 79 74 65 20 74 68 61 74 20 7a 54 65  he byte that zTe
1670: 72 6d 20 70 6f 69 6e 74 73 0a 2a 2a 20 69 73 20  rm points.** is 
1680: 61 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 57 72  a 0x00..**.** Wr
1690: 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
16a0: 20 74 68 65 20 6e 65 78 74 20 75 6e 72 65 61 64   the next unread
16b0: 20 62 79 74 65 20 62 61 63 6b 20 69 6e 74 6f 20   byte back into 
16c0: 2a 70 7a 4e 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 4e  *pzNext..**.** N
16d0: 6f 74 65 73 20 4f 6e 20 49 6e 76 61 6c 69 64 20  otes On Invalid 
16e0: 55 54 46 2d 38 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20  UTF-8:.**.**  * 
16f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   This routine ne
1700: 76 65 72 20 61 6c 6c 6f 77 73 20 61 20 37 2d 62  ver allows a 7-b
1710: 69 74 20 63 68 61 72 61 63 74 65 72 20 28 30 78  it character (0x
1720: 30 30 20 74 68 72 6f 75 67 68 20 30 78 37 66 29  00 through 0x7f)
1730: 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65 20 65 6e   to.**     be en
1740: 63 6f 64 65 64 20 61 73 20 61 20 6d 75 6c 74 69  coded as a multi
1750: 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72 2e  -byte character.
1760: 20 20 41 6e 79 20 6d 75 6c 74 69 2d 62 79 74 65    Any multi-byte
1770: 20 63 68 61 72 61 63 74 65 72 20 74 68 61 74 0a   character that.
1780: 2a 2a 20 20 20 20 20 61 74 74 65 6d 70 74 73 20  **     attempts 
1790: 74 6f 20 65 6e 63 6f 64 65 20 61 20 76 61 6c 75  to encode a valu
17a0: 65 20 62 65 74 77 65 65 6e 20 30 78 30 30 20 61  e between 0x00 a
17b0: 6e 64 20 30 78 37 66 20 69 73 20 72 65 6e 64 65  nd 0x7f is rende
17c0: 72 65 64 20 61 73 20 30 78 66 66 66 64 2e 0a 2a  red as 0xfffd..*
17d0: 2a 0a 2a 2a 20 20 2a 20 20 54 68 69 73 20 72 6f  *.**  *  This ro
17e0: 75 74 69 6e 65 20 6e 65 76 65 72 20 61 6c 6c 6f  utine never allo
17f0: 77 73 20 61 20 55 54 46 31 36 20 73 75 72 72 6f  ws a UTF16 surro
1800: 67 61 74 65 20 76 61 6c 75 65 20 74 6f 20 62 65  gate value to be
1810: 20 65 6e 63 6f 64 65 64 2e 0a 2a 2a 20 20 20 20   encoded..**    
1820: 20 49 66 20 61 20 6d 75 6c 74 69 2d 62 79 74 65   If a multi-byte
1830: 20 63 68 61 72 61 63 74 65 72 20 61 74 74 65 6d   character attem
1840: 70 74 73 20 74 6f 20 65 6e 63 6f 64 65 20 61 20  pts to encode a 
1850: 76 61 6c 75 65 20 62 65 74 77 65 65 6e 0a 2a 2a  value between.**
1860: 20 20 20 20 20 30 78 64 38 30 30 20 61 6e 64 20       0xd800 and 
1870: 30 78 65 30 30 30 20 74 68 65 6e 20 69 74 20 69  0xe000 then it i
1880: 73 20 72 65 6e 64 65 72 65 64 20 61 73 20 30 78  s rendered as 0x
1890: 66 66 66 64 2e 0a 2a 2a 0a 2a 2a 20 20 2a 20 20  fffd..**.**  *  
18a0: 42 79 74 65 73 20 69 6e 20 74 68 65 20 72 61 6e  Bytes in the ran
18b0: 67 65 20 6f 66 20 30 78 38 30 20 74 68 72 6f 75  ge of 0x80 throu
18c0: 67 68 20 30 78 62 66 20 77 68 69 63 68 20 6f 63  gh 0xbf which oc
18d0: 63 75 72 20 61 73 20 74 68 65 20 66 69 72 73 74  cur as the first
18e0: 0a 2a 2a 20 20 20 20 20 62 79 74 65 20 6f 66 20  .**     byte of 
18f0: 61 20 63 68 61 72 61 63 74 65 72 20 61 72 65 20  a character are 
1900: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 73  interpreted as s
1910: 69 6e 67 6c 65 2d 62 79 74 65 20 63 68 61 72 61  ingle-byte chara
1920: 63 74 65 72 73 0a 2a 2a 20 20 20 20 20 61 6e 64  cters.**     and
1930: 20 72 65 6e 64 65 72 65 64 20 61 73 20 74 68 65   rendered as the
1940: 6d 73 65 6c 76 65 73 20 65 76 65 6e 20 74 68 6f  mselves even tho
1950: 75 67 68 20 74 68 65 79 20 61 72 65 20 74 65 63  ugh they are tec
1960: 68 6e 69 63 61 6c 6c 79 0a 2a 2a 20 20 20 20 20  hnically.**     
1970: 69 6e 76 61 6c 69 64 20 63 68 61 72 61 63 74 65  invalid characte
1980: 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 2a 20 20 54 68  rs..**.**  *  Th
1990: 69 73 20 72 6f 75 74 69 6e 65 20 61 63 63 65 70  is routine accep
19a0: 74 73 20 61 6e 20 69 6e 66 69 6e 69 74 65 20 6e  ts an infinite n
19b0: 75 6d 62 65 72 20 6f 66 20 64 69 66 66 65 72 65  umber of differe
19c0: 6e 74 20 55 54 46 38 20 65 6e 63 6f 64 69 6e 67  nt UTF8 encoding
19d0: 73 0a 2a 2a 20 20 20 20 20 66 6f 72 20 75 6e 69  s.**     for uni
19e0: 63 6f 64 65 20 76 61 6c 75 65 73 20 30 78 38 30  code values 0x80
19f0: 20 61 6e 64 20 67 72 65 61 74 65 72 2e 20 20 49   and greater.  I
1a00: 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  t do not change 
1a10: 6f 76 65 72 2d 6c 65 6e 67 74 68 0a 2a 2a 20 20  over-length.**  
1a20: 20 20 20 65 6e 63 6f 64 69 6e 67 73 20 74 6f 20     encodings to 
1a30: 30 78 66 66 66 64 20 61 73 20 73 6f 6d 65 20 73  0xfffd as some s
1a40: 79 73 74 65 6d 73 20 72 65 63 6f 6d 6d 65 6e 64  ystems recommend
1a50: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52 45 41  ..*/.#define REA
1a60: 44 5f 55 54 46 38 28 7a 49 6e 2c 20 7a 54 65 72  D_UTF8(zIn, zTer
1a70: 6d 2c 20 63 29 20 20 20 20 20 20 20 20 20 20 20  m, c)           
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 5c 0a 20 20 63 20 3d 20 2a 28 7a 49 6e 2b 2b 29  \.  c = *(zIn++)
1aa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
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 20 20 5c 0a 20               \. 
1ad0: 20 69 66 28 20 63 3e 3d 30 78 63 30 20 29 7b 20   if( c>=0xc0 ){ 
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 20 20 5c 0a 20 20 20 20            \.    
1b10: 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 54  c = sqlite3Utf8T
1b20: 72 61 6e 73 31 5b 63 2d 30 78 63 30 5d 3b 20 20  rans1[c-0xc0];  
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b40: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 77 68 69         \.    whi
1b50: 6c 65 28 20 7a 49 6e 21 3d 7a 54 65 72 6d 20 26  le( zIn!=zTerm &
1b60: 26 20 28 2a 7a 49 6e 20 26 20 30 78 63 30 29 3d  & (*zIn & 0xc0)=
1b70: 3d 30 78 38 30 20 29 7b 20 20 20 20 20 20 20 20  =0x80 ){        
1b80: 20 20 20 20 5c 0a 20 20 20 20 20 20 63 20 3d 20      \.      c = 
1b90: 28 63 3c 3c 36 29 20 2b 20 28 30 78 33 66 20 26  (c<<6) + (0x3f &
1ba0: 20 2a 28 7a 49 6e 2b 2b 29 29 3b 20 20 20 20 20   *(zIn++));     
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 5c 0a 20 20 20 20 7d 20 20 20 20 20 20 20 20   \.    }        
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1c00: 20 20 20 20 69 66 28 20 63 3c 30 78 38 30 20 20      if( c<0x80  
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 20 20 5c 0a 20 20 20             \.   
1c40: 20 20 20 20 20 7c 7c 20 28 63 26 30 78 46 46 46       || (c&0xFFF
1c50: 46 46 38 30 30 29 3d 3d 30 78 44 38 30 30 20 20  FF800)==0xD800  
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20          \.      
1c80: 20 20 7c 7c 20 28 63 26 30 78 46 46 46 46 46 46    || (c&0xFFFFFF
1c90: 46 45 29 3d 3d 30 78 46 46 46 45 20 29 7b 20 20  FE)==0xFFFE ){  
1ca0: 63 20 3d 20 30 78 46 46 46 44 3b 20 7d 20 20 20  c = 0xFFFD; }   
1cb0: 20 20 20 20 20 5c 0a 20 20 7d 0a 75 33 32 20 73       \.  }.u32 s
1cc0: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 0a  qlite3Utf8Read(.
1cd0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1ce0: 20 63 68 61 72 20 2a 7a 49 6e 2c 20 20 20 20 20   char *zIn,     
1cf0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
1d00: 6f 66 20 55 54 46 2d 38 20 63 68 61 72 61 63 74  of UTF-8 charact
1d10: 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e  er */.  const un
1d20: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 70 7a  signed char **pz
1d30: 4e 65 78 74 20 20 20 20 2f 2a 20 57 72 69 74 65  Next    /* Write
1d40: 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
1d50: 20 55 54 46 2d 38 20 63 68 61 72 20 68 65 72 65   UTF-8 char here
1d60: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
1d70: 64 20 69 6e 74 20 63 3b 0a 0a 20 20 2f 2a 20 53  d int c;..  /* S
1d80: 61 6d 65 20 61 73 20 52 45 41 44 5f 55 54 46 38  ame as READ_UTF8
1d90: 28 29 20 61 62 6f 76 65 20 62 75 74 20 77 69 74  () above but wit
1da0: 68 6f 75 74 20 74 68 65 20 7a 54 65 72 6d 20 70  hout the zTerm p
1db0: 61 72 61 6d 65 74 65 72 2e 0a 20 20 2a 2a 20 46  arameter..  ** F
1dc0: 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  or this routine,
1dd0: 20 77 65 20 61 73 73 75 6d 65 20 74 68 65 20 55   we assume the U
1de0: 54 46 38 20 73 74 72 69 6e 67 20 69 73 20 61 6c  TF8 string is al
1df0: 77 61 79 73 20 7a 65 72 6f 2d 74 65 72 6d 69 6e  ways zero-termin
1e00: 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 20 3d  ated..  */.  c =
1e10: 20 2a 28 7a 49 6e 2b 2b 29 3b 0a 20 20 69 66 28   *(zIn++);.  if(
1e20: 20 63 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20   c>=0xc0 ){.    
1e30: 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 54  c = sqlite3Utf8T
1e40: 72 61 6e 73 31 5b 63 2d 30 78 63 30 5d 3b 0a 20  rans1[c-0xc0];. 
1e50: 20 20 20 77 68 69 6c 65 28 20 28 2a 7a 49 6e 20     while( (*zIn 
1e60: 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b  & 0xc0)==0x80 ){
1e70: 0a 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 36  .      c = (c<<6
1e80: 29 20 2b 20 28 30 78 33 66 20 26 20 2a 28 7a 49  ) + (0x3f & *(zI
1e90: 6e 2b 2b 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  n++));.    }.   
1ea0: 20 69 66 28 20 63 3c 30 78 38 30 0a 20 20 20 20   if( c<0x80.    
1eb0: 20 20 20 20 7c 7c 20 28 63 26 30 78 46 46 46 46      || (c&0xFFFF
1ec0: 46 38 30 30 29 3d 3d 30 78 44 38 30 30 0a 20 20  F800)==0xD800.  
1ed0: 20 20 20 20 20 20 7c 7c 20 28 63 26 30 78 46 46        || (c&0xFF
1ee0: 46 46 46 46 46 45 29 3d 3d 30 78 46 46 46 45 20  FFFFFE)==0xFFFE 
1ef0: 29 7b 20 20 63 20 3d 20 30 78 46 46 46 44 3b 20  ){  c = 0xFFFD; 
1f00: 7d 0a 20 20 7d 0a 20 20 2a 70 7a 4e 65 78 74 20  }.  }.  *pzNext 
1f10: 3d 20 7a 49 6e 3b 0a 20 20 72 65 74 75 72 6e 20  = zIn;.  return 
1f20: 63 3b 0a 7d 0a 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 49  c;.}...../*.** I
1f30: 66 20 74 68 65 20 54 52 41 4e 53 4c 41 54 45 5f  f the TRANSLATE_
1f40: 54 52 41 43 45 20 6d 61 63 72 6f 20 69 73 20 64  TRACE macro is d
1f50: 65 66 69 6e 65 64 2c 20 74 68 65 20 76 61 6c 75  efined, the valu
1f60: 65 20 6f 66 20 65 61 63 68 20 4d 65 6d 20 69 73  e of each Mem is
1f70: 0a 2a 2a 20 70 72 69 6e 74 65 64 20 6f 6e 20 73  .** printed on s
1f80: 74 64 65 72 72 20 6f 6e 20 74 68 65 20 77 61 79  tderr on the way
1f90: 20 69 6e 74 6f 20 61 6e 64 20 6f 75 74 20 6f 66   into and out of
1fa0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54   sqlite3VdbeMemT
1fb0: 72 61 6e 73 6c 61 74 65 28 29 2e 0a 2a 2f 20 0a  ranslate()..*/ .
1fc0: 2f 2a 20 23 64 65 66 69 6e 65 20 54 52 41 4e 53  /* #define TRANS
1fd0: 4c 41 54 45 5f 54 52 41 43 45 20 31 20 2a 2f 0a  LATE_TRACE 1 */.
1fe0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ff0: 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
2000: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72   This routine tr
2010: 61 6e 73 66 6f 72 6d 73 20 74 68 65 20 69 6e 74  ansforms the int
2020: 65 72 6e 61 6c 20 74 65 78 74 20 65 6e 63 6f 64  ernal text encod
2030: 69 6e 67 20 75 73 65 64 20 62 79 20 70 4d 65 6d  ing used by pMem
2040: 20 74 6f 0a 2a 2a 20 64 65 73 69 72 65 64 45 6e   to.** desiredEn
2050: 63 2e 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f  c. It is an erro
2060: 72 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 20  r if the string 
2070: 69 73 20 61 6c 72 65 61 64 79 20 6f 66 20 74 68  is already of th
2080: 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 65 6e 63  e desired.** enc
2090: 6f 64 69 6e 67 2c 20 6f 72 20 69 66 20 2a 70 4d  oding, or if *pM
20a0: 65 6d 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  em does not cont
20b0: 61 69 6e 20 61 20 73 74 72 69 6e 67 20 76 61 6c  ain a string val
20c0: 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ue..*/.int sqlit
20d0: 65 33 56 64 62 65 4d 65 6d 54 72 61 6e 73 6c 61  e3VdbeMemTransla
20e0: 74 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 38  te(Mem *pMem, u8
20f0: 20 64 65 73 69 72 65 64 45 6e 63 29 7b 0a 20 20   desiredEnc){.  
2100: 69 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20 20 20  int len;        
2110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2120: 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66  aximum length of
2130: 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67 20 69   output string i
2140: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  n bytes */.  uns
2150: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4f 75 74  igned char *zOut
2160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2170: 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
2180: 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  fer */.  unsigne
2190: 64 20 63 68 61 72 20 2a 7a 49 6e 3b 20 20 20 20  d char *zIn;    
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21b0: 2a 20 49 6e 70 75 74 20 69 74 65 72 61 74 6f 72  * Input iterator
21c0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
21d0: 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20  har *zTerm;     
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
21f0: 6e 64 20 6f 66 20 69 6e 70 75 74 20 2a 2f 0a 20  nd of input */. 
2200: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2210: 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
2220: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
2230: 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75   iterator */.  u
2240: 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 3b 0a 0a  nsigned int c;..
2250: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
2260: 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  db==0 || sqlite3
2270: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d  _mutex_held(pMem
2280: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
2290: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
22a0: 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 3b  flags&MEM_Str );
22b0: 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d  .  assert( pMem-
22c0: 3e 65 6e 63 21 3d 64 65 73 69 72 65 64 45 6e 63  >enc!=desiredEnc
22d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   );.  assert( pM
22e0: 65 6d 2d 3e 65 6e 63 21 3d 30 20 29 3b 0a 20 20  em->enc!=0 );.  
22f0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e  assert( pMem->n>
2300: 3d 30 20 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  =0 );..#if defin
2310: 65 64 28 54 52 41 4e 53 4c 41 54 45 5f 54 52 41  ed(TRANSLATE_TRA
2320: 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  CE) && defined(S
2330: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 20 20 7b  QLITE_DEBUG).  {
2340: 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31  .    char zBuf[1
2350: 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  00];.    sqlite3
2360: 56 64 62 65 4d 65 6d 50 72 65 74 74 79 50 72 69  VdbeMemPrettyPri
2370: 6e 74 28 70 4d 65 6d 2c 20 7a 42 75 66 29 3b 0a  nt(pMem, zBuf);.
2380: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
2390: 72 72 2c 20 22 49 4e 50 55 54 3a 20 20 25 73 5c  rr, "INPUT:  %s\
23a0: 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23  n", zBuf);.  }.#
23b0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
23c0: 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69  he translation i
23d0: 73 20 62 65 74 77 65 65 6e 20 55 54 46 2d 31 36  s between UTF-16
23e0: 20 6c 69 74 74 6c 65 20 61 6e 64 20 62 69 67 20   little and big 
23f0: 65 6e 64 69 61 6e 2c 20 74 68 65 6e 20 0a 20 20  endian, then .  
2400: 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72  ** all that is r
2410: 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 77  equired is to sw
2420: 61 70 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  ap the byte orde
2430: 72 2e 20 54 68 69 73 20 63 61 73 65 20 69 73 20  r. This case is 
2440: 68 61 6e 64 6c 65 64 0a 20 20 2a 2a 20 64 69 66  handled.  ** dif
2450: 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68  ferently from th
2460: 65 20 6f 74 68 65 72 73 2e 0a 20 20 2a 2f 0a 20  e others..  */. 
2470: 20 69 66 28 20 70 4d 65 6d 2d 3e 65 6e 63 21 3d   if( pMem->enc!=
2480: 53 51 4c 49 54 45 5f 55 54 46 38 20 26 26 20 64  SQLITE_UTF8 && d
2490: 65 73 69 72 65 64 45 6e 63 21 3d 53 51 4c 49 54  esiredEnc!=SQLIT
24a0: 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 75 38  E_UTF8 ){.    u8
24b0: 20 74 65 6d 70 3b 0a 20 20 20 20 69 6e 74 20 72   temp;.    int r
24c0: 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
24d0: 74 65 33 56 64 62 65 4d 65 6d 4d 61 6b 65 57 72  te3VdbeMemMakeWr
24e0: 69 74 65 61 62 6c 65 28 70 4d 65 6d 29 3b 0a 20  iteable(pMem);. 
24f0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2500: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
2510: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2520: 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
2530: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2540: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  MEM;.    }.    z
2550: 49 6e 20 3d 20 28 75 38 2a 29 70 4d 65 6d 2d 3e  In = (u8*)pMem->
2560: 7a 3b 0a 20 20 20 20 7a 54 65 72 6d 20 3d 20 26  z;.    zTerm = &
2570: 7a 49 6e 5b 70 4d 65 6d 2d 3e 6e 26 7e 31 5d 3b  zIn[pMem->n&~1];
2580: 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 49 6e 3c  .    while( zIn<
2590: 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 74  zTerm ){.      t
25a0: 65 6d 70 20 3d 20 2a 7a 49 6e 3b 0a 20 20 20 20  emp = *zIn;.    
25b0: 20 20 2a 7a 49 6e 20 3d 20 2a 28 7a 49 6e 2b 31    *zIn = *(zIn+1
25c0: 29 3b 0a 20 20 20 20 20 20 7a 49 6e 2b 2b 3b 0a  );.      zIn++;.
25d0: 20 20 20 20 20 20 2a 7a 49 6e 2b 2b 20 3d 20 74        *zIn++ = t
25e0: 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  emp;.    }.    p
25f0: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 64 65 73 69 72  Mem->enc = desir
2600: 65 64 45 6e 63 3b 0a 20 20 20 20 67 6f 74 6f 20  edEnc;.    goto 
2610: 74 72 61 6e 73 6c 61 74 65 5f 6f 75 74 3b 0a 20  translate_out;. 
2620: 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 6c 65 6e   }..  /* Set len
2630: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2640: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
2650: 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65 20  required in the 
2660: 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 2a  output buffer. *
2670: 2f 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 45  /.  if( desiredE
2680: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
2690: 29 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 63  ){.    /* When c
26a0: 6f 6e 76 65 72 74 69 6e 67 20 66 72 6f 6d 20 55  onverting from U
26b0: 54 46 2d 31 36 2c 20 74 68 65 20 6d 61 78 69 6d  TF-16, the maxim
26c0: 75 6d 20 67 72 6f 77 74 68 20 72 65 73 75 6c 74  um growth result
26d0: 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 72  s from.    ** tr
26e0: 61 6e 73 6c 61 74 69 6e 67 20 61 20 32 2d 62 79  anslating a 2-by
26f0: 74 65 20 63 68 61 72 61 63 74 65 72 20 74 6f 20  te character to 
2700: 61 20 34 2d 62 79 74 65 20 55 54 46 2d 38 20 63  a 4-byte UTF-8 c
2710: 68 61 72 61 63 74 65 72 2e 0a 20 20 20 20 2a 2a  haracter..    **
2720: 20 41 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69   A single byte i
2730: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74  s required for t
2740: 68 65 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67  he output string
2750: 0a 20 20 20 20 2a 2a 20 6e 75 6c 2d 74 65 72 6d  .    ** nul-term
2760: 69 6e 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  inator..    */. 
2770: 20 20 20 70 4d 65 6d 2d 3e 6e 20 26 3d 20 7e 31     pMem->n &= ~1
2780: 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d  ;.    len = pMem
2790: 2d 3e 6e 20 2a 20 32 20 2b 20 31 3b 0a 20 20 7d  ->n * 2 + 1;.  }
27a0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 68 65  else{.    /* Whe
27b0: 6e 20 63 6f 6e 76 65 72 74 69 6e 67 20 66 72 6f  n converting fro
27c0: 6d 20 55 54 46 2d 38 20 74 6f 20 55 54 46 2d 31  m UTF-8 to UTF-1
27d0: 36 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 67 72  6 the maximum gr
27e0: 6f 77 74 68 20 69 73 20 63 61 75 73 65 64 0a 20  owth is caused. 
27f0: 20 20 20 2a 2a 20 77 68 65 6e 20 61 20 31 2d 62     ** when a 1-b
2800: 79 74 65 20 55 54 46 2d 38 20 63 68 61 72 61 63  yte UTF-8 charac
2810: 74 65 72 20 69 73 20 74 72 61 6e 73 6c 61 74 65  ter is translate
2820: 64 20 69 6e 74 6f 20 61 20 32 2d 62 79 74 65 20  d into a 2-byte 
2830: 55 54 46 2d 31 36 0a 20 20 20 20 2a 2a 20 63 68  UTF-16.    ** ch
2840: 61 72 61 63 74 65 72 2e 20 54 77 6f 20 62 79 74  aracter. Two byt
2850: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  es are required 
2860: 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  in the output bu
2870: 66 66 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20  ffer for the.   
2880: 20 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   ** nul-terminat
2890: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c  or..    */.    l
28a0: 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 20 2a 20 32  en = pMem->n * 2
28b0: 20 2b 20 32 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   + 2;.  }..  /* 
28c0: 53 65 74 20 7a 49 6e 20 74 6f 20 70 6f 69 6e 74  Set zIn to point
28d0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
28e0: 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65   the input buffe
28f0: 72 20 61 6e 64 20 7a 54 65 72 6d 20 74 6f 20 70  r and zTerm to p
2900: 6f 69 6e 74 20 31 0a 20 20 2a 2a 20 62 79 74 65  oint 1.  ** byte
2910: 20 70 61 73 74 20 74 68 65 20 65 6e 64 2e 0a 20   past the end.. 
2920: 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c   **.  ** Variabl
2930: 65 20 7a 4f 75 74 20 69 73 20 73 65 74 20 74 6f  e zOut is set to
2940: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 6f 75   point at the ou
2950: 74 70 75 74 20 62 75 66 66 65 72 2c 20 73 70 61  tput buffer, spa
2960: 63 65 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a  ce obtained.  **
2970: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
2980: 6c 6c 6f 63 28 29 2e 0a 20 20 2a 2f 0a 20 20 7a  lloc()..  */.  z
2990: 49 6e 20 3d 20 28 75 38 2a 29 70 4d 65 6d 2d 3e  In = (u8*)pMem->
29a0: 7a 3b 0a 20 20 7a 54 65 72 6d 20 3d 20 26 7a 49  z;.  zTerm = &zI
29b0: 6e 5b 70 4d 65 6d 2d 3e 6e 5d 3b 0a 20 20 7a 4f  n[pMem->n];.  zO
29c0: 75 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ut = sqlite3DbMa
29d0: 6c 6c 6f 63 52 61 77 28 70 4d 65 6d 2d 3e 64 62  llocRaw(pMem->db
29e0: 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a  , len);.  if( !z
29f0: 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Out ){.    retur
2a00: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2a10: 20 20 7d 0a 20 20 7a 20 3d 20 7a 4f 75 74 3b 0a    }.  z = zOut;.
2a20: 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e 65 6e 63  .  if( pMem->enc
2a30: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b  ==SQLITE_UTF8 ){
2a40: 0a 20 20 20 20 69 66 28 20 64 65 73 69 72 65 64  .    if( desired
2a50: 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  Enc==SQLITE_UTF1
2a60: 36 4c 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  6LE ){.      /* 
2a70: 55 54 46 2d 38 20 2d 3e 20 55 54 46 2d 31 36 20  UTF-8 -> UTF-16 
2a80: 4c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 2a 2f  Little-endian */
2a90: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 49  .      while( zI
2aa0: 6e 3c 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  n<zTerm ){.     
2ab0: 20 20 20 2f 2a 20 63 20 3d 20 73 71 6c 69 74 65     /* c = sqlite
2ac0: 33 55 74 66 38 52 65 61 64 28 7a 49 6e 2c 20 7a  3Utf8Read(zIn, z
2ad0: 54 65 72 6d 2c 20 28 63 6f 6e 73 74 20 75 38 2a  Term, (const u8*
2ae0: 2a 29 26 7a 49 6e 29 3b 20 2a 2f 0a 20 20 20 20  *)&zIn); */.    
2af0: 20 20 20 20 52 45 41 44 5f 55 54 46 38 28 7a 49      READ_UTF8(zI
2b00: 6e 2c 20 7a 54 65 72 6d 2c 20 63 29 3b 0a 20 20  n, zTerm, c);.  
2b10: 20 20 20 20 20 20 57 52 49 54 45 5f 55 54 46 31        WRITE_UTF1
2b20: 36 4c 45 28 7a 2c 20 63 29 3b 0a 20 20 20 20 20  6LE(z, c);.     
2b30: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2b40: 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73 69      assert( desi
2b50: 72 65 64 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  redEnc==SQLITE_U
2b60: 54 46 31 36 42 45 20 29 3b 0a 20 20 20 20 20 20  TF16BE );.      
2b70: 2f 2a 20 55 54 46 2d 38 20 2d 3e 20 55 54 46 2d  /* UTF-8 -> UTF-
2b80: 31 36 20 42 69 67 2d 65 6e 64 69 61 6e 20 2a 2f  16 Big-endian */
2b90: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 49  .      while( zI
2ba0: 6e 3c 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  n<zTerm ){.     
2bb0: 20 20 20 2f 2a 20 63 20 3d 20 73 71 6c 69 74 65     /* c = sqlite
2bc0: 33 55 74 66 38 52 65 61 64 28 7a 49 6e 2c 20 7a  3Utf8Read(zIn, z
2bd0: 54 65 72 6d 2c 20 28 63 6f 6e 73 74 20 75 38 2a  Term, (const u8*
2be0: 2a 29 26 7a 49 6e 29 3b 20 2a 2f 0a 20 20 20 20  *)&zIn); */.    
2bf0: 20 20 20 20 52 45 41 44 5f 55 54 46 38 28 7a 49      READ_UTF8(zI
2c00: 6e 2c 20 7a 54 65 72 6d 2c 20 63 29 3b 0a 20 20  n, zTerm, c);.  
2c10: 20 20 20 20 20 20 57 52 49 54 45 5f 55 54 46 31        WRITE_UTF1
2c20: 36 42 45 28 7a 2c 20 63 29 3b 0a 20 20 20 20 20  6BE(z, c);.     
2c30: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65   }.    }.    pMe
2c40: 6d 2d 3e 6e 20 3d 20 28 69 6e 74 29 28 7a 20 2d  m->n = (int)(z -
2c50: 20 7a 4f 75 74 29 3b 0a 20 20 20 20 2a 7a 2b 2b   zOut);.    *z++
2c60: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
2c70: 20 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72     assert( desir
2c80: 65 64 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  edEnc==SQLITE_UT
2c90: 46 38 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  F8 );.    if( pM
2ca0: 65 6d 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  em->enc==SQLITE_
2cb0: 55 54 46 31 36 4c 45 20 29 7b 0a 20 20 20 20 20  UTF16LE ){.     
2cc0: 20 2f 2a 20 55 54 46 2d 31 36 20 4c 69 74 74 6c   /* UTF-16 Littl
2cd0: 65 2d 65 6e 64 69 61 6e 20 2d 3e 20 55 54 46 2d  e-endian -> UTF-
2ce0: 38 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65  8 */.      while
2cf0: 28 20 7a 49 6e 3c 7a 54 65 72 6d 20 29 7b 0a 20  ( zIn<zTerm ){. 
2d00: 20 20 20 20 20 20 20 52 45 41 44 5f 55 54 46 31         READ_UTF1
2d10: 36 4c 45 28 7a 49 6e 2c 20 7a 49 6e 3c 7a 54 65  6LE(zIn, zIn<zTe
2d20: 72 6d 2c 20 63 29 3b 20 0a 20 20 20 20 20 20 20  rm, c); .       
2d30: 20 57 52 49 54 45 5f 55 54 46 38 28 7a 2c 20 63   WRITE_UTF8(z, c
2d40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2d50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 55  else{.      /* U
2d60: 54 46 2d 31 36 20 42 69 67 2d 65 6e 64 69 61 6e  TF-16 Big-endian
2d70: 20 2d 3e 20 55 54 46 2d 38 20 2a 2f 0a 20 20 20   -> UTF-8 */.   
2d80: 20 20 20 77 68 69 6c 65 28 20 7a 49 6e 3c 7a 54     while( zIn<zT
2d90: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 52  erm ){.        R
2da0: 45 41 44 5f 55 54 46 31 36 42 45 28 7a 49 6e 2c  EAD_UTF16BE(zIn,
2db0: 20 7a 49 6e 3c 7a 54 65 72 6d 2c 20 63 29 3b 20   zIn<zTerm, c); 
2dc0: 0a 20 20 20 20 20 20 20 20 57 52 49 54 45 5f 55  .        WRITE_U
2dd0: 54 46 38 28 7a 2c 20 63 29 3b 0a 20 20 20 20 20  TF8(z, c);.     
2de0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65   }.    }.    pMe
2df0: 6d 2d 3e 6e 20 3d 20 28 69 6e 74 29 28 7a 20 2d  m->n = (int)(z -
2e00: 20 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 2a 7a   zOut);.  }.  *z
2e10: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
2e20: 28 70 4d 65 6d 2d 3e 6e 2b 28 64 65 73 69 72 65  (pMem->n+(desire
2e30: 64 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  dEnc==SQLITE_UTF
2e40: 38 3f 31 3a 32 29 29 3c 3d 6c 65 6e 20 29 3b 0a  8?1:2))<=len );.
2e50: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
2e60: 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a  mRelease(pMem);.
2e70: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 3d    pMem->flags &=
2e80: 20 7e 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45   ~(MEM_Static|ME
2e90: 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 29  M_Dyn|MEM_Ephem)
2ea0: 3b 0a 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20  ;.  pMem->enc = 
2eb0: 64 65 73 69 72 65 64 45 6e 63 3b 0a 20 20 70 4d  desiredEnc;.  pM
2ec0: 65 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 4d 45  em->flags |= (ME
2ed0: 4d 5f 54 65 72 6d 7c 4d 45 4d 5f 44 79 6e 29 3b  M_Term|MEM_Dyn);
2ee0: 0a 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68  .  pMem->z = (ch
2ef0: 61 72 2a 29 7a 4f 75 74 3b 0a 20 20 70 4d 65 6d  ar*)zOut;.  pMem
2f00: 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 70 4d 65 6d  ->zMalloc = pMem
2f10: 2d 3e 7a 3b 0a 0a 74 72 61 6e 73 6c 61 74 65 5f  ->z;..translate_
2f20: 6f 75 74 3a 0a 23 69 66 20 64 65 66 69 6e 65 64  out:.#if defined
2f30: 28 54 52 41 4e 53 4c 41 54 45 5f 54 52 41 43 45  (TRANSLATE_TRACE
2f40: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
2f50: 49 54 45 5f 44 45 42 55 47 29 0a 20 20 7b 0a 20  ITE_DEBUG).  {. 
2f60: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30     char zBuf[100
2f70: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ];.    sqlite3Vd
2f80: 62 65 4d 65 6d 50 72 65 74 74 79 50 72 69 6e 74  beMemPrettyPrint
2f90: 28 70 4d 65 6d 2c 20 7a 42 75 66 29 3b 0a 20 20  (pMem, zBuf);.  
2fa0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
2fb0: 2c 20 22 4f 55 54 50 55 54 3a 20 25 73 5c 6e 22  , "OUTPUT: %s\n"
2fc0: 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e  , zBuf);.  }.#en
2fd0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
2fe0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2ff0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
3000: 65 63 6b 73 20 66 6f 72 20 61 20 62 79 74 65 2d  ecks for a byte-
3010: 6f 72 64 65 72 20 6d 61 72 6b 20 61 74 20 74 68  order mark at th
3020: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
3030: 68 65 20 0a 2a 2a 20 55 54 46 2d 31 36 20 73 74  he .** UTF-16 st
3040: 72 69 6e 67 20 73 74 6f 72 65 64 20 69 6e 20 2a  ring stored in *
3050: 70 4d 65 6d 2e 20 49 66 20 6f 6e 65 20 69 73 20  pMem. If one is 
3060: 70 72 65 73 65 6e 74 2c 20 69 74 20 69 73 20 72  present, it is r
3070: 65 6d 6f 76 65 64 20 61 6e 64 0a 2a 2a 20 74 68  emoved and.** th
3080: 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68  e encoding of th
3090: 65 20 4d 65 6d 20 61 64 6a 75 73 74 65 64 2e 20  e Mem adjusted. 
30a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
30b0: 73 20 6e 6f 74 20 64 6f 20 61 6e 79 0a 2a 2a 20  s not do any.** 
30c0: 62 79 74 65 2d 73 77 61 70 70 69 6e 67 2c 20 69  byte-swapping, i
30d0: 74 20 6a 75 73 74 20 73 65 74 73 20 4d 65 6d 2e  t just sets Mem.
30e0: 65 6e 63 20 61 70 70 72 6f 70 72 69 61 74 65 6c  enc appropriatel
30f0: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 6c 6c  y..**.** The all
3100: 6f 63 61 74 69 6f 6e 20 28 73 74 61 74 69 63 2c  ocation (static,
3110: 20 64 79 6e 61 6d 69 63 20 65 74 63 2e 29 20 61   dynamic etc.) a
3120: 6e 64 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74  nd encoding of t
3130: 68 65 20 4d 65 6d 20 6d 61 79 20 62 65 0a 2a 2a  he Mem may be.**
3140: 20 63 68 61 6e 67 65 64 20 62 79 20 74 68 69 73   changed by this
3150: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
3160: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  t sqlite3VdbeMem
3170: 48 61 6e 64 6c 65 42 6f 6d 28 4d 65 6d 20 2a 70  HandleBom(Mem *p
3180: 4d 65 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Mem){.  int rc =
3190: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
31a0: 20 62 6f 6d 20 3d 20 30 3b 0a 0a 20 20 61 73 73   bom = 0;..  ass
31b0: 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20  ert( pMem->n>=0 
31c0: 29 3b 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e 6e  );.  if( pMem->n
31d0: 3e 31 20 29 7b 0a 20 20 20 20 75 38 20 62 31 20  >1 ){.    u8 b1 
31e0: 3d 20 2a 28 75 38 20 2a 29 70 4d 65 6d 2d 3e 7a  = *(u8 *)pMem->z
31f0: 3b 0a 20 20 20 20 75 38 20 62 32 20 3d 20 2a 28  ;.    u8 b2 = *(
3200: 28 28 75 38 20 2a 29 70 4d 65 6d 2d 3e 7a 29 20  ((u8 *)pMem->z) 
3210: 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20 62 31  + 1);.    if( b1
3220: 3d 3d 30 78 46 45 20 26 26 20 62 32 3d 3d 30 78  ==0xFE && b2==0x
3230: 46 46 20 29 7b 0a 20 20 20 20 20 20 62 6f 6d 20  FF ){.      bom 
3240: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  = SQLITE_UTF16BE
3250: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3260: 62 31 3d 3d 30 78 46 46 20 26 26 20 62 32 3d 3d  b1==0xFF && b2==
3270: 30 78 46 45 20 29 7b 0a 20 20 20 20 20 20 62 6f  0xFE ){.      bo
3280: 6d 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  m = SQLITE_UTF16
3290: 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LE;.    }.  }.  
32a0: 0a 20 20 69 66 28 20 62 6f 6d 20 29 7b 0a 20 20  .  if( bom ){.  
32b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
32c0: 62 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62  beMemMakeWriteab
32d0: 6c 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 69 66  le(pMem);.    if
32e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32f0: 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  ){.      pMem->n
3300: 20 2d 3d 20 32 3b 0a 20 20 20 20 20 20 6d 65 6d   -= 2;.      mem
3310: 6d 6f 76 65 28 70 4d 65 6d 2d 3e 7a 2c 20 26 70  move(pMem->z, &p
3320: 4d 65 6d 2d 3e 7a 5b 32 5d 2c 20 70 4d 65 6d 2d  Mem->z[2], pMem-
3330: 3e 6e 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >n);.      pMem-
3340: 3e 7a 5b 70 4d 65 6d 2d 3e 6e 5d 20 3d 20 27 5c  >z[pMem->n] = '\
3350: 30 27 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  0';.      pMem->
3360: 7a 5b 70 4d 65 6d 2d 3e 6e 2b 31 5d 20 3d 20 27  z[pMem->n+1] = '
3370: 5c 30 27 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  \0';.      pMem-
3380: 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 54 65  >flags |= MEM_Te
3390: 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  rm;.      pMem->
33a0: 65 6e 63 20 3d 20 62 6f 6d 3b 0a 20 20 20 20 7d  enc = bom;.    }
33b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
33c0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
33d0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
33e0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 70 5a 20 69 73 20  */../*.** pZ is 
33f0: 61 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  a UTF-8 encoded 
3400: 75 6e 69 63 6f 64 65 20 73 74 72 69 6e 67 2e 20  unicode string. 
3410: 49 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73  If nByte is less
3420: 20 74 68 61 6e 20 7a 65 72 6f 2c 0a 2a 2a 20 72   than zero,.** r
3430: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
3440: 20 6f 66 20 75 6e 69 63 6f 64 65 20 63 68 61 72   of unicode char
3450: 61 63 74 65 72 73 20 69 6e 20 70 5a 20 75 70 20  acters in pZ up 
3460: 74 6f 20 28 62 75 74 20 6e 6f 74 20 69 6e 63 6c  to (but not incl
3470: 75 64 69 6e 67 29 0a 2a 2a 20 74 68 65 20 66 69  uding).** the fi
3480: 72 73 74 20 30 78 30 30 20 62 79 74 65 2e 20 49  rst 0x00 byte. I
3490: 66 20 6e 42 79 74 65 20 69 73 20 6e 6f 74 20 6c  f nByte is not l
34a0: 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 72  ess than zero, r
34b0: 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 6e 75 6d  eturn the.** num
34c0: 62 65 72 20 6f 66 20 75 6e 69 63 6f 64 65 20 63  ber of unicode c
34d0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
34e0: 20 66 69 72 73 74 20 6e 42 79 74 65 20 6f 66 20   first nByte of 
34f0: 70 5a 20 28 6f 72 20 75 70 20 74 6f 20 0a 2a 2a  pZ (or up to .**
3500: 20 74 68 65 20 66 69 72 73 74 20 30 78 30 30 2c   the first 0x00,
3510: 20 77 68 69 63 68 65 76 65 72 20 63 6f 6d 65 73   whichever comes
3520: 20 66 69 72 73 74 29 2e 0a 2a 2f 0a 69 6e 74 20   first)..*/.int 
3530: 73 71 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c  sqlite3Utf8CharL
3540: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
3550: 49 6e 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a  In, int nByte){.
3560: 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 63    int r = 0;.  c
3570: 6f 6e 73 74 20 75 38 20 2a 7a 20 3d 20 28 63 6f  onst u8 *z = (co
3580: 6e 73 74 20 75 38 2a 29 7a 49 6e 3b 0a 20 20 63  nst u8*)zIn;.  c
3590: 6f 6e 73 74 20 75 38 20 2a 7a 54 65 72 6d 3b 0a  onst u8 *zTerm;.
35a0: 20 20 69 66 28 20 6e 42 79 74 65 3e 3d 30 20 29    if( nByte>=0 )
35b0: 7b 0a 20 20 20 20 7a 54 65 72 6d 20 3d 20 26 7a  {.    zTerm = &z
35c0: 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d 65 6c 73 65  [nByte];.  }else
35d0: 7b 0a 20 20 20 20 7a 54 65 72 6d 20 3d 20 28 63  {.    zTerm = (c
35e0: 6f 6e 73 74 20 75 38 2a 29 28 2d 31 29 3b 0a 20  onst u8*)(-1);. 
35f0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 3c 3d   }.  assert( z<=
3600: 7a 54 65 72 6d 20 29 3b 0a 20 20 77 68 69 6c 65  zTerm );.  while
3610: 28 20 2a 7a 21 3d 30 20 26 26 20 7a 3c 7a 54 65  ( *z!=0 && z<zTe
3620: 72 6d 20 29 7b 0a 20 20 20 20 53 51 4c 49 54 45  rm ){.    SQLITE
3630: 5f 53 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a 20  _SKIP_UTF8(z);. 
3640: 20 20 20 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65     r++;.  }.  re
3650: 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 20 54 68  turn r;.}../* Th
3660: 69 73 20 74 65 73 74 20 66 75 6e 63 74 69 6f 6e  is test function
3670: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
3680: 79 20 75 73 65 64 20 62 79 20 74 68 65 20 61 75  y used by the au
3690: 74 6f 6d 61 74 65 64 20 74 65 73 74 2d 73 75 69  tomated test-sui
36a0: 74 65 2e 20 0a 2a 2a 20 48 65 6e 63 65 20 69 74  te. .** Hence it
36b0: 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
36c0: 6c 65 20 69 6e 20 64 65 62 75 67 20 62 75 69 6c  le in debug buil
36d0: 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ds..*/.#if defin
36e0: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
36f0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
3700: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 54  E_DEBUG)./*.** T
3710: 72 61 6e 73 6c 61 74 65 20 55 54 46 2d 38 20 74  ranslate UTF-8 t
3720: 6f 20 55 54 46 2d 38 2e 0a 2a 2a 0a 2a 2a 20 54  o UTF-8..**.** T
3730: 68 69 73 20 68 61 73 20 74 68 65 20 65 66 66 65  his has the effe
3740: 63 74 20 6f 66 20 6d 61 6b 69 6e 67 20 73 75 72  ct of making sur
3750: 65 20 74 68 61 74 20 74 68 65 20 73 74 72 69 6e  e that the strin
3760: 67 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  g is well-formed
3770: 0a 2a 2a 20 55 54 46 2d 38 2e 20 20 4d 69 73 63  .** UTF-8.  Misc
3780: 6f 64 65 64 20 63 68 61 72 61 63 74 65 72 73 20  oded characters 
3790: 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a  are removed..**.
37a0: 2a 2a 20 54 68 65 20 74 72 61 6e 73 6c 61 74 69  ** The translati
37b0: 6f 6e 20 69 73 20 64 6f 6e 65 20 69 6e 2d 70 6c  on is done in-pl
37c0: 61 63 65 20 61 6e 64 20 61 62 6f 72 74 65 64 20  ace and aborted 
37d0: 69 66 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  if the output.**
37e0: 20 6f 76 65 72 72 75 6e 73 20 74 68 65 20 69 6e   overruns the in
37f0: 70 75 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  put..*/.int sqli
3800: 74 65 33 55 74 66 38 54 6f 38 28 75 6e 73 69 67  te3Utf8To8(unsig
3810: 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 29 7b 0a  ned char *zIn){.
3820: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3830: 2a 7a 4f 75 74 20 3d 20 7a 49 6e 3b 0a 20 20 75  *zOut = zIn;.  u
3840: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53  nsigned char *zS
3850: 74 61 72 74 20 3d 20 7a 49 6e 3b 0a 20 20 75 33  tart = zIn;.  u3
3860: 32 20 63 3b 0a 0a 20 20 77 68 69 6c 65 28 20 7a  2 c;..  while( z
3870: 49 6e 5b 30 5d 20 26 26 20 7a 4f 75 74 3c 3d 7a  In[0] && zOut<=z
3880: 49 6e 20 29 7b 0a 20 20 20 20 63 20 3d 20 73 71  In ){.    c = sq
3890: 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a 49  lite3Utf8Read(zI
38a0: 6e 2c 20 28 63 6f 6e 73 74 20 75 38 2a 2a 29 26  n, (const u8**)&
38b0: 7a 49 6e 29 3b 0a 20 20 20 20 69 66 28 20 63 21  zIn);.    if( c!
38c0: 3d 30 78 66 66 66 64 20 29 7b 0a 20 20 20 20 20  =0xfffd ){.     
38d0: 20 57 52 49 54 45 5f 55 54 46 38 28 7a 4f 75 74   WRITE_UTF8(zOut
38e0: 2c 20 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , c);.    }.  }.
38f0: 20 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 20 20 72    *zOut = 0;.  r
3900: 65 74 75 72 6e 20 28 69 6e 74 29 28 7a 4f 75 74  eturn (int)(zOut
3910: 20 2d 20 7a 53 74 61 72 74 29 3b 0a 7d 0a 23 65   - zStart);.}.#e
3920: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
3930: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
3940: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
3950: 55 54 46 2d 31 36 20 73 74 72 69 6e 67 20 69 6e  UTF-16 string in
3960: 20 74 68 65 20 6e 61 74 69 76 65 20 65 6e 63 6f   the native enco
3970: 64 69 6e 67 20 69 6e 74 6f 20 61 20 55 54 46 2d  ding into a UTF-
3980: 38 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 4d 65 6d  8 string..** Mem
3990: 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ory to hold the 
39a0: 55 54 46 2d 38 20 73 74 72 69 6e 67 20 69 73 20  UTF-8 string is 
39b0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
39c0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 20 61 6e 64  lite3_malloc and
39d0: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 66 72 65 65   must.** be free
39e0: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
39f0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
3a00: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
3a10: 64 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  d if there is an
3a20: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
3a30: 72 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  r..*/.char *sqli
3a40: 74 65 33 55 74 66 31 36 74 6f 38 28 73 71 6c 69  te3Utf16to8(sqli
3a50: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 76  te3 *db, const v
3a60: 6f 69 64 20 2a 7a 2c 20 69 6e 74 20 6e 42 79 74  oid *z, int nByt
3a70: 65 2c 20 75 38 20 65 6e 63 29 7b 0a 20 20 4d 65  e, u8 enc){.  Me
3a80: 6d 20 6d 3b 0a 20 20 6d 65 6d 73 65 74 28 26 6d  m m;.  memset(&m
3a90: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b  , 0, sizeof(m));
3aa0: 0a 20 20 6d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  .  m.db = db;.  
3ab0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
3ac0: 74 53 74 72 28 26 6d 2c 20 7a 2c 20 6e 42 79 74  tStr(&m, z, nByt
3ad0: 65 2c 20 65 6e 63 2c 20 53 51 4c 49 54 45 5f 53  e, enc, SQLITE_S
3ae0: 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65  TATIC);.  sqlite
3af0: 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64  3VdbeChangeEncod
3b00: 69 6e 67 28 26 6d 2c 20 53 51 4c 49 54 45 5f 55  ing(&m, SQLITE_U
3b10: 54 46 38 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  TF8);.  if( db->
3b20: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
3b30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
3b40: 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
3b50: 20 20 20 6d 2e 7a 20 3d 20 30 3b 0a 20 20 7d 0a     m.z = 0;.  }.
3b60: 20 20 61 73 73 65 72 74 28 20 28 6d 2e 66 6c 61    assert( (m.fla
3b70: 67 73 20 26 20 4d 45 4d 5f 54 65 72 6d 29 21 3d  gs & MEM_Term)!=
3b80: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
3b90: 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72  ailed );.  asser
3ba0: 74 28 20 28 6d 2e 66 6c 61 67 73 20 26 20 4d 45  t( (m.flags & ME
3bb0: 4d 5f 53 74 72 29 21 3d 30 20 7c 7c 20 64 62 2d  M_Str)!=0 || db-
3bc0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
3bd0: 0a 20 20 61 73 73 65 72 74 28 20 28 6d 2e 66 6c  .  assert( (m.fl
3be0: 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 29 21 3d  ags & MEM_Dyn)!=
3bf0: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
3c00: 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72  ailed );.  asser
3c10: 74 28 20 6d 2e 7a 20 7c 7c 20 64 62 2d 3e 6d 61  t( m.z || db->ma
3c20: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
3c30: 72 65 74 75 72 6e 20 6d 2e 7a 3b 0a 7d 0a 0a 2f  return m.z;.}../
3c40: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55  *.** Convert a U
3c50: 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20 74  TF-8 string to t
3c60: 68 65 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69  he UTF-16 encodi
3c70: 6e 67 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ng specified by 
3c80: 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 65 6e 63  parameter.** enc
3c90: 2e 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  . A pointer to t
3ca0: 68 65 20 6e 65 77 20 73 74 72 69 6e 67 20 69 73  he new string is
3cb0: 20 72 65 74 75 72 6e 65 64 2c 20 61 6e 64 20 74   returned, and t
3cc0: 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 6e 4f  he value of *pnO
3cd0: 75 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ut.** is set to 
3ce0: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
3cf0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
3d00: 67 20 69 6e 20 62 79 74 65 73 2e 20 54 68 65 20  g in bytes. The 
3d10: 63 61 6c 6c 20 73 68 6f 75 6c 64 0a 2a 2a 20 61  call should.** a
3d20: 72 72 61 6e 67 65 20 74 6f 20 63 61 6c 6c 20 73  rrange to call s
3d30: 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 6f  qlite3DbFree() o
3d40: 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 70  n the returned p
3d50: 6f 69 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ointer when it i
3d60: 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 72  s.** no longer r
3d70: 65 71 75 69 72 65 64 2e 0a 2a 2a 20 0a 2a 2a 20  equired..** .** 
3d80: 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  If a malloc fail
3d90: 75 72 65 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c  ure occurs, NULL
3da0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
3db0: 20 74 68 65 20 64 62 2e 6d 61 6c 6c 6f 63 46 61   the db.mallocFa
3dc0: 69 6c 65 64 0a 2a 2a 20 66 6c 61 67 20 73 65 74  iled.** flag set
3dd0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
3de0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a  TE_ENABLE_STAT3.
3df0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 55 74 66  char *sqlite3Utf
3e00: 38 74 6f 31 36 28 73 71 6c 69 74 65 33 20 2a 64  8to16(sqlite3 *d
3e10: 62 2c 20 75 38 20 65 6e 63 2c 20 63 68 61 72 20  b, u8 enc, char 
3e20: 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 2a  *z, int n, int *
3e30: 70 6e 4f 75 74 29 7b 0a 20 20 4d 65 6d 20 6d 3b  pnOut){.  Mem m;
3e40: 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c  .  memset(&m, 0,
3e50: 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 6d   sizeof(m));.  m
3e60: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69  .db = db;.  sqli
3e70: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
3e80: 28 26 6d 2c 20 7a 2c 20 6e 2c 20 53 51 4c 49 54  (&m, z, n, SQLIT
3e90: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
3ea0: 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 73 71  TATIC);.  if( sq
3eb0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 54 72 61 6e  lite3VdbeMemTran
3ec0: 73 6c 61 74 65 28 26 6d 2c 20 65 6e 63 29 20 29  slate(&m, enc) )
3ed0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
3ee0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
3ef0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
3f00: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6d 2e    }.  assert( m.
3f10: 7a 3d 3d 6d 2e 7a 4d 61 6c 6c 6f 63 20 29 3b 0a  z==m.zMalloc );.
3f20: 20 20 2a 70 6e 4f 75 74 20 3d 20 6d 2e 6e 3b 0a    *pnOut = m.n;.
3f30: 20 20 72 65 74 75 72 6e 20 6d 2e 7a 3b 0a 7d 0a    return m.z;.}.
3f40: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 7a 49  #endif../*.** zI
3f50: 6e 20 69 73 20 61 20 55 54 46 2d 31 36 20 65 6e  n is a UTF-16 en
3f60: 63 6f 64 65 64 20 75 6e 69 63 6f 64 65 20 73 74  coded unicode st
3f70: 72 69 6e 67 20 61 74 20 6c 65 61 73 74 20 6e 43  ring at least nC
3f80: 68 61 72 20 63 68 61 72 61 63 74 65 72 73 20 6c  har characters l
3f90: 6f 6e 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ong..** Return t
3fa0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
3fb0: 65 73 20 69 6e 20 74 68 65 20 66 69 72 73 74 20  es in the first 
3fc0: 6e 43 68 61 72 20 75 6e 69 63 6f 64 65 20 63 68  nChar unicode ch
3fd0: 61 72 61 63 74 65 72 73 0a 2a 2a 20 69 6e 20 70  aracters.** in p
3fe0: 5a 2e 20 20 6e 43 68 61 72 20 6d 75 73 74 20 62  Z.  nChar must b
3ff0: 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a  e non-negative..
4000: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 74  */.int sqlite3Ut
4010: 66 31 36 42 79 74 65 4c 65 6e 28 63 6f 6e 73 74  f16ByteLen(const
4020: 20 76 6f 69 64 20 2a 7a 49 6e 2c 20 69 6e 74 20   void *zIn, int 
4030: 6e 43 68 61 72 29 7b 0a 20 20 69 6e 74 20 63 3b  nChar){.  int c;
4040: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4050: 20 63 6f 6e 73 74 20 2a 7a 20 3d 20 7a 49 6e 3b   const *z = zIn;
4060: 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
4070: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 55 54  .  if( SQLITE_UT
4080: 46 31 36 4e 41 54 49 56 45 3d 3d 53 51 4c 49 54  F16NATIVE==SQLIT
4090: 45 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20  E_UTF16BE ){.   
40a0: 20 77 68 69 6c 65 28 20 6e 3c 6e 43 68 61 72 20   while( n<nChar 
40b0: 29 7b 0a 20 20 20 20 20 20 52 45 41 44 5f 55 54  ){.      READ_UT
40c0: 46 31 36 42 45 28 7a 2c 20 31 2c 20 63 29 3b 0a  F16BE(z, 1, c);.
40d0: 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d        n++;.    }
40e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
40f0: 69 6c 65 28 20 6e 3c 6e 43 68 61 72 20 29 7b 0a  ile( n<nChar ){.
4100: 20 20 20 20 20 20 52 45 41 44 5f 55 54 46 31 36        READ_UTF16
4110: 4c 45 28 7a 2c 20 31 2c 20 63 29 3b 0a 20 20 20  LE(z, 1, c);.   
4120: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
4130: 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  }.  return (int)
4140: 28 7a 2d 28 75 6e 73 69 67 6e 65 64 20 63 68 61  (z-(unsigned cha
4150: 72 20 63 6f 6e 73 74 20 2a 29 7a 49 6e 29 3b 0a  r const *)zIn);.
4160: 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
4170: 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
4180: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4190: 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 68  s called from th
41a0: 65 20 54 43 4c 20 74 65 73 74 20 66 75 6e 63 74  e TCL test funct
41b0: 69 6f 6e 20 22 74 72 61 6e 73 6c 61 74 65 5f 73  ion "translate_s
41c0: 65 6c 66 74 65 73 74 22 2e 0a 2a 2a 20 49 74 20  elftest"..** It 
41d0: 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
41e0: 70 72 69 6d 69 74 69 76 65 73 20 66 6f 72 20 73  primitives for s
41f0: 65 72 69 61 6c 69 7a 69 6e 67 20 61 6e 64 20 64  erializing and d
4200: 65 73 65 72 69 61 6c 69 7a 69 6e 67 0a 2a 2a 20  eserializing.** 
4210: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 65 61  characters in ea
4220: 63 68 20 65 6e 63 6f 64 69 6e 67 20 61 72 65 20  ch encoding are 
4230: 69 6e 76 65 72 73 65 73 20 6f 66 20 65 61 63 68  inverses of each
4240: 20 6f 74 68 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20   other..*/.void 
4250: 73 71 6c 69 74 65 33 55 74 66 53 65 6c 66 54 65  sqlite3UtfSelfTe
4260: 73 74 28 76 6f 69 64 29 7b 0a 20 20 75 6e 73 69  st(void){.  unsi
4270: 67 6e 65 64 20 69 6e 74 20 69 2c 20 74 3b 0a 20  gned int i, t;. 
4280: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
4290: 42 75 66 5b 32 30 5d 3b 0a 20 20 75 6e 73 69 67  Buf[20];.  unsig
42a0: 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ned char *z;.  i
42b0: 6e 74 20 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt n;.  unsigned
42c0: 20 69 6e 74 20 63 3b 0a 0a 20 20 66 6f 72 28 69   int c;..  for(i
42d0: 3d 30 3b 20 69 3c 30 78 30 30 31 31 30 30 30 30  =0; i<0x00110000
42e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 20 3d 20  ; i++){.    z = 
42f0: 7a 42 75 66 3b 0a 20 20 20 20 57 52 49 54 45 5f  zBuf;.    WRITE_
4300: 55 54 46 38 28 7a 2c 20 69 29 3b 0a 20 20 20 20  UTF8(z, i);.    
4310: 6e 20 3d 20 28 69 6e 74 29 28 7a 2d 7a 42 75 66  n = (int)(z-zBuf
4320: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
4330: 3e 30 20 26 26 20 6e 3c 3d 34 20 29 3b 0a 20 20  >0 && n<=4 );.  
4340: 20 20 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20    z[0] = 0;.    
4350: 7a 20 3d 20 7a 42 75 66 3b 0a 20 20 20 20 63 20  z = zBuf;.    c 
4360: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  = sqlite3Utf8Rea
4370: 64 28 7a 2c 20 28 63 6f 6e 73 74 20 75 38 2a 2a  d(z, (const u8**
4380: 29 26 7a 29 3b 0a 20 20 20 20 74 20 3d 20 69 3b  )&z);.    t = i;
4390: 0a 20 20 20 20 69 66 28 20 69 3e 3d 30 78 44 38  .    if( i>=0xD8
43a0: 30 30 20 26 26 20 69 3c 3d 30 78 44 46 46 46 20  00 && i<=0xDFFF 
43b0: 29 20 74 20 3d 20 30 78 46 46 46 44 3b 0a 20 20  ) t = 0xFFFD;.  
43c0: 20 20 69 66 28 20 28 69 26 30 78 46 46 46 46 46    if( (i&0xFFFFF
43d0: 46 46 45 29 3d 3d 30 78 46 46 46 45 20 29 20 74  FFE)==0xFFFE ) t
43e0: 20 3d 20 30 78 46 46 46 44 3b 0a 20 20 20 20 61   = 0xFFFD;.    a
43f0: 73 73 65 72 74 28 20 63 3d 3d 74 20 29 3b 0a 20  ssert( c==t );. 
4400: 20 20 20 61 73 73 65 72 74 28 20 28 7a 2d 7a 42     assert( (z-zB
4410: 75 66 29 3d 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20  uf)==n );.  }.  
4420: 66 6f 72 28 69 3d 30 3b 20 69 3c 30 78 30 30 31  for(i=0; i<0x001
4430: 31 30 30 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  10000; i++){.   
4440: 20 69 66 28 20 69 3e 3d 30 78 44 38 30 30 20 26   if( i>=0xD800 &
4450: 26 20 69 3c 30 78 45 30 30 30 20 29 20 63 6f 6e  & i<0xE000 ) con
4460: 74 69 6e 75 65 3b 0a 20 20 20 20 7a 20 3d 20 7a  tinue;.    z = z
4470: 42 75 66 3b 0a 20 20 20 20 57 52 49 54 45 5f 55  Buf;.    WRITE_U
4480: 54 46 31 36 4c 45 28 7a 2c 20 69 29 3b 0a 20 20  TF16LE(z, i);.  
4490: 20 20 6e 20 3d 20 28 69 6e 74 29 28 7a 2d 7a 42    n = (int)(z-zB
44a0: 75 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  uf);.    assert(
44b0: 20 6e 3e 30 20 26 26 20 6e 3c 3d 34 20 29 3b 0a   n>0 && n<=4 );.
44c0: 20 20 20 20 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20      z[0] = 0;.  
44d0: 20 20 7a 20 3d 20 7a 42 75 66 3b 0a 20 20 20 20    z = zBuf;.    
44e0: 52 45 41 44 5f 55 54 46 31 36 4c 45 28 7a 2c 20  READ_UTF16LE(z, 
44f0: 31 2c 20 63 29 3b 0a 20 20 20 20 61 73 73 65 72  1, c);.    asser
4500: 74 28 20 63 3d 3d 69 20 29 3b 0a 20 20 20 20 61  t( c==i );.    a
4510: 73 73 65 72 74 28 20 28 7a 2d 7a 42 75 66 29 3d  ssert( (z-zBuf)=
4520: 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  =n );.  }.  for(
4530: 69 3d 30 3b 20 69 3c 30 78 30 30 31 31 30 30 30  i=0; i<0x0011000
4540: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  0; i++){.    if(
4550: 20 69 3e 3d 30 78 44 38 30 30 20 26 26 20 69 3c   i>=0xD800 && i<
4560: 30 78 45 30 30 30 20 29 20 63 6f 6e 74 69 6e 75  0xE000 ) continu
4570: 65 3b 0a 20 20 20 20 7a 20 3d 20 7a 42 75 66 3b  e;.    z = zBuf;
4580: 0a 20 20 20 20 57 52 49 54 45 5f 55 54 46 31 36  .    WRITE_UTF16
4590: 42 45 28 7a 2c 20 69 29 3b 0a 20 20 20 20 6e 20  BE(z, i);.    n 
45a0: 3d 20 28 69 6e 74 29 28 7a 2d 7a 42 75 66 29 3b  = (int)(z-zBuf);
45b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 3e 30  .    assert( n>0
45c0: 20 26 26 20 6e 3c 3d 34 20 29 3b 0a 20 20 20 20   && n<=4 );.    
45d0: 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7a 20  z[0] = 0;.    z 
45e0: 3d 20 7a 42 75 66 3b 0a 20 20 20 20 52 45 41 44  = zBuf;.    READ
45f0: 5f 55 54 46 31 36 42 45 28 7a 2c 20 31 2c 20 63  _UTF16BE(z, 1, c
4600: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  );.    assert( c
4610: 3d 3d 69 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==i );.    asser
4620: 74 28 20 28 7a 2d 7a 42 75 66 29 3d 3d 6e 20 29  t( (z-zBuf)==n )
4630: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
4640: 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f  * SQLITE_TEST */
4650: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
4660: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.