/ Hex Artifact Content
Login

Artifact 3d087d22b7a2d68aee32919713251b30fd327fc0:


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 36 37 20 32  : utf.c,v 1.67 2
01f0: 30 30 38 2f 31 32 2f 30 38 20 32 31 3a 33 37 3a  008/12/08 21:37:
0200: 31 35 20 64 72 68 20 45 78 70 20 24 0a 2a 2a 0a  15 drh Exp $.**.
0210: 2a 2a 20 4e 6f 74 65 73 20 6f 6e 20 55 54 46 2d  ** Notes on UTF-
0220: 38 3a 0a 2a 2a 0a 2a 2a 20 20 20 42 79 74 65 2d  8:.**.**   Byte-
0230: 30 20 20 20 20 42 79 74 65 2d 31 20 20 20 20 42  0    Byte-1    B
0240: 79 74 65 2d 32 20 20 20 20 42 79 74 65 2d 33 20  yte-2    Byte-3 
0250: 20 20 20 56 61 6c 75 65 0a 2a 2a 20 20 30 78 78     Value.**  0xx
0260: 78 78 78 78 78 20 20 20 20 20 20 20 20 20 20 20  xxxxx           
0270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0280: 20 20 20 20 20 20 30 30 30 30 30 30 30 30 20 30        00000000 0
0290: 30 30 30 30 30 30 30 20 30 78 78 78 78 78 78 78  0000000 0xxxxxxx
02a0: 0a 2a 2a 20 20 31 31 30 79 79 79 79 79 20 20 31  .**  110yyyyy  1
02b0: 30 78 78 78 78 78 78 20 20 20 20 20 20 20 20 20  0xxxxxx         
02c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 30                00
02d0: 30 30 30 30 30 30 20 30 30 30 30 30 79 79 79 20  000000 00000yyy 
02e0: 79 79 78 78 78 78 78 78 0a 2a 2a 20 20 31 31 31  yyxxxxxx.**  111
02f0: 30 7a 7a 7a 7a 20 20 31 30 79 79 79 79 79 79 20  0zzzz  10yyyyyy 
0300: 20 31 30 78 78 78 78 78 78 20 20 20 20 20 20 20   10xxxxxx       
0310: 20 20 20 20 20 20 30 30 30 30 30 30 30 30 20 7a        00000000 z
0320: 7a 7a 7a 79 79 79 79 20 79 79 78 78 78 78 78 78  zzzyyyy yyxxxxxx
0330: 0a 2a 2a 20 20 31 31 31 31 30 75 75 75 20 20 31  .**  11110uuu  1
0340: 30 75 75 7a 7a 7a 7a 20 20 31 30 79 79 79 79 79  0uuzzzz  10yyyyy
0350: 79 20 20 31 30 78 78 78 78 78 78 20 20 20 30 30  y  10xxxxxx   00
0360: 30 75 75 75 75 75 20 7a 7a 7a 7a 79 79 79 79 20  0uuuuu zzzzyyyy 
0370: 79 79 78 78 78 78 78 78 0a 2a 2a 0a 2a 2a 0a 2a  yyxxxxxx.**.**.*
0380: 2a 20 4e 6f 74 65 73 20 6f 6e 20 55 54 46 2d 31  * Notes on UTF-1
0390: 36 3a 20 20 28 77 69 74 68 20 77 77 77 77 2b 31  6:  (with wwww+1
03a0: 3d 3d 75 75 75 75 75 29 0a 2a 2a 0a 2a 2a 20 20  ==uuuuu).**.**  
03b0: 20 20 20 20 57 6f 72 64 2d 30 20 20 20 20 20 20      Word-0      
03c0: 20 20 20 20 20 20 20 20 20 57 6f 72 64 2d 31 20           Word-1 
03d0: 20 20 20 20 20 20 20 20 20 56 61 6c 75 65 0a 2a           Value.*
03e0: 2a 20 20 31 31 30 31 31 30 77 77 20 77 77 7a 7a  *  110110ww wwzz
03f0: 7a 7a 79 79 20 20 20 31 31 30 31 31 31 79 79 20  zzyy   110111yy 
0400: 79 79 78 78 78 78 78 78 20 20 20 20 30 30 30 75  yyxxxxxx    000u
0410: 75 75 75 75 20 7a 7a 7a 7a 79 79 79 79 20 79 79  uuuu zzzzyyyy yy
0420: 78 78 78 78 78 78 0a 2a 2a 20 20 7a 7a 7a 7a 79  xxxxxx.**  zzzzy
0430: 79 79 79 20 79 79 78 78 78 78 78 78 20 20 20 20  yyy yyxxxxxx    
0440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0450: 20 20 20 20 30 30 30 30 30 30 30 30 20 7a 7a 7a      00000000 zzz
0460: 7a 79 79 79 79 20 79 79 78 78 78 78 78 78 0a 2a  zyyyy yyxxxxxx.*
0470: 2a 0a 2a 2a 0a 2a 2a 20 42 4f 4d 20 6f 72 20 42  *.**.** BOM or B
0480: 79 74 65 20 4f 72 64 65 72 20 4d 61 72 6b 3a 0a  yte Order Mark:.
0490: 2a 2a 20 20 20 20 20 30 78 66 66 20 30 78 66 65  **     0xff 0xfe
04a0: 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e     little-endian
04b0: 20 75 74 66 2d 31 36 20 66 6f 6c 6c 6f 77 73 0a   utf-16 follows.
04c0: 2a 2a 20 20 20 20 20 30 78 66 65 20 30 78 66 66  **     0xfe 0xff
04d0: 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 20 75 74     big-endian ut
04e0: 66 2d 31 36 20 66 6f 6c 6c 6f 77 73 0a 2a 2a 0a  f-16 follows.**.
04f0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
0500: 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  iteInt.h".#inclu
0510: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69  de <assert.h>.#i
0520: 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e  nclude "vdbeInt.
0530: 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  h"..#ifndef SQLI
0540: 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a  TE_AMALGAMATION.
0550: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
0560: 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c  ing constant val
0570: 75 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68  ue is used by th
0580: 65 20 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 49  e SQLITE_BIGENDI
0590: 41 4e 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  AN and.** SQLITE
05a0: 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e 20 6d 61  _LITTLEENDIAN ma
05b0: 63 72 6f 73 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 69  cros..*/.const i
05c0: 6e 74 20 73 71 6c 69 74 65 33 6f 6e 65 20 3d 20  nt sqlite3one = 
05d0: 31 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  1;.#endif /* SQL
05e0: 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e  ITE_AMALGAMATION
05f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
0600: 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20 69 73 20  lookup table is 
0610: 75 73 65 64 20 74 6f 20 68 65 6c 70 20 64 65 63  used to help dec
0620: 6f 64 65 20 74 68 65 20 66 69 72 73 74 20 62 79  ode the first by
0630: 74 65 20 6f 66 0a 2a 2a 20 61 20 6d 75 6c 74 69  te of.** a multi
0640: 2d 62 79 74 65 20 55 54 46 38 20 63 68 61 72 61  -byte UTF8 chara
0650: 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cter..*/.static 
0660: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
0670: 68 61 72 20 73 71 6c 69 74 65 33 55 74 66 54 72  har sqlite3UtfTr
0680: 61 6e 73 31 5b 5d 20 3d 20 7b 0a 20 20 30 78 30  ans1[] = {.  0x0
0690: 30 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20 30  0, 0x01, 0x02, 0
06a0: 78 30 33 2c 20 30 78 30 34 2c 20 30 78 30 35 2c  x03, 0x04, 0x05,
06b0: 20 30 78 30 36 2c 20 30 78 30 37 2c 0a 20 20 30   0x06, 0x07,.  0
06c0: 78 30 38 2c 20 30 78 30 39 2c 20 30 78 30 61 2c  x08, 0x09, 0x0a,
06d0: 20 30 78 30 62 2c 20 30 78 30 63 2c 20 30 78 30   0x0b, 0x0c, 0x0
06e0: 64 2c 20 30 78 30 65 2c 20 30 78 30 66 2c 0a 20  d, 0x0e, 0x0f,. 
06f0: 20 30 78 31 30 2c 20 30 78 31 31 2c 20 30 78 31   0x10, 0x11, 0x1
0700: 32 2c 20 30 78 31 33 2c 20 30 78 31 34 2c 20 30  2, 0x13, 0x14, 0
0710: 78 31 35 2c 20 30 78 31 36 2c 20 30 78 31 37 2c  x15, 0x16, 0x17,
0720: 0a 20 20 30 78 31 38 2c 20 30 78 31 39 2c 20 30  .  0x18, 0x19, 0
0730: 78 31 61 2c 20 30 78 31 62 2c 20 30 78 31 63 2c  x1a, 0x1b, 0x1c,
0740: 20 30 78 31 64 2c 20 30 78 31 65 2c 20 30 78 31   0x1d, 0x1e, 0x1
0750: 66 2c 0a 20 20 30 78 30 30 2c 20 30 78 30 31 2c  f,.  0x00, 0x01,
0760: 20 30 78 30 32 2c 20 30 78 30 33 2c 20 30 78 30   0x02, 0x03, 0x0
0770: 34 2c 20 30 78 30 35 2c 20 30 78 30 36 2c 20 30  4, 0x05, 0x06, 0
0780: 78 30 37 2c 0a 20 20 30 78 30 38 2c 20 30 78 30  x07,.  0x08, 0x0
0790: 39 2c 20 30 78 30 61 2c 20 30 78 30 62 2c 20 30  9, 0x0a, 0x0b, 0
07a0: 78 30 63 2c 20 30 78 30 64 2c 20 30 78 30 65 2c  x0c, 0x0d, 0x0e,
07b0: 20 30 78 30 66 2c 0a 20 20 30 78 30 30 2c 20 30   0x0f,.  0x00, 0
07c0: 78 30 31 2c 20 30 78 30 32 2c 20 30 78 30 33 2c  x01, 0x02, 0x03,
07d0: 20 30 78 30 34 2c 20 30 78 30 35 2c 20 30 78 30   0x04, 0x05, 0x0
07e0: 36 2c 20 30 78 30 37 2c 0a 20 20 30 78 30 30 2c  6, 0x07,.  0x00,
07f0: 20 30 78 30 31 2c 20 30 78 30 32 2c 20 30 78 30   0x01, 0x02, 0x0
0800: 33 2c 20 30 78 30 30 2c 20 30 78 30 31 2c 20 30  3, 0x00, 0x01, 0
0810: 78 30 30 2c 20 30 78 30 30 2c 0a 7d 3b 0a 0a 0a  x00, 0x00,.};...
0820: 23 64 65 66 69 6e 65 20 57 52 49 54 45 5f 55 54  #define WRITE_UT
0830: 46 38 28 7a 4f 75 74 2c 20 63 29 20 7b 20 20 20  F8(zOut, c) {   
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 5c 0a 20 20 69 66 28 20 63         \.  if( c
0860: 3c 30 78 30 30 30 38 30 20 29 7b 20 20 20 20 20  <0x00080 ){     
0870: 20 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: 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20  \.    *zOut++ = 
08a0: 28 63 26 30 78 46 46 29 3b 20 20 20 20 20 20 20  (c&0xFF);       
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 5c 0a 20 20 7d 20 20           \.  }  
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08e0: 20 20 20 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 5c 0a 20 20 65 6c 73 65 20 69 66 28 20 63    \.  else if( c
0910: 3c 30 78 30 30 38 30 30 20 29 7b 20 20 20 20 20  <0x00800 ){     
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0930: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
0940: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 43 30 20   *zOut++ = 0xC0 
0950: 2b 20 28 28 63 3e 3e 36 29 26 30 78 31 46 29 3b  + ((c>>6)&0x1F);
0960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0970: 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b      \.    *zOut+
0980: 2b 20 3d 20 30 78 38 30 20 2b 20 28 63 20 26 20  + = 0x80 + (c & 
0990: 30 78 33 46 29 3b 20 20 20 20 20 20 20 20 20 20  0x3F);          
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
09b0: 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 20 20 20 20 5c 0a 20 20 65 6c 73 65 20 69        \.  else i
09f0: 66 28 20 63 3c 30 78 31 30 30 30 30 20 29 7b 20  f( c<0x10000 ){ 
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
0a20: 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30  .    *zOut++ = 0
0a30: 78 45 30 20 2b 20 28 28 63 3e 3e 31 32 29 26 30  xE0 + ((c>>12)&0
0a40: 78 30 46 29 3b 20 20 20 20 20 20 20 20 20 20 20  x0F);           
0a50: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a          \.    *z
0a60: 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28  Out++ = 0x80 + (
0a70: 28 63 3e 3e 36 29 20 26 20 30 78 33 46 29 3b 20  (c>>6) & 0x3F); 
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d   \.    *zOut++ =
0aa0: 20 30 78 38 30 20 2b 20 28 63 20 26 20 30 78 33   0x80 + (c & 0x3
0ab0: 46 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  F);             
0ac0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65            \.  }e
0ad0: 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20  lse{            
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b     \.    *zOut++
0b10: 20 3d 20 30 78 46 30 20 2b 20 28 28 63 3e 3e 31   = 0xF0 + ((c>>1
0b20: 38 29 20 26 20 30 78 30 37 29 3b 20 20 20 20 20  8) & 0x07);     
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
0b40: 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30    *zOut++ = 0x80
0b50: 20 2b 20 28 28 63 3e 3e 31 32 29 20 26 20 30 78   + ((c>>12) & 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 5c 0a 20 20 20 20 2a 7a 4f 75 74       \.    *zOut
0b80: 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 28 63 3e  ++ = 0x80 + ((c>
0b90: 3e 36 29 20 26 20 30 78 33 46 29 3b 20 20 20 20  >6) & 0x3F);    
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
0bb0: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78      *zOut++ = 0x
0bc0: 38 30 20 2b 20 28 63 20 26 20 30 78 33 46 29 3b  80 + (c & 0x3F);
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 5c 0a 20 20 7d 20 20 20 20         \.  }    
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 57 52 49  \.}..#define WRI
0c30: 54 45 5f 55 54 46 31 36 4c 45 28 7a 4f 75 74 2c  TE_UTF16LE(zOut,
0c40: 20 63 29 20 7b 20 20 20 20 20 20 20 20 20 20 20   c) {           
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c60: 20 20 20 20 20 5c 0a 20 20 69 66 28 20 63 3c 3d       \.  if( c<=
0c70: 30 78 46 46 46 46 20 29 7b 20 20 20 20 20 20 20  0xFFFF ){       
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 20 20 2a 7a 4f         \.    *zO
0cb0: 75 74 2b 2b 20 3d 20 28 63 26 30 78 30 30 46 46  ut++ = (c&0x00FF
0cc0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
0cd0: 20 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 5c 0a 20 20 20 20 2a           \.    *
0cf0: 7a 4f 75 74 2b 2b 20 3d 20 28 28 63 3e 3e 38 29  zOut++ = ((c>>8)
0d00: 26 30 78 30 30 46 46 29 3b 20 20 20 20 20 20 20  &0x00FF);       
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 5c 0a 20 20 7d             \.  }
0d30: 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
0d70: 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 28 28     *zOut++ = (((
0d80: 63 3e 3e 31 30 29 26 30 78 30 30 33 46 29 20 2b  c>>10)&0x003F) +
0d90: 20 28 28 28 63 2d 30 78 31 30 30 30 30 29 3e 3e   (((c-0x10000)>>
0da0: 31 30 29 26 30 78 30 30 43 30 29 29 3b 20 20 5c  10)&0x00C0));  \
0db0: 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28  .    *zOut++ = (
0dc0: 30 78 30 30 44 38 20 2b 20 28 28 28 63 2d 30 78  0x00D8 + (((c-0x
0dd0: 31 30 30 30 30 29 3e 3e 31 38 29 26 30 78 30 33  10000)>>18)&0x03
0de0: 29 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ));             
0df0: 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d   \.    *zOut++ =
0e00: 20 28 63 26 30 78 30 30 46 46 29 3b 20 20 20 20   (c&0x00FF);    
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e30: 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b     \.    *zOut++
0e40: 20 3d 20 28 30 78 30 30 44 43 20 2b 20 28 28 63   = (0x00DC + ((c
0e50: 3e 3e 38 29 26 30 78 30 33 29 29 3b 20 20 20 20  >>8)&0x03));    
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e70: 20 20 20 20 20 5c 0a 20 20 7d 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 20 20 20 20 20 20                  
0eb0: 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66         \.}..#def
0ec0: 69 6e 65 20 57 52 49 54 45 5f 55 54 46 31 36 42  ine WRITE_UTF16B
0ed0: 45 28 7a 4f 75 74 2c 20 63 29 20 7b 20 20 20 20  E(zOut, c) {    
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 5c 0a 20 20              \.  
0f00: 69 66 28 20 63 3c 3d 30 78 46 46 46 46 20 29 7b  if( c<=0xFFFF ){
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 20 20 20 20 20 5c 0a                \.
0f40: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 28      *zOut++ = ((
0f50: 63 3e 3e 38 29 26 30 78 30 30 46 46 29 3b 20 20  c>>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 20                  
0f80: 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20  \.    *zOut++ = 
0f90: 28 63 26 30 78 30 30 46 46 29 3b 20 20 20 20 20  (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 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 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 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b      \.    *zOut+
1010: 2b 20 3d 20 28 30 78 30 30 44 38 20 2b 20 28 28  + = (0x00D8 + ((
1020: 28 63 2d 30 78 31 30 30 30 30 29 3e 3e 31 38 29  (c-0x10000)>>18)
1030: 26 30 78 30 33 29 29 3b 20 20 20 20 20 20 20 20  &0x03));        
1040: 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75        \.    *zOu
1050: 74 2b 2b 20 3d 20 28 28 28 63 3e 3e 31 30 29 26  t++ = (((c>>10)&
1060: 30 78 30 30 33 46 29 20 2b 20 28 28 28 63 2d 30  0x003F) + (((c-0
1070: 78 31 30 30 30 30 29 3e 3e 31 30 29 26 30 78 30  x10000)>>10)&0x0
1080: 30 43 30 29 29 3b 20 20 5c 0a 20 20 20 20 2a 7a  0C0));  \.    *z
1090: 4f 75 74 2b 2b 20 3d 20 28 30 78 30 30 44 43 20  Out++ = (0x00DC 
10a0: 2b 20 28 28 63 3e 3e 38 29 26 30 78 30 33 29 29  + ((c>>8)&0x03))
10b0: 3b 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 5c 0a 20 20 20 20            \.    
10d0: 2a 7a 4f 75 74 2b 2b 20 3d 20 28 63 26 30 78 30  *zOut++ = (c&0x0
10e0: 30 46 46 29 3b 20 20 20 20 20 20 20 20 20 20 20  0FF);           
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 5c 0a 20 20              \.  
1110: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
1120: 20 20 20 20 20 20 20 20 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 5c 0a                \.
1150: 7d 0a 0a 23 64 65 66 69 6e 65 20 52 45 41 44 5f  }..#define READ_
1160: 55 54 46 31 36 4c 45 28 7a 49 6e 2c 20 63 29 7b  UTF16LE(zIn, c){
1170: 20 20 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 5c 0a 20 20 63 20 3d           \.  c =
11a0: 20 28 2a 7a 49 6e 2b 2b 29 3b 20 20 20 20 20 20   (*zIn++);      
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 63 20 2b 3d 20 28 28 2a 7a 49 6e   \.  c += ((*zIn
11f0: 2b 2b 29 3c 3c 38 29 3b 20 20 20 20 20 20 20 20  ++)<<8);        
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1210: 20 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 5c 0a 20 20 69 66 28           \.  if(
1230: 20 63 3e 3d 30 78 44 38 30 30 20 26 26 20 63 3c   c>=0xD800 && c<
1240: 30 78 45 30 30 30 20 29 7b 20 20 20 20 20 20 20  0xE000 ){       
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: 5c 0a 20 20 20 20 69 6e 74 20 63 32 20 3d 20 28  \.    int c2 = (
1280: 2a 7a 49 6e 2b 2b 29 3b 20 20 20 20 20 20 20 20  *zIn++);        
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 20 20 63 32          \.    c2
12c0: 20 2b 3d 20 28 28 2a 7a 49 6e 2b 2b 29 3c 3c 38   += ((*zIn++)<<8
12d0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 5c 0a 20 20 20 20 63 20 3d 20 28 63 32 26 30 78  \.    c = (c2&0x
1310: 30 33 46 46 29 20 2b 20 28 28 63 26 30 78 30 30  03FF) + ((c&0x00
1320: 33 46 29 3c 3c 31 30 29 20 2b 20 28 28 28 63 26  3F)<<10) + (((c&
1330: 30 78 30 33 43 30 29 2b 30 78 30 30 34 30 29 3c  0x03C0)+0x0040)<
1340: 3c 31 30 29 3b 20 20 20 5c 0a 20 20 20 20 69 66  <10);   \.    if
1350: 28 20 28 63 20 26 20 30 78 46 46 46 46 30 30 30  ( (c & 0xFFFF000
1360: 30 29 3d 3d 30 20 29 20 63 20 3d 20 30 78 46 46  0)==0 ) c = 0xFF
1370: 46 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  FD;             
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1390: 5c 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20 20  \.  }           
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d0: 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65          \.}..#de
13e0: 66 69 6e 65 20 52 45 41 44 5f 55 54 46 31 36 42  fine READ_UTF16B
13f0: 45 28 7a 49 6e 2c 20 63 29 7b 20 20 20 20 20 20  E(zIn, c){      
1400: 20 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 5c 0a 20 20 63 20 3d 20 28 28 2a 7a 49     \.  c = ((*zI
1430: 6e 2b 2b 29 3c 3c 38 29 3b 20 20 20 20 20 20 20  n++)<<8);       
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 63             \.  c
1470: 20 2b 3d 20 28 2a 7a 49 6e 2b 2b 29 3b 20 20 20   += (*zIn++);   
1480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b0: 20 20 20 5c 0a 20 20 69 66 28 20 63 3e 3d 30 78     \.  if( c>=0x
14c0: 44 38 30 30 20 26 26 20 63 3c 30 78 45 30 30 30  D800 && c<0xE000
14d0: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
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 5c 0a 20 20 20 20            \.    
1500: 69 6e 74 20 63 32 20 3d 20 28 28 2a 7a 49 6e 2b  int c2 = ((*zIn+
1510: 2b 29 3c 3c 38 29 3b 20 20 20 20 20 20 20 20 20  +)<<8);         
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 5c 0a 20 20 20 20 63 32 20 2b 3d 20 28 2a    \.    c2 += (*
1550: 7a 49 6e 2b 2b 29 3b 20 20 20 20 20 20 20 20 20  zIn++);         
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1580: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
1590: 63 20 3d 20 28 63 32 26 30 78 30 33 46 46 29 20  c = (c2&0x03FF) 
15a0: 2b 20 28 28 63 26 30 78 30 30 33 46 29 3c 3c 31  + ((c&0x003F)<<1
15b0: 30 29 20 2b 20 28 28 28 63 26 30 78 30 33 43 30  0) + (((c&0x03C0
15c0: 29 2b 30 78 30 30 34 30 29 3c 3c 31 30 29 3b 20  )+0x0040)<<10); 
15d0: 20 20 5c 0a 20 20 20 20 69 66 28 20 28 63 20 26    \.    if( (c &
15e0: 20 30 78 46 46 46 46 30 30 30 30 29 3d 3d 30 20   0xFFFF0000)==0 
15f0: 29 20 63 20 3d 20 30 78 46 46 46 44 3b 20 20 20  ) c = 0xFFFD;   
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 5c 0a 20 20 7d 20            \.  } 
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61    \.}../*.** Tra
1670: 6e 73 6c 61 74 65 20 61 20 73 69 6e 67 6c 65 20  nslate a single 
1680: 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 2e  UTF-8 character.
1690: 20 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69    Return the uni
16a0: 63 6f 64 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  code value..**.*
16b0: 2a 20 44 75 72 69 6e 67 20 74 72 61 6e 73 6c 61  * During transla
16c0: 74 69 6f 6e 2c 20 61 73 73 75 6d 65 20 74 68 61  tion, assume tha
16d0: 74 20 74 68 65 20 62 79 74 65 20 74 68 61 74 20  t the byte that 
16e0: 7a 54 65 72 6d 20 70 6f 69 6e 74 73 0a 2a 2a 20  zTerm points.** 
16f0: 69 73 20 61 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a  is a 0x00..**.**
1700: 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
1710: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 75 6e 72   to the next unr
1720: 65 61 64 20 62 79 74 65 20 62 61 63 6b 20 69 6e  ead byte back in
1730: 74 6f 20 2a 70 7a 4e 65 78 74 2e 0a 2a 2a 0a 2a  to *pzNext..**.*
1740: 2a 20 4e 6f 74 65 73 20 4f 6e 20 49 6e 76 61 6c  * Notes On Inval
1750: 69 64 20 55 54 46 2d 38 3a 0a 2a 2a 0a 2a 2a 20  id UTF-8:.**.** 
1760: 20 2a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65   *  This routine
1770: 20 6e 65 76 65 72 20 61 6c 6c 6f 77 73 20 61 20   never allows a 
1780: 37 2d 62 69 74 20 63 68 61 72 61 63 74 65 72 20  7-bit character 
1790: 28 30 78 30 30 20 74 68 72 6f 75 67 68 20 30 78  (0x00 through 0x
17a0: 37 66 29 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65  7f) to.**     be
17b0: 20 65 6e 63 6f 64 65 64 20 61 73 20 61 20 6d 75   encoded as a mu
17c0: 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74  lti-byte charact
17d0: 65 72 2e 20 20 41 6e 79 20 6d 75 6c 74 69 2d 62  er.  Any multi-b
17e0: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 74 68  yte character th
17f0: 61 74 0a 2a 2a 20 20 20 20 20 61 74 74 65 6d 70  at.**     attemp
1800: 74 73 20 74 6f 20 65 6e 63 6f 64 65 20 61 20 76  ts to encode a v
1810: 61 6c 75 65 20 62 65 74 77 65 65 6e 20 30 78 30  alue between 0x0
1820: 30 20 61 6e 64 20 30 78 37 66 20 69 73 20 72 65  0 and 0x7f is re
1830: 6e 64 65 72 65 64 20 61 73 20 30 78 66 66 66 64  ndered as 0xfffd
1840: 2e 0a 2a 2a 0a 2a 2a 20 20 2a 20 20 54 68 69 73  ..**.**  *  This
1850: 20 72 6f 75 74 69 6e 65 20 6e 65 76 65 72 20 61   routine never a
1860: 6c 6c 6f 77 73 20 61 20 55 54 46 31 36 20 73 75  llows a UTF16 su
1870: 72 72 6f 67 61 74 65 20 76 61 6c 75 65 20 74 6f  rrogate value to
1880: 20 62 65 20 65 6e 63 6f 64 65 64 2e 0a 2a 2a 20   be encoded..** 
1890: 20 20 20 20 49 66 20 61 20 6d 75 6c 74 69 2d 62      If a multi-b
18a0: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 61 74  yte character at
18b0: 74 65 6d 70 74 73 20 74 6f 20 65 6e 63 6f 64 65  tempts to encode
18c0: 20 61 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e   a value between
18d0: 0a 2a 2a 20 20 20 20 20 30 78 64 38 30 30 20 61  .**     0xd800 a
18e0: 6e 64 20 30 78 65 30 30 30 20 74 68 65 6e 20 69  nd 0xe000 then i
18f0: 74 20 69 73 20 72 65 6e 64 65 72 65 64 20 61 73  t is rendered as
1900: 20 30 78 66 66 66 64 2e 0a 2a 2a 0a 2a 2a 20 20   0xfffd..**.**  
1910: 2a 20 20 42 79 74 65 73 20 69 6e 20 74 68 65 20  *  Bytes in the 
1920: 72 61 6e 67 65 20 6f 66 20 30 78 38 30 20 74 68  range of 0x80 th
1930: 72 6f 75 67 68 20 30 78 62 66 20 77 68 69 63 68  rough 0xbf which
1940: 20 6f 63 63 75 72 20 61 73 20 74 68 65 20 66 69   occur as the fi
1950: 72 73 74 0a 2a 2a 20 20 20 20 20 62 79 74 65 20  rst.**     byte 
1960: 6f 66 20 61 20 63 68 61 72 61 63 74 65 72 20 61  of a character a
1970: 72 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  re interpreted a
1980: 73 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 63 68  s single-byte ch
1990: 61 72 61 63 74 65 72 73 0a 2a 2a 20 20 20 20 20  aracters.**     
19a0: 61 6e 64 20 72 65 6e 64 65 72 65 64 20 61 73 20  and rendered as 
19b0: 74 68 65 6d 73 65 6c 76 65 73 20 65 76 65 6e 20  themselves even 
19c0: 74 68 6f 75 67 68 20 74 68 65 79 20 61 72 65 20  though they are 
19d0: 74 65 63 68 6e 69 63 61 6c 6c 79 0a 2a 2a 20 20  technically.**  
19e0: 20 20 20 69 6e 76 61 6c 69 64 20 63 68 61 72 61     invalid chara
19f0: 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 2a 20  cters..**.**  * 
1a00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
1a10: 63 65 70 74 73 20 61 6e 20 69 6e 66 69 6e 69 74  cepts an infinit
1a20: 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 69 66 66  e number of diff
1a30: 65 72 65 6e 74 20 55 54 46 38 20 65 6e 63 6f 64  erent UTF8 encod
1a40: 69 6e 67 73 0a 2a 2a 20 20 20 20 20 66 6f 72 20  ings.**     for 
1a50: 75 6e 69 63 6f 64 65 20 76 61 6c 75 65 73 20 30  unicode values 0
1a60: 78 38 30 20 61 6e 64 20 67 72 65 61 74 65 72 2e  x80 and greater.
1a70: 20 20 49 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e    It do not chan
1a80: 67 65 20 6f 76 65 72 2d 6c 65 6e 67 74 68 0a 2a  ge over-length.*
1a90: 2a 20 20 20 20 20 65 6e 63 6f 64 69 6e 67 73 20  *     encodings 
1aa0: 74 6f 20 30 78 66 66 66 64 20 61 73 20 73 6f 6d  to 0xfffd as som
1ab0: 65 20 73 79 73 74 65 6d 73 20 72 65 63 6f 6d 6d  e systems recomm
1ac0: 65 6e 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  end..*/.#define 
1ad0: 52 45 41 44 5f 55 54 46 38 28 7a 49 6e 2c 20 7a  READ_UTF8(zIn, z
1ae0: 54 65 72 6d 2c 20 63 29 20 20 20 20 20 20 20 20  Term, c)        
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 20 5c 0a 20 20 63 20 3d 20 2a 28 7a 49 6e     \.  c = *(zIn
1b10: 2b 2b 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ++);            
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: 5c 0a 20 20 69 66 28 20 63 3e 3d 30 78 63 30 20  \.  if( c>=0xc0 
1b50: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1b80: 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 74     c = sqlite3Ut
1b90: 66 54 72 61 6e 73 31 5b 63 2d 30 78 63 30 5d 3b  fTrans1[c-0xc0];
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
1bc0: 77 68 69 6c 65 28 20 7a 49 6e 21 3d 7a 54 65 72  while( zIn!=zTer
1bd0: 6d 20 26 26 20 28 2a 7a 49 6e 20 26 20 30 78 63  m && (*zIn & 0xc
1be0: 30 29 3d 3d 30 78 38 30 20 29 7b 20 20 20 20 20  0)==0x80 ){     
1bf0: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 63         \.      c
1c00: 20 3d 20 28 63 3c 3c 36 29 20 2b 20 28 30 78 33   = (c<<6) + (0x3
1c10: 66 20 26 20 2a 28 7a 49 6e 2b 2b 29 29 3b 20 20  f & *(zIn++));  
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c30: 20 20 20 20 5c 0a 20 20 20 20 7d 20 20 20 20 20      \.    }     
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 20 20 69 66 28 20 63 3c 30 78 38   \.    if( c<0x8
1c80: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1cb0: 20 20 20 20 20 20 20 20 7c 7c 20 28 63 26 30 78          || (c&0x
1cc0: 46 46 46 46 46 38 30 30 29 3d 3d 30 78 44 38 30  FFFFF800)==0xD80
1cd0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
1ce0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1cf0: 20 20 20 20 20 7c 7c 20 28 63 26 30 78 46 46 46       || (c&0xFFF
1d00: 46 46 46 46 45 29 3d 3d 30 78 46 46 46 45 20 29  FFFFE)==0xFFFE )
1d10: 7b 20 20 63 20 3d 20 30 78 46 46 46 44 3b 20 7d  {  c = 0xFFFD; }
1d20: 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 69 6e          \.  }.in
1d30: 74 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61  t sqlite3Utf8Rea
1d40: 64 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  d(.  const unsig
1d50: 6e 65 64 20 63 68 61 72 20 2a 7a 2c 20 20 20 20  ned char *z,    
1d60: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
1d70: 74 65 20 6f 66 20 55 54 46 2d 38 20 63 68 61 72  te of UTF-8 char
1d80: 61 63 74 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  acter */.  const
1d90: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1da0: 7a 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 50 72  zTerm,     /* Pr
1db0: 65 74 65 6e 64 20 74 68 69 73 20 62 79 74 65 20  etend this byte 
1dc0: 69 73 20 30 78 30 30 20 2a 2f 0a 20 20 63 6f 6e  is 0x00 */.  con
1dd0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1de0: 20 2a 2a 70 7a 4e 65 78 74 20 20 20 20 2f 2a 20   **pzNext    /* 
1df0: 57 72 69 74 65 20 66 69 72 73 74 20 62 79 74 65  Write first byte
1e00: 20 70 61 73 74 20 55 54 46 2d 38 20 63 68 61 72   past UTF-8 char
1e10: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
1e20: 74 20 63 3b 0a 20 20 52 45 41 44 5f 55 54 46 38  t c;.  READ_UTF8
1e30: 28 7a 2c 20 7a 54 65 72 6d 2c 20 63 29 3b 0a 20  (z, zTerm, c);. 
1e40: 20 2a 70 7a 4e 65 78 74 20 3d 20 7a 3b 0a 20 20   *pzNext = z;.  
1e50: 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 0a 0a 0a  return c;.}.....
1e60: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 54 52 41  /*.** If the TRA
1e70: 4e 53 4c 41 54 45 5f 54 52 41 43 45 20 6d 61 63  NSLATE_TRACE mac
1e80: 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  ro is defined, t
1e90: 68 65 20 76 61 6c 75 65 20 6f 66 20 65 61 63 68  he value of each
1ea0: 20 4d 65 6d 20 69 73 0a 2a 2a 20 70 72 69 6e 74   Mem is.** print
1eb0: 65 64 20 6f 6e 20 73 74 64 65 72 72 20 6f 6e 20  ed on stderr on 
1ec0: 74 68 65 20 77 61 79 20 69 6e 74 6f 20 61 6e 64  the way into and
1ed0: 20 6f 75 74 20 6f 66 20 73 71 6c 69 74 65 33 56   out of sqlite3V
1ee0: 64 62 65 4d 65 6d 54 72 61 6e 73 6c 61 74 65 28  dbeMemTranslate(
1ef0: 29 2e 0a 2a 2f 20 0a 2f 2a 20 23 64 65 66 69 6e  )..*/ ./* #defin
1f00: 65 20 54 52 41 4e 53 4c 41 54 45 5f 54 52 41 43  e TRANSLATE_TRAC
1f10: 45 20 31 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  E 1 */..#ifndef 
1f20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1f30: 36 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  6./*.** This rou
1f40: 74 69 6e 65 20 74 72 61 6e 73 66 6f 72 6d 73 20  tine transforms 
1f50: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 74 65 78  the internal tex
1f60: 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20  t encoding used 
1f70: 62 79 20 70 4d 65 6d 20 74 6f 0a 2a 2a 20 64 65  by pMem to.** de
1f80: 73 69 72 65 64 45 6e 63 2e 20 49 74 20 69 73 20  siredEnc. It is 
1f90: 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
1fa0: 73 74 72 69 6e 67 20 69 73 20 61 6c 72 65 61 64  string is alread
1fb0: 79 20 6f 66 20 74 68 65 20 64 65 73 69 72 65 64  y of the desired
1fc0: 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 2c 20 6f 72  .** encoding, or
1fd0: 20 69 66 20 2a 70 4d 65 6d 20 64 6f 65 73 20 6e   if *pMem does n
1fe0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 73 74 72  ot contain a str
1ff0: 69 6e 67 20 76 61 6c 75 65 2e 0a 2a 2f 0a 69 6e  ing value..*/.in
2000: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  t sqlite3VdbeMem
2010: 54 72 61 6e 73 6c 61 74 65 28 4d 65 6d 20 2a 70  Translate(Mem *p
2020: 4d 65 6d 2c 20 75 38 20 64 65 73 69 72 65 64 45  Mem, u8 desiredE
2030: 6e 63 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20  nc){.  int len; 
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 65     /* Maximum le
2060: 6e 67 74 68 20 6f 66 20 6f 75 74 70 75 74 20 73  ngth of output s
2070: 74 72 69 6e 67 20 69 6e 20 62 79 74 65 73 20 2a  tring in bytes *
2080: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
2090: 72 20 2a 7a 4f 75 74 3b 20 20 20 20 20 20 20 20  r *zOut;        
20a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
20b0: 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  put buffer */.  
20c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
20d0: 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  In;             
20e0: 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 69        /* Input i
20f0: 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 6e 73  terator */.  uns
2100: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 54 65 72  igned char *zTer
2110: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
2120: 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 69 6e 70     /* End of inp
2130: 75 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ut */.  unsigned
2140: 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2160: 20 4f 75 74 70 75 74 20 69 74 65 72 61 74 6f 72   Output iterator
2170: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   */.  unsigned i
2180: 6e 74 20 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt c;..  assert(
2190: 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20   pMem->db==0 || 
21a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
21b0: 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74  ld(pMem->db->mut
21c0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
21d0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d   pMem->flags&MEM
21e0: 5f 53 74 72 20 29 3b 0a 20 20 61 73 73 65 72 74  _Str );.  assert
21f0: 28 20 70 4d 65 6d 2d 3e 65 6e 63 21 3d 64 65 73  ( pMem->enc!=des
2200: 69 72 65 64 45 6e 63 20 29 3b 0a 20 20 61 73 73  iredEnc );.  ass
2210: 65 72 74 28 20 70 4d 65 6d 2d 3e 65 6e 63 21 3d  ert( pMem->enc!=
2220: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2230: 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 0a 23 69  Mem->n>=0 );..#i
2240: 66 20 64 65 66 69 6e 65 64 28 54 52 41 4e 53 4c  f defined(TRANSL
2250: 41 54 45 5f 54 52 41 43 45 29 20 26 26 20 64 65  ATE_TRACE) && de
2260: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
2270: 55 47 29 0a 20 20 7b 0a 20 20 20 20 63 68 61 72  UG).  {.    char
2280: 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20   zBuf[100];.    
2290: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 50 72  sqlite3VdbeMemPr
22a0: 65 74 74 79 50 72 69 6e 74 28 70 4d 65 6d 2c 20  ettyPrint(pMem, 
22b0: 7a 42 75 66 29 3b 0a 20 20 20 20 66 70 72 69 6e  zBuf);.    fprin
22c0: 74 66 28 73 74 64 65 72 72 2c 20 22 49 4e 50 55  tf(stderr, "INPU
22d0: 54 3a 20 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29  T:  %s\n", zBuf)
22e0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
22f0: 2f 2a 20 49 66 20 74 68 65 20 74 72 61 6e 73 6c  /* If the transl
2300: 61 74 69 6f 6e 20 69 73 20 62 65 74 77 65 65 6e  ation is between
2310: 20 55 54 46 2d 31 36 20 6c 69 74 74 6c 65 20 61   UTF-16 little a
2320: 6e 64 20 62 69 67 20 65 6e 64 69 61 6e 2c 20 74  nd big endian, t
2330: 68 65 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 74 68  hen .  ** all th
2340: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
2350: 73 20 74 6f 20 73 77 61 70 20 74 68 65 20 62 79  s to swap the by
2360: 74 65 20 6f 72 64 65 72 2e 20 54 68 69 73 20 63  te order. This c
2370: 61 73 65 20 69 73 20 68 61 6e 64 6c 65 64 0a 20  ase is handled. 
2380: 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 6c 79 20   ** differently 
2390: 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 2e  from the others.
23a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 65 6d  .  */.  if( pMem
23b0: 2d 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54  ->enc!=SQLITE_UT
23c0: 46 38 20 26 26 20 64 65 73 69 72 65 64 45 6e 63  F8 && desiredEnc
23d0: 21 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b  !=SQLITE_UTF8 ){
23e0: 0a 20 20 20 20 75 38 20 74 65 6d 70 3b 0a 20 20  .    u8 temp;.  
23f0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63    int rc;.    rc
2400: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
2410: 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c 65 28 70  mMakeWriteable(p
2420: 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Mem);.    if( rc
2430: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2440: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
2450: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
2460: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2470: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2480: 7d 0a 20 20 20 20 7a 49 6e 20 3d 20 28 75 38 2a  }.    zIn = (u8*
2490: 29 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 7a 54  )pMem->z;.    zT
24a0: 65 72 6d 20 3d 20 26 7a 49 6e 5b 70 4d 65 6d 2d  erm = &zIn[pMem-
24b0: 3e 6e 26 7e 31 5d 3b 0a 20 20 20 20 77 68 69 6c  >n&~1];.    whil
24c0: 65 28 20 7a 49 6e 3c 7a 54 65 72 6d 20 29 7b 0a  e( zIn<zTerm ){.
24d0: 20 20 20 20 20 20 74 65 6d 70 20 3d 20 2a 7a 49        temp = *zI
24e0: 6e 3b 0a 20 20 20 20 20 20 2a 7a 49 6e 20 3d 20  n;.      *zIn = 
24f0: 2a 28 7a 49 6e 2b 31 29 3b 0a 20 20 20 20 20 20  *(zIn+1);.      
2500: 7a 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 2a 7a 49  zIn++;.      *zI
2510: 6e 2b 2b 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20  n++ = temp;.    
2520: 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20  }.    pMem->enc 
2530: 3d 20 64 65 73 69 72 65 64 45 6e 63 3b 0a 20 20  = desiredEnc;.  
2540: 20 20 67 6f 74 6f 20 74 72 61 6e 73 6c 61 74 65    goto translate
2550: 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
2560: 53 65 74 20 6c 65 6e 20 74 6f 20 74 68 65 20 6d  Set len to the m
2570: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
2580: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
2590: 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  in the output bu
25a0: 66 66 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 64  ffer. */.  if( d
25b0: 65 73 69 72 65 64 45 6e 63 3d 3d 53 51 4c 49 54  esiredEnc==SQLIT
25c0: 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 2f 2a  E_UTF8 ){.    /*
25d0: 20 57 68 65 6e 20 63 6f 6e 76 65 72 74 69 6e 67   When converting
25e0: 20 66 72 6f 6d 20 55 54 46 2d 31 36 2c 20 74 68   from UTF-16, th
25f0: 65 20 6d 61 78 69 6d 75 6d 20 67 72 6f 77 74 68  e maximum growth
2600: 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 0a 20 20   results from.  
2610: 20 20 2a 2a 20 74 72 61 6e 73 6c 61 74 69 6e 67    ** translating
2620: 20 61 20 32 2d 62 79 74 65 20 63 68 61 72 61 63   a 2-byte charac
2630: 74 65 72 20 74 6f 20 61 20 34 2d 62 79 74 65 20  ter to a 4-byte 
2640: 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 2e  UTF-8 character.
2650: 0a 20 20 20 20 2a 2a 20 41 20 73 69 6e 67 6c 65  .    ** A single
2660: 20 62 79 74 65 20 69 73 20 72 65 71 75 69 72 65   byte is require
2670: 64 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  d for the output
2680: 20 73 74 72 69 6e 67 0a 20 20 20 20 2a 2a 20 6e   string.    ** n
2690: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 20  ul-terminator.. 
26a0: 20 20 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e     */.    pMem->
26b0: 6e 20 26 3d 20 7e 31 3b 0a 20 20 20 20 6c 65 6e  n &= ~1;.    len
26c0: 20 3d 20 70 4d 65 6d 2d 3e 6e 20 2a 20 32 20 2b   = pMem->n * 2 +
26d0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
26e0: 20 2f 2a 20 57 68 65 6e 20 63 6f 6e 76 65 72 74   /* When convert
26f0: 69 6e 67 20 66 72 6f 6d 20 55 54 46 2d 38 20 74  ing from UTF-8 t
2700: 6f 20 55 54 46 2d 31 36 20 74 68 65 20 6d 61 78  o UTF-16 the max
2710: 69 6d 75 6d 20 67 72 6f 77 74 68 20 69 73 20 63  imum growth is c
2720: 61 75 73 65 64 0a 20 20 20 20 2a 2a 20 77 68 65  aused.    ** whe
2730: 6e 20 61 20 31 2d 62 79 74 65 20 55 54 46 2d 38  n a 1-byte UTF-8
2740: 20 63 68 61 72 61 63 74 65 72 20 69 73 20 74 72   character is tr
2750: 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20  anslated into a 
2760: 32 2d 62 79 74 65 20 55 54 46 2d 31 36 0a 20 20  2-byte UTF-16.  
2770: 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2e 20    ** character. 
2780: 54 77 6f 20 62 79 74 65 73 20 61 72 65 20 72 65  Two bytes are re
2790: 71 75 69 72 65 64 20 69 6e 20 74 68 65 20 6f 75  quired in the ou
27a0: 74 70 75 74 20 62 75 66 66 65 72 20 66 6f 72 20  tput buffer for 
27b0: 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6c 2d 74  the.    ** nul-t
27c0: 65 72 6d 69 6e 61 74 6f 72 2e 0a 20 20 20 20 2a  erminator..    *
27d0: 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d  /.    len = pMem
27e0: 2d 3e 6e 20 2a 20 32 20 2b 20 32 3b 0a 20 20 7d  ->n * 2 + 2;.  }
27f0: 0a 0a 20 20 2f 2a 20 53 65 74 20 7a 49 6e 20 74  ..  /* Set zIn t
2800: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 73  o point at the s
2810: 74 61 72 74 20 6f 66 20 74 68 65 20 69 6e 70 75  tart of the inpu
2820: 74 20 62 75 66 66 65 72 20 61 6e 64 20 7a 54 65  t buffer and zTe
2830: 72 6d 20 74 6f 20 70 6f 69 6e 74 20 31 0a 20 20  rm to point 1.  
2840: 2a 2a 20 62 79 74 65 20 70 61 73 74 20 74 68 65  ** byte past the
2850: 20 65 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   end..  **.  ** 
2860: 56 61 72 69 61 62 6c 65 20 7a 4f 75 74 20 69 73  Variable zOut is
2870: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 61 74   set to point at
2880: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
2890: 65 72 2c 20 73 70 61 63 65 20 6f 62 74 61 69 6e  er, space obtain
28a0: 65 64 0a 20 20 2a 2a 20 66 72 6f 6d 20 73 71 6c  ed.  ** from sql
28b0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 20  ite3_malloc().. 
28c0: 20 2a 2f 0a 20 20 7a 49 6e 20 3d 20 28 75 38 2a   */.  zIn = (u8*
28d0: 29 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 7a 54 65 72  )pMem->z;.  zTer
28e0: 6d 20 3d 20 26 7a 49 6e 5b 70 4d 65 6d 2d 3e 6e  m = &zIn[pMem->n
28f0: 5d 3b 0a 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69  ];.  zOut = sqli
2900: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70  te3DbMallocRaw(p
2910: 4d 65 6d 2d 3e 64 62 2c 20 6c 65 6e 29 3b 0a 20  Mem->db, len);. 
2920: 20 69 66 28 20 21 7a 4f 75 74 20 29 7b 0a 20 20   if( !zOut ){.  
2930: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2940: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 7a 20 3d  NOMEM;.  }.  z =
2950: 20 7a 4f 75 74 3b 0a 0a 20 20 69 66 28 20 70 4d   zOut;..  if( pM
2960: 65 6d 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  em->enc==SQLITE_
2970: 55 54 46 38 20 29 7b 0a 20 20 20 20 69 66 28 20  UTF8 ){.    if( 
2980: 64 65 73 69 72 65 64 45 6e 63 3d 3d 53 51 4c 49  desiredEnc==SQLI
2990: 54 45 5f 55 54 46 31 36 4c 45 20 29 7b 0a 20 20  TE_UTF16LE ){.  
29a0: 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 2d 3e 20      /* UTF-8 -> 
29b0: 55 54 46 2d 31 36 20 4c 69 74 74 6c 65 2d 65 6e  UTF-16 Little-en
29c0: 64 69 61 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68  dian */.      wh
29d0: 69 6c 65 28 20 7a 49 6e 3c 7a 54 65 72 6d 20 29  ile( zIn<zTerm )
29e0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 20 3d  {.        /* c =
29f0: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
2a00: 28 7a 49 6e 2c 20 7a 54 65 72 6d 2c 20 28 63 6f  (zIn, zTerm, (co
2a10: 6e 73 74 20 75 38 2a 2a 29 26 7a 49 6e 29 3b 20  nst u8**)&zIn); 
2a20: 2a 2f 0a 20 20 20 20 20 20 20 20 52 45 41 44 5f  */.        READ_
2a30: 55 54 46 38 28 7a 49 6e 2c 20 7a 54 65 72 6d 2c  UTF8(zIn, zTerm,
2a40: 20 63 29 3b 0a 20 20 20 20 20 20 20 20 57 52 49   c);.        WRI
2a50: 54 45 5f 55 54 46 31 36 4c 45 28 7a 2c 20 63 29  TE_UTF16LE(z, c)
2a60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2a70: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
2a80: 74 28 20 64 65 73 69 72 65 64 45 6e 63 3d 3d 53  t( desiredEnc==S
2a90: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b  QLITE_UTF16BE );
2aa0: 0a 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 38 20  .      /* UTF-8 
2ab0: 2d 3e 20 55 54 46 2d 31 36 20 42 69 67 2d 65 6e  -> UTF-16 Big-en
2ac0: 64 69 61 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68  dian */.      wh
2ad0: 69 6c 65 28 20 7a 49 6e 3c 7a 54 65 72 6d 20 29  ile( zIn<zTerm )
2ae0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 20 3d  {.        /* c =
2af0: 20 73 71 6c 69 74 65 33 55 74 66 38 52 65 61 64   sqlite3Utf8Read
2b00: 28 7a 49 6e 2c 20 7a 54 65 72 6d 2c 20 28 63 6f  (zIn, zTerm, (co
2b10: 6e 73 74 20 75 38 2a 2a 29 26 7a 49 6e 29 3b 20  nst u8**)&zIn); 
2b20: 2a 2f 0a 20 20 20 20 20 20 20 20 52 45 41 44 5f  */.        READ_
2b30: 55 54 46 38 28 7a 49 6e 2c 20 7a 54 65 72 6d 2c  UTF8(zIn, zTerm,
2b40: 20 63 29 3b 0a 20 20 20 20 20 20 20 20 57 52 49   c);.        WRI
2b50: 54 45 5f 55 54 46 31 36 42 45 28 7a 2c 20 63 29  TE_UTF16BE(z, c)
2b60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2b70: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 7a 20      pMem->n = z 
2b80: 2d 20 7a 4f 75 74 3b 0a 20 20 20 20 2a 7a 2b 2b  - zOut;.    *z++
2b90: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
2ba0: 20 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72     assert( desir
2bb0: 65 64 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  edEnc==SQLITE_UT
2bc0: 46 38 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  F8 );.    if( pM
2bd0: 65 6d 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  em->enc==SQLITE_
2be0: 55 54 46 31 36 4c 45 20 29 7b 0a 20 20 20 20 20  UTF16LE ){.     
2bf0: 20 2f 2a 20 55 54 46 2d 31 36 20 4c 69 74 74 6c   /* UTF-16 Littl
2c00: 65 2d 65 6e 64 69 61 6e 20 2d 3e 20 55 54 46 2d  e-endian -> UTF-
2c10: 38 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65  8 */.      while
2c20: 28 20 7a 49 6e 3c 7a 54 65 72 6d 20 29 7b 0a 20  ( zIn<zTerm ){. 
2c30: 20 20 20 20 20 20 20 52 45 41 44 5f 55 54 46 31         READ_UTF1
2c40: 36 4c 45 28 7a 49 6e 2c 20 63 29 3b 20 0a 20 20  6LE(zIn, c); .  
2c50: 20 20 20 20 20 20 57 52 49 54 45 5f 55 54 46 38        WRITE_UTF8
2c60: 28 7a 2c 20 63 29 3b 0a 20 20 20 20 20 20 7d 0a  (z, c);.      }.
2c70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c80: 20 2f 2a 20 55 54 46 2d 31 36 20 42 69 67 2d 65   /* UTF-16 Big-e
2c90: 6e 64 69 61 6e 20 2d 3e 20 55 54 46 2d 38 20 2a  ndian -> UTF-8 *
2ca0: 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  /.      while( z
2cb0: 49 6e 3c 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20  In<zTerm ){.    
2cc0: 20 20 20 20 52 45 41 44 5f 55 54 46 31 36 42 45      READ_UTF16BE
2cd0: 28 7a 49 6e 2c 20 63 29 3b 20 0a 20 20 20 20 20  (zIn, c); .     
2ce0: 20 20 20 57 52 49 54 45 5f 55 54 46 38 28 7a 2c     WRITE_UTF8(z,
2cf0: 20 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   c);.      }.   
2d00: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d   }.    pMem->n =
2d10: 20 7a 20 2d 20 7a 4f 75 74 3b 0a 20 20 7d 0a 20   z - zOut;.  }. 
2d20: 20 2a 7a 20 3d 20 30 3b 0a 20 20 61 73 73 65 72   *z = 0;.  asser
2d30: 74 28 20 28 70 4d 65 6d 2d 3e 6e 2b 28 64 65 73  t( (pMem->n+(des
2d40: 69 72 65 64 45 6e 63 3d 3d 53 51 4c 49 54 45 5f  iredEnc==SQLITE_
2d50: 55 54 46 38 3f 31 3a 32 29 29 3c 3d 6c 65 6e 20  UTF8?1:2))<=len 
2d60: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62  );..  sqlite3Vdb
2d70: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d  eMemRelease(pMem
2d80: 29 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  );.  pMem->flags
2d90: 20 26 3d 20 7e 28 4d 45 4d 5f 53 74 61 74 69 63   &= ~(MEM_Static
2da0: 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68  |MEM_Dyn|MEM_Eph
2db0: 65 6d 29 3b 0a 20 20 70 4d 65 6d 2d 3e 65 6e 63  em);.  pMem->enc
2dc0: 20 3d 20 64 65 73 69 72 65 64 45 6e 63 3b 0a 20   = desiredEnc;. 
2dd0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20   pMem->flags |= 
2de0: 28 4d 45 4d 5f 54 65 72 6d 7c 4d 45 4d 5f 44 79  (MEM_Term|MEM_Dy
2df0: 6e 29 3b 0a 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20  n);.  pMem->z = 
2e00: 28 63 68 61 72 2a 29 7a 4f 75 74 3b 0a 20 20 70  (char*)zOut;.  p
2e10: 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 70  Mem->zMalloc = p
2e20: 4d 65 6d 2d 3e 7a 3b 0a 0a 74 72 61 6e 73 6c 61  Mem->z;..transla
2e30: 74 65 5f 6f 75 74 3a 0a 23 69 66 20 64 65 66 69  te_out:.#if defi
2e40: 6e 65 64 28 54 52 41 4e 53 4c 41 54 45 5f 54 52  ned(TRANSLATE_TR
2e50: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
2e60: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 20 20  SQLITE_DEBUG).  
2e70: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
2e80: 31 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  100];.    sqlite
2e90: 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79 50 72  3VdbeMemPrettyPr
2ea0: 69 6e 74 28 70 4d 65 6d 2c 20 7a 42 75 66 29 3b  int(pMem, zBuf);
2eb0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
2ec0: 65 72 72 2c 20 22 4f 55 54 50 55 54 3a 20 25 73  err, "OUTPUT: %s
2ed0: 5c 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a  \n", zBuf);.  }.
2ee0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
2ef0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2f00: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2f10: 20 63 68 65 63 6b 73 20 66 6f 72 20 61 20 62 79   checks for a by
2f20: 74 65 2d 6f 72 64 65 72 20 6d 61 72 6b 20 61 74  te-order mark at
2f30: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
2f40: 66 20 74 68 65 20 0a 2a 2a 20 55 54 46 2d 31 36  f the .** UTF-16
2f50: 20 73 74 72 69 6e 67 20 73 74 6f 72 65 64 20 69   string stored i
2f60: 6e 20 2a 70 4d 65 6d 2e 20 49 66 20 6f 6e 65 20  n *pMem. If one 
2f70: 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74 20 69  is present, it i
2f80: 73 20 72 65 6d 6f 76 65 64 20 61 6e 64 0a 2a 2a  s removed and.**
2f90: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66   the encoding of
2fa0: 20 74 68 65 20 4d 65 6d 20 61 64 6a 75 73 74 65   the Mem adjuste
2fb0: 64 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  d. This routine 
2fc0: 64 6f 65 73 20 6e 6f 74 20 64 6f 20 61 6e 79 0a  does not do any.
2fd0: 2a 2a 20 62 79 74 65 2d 73 77 61 70 70 69 6e 67  ** byte-swapping
2fe0: 2c 20 69 74 20 6a 75 73 74 20 73 65 74 73 20 4d  , it just sets M
2ff0: 65 6d 2e 65 6e 63 20 61 70 70 72 6f 70 72 69 61  em.enc appropria
3000: 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
3010: 61 6c 6c 6f 63 61 74 69 6f 6e 20 28 73 74 61 74  allocation (stat
3020: 69 63 2c 20 64 79 6e 61 6d 69 63 20 65 74 63 2e  ic, dynamic etc.
3030: 29 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 6f  ) and encoding o
3040: 66 20 74 68 65 20 4d 65 6d 20 6d 61 79 20 62 65  f the Mem may be
3050: 0a 2a 2a 20 63 68 61 6e 67 65 64 20 62 79 20 74  .** changed by t
3060: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
3070: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
3080: 4d 65 6d 48 61 6e 64 6c 65 42 6f 6d 28 4d 65 6d  MemHandleBom(Mem
3090: 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 6e 74 20 72   *pMem){.  int r
30a0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
30b0: 20 75 38 20 62 6f 6d 20 3d 20 30 3b 0a 0a 20 20   u8 bom = 0;..  
30c0: 69 66 28 20 70 4d 65 6d 2d 3e 6e 3c 30 20 7c 7c  if( pMem->n<0 ||
30d0: 20 70 4d 65 6d 2d 3e 6e 3e 31 20 29 7b 0a 20 20   pMem->n>1 ){.  
30e0: 20 20 75 38 20 62 31 20 3d 20 2a 28 75 38 20 2a    u8 b1 = *(u8 *
30f0: 29 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 75 38  )pMem->z;.    u8
3100: 20 62 32 20 3d 20 2a 28 28 28 75 38 20 2a 29 70   b2 = *(((u8 *)p
3110: 4d 65 6d 2d 3e 7a 29 20 2b 20 31 29 3b 0a 20 20  Mem->z) + 1);.  
3120: 20 20 69 66 28 20 62 31 3d 3d 30 78 46 45 20 26    if( b1==0xFE &
3130: 26 20 62 32 3d 3d 30 78 46 46 20 29 7b 0a 20 20  & b2==0xFF ){.  
3140: 20 20 20 20 62 6f 6d 20 3d 20 53 51 4c 49 54 45      bom = SQLITE
3150: 5f 55 54 46 31 36 42 45 3b 0a 20 20 20 20 7d 0a  _UTF16BE;.    }.
3160: 20 20 20 20 69 66 28 20 62 31 3d 3d 30 78 46 46      if( b1==0xFF
3170: 20 26 26 20 62 32 3d 3d 30 78 46 45 20 29 7b 0a   && b2==0xFE ){.
3180: 20 20 20 20 20 20 62 6f 6d 20 3d 20 53 51 4c 49        bom = SQLI
3190: 54 45 5f 55 54 46 31 36 4c 45 3b 0a 20 20 20 20  TE_UTF16LE;.    
31a0: 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 62  }.  }.  .  if( b
31b0: 6f 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  om ){.    rc = s
31c0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 61 6b  qlite3VdbeMemMak
31d0: 65 57 72 69 74 65 61 62 6c 65 28 70 4d 65 6d 29  eWriteable(pMem)
31e0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
31f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
3200: 20 70 4d 65 6d 2d 3e 6e 20 2d 3d 20 32 3b 0a 20   pMem->n -= 2;. 
3210: 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4d 65       memmove(pMe
3220: 6d 2d 3e 7a 2c 20 26 70 4d 65 6d 2d 3e 7a 5b 32  m->z, &pMem->z[2
3230: 5d 2c 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20  ], pMem->n);.   
3240: 20 20 20 70 4d 65 6d 2d 3e 7a 5b 70 4d 65 6d 2d     pMem->z[pMem-
3250: 3e 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  >n] = '\0';.    
3260: 20 20 70 4d 65 6d 2d 3e 7a 5b 70 4d 65 6d 2d 3e    pMem->z[pMem->
3270: 6e 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  n+1] = '\0';.   
3280: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 7c     pMem->flags |
3290: 3d 20 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  = MEM_Term;.    
32a0: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 62 6f    pMem->enc = bo
32b0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  m;.    }.  }.  r
32c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
32d0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
32e0: 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
32f0: 2a 20 70 5a 20 69 73 20 61 20 55 54 46 2d 38 20  * pZ is a UTF-8 
3300: 65 6e 63 6f 64 65 64 20 75 6e 69 63 6f 64 65 20  encoded unicode 
3310: 73 74 72 69 6e 67 2e 20 49 66 20 6e 42 79 74 65  string. If nByte
3320: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
3330: 72 6f 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68  ro,.** return th
3340: 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 63  e number of unic
3350: 6f 64 65 20 63 68 61 72 61 63 74 65 72 73 20 69  ode characters i
3360: 6e 20 70 5a 20 75 70 20 74 6f 20 28 62 75 74 20  n pZ up to (but 
3370: 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 29 0a 2a  not including).*
3380: 2a 20 74 68 65 20 66 69 72 73 74 20 30 78 30 30  * the first 0x00
3390: 20 62 79 74 65 2e 20 49 66 20 6e 42 79 74 65 20   byte. If nByte 
33a0: 69 73 20 6e 6f 74 20 6c 65 73 73 20 74 68 61 6e  is not less than
33b0: 20 7a 65 72 6f 2c 20 72 65 74 75 72 6e 20 74 68   zero, return th
33c0: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 75  e.** number of u
33d0: 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72  nicode character
33e0: 73 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e  s in the first n
33f0: 42 79 74 65 20 6f 66 20 70 5a 20 28 6f 72 20 75  Byte of pZ (or u
3400: 70 20 74 6f 20 0a 2a 2a 20 74 68 65 20 66 69 72  p to .** the fir
3410: 73 74 20 30 78 30 30 2c 20 77 68 69 63 68 65 76  st 0x00, whichev
3420: 65 72 20 63 6f 6d 65 73 20 66 69 72 73 74 29 2e  er comes first).
3430: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55  .*/.int sqlite3U
3440: 74 66 38 43 68 61 72 4c 65 6e 28 63 6f 6e 73 74  tf8CharLen(const
3450: 20 63 68 61 72 20 2a 7a 49 6e 2c 20 69 6e 74 20   char *zIn, int 
3460: 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 72 20  nByte){.  int r 
3470: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  = 0;.  const u8 
3480: 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29  *z = (const u8*)
3490: 7a 49 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  zIn;.  const u8 
34a0: 2a 7a 54 65 72 6d 3b 0a 20 20 69 66 28 20 6e 42  *zTerm;.  if( nB
34b0: 79 74 65 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 54  yte>=0 ){.    zT
34c0: 65 72 6d 20 3d 20 26 7a 5b 6e 42 79 74 65 5d 3b  erm = &z[nByte];
34d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54  .  }else{.    zT
34e0: 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a  erm = (const u8*
34f0: 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 61 73 73  )(-1);.  }.  ass
3500: 65 72 74 28 20 7a 3c 3d 7a 54 65 72 6d 20 29 3b  ert( z<=zTerm );
3510: 0a 20 20 77 68 69 6c 65 28 20 2a 7a 21 3d 30 20  .  while( *z!=0 
3520: 26 26 20 7a 3c 7a 54 65 72 6d 20 29 7b 0a 20 20  && z<zTerm ){.  
3530: 20 20 53 51 4c 49 54 45 5f 53 4b 49 50 5f 55 54    SQLITE_SKIP_UT
3540: 46 38 28 7a 29 3b 0a 20 20 20 20 72 2b 2b 3b 0a  F8(z);.    r++;.
3550: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
3560: 7d 0a 0a 2f 2a 20 54 68 69 73 20 74 65 73 74 20  }../* This test 
3570: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20  function is not 
3580: 63 75 72 72 65 6e 74 6c 79 20 75 73 65 64 20 62  currently used b
3590: 79 20 74 68 65 20 61 75 74 6f 6d 61 74 65 64 20  y the automated 
35a0: 74 65 73 74 2d 73 75 69 74 65 2e 20 0a 2a 2a 20  test-suite. .** 
35b0: 48 65 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c 79  Hence it is only
35c0: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 64 65   available in de
35d0: 62 75 67 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23  bug builds..*/.#
35e0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
35f0: 45 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e  E_TEST) && defin
3600: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
3610: 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65  ./*.** Translate
3620: 20 55 54 46 2d 38 20 74 6f 20 55 54 46 2d 38 2e   UTF-8 to UTF-8.
3630: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 68 61 73 20  .**.** This has 
3640: 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 6d 61  the effect of ma
3650: 6b 69 6e 67 20 73 75 72 65 20 74 68 61 74 20 74  king sure that t
3660: 68 65 20 73 74 72 69 6e 67 20 69 73 20 77 65 6c  he string is wel
3670: 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 55 54 46 2d  l-formed.** UTF-
3680: 38 2e 20 20 4d 69 73 63 6f 64 65 64 20 63 68 61  8.  Miscoded cha
3690: 72 61 63 74 65 72 73 20 61 72 65 20 72 65 6d 6f  racters are remo
36a0: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ved..**.** The t
36b0: 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 64 6f  ranslation is do
36c0: 6e 65 20 69 6e 2d 70 6c 61 63 65 20 28 73 69 6e  ne in-place (sin
36d0: 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69  ce it is impossi
36e0: 62 6c 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63  ble for the.** c
36f0: 6f 72 72 65 63 74 20 55 54 46 2d 38 20 65 6e 63  orrect UTF-8 enc
3700: 6f 64 69 6e 67 20 74 6f 20 62 65 20 6c 6f 6e 67  oding to be long
3710: 65 72 20 74 68 61 6e 20 61 20 6d 61 6c 66 6f 72  er than a malfor
3720: 6d 65 64 20 65 6e 63 6f 64 69 6e 67 29 2e 0a 2a  med encoding)..*
3730: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 74 66  /.int sqlite3Utf
3740: 38 54 6f 38 28 75 6e 73 69 67 6e 65 64 20 63 68  8To8(unsigned ch
3750: 61 72 20 2a 7a 49 6e 29 7b 0a 20 20 75 6e 73 69  ar *zIn){.  unsi
3760: 67 6e 65 64 20 63 68 61 72 20 2a 7a 4f 75 74 20  gned char *zOut 
3770: 3d 20 7a 49 6e 3b 0a 20 20 75 6e 73 69 67 6e 65  = zIn;.  unsigne
3780: 64 20 63 68 61 72 20 2a 7a 53 74 61 72 74 20 3d  d char *zStart =
3790: 20 7a 49 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64   zIn;.  unsigned
37a0: 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 26   char *zTerm = &
37b0: 7a 49 6e 5b 73 74 72 6c 65 6e 28 28 63 68 61 72  zIn[strlen((char
37c0: 20 2a 29 7a 49 6e 29 5d 3b 0a 20 20 75 33 32 20   *)zIn)];.  u32 
37d0: 63 3b 0a 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e  c;..  while( zIn
37e0: 5b 30 5d 20 29 7b 0a 20 20 20 20 63 20 3d 20 73  [0] ){.    c = s
37f0: 71 6c 69 74 65 33 55 74 66 38 52 65 61 64 28 7a  qlite3Utf8Read(z
3800: 49 6e 2c 20 7a 54 65 72 6d 2c 20 28 63 6f 6e 73  In, zTerm, (cons
3810: 74 20 75 38 2a 2a 29 26 7a 49 6e 29 3b 0a 20 20  t u8**)&zIn);.  
3820: 20 20 69 66 28 20 63 21 3d 30 78 66 66 66 64 20    if( c!=0xfffd 
3830: 29 7b 0a 20 20 20 20 20 20 57 52 49 54 45 5f 55  ){.      WRITE_U
3840: 54 46 38 28 7a 4f 75 74 2c 20 63 29 3b 0a 20 20  TF8(zOut, c);.  
3850: 20 20 7d 0a 20 20 7d 0a 20 20 2a 7a 4f 75 74 20    }.  }.  *zOut 
3860: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4f  = 0;.  return zO
3870: 75 74 20 2d 20 7a 53 74 61 72 74 3b 0a 7d 0a 23  ut - zStart;.}.#
3880: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
3890: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
38a0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
38b0: 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67 20 69   UTF-16 string i
38c0: 6e 20 74 68 65 20 6e 61 74 69 76 65 20 65 6e 63  n the native enc
38d0: 6f 64 69 6e 67 20 69 6e 74 6f 20 61 20 55 54 46  oding into a UTF
38e0: 2d 38 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 4d 65  -8 string..** Me
38f0: 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  mory to hold the
3900: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 69 73   UTF-8 string is
3910: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
3920: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 20 61 6e  qlite3_malloc an
3930: 64 20 6d 75 73 74 0a 2a 2a 20 62 65 20 66 72 65  d must.** be fre
3940: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
3950: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  g function..**.*
3960: 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  * NULL is return
3970: 65 64 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ed if there is a
3980: 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  n allocation err
3990: 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  or..*/.char *sql
39a0: 69 74 65 33 55 74 66 31 36 74 6f 38 28 73 71 6c  ite3Utf16to8(sql
39b0: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
39c0: 76 6f 69 64 20 2a 7a 2c 20 69 6e 74 20 6e 42 79  void *z, int nBy
39d0: 74 65 29 7b 0a 20 20 4d 65 6d 20 6d 3b 0a 20 20  te){.  Mem m;.  
39e0: 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69  memset(&m, 0, si
39f0: 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 6d 2e 64 62  zeof(m));.  m.db
3a00: 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74 65 33   = db;.  sqlite3
3a10: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 26 6d  VdbeMemSetStr(&m
3a20: 2c 20 7a 2c 20 6e 42 79 74 65 2c 20 53 51 4c 49  , z, nByte, SQLI
3a30: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20  TE_UTF16NATIVE, 
3a40: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
3a50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
3a60: 6e 67 65 45 6e 63 6f 64 69 6e 67 28 26 6d 2c 20  ngeEncoding(&m, 
3a70: 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
3a80: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
3a90: 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
3aa0: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
3ab0: 65 28 26 6d 29 3b 0a 20 20 20 20 6d 2e 7a 20 3d  e(&m);.    m.z =
3ac0: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
3ad0: 28 20 28 6d 2e 66 6c 61 67 73 20 26 20 4d 45 4d  ( (m.flags & MEM
3ae0: 5f 54 65 72 6d 29 21 3d 30 20 7c 7c 20 64 62 2d  _Term)!=0 || db-
3af0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
3b00: 0a 20 20 61 73 73 65 72 74 28 20 28 6d 2e 66 6c  .  assert( (m.fl
3b10: 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 29 21 3d  ags & MEM_Str)!=
3b20: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
3b30: 61 69 6c 65 64 20 29 3b 0a 20 20 72 65 74 75 72  ailed );.  retur
3b40: 6e 20 28 6d 2e 66 6c 61 67 73 20 26 20 4d 45 4d  n (m.flags & MEM
3b50: 5f 44 79 6e 29 21 3d 30 20 3f 20 6d 2e 7a 20 3a  _Dyn)!=0 ? m.z :
3b60: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
3b70: 28 64 62 2c 20 6d 2e 7a 29 3b 0a 7d 0a 0a 2f 2a  (db, m.z);.}../*
3b80: 0a 2a 2a 20 70 5a 20 69 73 20 61 20 55 54 46 2d  .** pZ is a UTF-
3b90: 31 36 20 65 6e 63 6f 64 65 64 20 75 6e 69 63 6f  16 encoded unico
3ba0: 64 65 20 73 74 72 69 6e 67 2e 20 49 66 20 6e 43  de string. If nC
3bb0: 68 61 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  har is less than
3bc0: 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 74 75 72 6e   zero,.** return
3bd0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
3be0: 79 74 65 73 20 75 70 20 74 6f 20 28 62 75 74 20  ytes up to (but 
3bf0: 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 29 2c 20  not including), 
3c00: 74 68 65 20 66 69 72 73 74 20 70 61 69 72 0a 2a  the first pair.*
3c10: 2a 20 6f 66 20 63 6f 6e 73 65 63 75 74 69 76 65  * of consecutive
3c20: 20 30 78 30 30 20 62 79 74 65 73 20 69 6e 20 70   0x00 bytes in p
3c30: 5a 2e 20 49 66 20 6e 43 68 61 72 20 69 73 20 6e  Z. If nChar is n
3c40: 6f 74 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  ot less than zer
3c50: 6f 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  o,.** then retur
3c60: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
3c70: 62 79 74 65 73 20 69 6e 20 74 68 65 20 66 69 72  bytes in the fir
3c80: 73 74 20 6e 43 68 61 72 20 75 6e 69 63 6f 64 65  st nChar unicode
3c90: 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 69   characters.** i
3ca0: 6e 20 70 5a 20 28 6f 72 20 75 70 20 75 6e 74 69  n pZ (or up unti
3cb0: 6c 20 74 68 65 20 66 69 72 73 74 20 70 61 69 72  l the first pair
3cc0: 20 6f 66 20 30 78 30 30 20 62 79 74 65 73 2c 20   of 0x00 bytes, 
3cd0: 77 68 69 63 68 65 76 65 72 20 63 6f 6d 65 73 20  whichever comes 
3ce0: 66 69 72 73 74 29 2e 0a 2a 2f 0a 69 6e 74 20 73  first)..*/.int s
3cf0: 71 6c 69 74 65 33 55 74 66 31 36 42 79 74 65 4c  qlite3Utf16ByteL
3d00: 65 6e 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  en(const void *z
3d10: 49 6e 2c 20 69 6e 74 20 6e 43 68 61 72 29 7b 0a  In, int nChar){.
3d20: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63    unsigned int c
3d30: 20 3d 20 31 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 1;.  char con
3d40: 73 74 20 2a 7a 20 3d 20 7a 49 6e 3b 0a 20 20 69  st *z = zIn;.  i
3d50: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20  nt n = 0;.  if( 
3d60: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
3d70: 56 45 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  VE==SQLITE_UTF16
3d80: 42 45 20 29 7b 0a 20 20 20 20 2f 2a 20 55 73 69  BE ){.    /* Usi
3d90: 6e 67 20 61 6e 20 22 69 66 20 28 53 51 4c 49 54  ng an "if (SQLIT
3da0: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3d 3d 53  E_UTF16NATIVE==S
3db0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 29 22 20  QLITE_UTF16BE)" 
3dc0: 63 6f 6e 73 74 72 75 63 74 20 68 65 72 65 0a 20  construct here. 
3dd0: 20 20 20 2a 2a 20 61 6e 64 20 69 6e 20 6f 74 68     ** and in oth
3de0: 65 72 20 70 61 72 74 73 20 6f 66 20 74 68 69 73  er parts of this
3df0: 20 66 69 6c 65 20 6d 65 61 6e 73 20 74 68 61 74   file means that
3e00: 20 61 74 20 6f 6e 65 20 62 72 61 6e 63 68 20 77   at one branch w
3e10: 69 6c 6c 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 62  ill.    ** not b
3e20: 65 20 63 6f 76 65 72 65 64 20 62 79 20 63 6f 76  e covered by cov
3e30: 65 72 61 67 65 20 74 65 73 74 69 6e 67 20 6f 6e  erage testing on
3e40: 20 61 6e 79 20 73 69 6e 67 6c 65 20 68 6f 73 74   any single host
3e50: 2e 20 42 75 74 20 63 6f 76 65 72 61 67 65 0a 20  . But coverage. 
3e60: 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f     ** will be co
3e70: 6d 70 6c 65 74 65 20 69 66 20 74 68 65 20 74 65  mplete if the te
3e80: 73 74 73 20 61 72 65 20 72 75 6e 20 6f 6e 20 62  sts are run on b
3e90: 6f 74 68 20 61 20 6c 69 74 74 6c 65 2d 65 6e 64  oth a little-end
3ea0: 69 61 6e 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20  ian and .    ** 
3eb0: 62 69 67 2d 65 6e 64 69 61 6e 20 68 6f 73 74 2e  big-endian host.
3ec0: 20 42 65 63 61 75 73 65 20 62 6f 74 68 20 74 68   Because both th
3ed0: 65 20 55 54 46 31 36 4e 41 54 49 56 45 20 61 6e  e UTF16NATIVE an
3ee0: 64 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  d SQLITE_UTF16BE
3ef0: 0a 20 20 20 20 2a 2a 20 6d 61 63 72 6f 73 20 61  .    ** macros a
3f00: 72 65 20 63 6f 6e 73 74 61 6e 74 20 61 74 20 63  re constant at c
3f10: 6f 6d 70 69 6c 65 20 74 69 6d 65 20 74 68 65 20  ompile time the 
3f20: 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 64 65 74  compiler can det
3f30: 65 72 6d 69 6e 65 0a 20 20 20 20 2a 2a 20 77 68  ermine.    ** wh
3f40: 69 63 68 20 62 72 61 6e 63 68 20 77 69 6c 6c 20  ich branch will 
3f50: 62 65 20 66 6f 6c 6c 6f 77 65 64 2e 20 49 74 20  be followed. It 
3f60: 69 73 20 74 68 65 72 65 66 6f 72 65 20 61 73 73  is therefore ass
3f70: 75 6d 65 64 20 74 68 61 74 20 6e 6f 20 72 75 6e  umed that no run
3f80: 74 69 6d 65 0a 20 20 20 20 2a 2a 20 70 65 6e 61  time.    ** pena
3f90: 6c 74 79 20 69 73 20 70 61 69 64 20 66 6f 72 20  lty is paid for 
3fa0: 74 68 69 73 20 22 69 66 22 20 73 74 61 74 65 6d  this "if" statem
3fb0: 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
3fc0: 77 68 69 6c 65 28 20 63 20 26 26 20 28 28 6e 43  while( c && ((nC
3fd0: 68 61 72 3c 30 29 20 7c 7c 20 6e 3c 6e 43 68 61  har<0) || n<nCha
3fe0: 72 29 20 29 7b 0a 20 20 20 20 20 20 52 45 41 44  r) ){.      READ
3ff0: 5f 55 54 46 31 36 42 45 28 7a 2c 20 63 29 3b 0a  _UTF16BE(z, c);.
4000: 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d        n++;.    }
4010: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
4020: 69 6c 65 28 20 63 20 26 26 20 28 28 6e 43 68 61  ile( c && ((nCha
4030: 72 3c 30 29 20 7c 7c 20 6e 3c 6e 43 68 61 72 29  r<0) || n<nChar)
4040: 20 29 7b 0a 20 20 20 20 20 20 52 45 41 44 5f 55   ){.      READ_U
4050: 54 46 31 36 4c 45 28 7a 2c 20 63 29 3b 0a 20 20  TF16LE(z, c);.  
4060: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
4070: 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 7a 2d 28   }.  return (z-(
4080: 63 68 61 72 20 63 6f 6e 73 74 20 2a 29 7a 49 6e  char const *)zIn
4090: 29 2d 28 28 63 3d 3d 30 29 3f 32 3a 30 29 3b 0a  )-((c==0)?2:0);.
40a0: 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
40b0: 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
40c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
40d0: 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 68  s called from th
40e0: 65 20 54 43 4c 20 74 65 73 74 20 66 75 6e 63 74  e TCL test funct
40f0: 69 6f 6e 20 22 74 72 61 6e 73 6c 61 74 65 5f 73  ion "translate_s
4100: 65 6c 66 74 65 73 74 22 2e 0a 2a 2a 20 49 74 20  elftest"..** It 
4110: 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
4120: 70 72 69 6d 69 74 69 76 65 73 20 66 6f 72 20 73  primitives for s
4130: 65 72 69 61 6c 69 7a 69 6e 67 20 61 6e 64 20 64  erializing and d
4140: 65 73 65 72 69 61 6c 69 7a 69 6e 67 0a 2a 2a 20  eserializing.** 
4150: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 65 61  characters in ea
4160: 63 68 20 65 6e 63 6f 64 69 6e 67 20 61 72 65 20  ch encoding are 
4170: 69 6e 76 65 72 73 65 73 20 6f 66 20 65 61 63 68  inverses of each
4180: 20 6f 74 68 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20   other..*/.void 
4190: 73 71 6c 69 74 65 33 55 74 66 53 65 6c 66 54 65  sqlite3UtfSelfTe
41a0: 73 74 28 76 6f 69 64 29 7b 0a 20 20 75 6e 73 69  st(void){.  unsi
41b0: 67 6e 65 64 20 69 6e 74 20 69 2c 20 74 3b 0a 20  gned int i, t;. 
41c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
41d0: 42 75 66 5b 32 30 5d 3b 0a 20 20 75 6e 73 69 67  Buf[20];.  unsig
41e0: 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 75  ned char *z;.  u
41f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 54  nsigned char *zT
4200: 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  erm;.  int n;.  
4210: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 3b 0a  unsigned int c;.
4220: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 30 78  .  for(i=0; i<0x
4230: 30 30 31 31 30 30 30 30 3b 20 69 2b 2b 29 7b 0a  00110000; i++){.
4240: 20 20 20 20 7a 20 3d 20 7a 42 75 66 3b 0a 20 20      z = zBuf;.  
4250: 20 20 57 52 49 54 45 5f 55 54 46 38 28 7a 2c 20    WRITE_UTF8(z, 
4260: 69 29 3b 0a 20 20 20 20 6e 20 3d 20 7a 2d 7a 42  i);.    n = z-zB
4270: 75 66 3b 0a 20 20 20 20 7a 5b 30 5d 20 3d 20 30  uf;.    z[0] = 0
4280: 3b 0a 20 20 20 20 7a 54 65 72 6d 20 3d 20 7a 3b  ;.    zTerm = z;
4290: 0a 20 20 20 20 7a 20 3d 20 7a 42 75 66 3b 0a 20  .    z = zBuf;. 
42a0: 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 74     c = sqlite3Ut
42b0: 66 38 52 65 61 64 28 7a 2c 20 7a 54 65 72 6d 2c  f8Read(z, zTerm,
42c0: 20 28 63 6f 6e 73 74 20 75 38 2a 2a 29 26 7a 29   (const u8**)&z)
42d0: 3b 0a 20 20 20 20 74 20 3d 20 69 3b 0a 20 20 20  ;.    t = i;.   
42e0: 20 69 66 28 20 69 3e 3d 30 78 44 38 30 30 20 26   if( i>=0xD800 &
42f0: 26 20 69 3c 3d 30 78 44 46 46 46 20 29 20 74 20  & i<=0xDFFF ) t 
4300: 3d 20 30 78 46 46 46 44 3b 0a 20 20 20 20 69 66  = 0xFFFD;.    if
4310: 28 20 28 69 26 30 78 46 46 46 46 46 46 46 45 29  ( (i&0xFFFFFFFE)
4320: 3d 3d 30 78 46 46 46 45 20 29 20 74 20 3d 20 30  ==0xFFFE ) t = 0
4330: 78 46 46 46 44 3b 0a 20 20 20 20 61 73 73 65 72  xFFFD;.    asser
4340: 74 28 20 63 3d 3d 74 20 29 3b 0a 20 20 20 20 61  t( c==t );.    a
4350: 73 73 65 72 74 28 20 28 7a 2d 7a 42 75 66 29 3d  ssert( (z-zBuf)=
4360: 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  =n );.  }.  for(
4370: 69 3d 30 3b 20 69 3c 30 78 30 30 31 31 30 30 30  i=0; i<0x0011000
4380: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  0; i++){.    if(
4390: 20 69 3e 3d 30 78 44 38 30 30 20 26 26 20 69 3c   i>=0xD800 && i<
43a0: 30 78 45 30 30 30 20 29 20 63 6f 6e 74 69 6e 75  0xE000 ) continu
43b0: 65 3b 0a 20 20 20 20 7a 20 3d 20 7a 42 75 66 3b  e;.    z = zBuf;
43c0: 0a 20 20 20 20 57 52 49 54 45 5f 55 54 46 31 36  .    WRITE_UTF16
43d0: 4c 45 28 7a 2c 20 69 29 3b 0a 20 20 20 20 6e 20  LE(z, i);.    n 
43e0: 3d 20 7a 2d 7a 42 75 66 3b 0a 20 20 20 20 7a 5b  = z-zBuf;.    z[
43f0: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7a 20 3d 20  0] = 0;.    z = 
4400: 7a 42 75 66 3b 0a 20 20 20 20 52 45 41 44 5f 55  zBuf;.    READ_U
4410: 54 46 31 36 4c 45 28 7a 2c 20 63 29 3b 0a 20 20  TF16LE(z, c);.  
4420: 20 20 61 73 73 65 72 74 28 20 63 3d 3d 69 20 29    assert( c==i )
4430: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 7a  ;.    assert( (z
4440: 2d 7a 42 75 66 29 3d 3d 6e 20 29 3b 0a 20 20 7d  -zBuf)==n );.  }
4450: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 30 78  .  for(i=0; i<0x
4460: 30 30 31 31 30 30 30 30 3b 20 69 2b 2b 29 7b 0a  00110000; i++){.
4470: 20 20 20 20 69 66 28 20 69 3e 3d 30 78 44 38 30      if( i>=0xD80
4480: 30 20 26 26 20 69 3c 30 78 45 30 30 30 20 29 20  0 && i<0xE000 ) 
4490: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 20  continue;.    z 
44a0: 3d 20 7a 42 75 66 3b 0a 20 20 20 20 57 52 49 54  = zBuf;.    WRIT
44b0: 45 5f 55 54 46 31 36 42 45 28 7a 2c 20 69 29 3b  E_UTF16BE(z, i);
44c0: 0a 20 20 20 20 6e 20 3d 20 7a 2d 7a 42 75 66 3b  .    n = z-zBuf;
44d0: 0a 20 20 20 20 7a 5b 30 5d 20 3d 20 30 3b 0a 20  .    z[0] = 0;. 
44e0: 20 20 20 7a 20 3d 20 7a 42 75 66 3b 0a 20 20 20     z = zBuf;.   
44f0: 20 52 45 41 44 5f 55 54 46 31 36 42 45 28 7a 2c   READ_UTF16BE(z,
4500: 20 63 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   c);.    assert(
4510: 20 63 3d 3d 69 20 29 3b 0a 20 20 20 20 61 73 73   c==i );.    ass
4520: 65 72 74 28 20 28 7a 2d 7a 42 75 66 29 3d 3d 6e  ert( (z-zBuf)==n
4530: 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   );.  }.}.#endif
4540: 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20   /* SQLITE_TEST 
4550: 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  */.#endif /* SQL
4560: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
4570: 2f 0a                                            /.