/ Hex Artifact Content
Login

Artifact e64a48bc21aa973eb622dd47da87d56a4cdcf528:


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 34 34 20 32  : utf.c,v 1.44 2
01f0: 30 30 37 2f 30 33 2f 33 31 20 31 35 3a 32 38 3a  007/03/31 15:28:
0200: 30 30 20 64 72 68 20 45 78 70 20 24 0a 2a 2a 0a  00 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 2a 0a 2a 2a 20 48 61 6e 64 6c 69 6e 67 20 6f  **.** Handling o
0500: 66 20 6d 61 6c 66 6f 72 6d 65 64 20 73 74 72 69  f malformed stri
0510: 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ngs:.**.** SQLit
0520: 65 20 61 63 63 65 70 74 73 20 61 6e 64 20 70 72  e accepts and pr
0530: 6f 63 65 73 73 65 73 20 6d 61 6c 66 6f 72 6d 65  ocesses malforme
0540: 64 20 73 74 72 69 6e 67 73 20 77 69 74 68 6f 75  d strings withou
0550: 74 20 61 6e 20 65 72 72 6f 72 20 77 68 65 72 65  t an error where
0560: 76 65 72 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2e  ver.** possible.
0570: 20 48 6f 77 65 76 65 72 20 74 68 69 73 20 69 73   However this is
0580: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 77 68   not possible wh
0590: 65 6e 20 63 6f 6e 76 65 72 74 69 6e 67 20 62 65  en converting be
05a0: 74 77 65 65 6e 20 55 54 46 2d 38 20 61 6e 64 0a  tween UTF-8 and.
05b0: 2a 2a 20 55 54 46 2d 31 36 2e 0a 2a 2a 0a 2a 2a  ** UTF-16..**.**
05c0: 20 57 68 65 6e 20 63 6f 6e 76 65 72 74 69 6e 67   When converting
05d0: 20 6d 61 6c 66 6f 72 6d 65 64 20 55 54 46 2d 38   malformed UTF-8
05e0: 20 73 74 72 69 6e 67 73 20 74 6f 20 55 54 46 2d   strings to UTF-
05f0: 31 36 2c 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65  16, one instance
0600: 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 70 6c 61   of the.** repla
0610: 63 65 6d 65 6e 74 20 63 68 61 72 61 63 74 65 72  cement character
0620: 20 55 2b 46 46 46 44 20 66 6f 72 20 65 61 63 68   U+FFFD for each
0630: 20 62 79 74 65 20 74 68 61 74 20 63 61 6e 6e 6f   byte that canno
0640: 74 20 62 65 20 69 6e 74 65 72 70 65 74 65 64 20  t be interpeted 
0650: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 20  as.** part of a 
0660: 76 61 6c 69 64 20 75 6e 69 63 6f 64 65 20 63 68  valid unicode ch
0670: 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57  aracter..**.** W
0680: 68 65 6e 20 63 6f 6e 76 65 72 74 69 6e 67 20 6d  hen converting m
0690: 61 6c 66 6f 72 6d 65 64 20 55 54 46 2d 31 36 20  alformed UTF-16 
06a0: 73 74 72 69 6e 67 73 20 74 6f 20 55 54 46 2d 38  strings to UTF-8
06b0: 2c 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  , one instance o
06c0: 66 20 74 68 65 0a 2a 2a 20 72 65 70 6c 61 63 65  f the.** replace
06d0: 6d 65 6e 74 20 63 68 61 72 61 63 74 65 72 20 55  ment character U
06e0: 2b 46 46 46 44 20 66 6f 72 20 65 61 63 68 20 70  +FFFD for each p
06f0: 61 69 72 20 6f 66 20 62 79 74 65 73 20 74 68 61  air of bytes tha
0700: 74 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 69  t cannot be.** i
0710: 6e 74 65 72 70 65 74 65 64 20 61 73 20 70 61 72  nterpeted as par
0720: 74 20 6f 66 20 61 20 76 61 6c 69 64 20 75 6e 69  t of a valid uni
0730: 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 2e 0a  code character..
0740: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
0750: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 6f 6c  contains the fol
0760: 6c 6f 77 69 6e 67 20 70 75 62 6c 69 63 20 72 6f  lowing public ro
0770: 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 73 71  utines:.**.** sq
0780: 6c 69 74 65 33 56 64 62 65 4d 65 6d 54 72 61 6e  lite3VdbeMemTran
0790: 73 6c 61 74 65 28 29 20 2d 20 54 72 61 6e 73 6c  slate() - Transl
07a0: 61 74 65 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  ate the encoding
07b0: 20 75 73 65 64 20 62 79 20 61 20 4d 65 6d 2a 20   used by a Mem* 
07c0: 73 74 72 69 6e 67 2e 0a 2a 2a 20 73 71 6c 69 74  string..** sqlit
07d0: 65 33 56 64 62 65 4d 65 6d 48 61 6e 64 6c 65 42  e3VdbeMemHandleB
07e0: 6f 6d 28 29 20 2d 20 48 61 6e 64 6c 65 20 62 79  om() - Handle by
07f0: 74 65 2d 6f 72 64 65 72 2d 6d 61 72 6b 73 20 69  te-order-marks i
0800: 6e 20 55 54 46 31 36 20 4d 65 6d 2a 20 73 74 72  n UTF16 Mem* str
0810: 69 6e 67 73 2e 0a 2a 2a 20 73 71 6c 69 74 65 33  ings..** sqlite3
0820: 75 74 66 31 36 42 79 74 65 4c 65 6e 28 29 20 20  utf16ByteLen()  
0830: 20 20 20 2d 20 43 61 6c 63 75 6c 61 74 65 20 62     - Calculate b
0840: 79 74 65 2d 6c 65 6e 67 74 68 20 6f 66 20 61 20  yte-length of a 
0850: 76 6f 69 64 2a 20 55 54 46 31 36 20 73 74 72 69  void* UTF16 stri
0860: 6e 67 2e 0a 2a 2a 20 73 71 6c 69 74 65 33 75 74  ng..** sqlite3ut
0870: 66 38 43 68 61 72 4c 65 6e 28 29 20 20 20 20 20  f8CharLen()     
0880: 20 2d 20 43 61 6c 63 75 6c 61 74 65 20 63 68 61   - Calculate cha
0890: 72 2d 6c 65 6e 67 74 68 20 6f 66 20 61 20 63 68  r-length of a ch
08a0: 61 72 2a 20 55 54 46 38 20 73 74 72 69 6e 67 2e  ar* UTF8 string.
08b0: 0a 2a 2a 20 73 71 6c 69 74 65 33 75 74 66 38 4c  .** sqlite3utf8L
08c0: 69 6b 65 43 6f 6d 70 61 72 65 28 29 20 20 2d 20  ikeCompare()  - 
08d0: 44 6f 20 61 20 4c 49 4b 45 20 6d 61 74 63 68 20  Do a LIKE match 
08e0: 67 69 76 65 6e 20 74 77 6f 20 55 54 46 38 20 63  given two UTF8 c
08f0: 68 61 72 2a 20 73 74 72 69 6e 67 73 2e 0a 2a 2a  har* strings..**
0900: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0910: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
0920: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
0930: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74  include "vdbeInt
0940: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .h"../*.** The f
0950: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e  ollowing constan
0960: 74 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  t value is used 
0970: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 42 49  by the SQLITE_BI
0980: 47 45 4e 44 49 41 4e 20 61 6e 64 0a 2a 2a 20 53  GENDIAN and.** S
0990: 51 4c 49 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49  QLITE_LITTLEENDI
09a0: 41 4e 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 63 6f  AN macros..*/.co
09b0: 6e 73 74 20 69 6e 74 20 73 71 6c 69 74 65 33 6f  nst int sqlite3o
09c0: 6e 65 20 3d 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 54  ne = 1;../*.** T
09d0: 68 69 73 20 74 61 62 6c 65 20 6d 61 70 73 20 66  his table maps f
09e0: 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 62 79  rom the first by
09f0: 74 65 20 6f 66 20 61 20 55 54 46 2d 38 20 63 68  te of a UTF-8 ch
0a00: 61 72 61 63 74 65 72 20 74 6f 20 74 68 65 20 6e  aracter to the n
0a10: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 74 72 61 69  umber.** of trai
0a20: 6c 69 6e 67 20 62 79 74 65 73 20 65 78 70 65 63  ling bytes expec
0a30: 74 65 64 2e 20 41 20 76 61 6c 75 65 20 27 34 27  ted. A value '4'
0a40: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
0a50: 74 68 65 20 74 61 62 6c 65 20 6b 65 79 0a 2a 2a  the table key.**
0a60: 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20   is not a legal 
0a70: 66 69 72 73 74 20 62 79 74 65 20 66 6f 72 20 61  first byte for a
0a80: 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72   UTF-8 character
0a90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
0aa0: 74 20 75 38 20 78 74 72 61 5f 75 74 66 38 5f 62  t u8 xtra_utf8_b
0ab0: 79 74 65 73 5b 32 35 36 5d 20 20 3d 20 7b 0a 2f  ytes[256]  = {./
0ac0: 2a 20 30 78 78 78 78 78 78 78 20 2a 2f 0a 30 2c  * 0xxxxxxx */.0,
0ad0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0ae0: 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20  0, 0,     0, 0, 
0af0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0b00: 2c 0a 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  ,.0, 0, 0, 0, 0,
0b10: 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c   0, 0, 0,     0,
0b20: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0b30: 30 2c 20 30 2c 0a 30 2c 20 30 2c 20 30 2c 20 30  0, 0,.0, 0, 0, 0
0b40: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
0b50: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
0b60: 20 30 2c 20 30 2c 20 30 2c 0a 30 2c 20 30 2c 20   0, 0, 0,.0, 0, 
0b70: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0b80: 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  ,     0, 0, 0, 0
0b90: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 30 2c  , 0, 0, 0, 0,.0,
0ba0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0bb0: 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20  0, 0,     0, 0, 
0bc0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0bd0: 2c 0a 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  ,.0, 0, 0, 0, 0,
0be0: 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c   0, 0, 0,     0,
0bf0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0c00: 30 2c 20 30 2c 0a 30 2c 20 30 2c 20 30 2c 20 30  0, 0,.0, 0, 0, 0
0c10: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
0c20: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
0c30: 20 30 2c 20 30 2c 20 30 2c 0a 30 2c 20 30 2c 20   0, 0, 0,.0, 0, 
0c40: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0c50: 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  ,     0, 0, 0, 0
0c60: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 0a 2f  , 0, 0, 0, 0,../
0c70: 2a 20 31 30 77 77 77 77 77 77 20 2a 2f 0a 34 2c  * 10wwwwww */.4,
0c80: 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20   4, 4, 4, 4, 4, 
0c90: 34 2c 20 34 2c 20 20 20 20 20 34 2c 20 34 2c 20  4, 4,     4, 4, 
0ca0: 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34  4, 4, 4, 4, 4, 4
0cb0: 2c 0a 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c  ,.4, 4, 4, 4, 4,
0cc0: 20 34 2c 20 34 2c 20 34 2c 20 20 20 20 20 34 2c   4, 4, 4,     4,
0cd0: 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20   4, 4, 4, 4, 4, 
0ce0: 34 2c 20 34 2c 0a 34 2c 20 34 2c 20 34 2c 20 34  4, 4,.4, 4, 4, 4
0cf0: 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 20 20  , 4, 4, 4, 4,   
0d00: 20 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c    4, 4, 4, 4, 4,
0d10: 20 34 2c 20 34 2c 20 34 2c 0a 34 2c 20 34 2c 20   4, 4, 4,.4, 4, 
0d20: 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34  4, 4, 4, 4, 4, 4
0d30: 2c 20 20 20 20 20 34 2c 20 34 2c 20 34 2c 20 34  ,     4, 4, 4, 4
0d40: 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 0a 0a 2f  , 4, 4, 4, 4,../
0d50: 2a 20 31 31 30 79 79 79 79 79 20 2a 2f 0a 31 2c  * 110yyyyy */.1,
0d60: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
0d70: 31 2c 20 31 2c 20 20 20 20 20 31 2c 20 31 2c 20  1, 1,     1, 1, 
0d80: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
0d90: 2c 0a 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  ,.1, 1, 1, 1, 1,
0da0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 20 20 31 2c   1, 1, 1,     1,
0db0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
0dc0: 31 2c 20 31 2c 0a 0a 2f 2a 20 31 31 31 30 7a 7a  1, 1,../* 1110zz
0dd0: 7a 7a 20 2a 2f 0a 32 2c 20 32 2c 20 32 2c 20 32  zz */.2, 2, 2, 2
0de0: 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 20 20  , 2, 2, 2, 2,   
0df0: 20 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c    2, 2, 2, 2, 2,
0e00: 20 32 2c 20 32 2c 20 32 2c 0a 0a 2f 2a 20 31 31   2, 2, 2,../* 11
0e10: 31 31 30 79 79 79 20 2a 2f 0a 33 2c 20 33 2c 20  110yyy */.3, 3, 
0e20: 33 2c 20 33 2c 20 33 2c 20 33 2c 20 33 2c 20 33  3, 3, 3, 3, 3, 3
0e30: 2c 20 20 20 20 20 34 2c 20 34 2c 20 34 2c 20 34  ,     4, 4, 4, 4
0e40: 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 0a 7d 3b  , 4, 4, 4, 4,.};
0e50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 74 61 62  ../*.** This tab
0e60: 6c 65 20 6d 61 70 73 20 66 72 6f 6d 20 74 68 65  le maps from the
0e70: 20 6e 75 6d 62 65 72 20 6f 66 20 74 72 61 69 6c   number of trail
0e80: 69 6e 67 20 62 79 74 65 73 20 69 6e 20 61 20 55  ing bytes in a U
0e90: 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 0a 2a  TF-8 character.*
0ea0: 2a 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  * to an integer 
0eb0: 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 69 73  constant that is
0ec0: 20 65 66 66 65 63 74 69 76 65 6c 79 20 63 61 6c   effectively cal
0ed0: 63 75 6c 61 74 65 64 20 66 6f 72 20 65 61 63 68  culated for each
0ee0: 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 72 65   character.** re
0ef0: 61 64 20 62 79 20 61 20 6e 61 69 76 65 20 69 6d  ad by a naive im
0f00: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
0f10: 61 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65  a UTF-8 characte
0f20: 72 20 72 65 61 64 65 72 2e 20 54 68 65 20 63 6f  r reader. The co
0f30: 64 65 0a 2a 2a 20 69 6e 20 74 68 65 20 52 45 41  de.** in the REA
0f40: 44 5f 55 54 46 38 20 6d 61 63 72 6f 20 65 78 70  D_UTF8 macro exp
0f50: 6c 61 69 6e 73 20 74 68 69 6e 67 73 20 62 65 73  lains things bes
0f60: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  t..*/.static con
0f70: 73 74 20 69 6e 74 20 78 74 72 61 5f 75 74 66 38  st int xtra_utf8
0f80: 5f 62 69 74 73 5b 5d 20 3d 20 20 7b 0a 20 20 30  _bits[] =  {.  0
0f90: 2c 0a 20 20 31 32 34 31 36 2c 20 20 20 20 20 20  ,.  12416,      
0fa0: 20 20 20 20 2f 2a 20 28 30 78 43 30 20 3c 3c 20      /* (0xC0 << 
0fb0: 36 29 20 2b 20 28 30 78 38 30 29 20 2a 2f 0a 20  6) + (0x80) */. 
0fc0: 20 39 32 35 38 32 34 2c 20 20 20 20 20 20 20 20   925824,        
0fd0: 20 2f 2a 20 28 30 78 45 30 20 3c 3c 20 31 32 29   /* (0xE0 << 12)
0fe0: 20 2b 20 28 30 78 38 30 20 3c 3c 20 36 29 20 2b   + (0x80 << 6) +
0ff0: 20 28 30 78 38 30 29 20 2a 2f 0a 20 20 36 33 34   (0x80) */.  634
1000: 34 37 31 36 38 20 20 20 20 20 20 20 20 2f 2a 20  47168        /* 
1010: 28 30 78 46 30 20 3c 3c 20 31 38 29 20 2b 20 28  (0xF0 << 18) + (
1020: 30 78 38 30 20 3c 3c 20 31 32 29 20 2b 20 28 30  0x80 << 12) + (0
1030: 78 38 30 20 3c 3c 20 36 29 20 2b 20 30 78 38 30  x80 << 6) + 0x80
1040: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66   */.};../*.** If
1050: 20 61 20 55 54 46 2d 38 20 63 68 61 72 61 63 74   a UTF-8 charact
1060: 65 72 20 63 6f 6e 74 61 69 6e 73 20 4e 20 62 79  er contains N by
1070: 74 65 73 20 65 78 74 72 61 20 62 79 74 65 73 20  tes extra bytes 
1080: 28 4e 20 62 79 74 65 73 20 66 6f 6c 6c 6f 77 0a  (N bytes follow.
1090: 2a 2a 20 74 68 65 20 69 6e 69 74 69 61 6c 20 62  ** the initial b
10a0: 79 74 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  yte so that the 
10b0: 74 6f 74 61 6c 20 63 68 61 72 61 63 74 65 72 20  total character 
10c0: 6c 65 6e 67 74 68 20 69 73 20 4e 2b 31 29 20 74  length is N+1) t
10d0: 68 65 6e 0a 2a 2a 20 6d 61 73 6b 69 6e 67 20 74  hen.** masking t
10e0: 68 65 20 63 68 61 72 61 63 74 65 72 20 77 69 74  he character wit
10f0: 68 20 75 74 66 38 5f 6d 61 73 6b 5b 4e 5d 20 6d  h utf8_mask[N] m
1100: 75 73 74 20 70 72 6f 64 75 63 65 20 61 20 6e 6f  ust produce a no
1110: 6e 2d 7a 65 72 6f 0a 2a 2a 20 72 65 73 75 6c 74  n-zero.** result
1120: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 77 65  .  Otherwise, we
1130: 20 68 61 76 65 20 61 6e 20 28 69 6c 6c 65 67 61   have an (illega
1140: 6c 29 20 6f 76 65 72 6c 6f 6e 67 20 65 6e 63 6f  l) overlong enco
1150: 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ding..*/.static 
1160: 63 6f 6e 73 74 20 69 6e 74 20 75 74 66 5f 6d 61  const int utf_ma
1170: 73 6b 5b 5d 20 3d 20 7b 0a 20 20 30 78 30 30 30  sk[] = {.  0x000
1180: 30 30 30 30 30 2c 0a 20 20 30 78 66 66 66 66 66  00000,.  0xfffff
1190: 66 38 30 2c 0a 20 20 30 78 66 66 66 66 66 38 30  f80,.  0xfffff80
11a0: 30 2c 0a 20 20 30 78 66 66 66 66 30 30 30 30 2c  0,.  0xffff0000,
11b0: 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 52 45 41  .};..#define REA
11c0: 44 5f 55 54 46 38 28 7a 49 6e 2c 20 63 29 20 7b  D_UTF8(zIn, c) {
11d0: 20 5c 0a 20 20 69 6e 74 20 78 74 72 61 3b 20 20   \.  int xtra;  
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 20 20 20 20                  
1200: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 63 20            \.  c 
1210: 3d 20 2a 28 7a 49 6e 29 2b 2b 3b 20 20 20 20 20  = *(zIn)++;     
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 5c 0a 20 20 78 74 72 61 20 3d 20 78 74     \.  xtra = xt
1250: 72 61 5f 75 74 66 38 5f 62 79 74 65 73 5b 63 5d  ra_utf8_bytes[c]
1260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1270: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1280: 73 77 69 74 63 68 28 20 78 74 72 61 20 29 7b 20  switch( xtra ){ 
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 5c 0a 20 20 20 20 63 61 73 65 20       \.    case 
12c0: 34 3a 20 63 20 3d 20 28 69 6e 74 29 30 78 46 46  4: c = (int)0xFF
12d0: 46 44 3b 20 62 72 65 61 6b 3b 20 20 20 20 20 20  FD; break;      
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
12f0: 20 20 20 20 63 61 73 65 20 33 3a 20 63 20 3d 20      case 3: c = 
1300: 28 63 3c 3c 36 29 20 2b 20 2a 28 7a 49 6e 29 2b  (c<<6) + *(zIn)+
1310: 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +;              
1320: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 63 61 73         \.    cas
1330: 65 20 32 3a 20 63 20 3d 20 28 63 3c 3c 36 29 20  e 2: c = (c<<6) 
1340: 2b 20 2a 28 7a 49 6e 29 2b 2b 3b 20 20 20 20 20  + *(zIn)++;     
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1360: 5c 0a 20 20 20 20 63 61 73 65 20 31 3a 20 63 20  \.    case 1: c 
1370: 3d 20 28 63 3c 3c 36 29 20 2b 20 2a 28 7a 49 6e  = (c<<6) + *(zIn
1380: 29 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20  )++;            
1390: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 63           \.    c
13a0: 20 2d 3d 20 78 74 72 61 5f 75 74 66 38 5f 62 69   -= xtra_utf8_bi
13b0: 74 73 5b 78 74 72 61 5d 3b 20 20 20 20 20 20 20  ts[xtra];       
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d0: 20 20 5c 0a 20 20 20 20 69 66 28 20 28 75 74 66    \.    if( (utf
13e0: 5f 6d 61 73 6b 5b 78 74 72 61 5d 26 63 29 3d 3d  _mask[xtra]&c)==
13f0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
1400: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1410: 20 20 20 20 20 7c 7c 20 28 63 26 30 78 46 46 46       || (c&0xFFF
1420: 46 46 38 30 30 29 3d 3d 30 78 44 38 30 30 20 20  FF800)==0xD800  
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 20 5c 0a 20 20 20 20 20 20 20 20 7c 7c      \.        ||
1450: 20 28 63 26 30 78 46 46 46 46 46 46 46 45 29 3d   (c&0xFFFFFFFE)=
1460: 3d 30 78 46 46 46 45 20 29 7b 20 20 63 20 3d 20  =0xFFFE ){  c = 
1470: 30 78 46 46 46 44 3b 20 7d 20 20 20 20 5c 0a 20  0xFFFD; }    \. 
1480: 20 7d 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 20 20 20 5c 0a 7d 0a 69 6e 74 20 73 71        \.}.int sq
14c0: 6c 69 74 65 33 52 65 61 64 55 74 66 38 28 63 6f  lite3ReadUtf8(co
14d0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
14e0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 63 3b 0a  r *z){.  int c;.
14f0: 20 20 52 45 41 44 5f 55 54 46 38 28 7a 2c 20 63    READ_UTF8(z, c
1500: 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d  );.  return c;.}
1510: 0a 0a 23 64 65 66 69 6e 65 20 53 4b 49 50 5f 55  ..#define SKIP_U
1520: 54 46 38 28 7a 49 6e 29 20 7b 20 20 20 20 20 20  TF8(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 5c 0a 20 20 7a 49 6e           \.  zIn
1550: 20 2b 3d 20 28 78 74 72 61 5f 75 74 66 38 5f 62   += (xtra_utf8_b
1560: 79 74 65 73 5b 2a 28 75 38 20 2a 29 7a 49 6e 5d  ytes[*(u8 *)zIn]
1570: 20 2b 20 31 29 3b 20 20 20 20 20 20 20 20 20 20   + 1);          
1580: 20 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 57    \.}..#define W
1590: 52 49 54 45 5f 55 54 46 38 28 7a 4f 75 74 2c 20  RITE_UTF8(zOut, 
15a0: 63 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  c) {            
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
15c0: 20 20 69 66 28 20 63 3c 30 78 30 30 30 38 30 20    if( c<0x00080 
15d0: 29 7b 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 20                  
15f0: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f         \.    *zO
1600: 75 74 2b 2b 20 3d 20 28 63 26 30 78 46 46 29 3b  ut++ = (c&0xFF);
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1630: 5c 0a 20 20 7d 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 20 20 20 20 20 20 20 5c 0a 20 20 65 6c 73           \.  els
1670: 65 20 69 66 28 20 63 3c 30 78 30 30 38 30 30 20  e if( c<0x00800 
1680: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20    \.    *zOut++ 
16b0: 3d 20 30 78 43 30 20 2b 20 28 28 63 3e 3e 36 29  = 0xC0 + ((c>>6)
16c0: 26 30 78 31 46 29 3b 20 20 20 20 20 20 20 20 20  &0x1F);         
16d0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
16e0: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20   *zOut++ = 0x80 
16f0: 2b 20 28 63 20 26 20 30 78 33 46 29 3b 20 20 20  + (c & 0x3F);   
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 20 20 5c 0a 20 20 7d 20 20 20 20 20 20 20      \.  }       
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1750: 20 65 6c 73 65 20 69 66 28 20 63 3c 30 78 31 30   else if( c<0x10
1760: 30 30 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  000 ){          
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1780: 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75        \.    *zOu
1790: 74 2b 2b 20 3d 20 30 78 45 30 20 2b 20 28 28 63  t++ = 0xE0 + ((c
17a0: 3e 3e 31 32 29 26 30 78 30 46 29 3b 20 20 20 20  >>12)&0x0F);    
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
17c0: 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30  .    *zOut++ = 0
17d0: 78 38 30 20 2b 20 28 28 63 3e 3e 36 29 20 26 20  x80 + ((c>>6) & 
17e0: 30 78 33 46 29 3b 20 20 20 20 20 20 20 20 20 20  0x3F);          
17f0: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a          \.    *z
1800: 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28  Out++ = 0x80 + (
1810: 63 20 26 20 30 78 33 46 29 3b 20 20 20 20 20 20  c & 0x3F);      
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1830: 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20   \.  }else{     
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1860: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
1870: 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 46 30 20 2b  *zOut++ = 0xF0 +
1880: 20 28 28 63 3e 3e 31 38 29 20 26 20 30 78 30 37   ((c>>18) & 0x07
1890: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
18a0: 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b     \.    *zOut++
18b0: 20 3d 20 30 78 38 30 20 2b 20 28 28 63 3e 3e 31   = 0x80 + ((c>>1
18c0: 32 29 20 26 20 30 78 33 46 29 3b 20 20 20 20 20  2) & 0x3F);     
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
18e0: 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30    *zOut++ = 0x80
18f0: 20 2b 20 28 28 63 3e 3e 36 29 20 26 20 30 78 33   + ((c>>6) & 0x3
1900: 46 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  F);             
1910: 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74       \.    *zOut
1920: 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 63 20 26  ++ = 0x80 + (c &
1930: 20 30 78 33 46 29 3b 20 20 20 20 20 20 20 20 20   0x3F);         
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1950: 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20    }             
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1980: 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66         \.}..#def
1990: 69 6e 65 20 57 52 49 54 45 5f 55 54 46 31 36 4c  ine WRITE_UTF16L
19a0: 45 28 7a 4f 75 74 2c 20 63 29 20 7b 20 20 20 20  E(zOut, c) {    
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
19d0: 69 66 28 20 63 3c 3d 30 78 46 46 46 46 20 29 7b  if( c<=0xFFFF ){
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1a10: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 63      *zOut++ = (c
1a20: 26 30 78 30 30 46 46 29 3b 20 20 20 20 20 20 20  &0x00FF);       
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a50: 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20  \.    *zOut++ = 
1a60: 28 28 63 3e 3e 38 29 26 30 78 30 30 46 46 29 3b  ((c>>8)&0x00FF);
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20    \.  }else{    
1aa0: 20 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 20 20 20                  
1ad0: 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b      \.    *zOut+
1ae0: 2b 20 3d 20 28 28 28 63 3e 3e 31 30 29 26 30 78  + = (((c>>10)&0x
1af0: 30 30 33 46 29 20 2b 20 28 28 28 63 2d 30 78 31  003F) + (((c-0x1
1b00: 30 30 30 30 29 3e 3e 31 30 29 26 30 78 30 30 43  0000)>>10)&0x00C
1b10: 30 29 29 3b 20 20 5c 0a 20 20 20 20 2a 7a 4f 75  0));  \.    *zOu
1b20: 74 2b 2b 20 3d 20 28 30 78 30 30 44 38 20 2b 20  t++ = (0x00D8 + 
1b30: 28 28 28 63 2d 30 78 31 30 30 30 30 29 3e 3e 31  (((c-0x10000)>>1
1b40: 38 29 26 30 78 30 33 29 29 3b 20 20 20 20 20 20  8)&0x03));      
1b50: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a          \.    *z
1b60: 4f 75 74 2b 2b 20 3d 20 28 63 26 30 78 30 30 46  Out++ = (c&0x00F
1b70: 46 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  F);             
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
1ba0: 2a 7a 4f 75 74 2b 2b 20 3d 20 28 30 78 30 30 44  *zOut++ = (0x00D
1bb0: 43 20 2b 20 28 28 63 3e 3e 38 29 26 30 78 30 33  C + ((c>>8)&0x03
1bc0: 29 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ));             
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1be0: 7d 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 20 20                  
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1c20: 7d 0a 0a 23 64 65 66 69 6e 65 20 57 52 49 54 45  }..#define WRITE
1c30: 5f 55 54 46 31 36 42 45 28 7a 4f 75 74 2c 20 63  _UTF16BE(zOut, c
1c40: 29 20 7b 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 5c 0a 20 20 69 66 28 20 63 3c 3d 30 78     \.  if( c<=0x
1c70: 46 46 46 46 20 29 7b 20 20 20 20 20 20 20 20 20  FFFF ){         
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74       \.    *zOut
1cb0: 2b 2b 20 3d 20 28 28 63 3e 3e 38 29 26 30 78 30  ++ = ((c>>8)&0x0
1cc0: 30 46 46 29 3b 20 20 20 20 20 20 20 20 20 20 20  0FF);           
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f         \.    *zO
1cf0: 75 74 2b 2b 20 3d 20 28 63 26 30 78 30 30 46 46  ut++ = (c&0x00FF
1d00: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c           \.  }el
1d30: 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d60: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1d70: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 30 78 30 30   *zOut++ = (0x00
1d80: 44 38 20 2b 20 28 28 28 63 2d 30 78 31 30 30 30  D8 + (((c-0x1000
1d90: 30 29 3e 3e 31 38 29 26 30 78 30 33 29 29 3b 20  0)>>18)&0x03)); 
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1db0: 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 28 28     *zOut++ = (((
1dc0: 63 3e 3e 31 30 29 26 30 78 30 30 33 46 29 20 2b  c>>10)&0x003F) +
1dd0: 20 28 28 28 63 2d 30 78 31 30 30 30 30 29 3e 3e   (((c-0x10000)>>
1de0: 31 30 29 26 30 78 30 30 43 30 29 29 3b 20 20 5c  10)&0x00C0));  \
1df0: 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28  .    *zOut++ = (
1e00: 30 78 30 30 44 43 20 2b 20 28 28 63 3e 3e 38 29  0x00DC + ((c>>8)
1e10: 26 30 78 30 33 29 29 3b 20 20 20 20 20 20 20 20  &0x03));        
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d   \.    *zOut++ =
1e40: 20 28 63 26 30 78 30 30 46 46 29 3b 20 20 20 20   (c&0x00FF);    
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 5c 0a 20 20 7d 20 20 20 20 20 20 20 20     \.  }        
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb0: 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e       \.}..#defin
1ec0: 65 20 52 45 41 44 5f 55 54 46 31 36 4c 45 28 7a  e READ_UTF16LE(z
1ed0: 49 6e 2c 20 63 29 7b 20 20 20 20 20 20 20 20 20  In, c){         
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f00: 5c 0a 20 20 63 20 3d 20 28 2a 7a 49 6e 2b 2b 29  \.  c = (*zIn++)
1f10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f40: 20 20 20 20 20 20 20 20 5c 0a 20 20 63 20 2b 3d          \.  c +=
1f50: 20 28 28 2a 7a 49 6e 2b 2b 29 3c 3c 38 29 3b 20   ((*zIn++)<<8); 
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f90: 5c 0a 20 20 69 66 28 20 63 3e 3d 30 78 44 38 30  \.  if( c>=0xD80
1fa0: 30 20 26 26 20 63 3c 3d 30 78 45 30 30 30 20 29  0 && c<=0xE000 )
1fb0: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd0: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e          \.    in
1fe0: 74 20 63 32 20 3d 20 28 2a 7a 49 6e 2b 2b 29 3b  t c2 = (*zIn++);
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2020: 5c 0a 20 20 20 20 63 32 20 2b 3d 20 28 28 2a 7a  \.    c2 += ((*z
2030: 49 6e 2b 2b 29 3c 3c 38 29 3b 20 20 20 20 20 20  In++)<<8);      
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2060: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 63 20          \.    c 
2070: 3d 20 28 63 32 26 30 78 30 33 46 46 29 20 2b 20  = (c2&0x03FF) + 
2080: 28 28 63 26 30 78 30 30 33 46 29 3c 3c 31 30 29  ((c&0x003F)<<10)
2090: 20 2b 20 28 28 28 63 26 30 78 30 33 43 30 29 2b   + (((c&0x03C0)+
20a0: 30 78 30 30 34 30 29 3c 3c 31 30 29 3b 20 20 20  0x0040)<<10);   
20b0: 5c 0a 20 20 20 20 69 66 28 20 28 63 20 26 20 30  \.    if( (c & 0
20c0: 78 46 46 46 46 30 30 30 30 29 3d 3d 30 20 29 20  xFFFF0000)==0 ) 
20d0: 63 20 3d 20 30 78 46 46 46 44 3b 20 20 20 20 20  c = 0xFFFD;     
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f0: 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 20 20 20          \.  }   
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2140: 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 52 45 41  \.}..#define REA
2150: 44 5f 55 54 46 31 36 42 45 28 7a 49 6e 2c 20 63  D_UTF16BE(zIn, c
2160: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 63             \.  c
2190: 20 3d 20 28 28 2a 7a 49 6e 2b 2b 29 3c 3c 38 29   = ((*zIn++)<<8)
21a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d0: 20 20 20 5c 0a 20 20 63 20 2b 3d 20 28 2a 7a 49     \.  c += (*zI
21e0: 6e 2b 2b 29 3b 20 20 20 20 20 20 20 20 20 20 20  n++);           
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
2220: 66 28 20 63 3e 3d 30 78 44 38 30 30 20 26 26 20  f( c>=0xD800 && 
2230: 63 3c 3d 30 78 45 30 30 30 20 29 7b 20 20 20 20  c<=0xE000 ){    
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 63 32 20     \.    int c2 
2270: 3d 20 28 28 2a 7a 49 6e 2b 2b 29 3c 3c 38 29 3b  = ((*zIn++)<<8);
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
22b0: 20 63 32 20 2b 3d 20 28 2a 7a 49 6e 2b 2b 29 3b   c2 += (*zIn++);
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f0: 20 20 20 5c 0a 20 20 20 20 63 20 3d 20 28 63 32     \.    c = (c2
2300: 26 30 78 30 33 46 46 29 20 2b 20 28 28 63 26 30  &0x03FF) + ((c&0
2310: 78 30 30 33 46 29 3c 3c 31 30 29 20 2b 20 28 28  x003F)<<10) + ((
2320: 28 63 26 30 78 30 33 43 30 29 2b 30 78 30 30 34  (c&0x03C0)+0x004
2330: 30 29 3c 3c 31 30 29 3b 20 20 20 5c 0a 20 20 20  0)<<10);   \.   
2340: 20 69 66 28 20 28 63 20 26 20 30 78 46 46 46 46   if( (c & 0xFFFF
2350: 30 30 30 30 29 3d 3d 30 20 29 20 63 20 3d 20 30  0000)==0 ) c = 0
2360: 78 46 46 46 44 3b 20 20 20 20 20 20 20 20 20 20  xFFFD;          
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2380: 20 20 20 5c 0a 20 20 7d 20 20 20 20 20 20 20 20     \.  }        
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a             \.}..
23d0: 23 64 65 66 69 6e 65 20 53 4b 49 50 5f 55 54 46  #define SKIP_UTF
23e0: 31 36 42 45 28 7a 49 6e 29 7b 20 20 20 20 20 20  16BE(zIn){      
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 2a 7a        \.  if( *z
2420: 49 6e 3e 3d 30 78 44 38 20 26 26 20 28 2a 7a 49  In>=0xD8 && (*zI
2430: 6e 3c 30 78 45 30 20 7c 7c 20 28 2a 7a 49 6e 3d  n<0xE0 || (*zIn=
2440: 3d 30 78 45 30 20 26 26 20 2a 28 7a 49 6e 2b 31  =0xE0 && *(zIn+1
2450: 29 3d 3d 30 78 30 30 29 29 20 29 7b 20 20 5c 0a  )==0x00)) ){  \.
2460: 20 20 20 20 7a 49 6e 20 2b 3d 20 34 3b 20 20 20      zIn += 4;   
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b        \.  }else{
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
24f0: 20 20 20 20 7a 49 6e 20 2b 3d 20 32 3b 20 20 20      zIn += 2;   
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2530: 20 20 20 20 20 20 5c 0a 20 20 7d 20 20 20 20 20        \.  }     
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2580: 7d 0a 23 64 65 66 69 6e 65 20 53 4b 49 50 5f 55  }.#define SKIP_U
2590: 54 46 31 36 4c 45 28 7a 49 6e 29 7b 20 20 20 20  TF16LE(zIn){    
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c0: 20 20 20 20 20 20 20 20 5c 0a 20 20 7a 49 6e 2b          \.  zIn+
25d0: 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +;              
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2610: 5c 0a 20 20 69 66 28 20 2a 7a 49 6e 3e 3d 30 78  \.  if( *zIn>=0x
2620: 44 38 20 26 26 20 28 2a 7a 49 6e 3c 30 78 45 30  D8 && (*zIn<0xE0
2630: 20 7c 7c 20 28 2a 7a 49 6e 3d 3d 30 78 45 30 20   || (*zIn==0xE0 
2640: 26 26 20 2a 28 7a 49 6e 2d 31 29 3d 3d 30 78 30  && *(zIn-1)==0x0
2650: 30 29 29 20 29 7b 20 20 5c 0a 20 20 20 20 7a 49  0)) ){  \.    zI
2660: 6e 20 2b 3d 20 33 3b 20 20 20 20 20 20 20 20 20  n += 3;         
2670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20  \.  }else{      
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e0: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 7a 49          \.    zI
26f0: 6e 20 2b 3d 20 31 3b 20 20 20 20 20 20 20 20 20  n += 1;         
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2730: 5c 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20 20  \.  }           
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2770: 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65          \.}..#de
2780: 66 69 6e 65 20 52 53 4b 49 50 5f 55 54 46 31 36  fine RSKIP_UTF16
2790: 4c 45 28 7a 49 6e 29 7b 20 20 20 20 20 20 20 20  LE(zIn){        
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c0: 20 20 20 20 5c 0a 20 20 69 66 28 20 2a 7a 49 6e      \.  if( *zIn
27d0: 3e 3d 30 78 44 38 20 26 26 20 28 2a 7a 49 6e 3c  >=0xD8 && (*zIn<
27e0: 30 78 45 30 20 7c 7c 20 28 2a 7a 49 6e 3d 3d 30  0xE0 || (*zIn==0
27f0: 78 45 30 20 26 26 20 2a 28 7a 49 6e 2d 31 29 3d  xE0 && *(zIn-1)=
2800: 3d 30 78 30 30 29 29 20 29 7b 20 20 5c 0a 20 20  =0x00)) ){  \.  
2810: 20 20 7a 49 6e 20 2d 3d 20 34 3b 20 20 20 20 20    zIn -= 4;     
2820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2850: 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20      \.  }else{  
2860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2890: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28a0: 20 20 7a 49 6e 20 2d 3d 20 32 3b 20 20 20 20 20    zIn -= 2;     
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e0: 20 20 20 20 5c 0a 20 20 7d 20 20 20 20 20 20 20      \.  }       
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2920: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a              \.}.
2930: 23 64 65 66 69 6e 65 20 52 53 4b 49 50 5f 55 54  #define RSKIP_UT
2940: 46 31 36 42 45 28 7a 49 6e 29 7b 20 20 20 20 20  F16BE(zIn){     
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2970: 20 20 20 20 20 20 20 5c 0a 20 20 7a 49 6e 2d 2d         \.  zIn--
2980: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
29c0: 0a 20 20 69 66 28 20 2a 7a 49 6e 3e 3d 30 78 44  .  if( *zIn>=0xD
29d0: 38 20 26 26 20 28 2a 7a 49 6e 3c 30 78 45 30 20  8 && (*zIn<0xE0 
29e0: 7c 7c 20 28 2a 7a 49 6e 3d 3d 30 78 45 30 20 26  || (*zIn==0xE0 &
29f0: 26 20 2a 28 7a 49 6e 2b 31 29 3d 3d 30 78 30 30  & *(zIn+1)==0x00
2a00: 29 29 20 29 7b 20 20 5c 0a 20 20 20 20 7a 49 6e  )) ){  \.    zIn
2a10: 20 2d 3d 20 33 3b 20 20 20 20 20 20 20 20 20 20   -= 3;          
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2a50: 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20  .  }else{       
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a90: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 7a 49 6e         \.    zIn
2aa0: 20 2d 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20   -= 1;          
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2ae0: 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  .  }            
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b20: 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a         \.}../*.*
2b30: 2a 20 49 66 20 74 68 65 20 54 52 41 4e 53 4c 41  * If the TRANSLA
2b40: 54 45 5f 54 52 41 43 45 20 6d 61 63 72 6f 20 69  TE_TRACE macro i
2b50: 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20 76  s defined, the v
2b60: 61 6c 75 65 20 6f 66 20 65 61 63 68 20 4d 65 6d  alue of each Mem
2b70: 20 69 73 0a 2a 2a 20 70 72 69 6e 74 65 64 20 6f   is.** printed o
2b80: 6e 20 73 74 64 65 72 72 20 6f 6e 20 74 68 65 20  n stderr on the 
2b90: 77 61 79 20 69 6e 74 6f 20 61 6e 64 20 6f 75 74  way into and out
2ba0: 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d   of sqlite3VdbeM
2bb0: 65 6d 54 72 61 6e 73 6c 61 74 65 28 29 2e 0a 2a  emTranslate()..*
2bc0: 2f 20 0a 2f 2a 20 23 64 65 66 69 6e 65 20 54 52  / ./* #define TR
2bd0: 41 4e 53 4c 41 54 45 5f 54 52 41 43 45 20 31 20  ANSLATE_TRACE 1 
2be0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
2bf0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
2c00: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2c10: 20 74 72 61 6e 73 66 6f 72 6d 73 20 74 68 65 20   transforms the 
2c20: 69 6e 74 65 72 6e 61 6c 20 74 65 78 74 20 65 6e  internal text en
2c30: 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 70  coding used by p
2c40: 4d 65 6d 20 74 6f 0a 2a 2a 20 64 65 73 69 72 65  Mem to.** desire
2c50: 64 45 6e 63 2e 20 49 74 20 69 73 20 61 6e 20 65  dEnc. It is an e
2c60: 72 72 6f 72 20 69 66 20 74 68 65 20 73 74 72 69  rror if the stri
2c70: 6e 67 20 69 73 20 61 6c 72 65 61 64 79 20 6f 66  ng is already of
2c80: 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
2c90: 65 6e 63 6f 64 69 6e 67 2c 20 6f 72 20 69 66 20  encoding, or if 
2ca0: 2a 70 4d 65 6d 20 64 6f 65 73 20 6e 6f 74 20 63  *pMem does not c
2cb0: 6f 6e 74 61 69 6e 20 61 20 73 74 72 69 6e 67 20  ontain a string 
2cc0: 76 61 6c 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  value..*/.int sq
2cd0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 54 72 61 6e  lite3VdbeMemTran
2ce0: 73 6c 61 74 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c  slate(Mem *pMem,
2cf0: 20 75 38 20 64 65 73 69 72 65 64 45 6e 63 29 7b   u8 desiredEnc){
2d00: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2d10: 20 7a 53 68 6f 72 74 5b 4e 42 46 53 5d 3b 20 2f   zShort[NBFS]; /
2d20: 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 68 6f 72  * Temporary shor
2d30: 74 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  t output buffer 
2d40: 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20  */.  int len;   
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d60: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67   /* Maximum leng
2d70: 74 68 20 6f 66 20 6f 75 74 70 75 74 20 73 74 72  th of output str
2d80: 69 6e 67 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ing in bytes */.
2d90: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2da0: 2a 7a 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20  *zOut;          
2db0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
2dc0: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e  t buffer */.  un
2dd0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e  signed char *zIn
2de0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2df0: 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 69 74 65      /* Input ite
2e00: 72 61 74 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67  rator */.  unsig
2e10: 6e 65 64 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b  ned char *zTerm;
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e30: 20 2f 2a 20 45 6e 64 20 6f 66 20 69 6e 70 75 74   /* End of input
2e40: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
2e50: 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20  har *z;         
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2e70: 75 74 70 75 74 20 69 74 65 72 61 74 6f 72 20 2a  utput iterator *
2e80: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  /.  unsigned int
2e90: 20 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   c;..  assert( p
2ea0: 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 53  Mem->flags&MEM_S
2eb0: 74 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tr );.  assert( 
2ec0: 70 4d 65 6d 2d 3e 65 6e 63 21 3d 64 65 73 69 72  pMem->enc!=desir
2ed0: 65 64 45 6e 63 20 29 3b 0a 20 20 61 73 73 65 72  edEnc );.  asser
2ee0: 74 28 20 70 4d 65 6d 2d 3e 65 6e 63 21 3d 30 20  t( pMem->enc!=0 
2ef0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65  );.  assert( pMe
2f00: 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 0a 23 69 66 20  m->n>=0 );..#if 
2f10: 64 65 66 69 6e 65 64 28 54 52 41 4e 53 4c 41 54  defined(TRANSLAT
2f20: 45 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69  E_TRACE) && defi
2f30: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
2f40: 29 0a 20 20 7b 0a 20 20 20 20 63 68 61 72 20 7a  ).  {.    char z
2f50: 42 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20 73 71  Buf[100];.    sq
2f60: 6c 69 74 65 33 56 64 62 65 4d 65 6d 50 72 65 74  lite3VdbeMemPret
2f70: 74 79 50 72 69 6e 74 28 70 4d 65 6d 2c 20 7a 42  tyPrint(pMem, zB
2f80: 75 66 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  uf);.    fprintf
2f90: 28 73 74 64 65 72 72 2c 20 22 49 4e 50 55 54 3a  (stderr, "INPUT:
2fa0: 20 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29 3b 0a    %s\n", zBuf);.
2fb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2fc0: 20 49 66 20 74 68 65 20 74 72 61 6e 73 6c 61 74   If the translat
2fd0: 69 6f 6e 20 69 73 20 62 65 74 77 65 65 6e 20 55  ion is between U
2fe0: 54 46 2d 31 36 20 6c 69 74 74 6c 65 20 61 6e 64  TF-16 little and
2ff0: 20 62 69 67 20 65 6e 64 69 61 6e 2c 20 74 68 65   big endian, the
3000: 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74  n .  ** all that
3010: 20 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20   is required is 
3020: 74 6f 20 73 77 61 70 20 74 68 65 20 62 79 74 65  to swap the byte
3030: 20 6f 72 64 65 72 2e 20 54 68 69 73 20 63 61 73   order. This cas
3040: 65 20 69 73 20 68 61 6e 64 6c 65 64 0a 20 20 2a  e is handled.  *
3050: 2a 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72  * differently fr
3060: 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 2e 0a 20  om the others.. 
3070: 20 2a 2f 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e   */.  if( pMem->
3080: 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc!=SQLITE_UTF8
3090: 20 26 26 20 64 65 73 69 72 65 64 45 6e 63 21 3d   && desiredEnc!=
30a0: 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20  SQLITE_UTF8 ){. 
30b0: 20 20 20 75 38 20 74 65 6d 70 3b 0a 20 20 20 20     u8 temp;.    
30c0: 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  int rc;.    rc =
30d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d   sqlite3VdbeMemM
30e0: 61 6b 65 57 72 69 74 65 61 62 6c 65 28 70 4d 65  akeWriteable(pMe
30f0: 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  m);.    if( rc!=
3100: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3110: 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
3120: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
3130: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
3140: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
3150: 20 20 20 20 7a 49 6e 20 3d 20 28 75 38 2a 29 70      zIn = (u8*)p
3160: 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 7a 54 65 72  Mem->z;.    zTer
3170: 6d 20 3d 20 26 7a 49 6e 5b 70 4d 65 6d 2d 3e 6e  m = &zIn[pMem->n
3180: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 49  ];.    while( zI
3190: 6e 3c 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  n<zTerm ){.     
31a0: 20 74 65 6d 70 20 3d 20 2a 7a 49 6e 3b 0a 20 20   temp = *zIn;.  
31b0: 20 20 20 20 2a 7a 49 6e 20 3d 20 2a 28 7a 49 6e      *zIn = *(zIn
31c0: 2b 31 29 3b 0a 20 20 20 20 20 20 7a 49 6e 2b 2b  +1);.      zIn++
31d0: 3b 0a 20 20 20 20 20 20 2a 7a 49 6e 2b 2b 20 3d  ;.      *zIn++ =
31e0: 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20   temp;.    }.   
31f0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 64 65 73   pMem->enc = des
3200: 69 72 65 64 45 6e 63 3b 0a 20 20 20 20 67 6f 74  iredEnc;.    got
3210: 6f 20 74 72 61 6e 73 6c 61 74 65 5f 6f 75 74 3b  o translate_out;
3220: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 6c  .  }..  /* Set l
3230: 65 6e 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  en to the maximu
3240: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  m number of byte
3250: 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68  s required in th
3260: 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  e output buffer.
3270: 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 69 72 65   */.  if( desire
3280: 64 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  dEnc==SQLITE_UTF
3290: 38 20 29 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e  8 ){.    /* When
32a0: 20 63 6f 6e 76 65 72 74 69 6e 67 20 66 72 6f 6d   converting from
32b0: 20 55 54 46 2d 31 36 2c 20 74 68 65 20 6d 61 78   UTF-16, the max
32c0: 69 6d 75 6d 20 67 72 6f 77 74 68 20 72 65 73 75  imum growth resu
32d0: 6c 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  lts from.    ** 
32e0: 74 72 61 6e 73 6c 61 74 69 6e 67 20 61 20 32 2d  translating a 2-
32f0: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 74  byte character t
3300: 6f 20 61 20 34 2d 62 79 74 65 20 55 54 46 2d 38  o a 4-byte UTF-8
3310: 20 63 68 61 72 61 63 74 65 72 2e 0a 20 20 20 20   character..    
3320: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 62 79 74 65  ** A single byte
3330: 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
3340: 20 74 68 65 20 6f 75 74 70 75 74 20 73 74 72 69   the output stri
3350: 6e 67 0a 20 20 20 20 2a 2a 20 6e 75 6c 2d 74 65  ng.    ** nul-te
3360: 72 6d 69 6e 61 74 6f 72 2e 0a 20 20 20 20 2a 2f  rminator..    */
3370: 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d  .    len = pMem-
3380: 3e 6e 20 2a 20 32 20 2b 20 31 3b 0a 20 20 7d 65  >n * 2 + 1;.  }e
3390: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e  lse{.    /* When
33a0: 20 63 6f 6e 76 65 72 74 69 6e 67 20 66 72 6f 6d   converting from
33b0: 20 55 54 46 2d 38 20 74 6f 20 55 54 46 2d 31 36   UTF-8 to UTF-16
33c0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 67 72 6f   the maximum gro
33d0: 77 74 68 20 69 73 20 63 61 75 73 65 64 0a 20 20  wth is caused.  
33e0: 20 20 2a 2a 20 77 68 65 6e 20 61 20 31 2d 62 79    ** when a 1-by
33f0: 74 65 20 55 54 46 2d 38 20 63 68 61 72 61 63 74  te UTF-8 charact
3400: 65 72 20 69 73 20 74 72 61 6e 73 6c 61 74 65 64  er is translated
3410: 20 69 6e 74 6f 20 61 20 32 2d 62 79 74 65 20 55   into a 2-byte U
3420: 54 46 2d 31 36 0a 20 20 20 20 2a 2a 20 63 68 61  TF-16.    ** cha
3430: 72 61 63 74 65 72 2e 20 54 77 6f 20 62 79 74 65  racter. Two byte
3440: 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20 69  s are required i
3450: 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  n the output buf
3460: 66 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20  fer for the.    
3470: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
3480: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65  r..    */.    le
3490: 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 20 2a 20 32 20  n = pMem->n * 2 
34a0: 2b 20 32 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  + 2;.  }..  /* S
34b0: 65 74 20 7a 49 6e 20 74 6f 20 70 6f 69 6e 74 20  et zIn to point 
34c0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
34d0: 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72  the input buffer
34e0: 20 61 6e 64 20 7a 54 65 72 6d 20 74 6f 20 70 6f   and zTerm to po
34f0: 69 6e 74 20 31 0a 20 20 2a 2a 20 62 79 74 65 20  int 1.  ** byte 
3500: 70 61 73 74 20 74 68 65 20 65 6e 64 2e 0a 20 20  past the end..  
3510: 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65  **.  ** Variable
3520: 20 7a 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20   zOut is set to 
3530: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 6f 75 74  point at the out
3540: 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73  put buffer. This
3550: 20 6d 61 79 20 62 65 20 73 70 61 63 65 0a 20 20   may be space.  
3560: 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ** obtained from
3570: 20 6d 61 6c 6c 6f 63 28 29 2c 20 6f 72 20 4d 65   malloc(), or Me
3580: 6d 2e 7a 53 68 6f 72 74 2c 20 69 66 20 69 74 20  m.zShort, if it 
3590: 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 61 6e 64  large enough and
35a0: 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 75 73 65   not in.  ** use
35b0: 2c 20 6f 72 20 74 68 65 20 7a 53 68 6f 72 74 20  , or the zShort 
35c0: 61 72 72 61 79 20 6f 6e 20 74 68 65 20 73 74 61  array on the sta
35d0: 63 6b 20 28 73 65 65 20 61 62 6f 76 65 29 2e 0a  ck (see above)..
35e0: 20 20 2a 2f 0a 20 20 7a 49 6e 20 3d 20 28 75 38    */.  zIn = (u8
35f0: 2a 29 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 7a 54 65  *)pMem->z;.  zTe
3600: 72 6d 20 3d 20 26 7a 49 6e 5b 70 4d 65 6d 2d 3e  rm = &zIn[pMem->
3610: 6e 5d 3b 0a 20 20 69 66 28 20 6c 65 6e 3e 4e 42  n];.  if( len>NB
3620: 46 53 20 29 7b 0a 20 20 20 20 7a 4f 75 74 20 3d  FS ){.    zOut =
3630: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
3640: 28 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 21  (len);.    if( !
3650: 7a 4f 75 74 20 29 20 72 65 74 75 72 6e 20 53 51  zOut ) return SQ
3660: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
3670: 6c 73 65 7b 0a 20 20 20 20 7a 4f 75 74 20 3d 20  lse{.    zOut = 
3680: 7a 53 68 6f 72 74 3b 0a 20 20 7d 0a 20 20 7a 20  zShort;.  }.  z 
3690: 3d 20 7a 4f 75 74 3b 0a 0a 20 20 69 66 28 20 70  = zOut;..  if( p
36a0: 4d 65 6d 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  Mem->enc==SQLITE
36b0: 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 69 66 28  _UTF8 ){.    if(
36c0: 20 64 65 73 69 72 65 64 45 6e 63 3d 3d 53 51 4c   desiredEnc==SQL
36d0: 49 54 45 5f 55 54 46 31 36 4c 45 20 29 7b 0a 20  ITE_UTF16LE ){. 
36e0: 20 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 2d 3e       /* UTF-8 ->
36f0: 20 55 54 46 2d 31 36 20 4c 69 74 74 6c 65 2d 65   UTF-16 Little-e
3700: 6e 64 69 61 6e 20 2a 2f 0a 20 20 20 20 20 20 77  ndian */.      w
3710: 68 69 6c 65 28 20 7a 49 6e 3c 7a 54 65 72 6d 20  hile( zIn<zTerm 
3720: 29 7b 0a 20 20 20 20 20 20 20 20 52 45 41 44 5f  ){.        READ_
3730: 55 54 46 38 28 7a 49 6e 2c 20 63 29 3b 20 0a 20  UTF8(zIn, c); . 
3740: 20 20 20 20 20 20 20 57 52 49 54 45 5f 55 54 46         WRITE_UTF
3750: 31 36 4c 45 28 7a 2c 20 63 29 3b 0a 20 20 20 20  16LE(z, c);.    
3760: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
3770: 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73       assert( des
3780: 69 72 65 64 45 6e 63 3d 3d 53 51 4c 49 54 45 5f  iredEnc==SQLITE_
3790: 55 54 46 31 36 42 45 20 29 3b 0a 20 20 20 20 20  UTF16BE );.     
37a0: 20 2f 2a 20 55 54 46 2d 38 20 2d 3e 20 55 54 46   /* UTF-8 -> UTF
37b0: 2d 31 36 20 42 69 67 2d 65 6e 64 69 61 6e 20 2a  -16 Big-endian *
37c0: 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  /.      while( z
37d0: 49 6e 3c 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20  In<zTerm ){.    
37e0: 20 20 20 20 52 45 41 44 5f 55 54 46 38 28 7a 49      READ_UTF8(zI
37f0: 6e 2c 20 63 29 3b 20 0a 20 20 20 20 20 20 20 20  n, c); .        
3800: 57 52 49 54 45 5f 55 54 46 31 36 42 45 28 7a 2c  WRITE_UTF16BE(z,
3810: 20 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   c);.      }.   
3820: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d   }.    pMem->n =
3830: 20 7a 20 2d 20 7a 4f 75 74 3b 0a 20 20 20 20 2a   z - zOut;.    *
3840: 7a 2b 2b 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  z++ = 0;.  }else
3850: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 65  {.    assert( de
3860: 73 69 72 65 64 45 6e 63 3d 3d 53 51 4c 49 54 45  siredEnc==SQLITE
3870: 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 69 66 28  _UTF8 );.    if(
3880: 20 70 4d 65 6d 2d 3e 65 6e 63 3d 3d 53 51 4c 49   pMem->enc==SQLI
3890: 54 45 5f 55 54 46 31 36 4c 45 20 29 7b 0a 20 20  TE_UTF16LE ){.  
38a0: 20 20 20 20 2f 2a 20 55 54 46 2d 31 36 20 4c 69      /* UTF-16 Li
38b0: 74 74 6c 65 2d 65 6e 64 69 61 6e 20 2d 3e 20 55  ttle-endian -> U
38c0: 54 46 2d 38 20 2a 2f 0a 20 20 20 20 20 20 77 68  TF-8 */.      wh
38d0: 69 6c 65 28 20 7a 49 6e 3c 7a 54 65 72 6d 20 29  ile( zIn<zTerm )
38e0: 7b 0a 20 20 20 20 20 20 20 20 52 45 41 44 5f 55  {.        READ_U
38f0: 54 46 31 36 4c 45 28 7a 49 6e 2c 20 63 29 3b 20  TF16LE(zIn, c); 
3900: 0a 20 20 20 20 20 20 20 20 57 52 49 54 45 5f 55  .        WRITE_U
3910: 54 46 38 28 7a 2c 20 63 29 3b 0a 20 20 20 20 20  TF8(z, c);.     
3920: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
3930: 20 20 20 20 2f 2a 20 55 54 46 2d 31 36 20 4c 69      /* UTF-16 Li
3940: 74 74 6c 65 2d 65 6e 64 69 61 6e 20 2d 3e 20 55  ttle-endian -> U
3950: 54 46 2d 38 20 2a 2f 0a 20 20 20 20 20 20 77 68  TF-8 */.      wh
3960: 69 6c 65 28 20 7a 49 6e 3c 7a 54 65 72 6d 20 29  ile( zIn<zTerm )
3970: 7b 0a 20 20 20 20 20 20 20 20 52 45 41 44 5f 55  {.        READ_U
3980: 54 46 31 36 42 45 28 7a 49 6e 2c 20 63 29 3b 20  TF16BE(zIn, c); 
3990: 0a 20 20 20 20 20 20 20 20 57 52 49 54 45 5f 55  .        WRITE_U
39a0: 54 46 38 28 7a 2c 20 63 29 3b 0a 20 20 20 20 20  TF8(z, c);.     
39b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65   }.    }.    pMe
39c0: 6d 2d 3e 6e 20 3d 20 7a 20 2d 20 7a 4f 75 74 3b  m->n = z - zOut;
39d0: 0a 20 20 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 20  .  }.  *z = 0;. 
39e0: 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e   assert( (pMem->
39f0: 6e 2b 28 64 65 73 69 72 65 64 45 6e 63 3d 3d 53  n+(desiredEnc==S
3a00: 51 4c 49 54 45 5f 55 54 46 38 3f 31 3a 32 29 29  QLITE_UTF8?1:2))
3a10: 3c 3d 6c 65 6e 20 29 3b 0a 0a 20 20 73 71 6c 69  <=len );..  sqli
3a20: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
3a30: 65 28 70 4d 65 6d 29 3b 0a 20 20 70 4d 65 6d 2d  e(pMem);.  pMem-
3a40: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f  >flags &= ~(MEM_
3a50: 53 74 61 74 69 63 7c 4d 45 4d 5f 44 79 6e 7c 4d  Static|MEM_Dyn|M
3a60: 45 4d 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53 68 6f  EM_Ephem|MEM_Sho
3a70: 72 74 29 3b 0a 20 20 70 4d 65 6d 2d 3e 65 6e 63  rt);.  pMem->enc
3a80: 20 3d 20 64 65 73 69 72 65 64 45 6e 63 3b 0a 20   = desiredEnc;. 
3a90: 20 69 66 28 20 7a 4f 75 74 3d 3d 7a 53 68 6f 72   if( zOut==zShor
3aa0: 74 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  t ){.    memcpy(
3ab0: 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 2c 20 7a 4f  pMem->zShort, zO
3ac0: 75 74 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 7a 4f  ut, len);.    zO
3ad0: 75 74 20 3d 20 28 75 38 2a 29 70 4d 65 6d 2d 3e  ut = (u8*)pMem->
3ae0: 7a 53 68 6f 72 74 3b 0a 20 20 20 20 70 4d 65 6d  zShort;.    pMem
3af0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 4d 45 4d 5f  ->flags |= (MEM_
3b00: 54 65 72 6d 7c 4d 45 4d 5f 53 68 6f 72 74 29 3b  Term|MEM_Short);
3b10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4d  .  }else{.    pM
3b20: 65 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 4d 45  em->flags |= (ME
3b30: 4d 5f 54 65 72 6d 7c 4d 45 4d 5f 44 79 6e 29 3b  M_Term|MEM_Dyn);
3b40: 0a 20 20 7d 0a 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .  }.  pMem->z =
3b50: 20 28 63 68 61 72 2a 29 7a 4f 75 74 3b 0a 0a 74   (char*)zOut;..t
3b60: 72 61 6e 73 6c 61 74 65 5f 6f 75 74 3a 0a 23 69  ranslate_out:.#i
3b70: 66 20 64 65 66 69 6e 65 64 28 54 52 41 4e 53 4c  f defined(TRANSL
3b80: 41 54 45 5f 54 52 41 43 45 29 20 26 26 20 64 65  ATE_TRACE) && de
3b90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
3ba0: 55 47 29 0a 20 20 7b 0a 20 20 20 20 63 68 61 72  UG).  {.    char
3bb0: 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20   zBuf[100];.    
3bc0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 50 72  sqlite3VdbeMemPr
3bd0: 65 74 74 79 50 72 69 6e 74 28 70 4d 65 6d 2c 20  ettyPrint(pMem, 
3be0: 7a 42 75 66 29 3b 0a 20 20 20 20 66 70 72 69 6e  zBuf);.    fprin
3bf0: 74 66 28 73 74 64 65 72 72 2c 20 22 4f 55 54 50  tf(stderr, "OUTP
3c00: 55 54 3a 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29  UT: %s\n", zBuf)
3c10: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
3c20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
3c30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
3c40: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 66 6f  outine checks fo
3c50: 72 20 61 20 62 79 74 65 2d 6f 72 64 65 72 20 6d  r a byte-order m
3c60: 61 72 6b 20 61 74 20 74 68 65 20 62 65 67 69 6e  ark at the begin
3c70: 6e 69 6e 67 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ning of the .** 
3c80: 55 54 46 2d 31 36 20 73 74 72 69 6e 67 20 73 74  UTF-16 string st
3c90: 6f 72 65 64 20 69 6e 20 2a 70 4d 65 6d 2e 20 49  ored in *pMem. I
3ca0: 66 20 6f 6e 65 20 69 73 20 70 72 65 73 65 6e 74  f one is present
3cb0: 2c 20 69 74 20 69 73 20 72 65 6d 6f 76 65 64 20  , it is removed 
3cc0: 61 6e 64 0a 2a 2a 20 74 68 65 20 65 6e 63 6f 64  and.** the encod
3cd0: 69 6e 67 20 6f 66 20 74 68 65 20 4d 65 6d 20 61  ing of the Mem a
3ce0: 64 6a 75 73 74 65 64 2e 20 54 68 69 73 20 72 6f  djusted. This ro
3cf0: 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 64  utine does not d
3d00: 6f 20 61 6e 79 0a 2a 2a 20 62 79 74 65 2d 73 77  o any.** byte-sw
3d10: 61 70 70 69 6e 67 2c 20 69 74 20 6a 75 73 74 20  apping, it just 
3d20: 73 65 74 73 20 4d 65 6d 2e 65 6e 63 20 61 70 70  sets Mem.enc app
3d30: 72 6f 70 72 69 61 74 65 6c 79 2e 0a 2a 2a 0a 2a  ropriately..**.*
3d40: 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  * The allocation
3d50: 20 28 73 74 61 74 69 63 2c 20 64 79 6e 61 6d 69   (static, dynami
3d60: 63 20 65 74 63 2e 29 20 61 6e 64 20 65 6e 63 6f  c etc.) and enco
3d70: 64 69 6e 67 20 6f 66 20 74 68 65 20 4d 65 6d 20  ding of the Mem 
3d80: 6d 61 79 20 62 65 0a 2a 2a 20 63 68 61 6e 67 65  may be.** change
3d90: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
3da0: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
3db0: 65 33 56 64 62 65 4d 65 6d 48 61 6e 64 6c 65 42  e3VdbeMemHandleB
3dc0: 6f 6d 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20  om(Mem *pMem){. 
3dd0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
3de0: 5f 4f 4b 3b 0a 20 20 75 38 20 62 6f 6d 20 3d 20  _OK;.  u8 bom = 
3df0: 30 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e  0;..  if( pMem->
3e00: 6e 3c 30 20 7c 7c 20 70 4d 65 6d 2d 3e 6e 3e 31  n<0 || pMem->n>1
3e10: 20 29 7b 0a 20 20 20 20 75 38 20 62 31 20 3d 20   ){.    u8 b1 = 
3e20: 2a 28 75 38 20 2a 29 70 4d 65 6d 2d 3e 7a 3b 0a  *(u8 *)pMem->z;.
3e30: 20 20 20 20 75 38 20 62 32 20 3d 20 2a 28 28 28      u8 b2 = *(((
3e40: 75 38 20 2a 29 70 4d 65 6d 2d 3e 7a 29 20 2b 20  u8 *)pMem->z) + 
3e50: 31 29 3b 0a 20 20 20 20 69 66 28 20 62 31 3d 3d  1);.    if( b1==
3e60: 30 78 46 45 20 26 26 20 62 32 3d 3d 30 78 46 46  0xFE && b2==0xFF
3e70: 20 29 7b 0a 20 20 20 20 20 20 62 6f 6d 20 3d 20   ){.      bom = 
3e80: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a  SQLITE_UTF16BE;.
3e90: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 31      }.    if( b1
3ea0: 3d 3d 30 78 46 46 20 26 26 20 62 32 3d 3d 30 78  ==0xFF && b2==0x
3eb0: 46 45 20 29 7b 0a 20 20 20 20 20 20 62 6f 6d 20  FE ){.      bom 
3ec0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  = SQLITE_UTF16LE
3ed0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
3ee0: 20 69 66 28 20 62 6f 6d 20 29 7b 0a 20 20 20 20   if( bom ){.    
3ef0: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3f00: 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 73 6f   is called as so
3f10: 6f 6e 20 61 73 20 61 20 73 74 72 69 6e 67 20 69  on as a string i
3f20: 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 4d 65  s stored in a Me
3f30: 6d 2a 2c 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  m*,.    ** from 
3f40: 77 69 74 68 69 6e 20 73 71 6c 69 74 65 33 56 64  within sqlite3Vd
3f50: 62 65 4d 65 6d 53 65 74 53 74 72 28 29 2e 20 41  beMemSetStr(). A
3f60: 74 20 74 68 61 74 20 70 6f 69 6e 74 20 69 74 20  t that point it 
3f70: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 0a  is not possible.
3f80: 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 73      ** for the s
3f90: 74 72 69 6e 67 20 74 6f 20 62 65 20 73 74 6f 72  tring to be stor
3fa0: 65 64 20 69 6e 20 4d 65 6d 2e 7a 53 68 6f 72 74  ed in Mem.zShort
3fb0: 2c 20 6f 72 20 66 6f 72 20 69 74 20 74 6f 20 62  , or for it to b
3fc0: 65 20 73 74 6f 72 65 64 0a 20 20 20 20 2a 2a 20  e stored.    ** 
3fd0: 69 6e 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72  in dynamic memor
3fe0: 79 20 77 69 74 68 20 6e 6f 20 64 65 73 74 72 75  y with no destru
3ff0: 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ctor..    */.   
4000: 20 61 73 73 65 72 74 28 20 21 28 70 4d 65 6d 2d   assert( !(pMem-
4010: 3e 66 6c 61 67 73 26 4d 45 4d 5f 53 68 6f 72 74  >flags&MEM_Short
4020: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
4030: 20 21 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d   !(pMem->flags&M
4040: 45 4d 5f 44 79 6e 29 20 7c 7c 20 70 4d 65 6d 2d  EM_Dyn) || pMem-
4050: 3e 78 44 65 6c 20 29 3b 0a 20 20 20 20 69 66 28  >xDel );.    if(
4060: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
4070: 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20  EM_Dyn ){.      
4080: 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69  void (*xDel)(voi
4090: 64 2a 29 20 3d 20 70 4d 65 6d 2d 3e 78 44 65 6c  d*) = pMem->xDel
40a0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20  ;.      char *z 
40b0: 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20  = pMem->z;.     
40c0: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20   pMem->z = 0;.  
40d0: 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d      pMem->xDel =
40e0: 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
40f0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
4100: 53 74 72 28 70 4d 65 6d 2c 20 26 7a 5b 32 5d 2c  Str(pMem, &z[2],
4110: 20 70 4d 65 6d 2d 3e 6e 2d 32 2c 20 62 6f 6d 2c   pMem->n-2, bom,
4120: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
4130: 54 29 3b 0a 20 20 20 20 20 20 78 44 65 6c 28 7a  T);.      xDel(z
4140: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
4150: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4160: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d  VdbeMemSetStr(pM
4170: 65 6d 2c 20 26 70 4d 65 6d 2d 3e 7a 5b 32 5d 2c  em, &pMem->z[2],
4180: 20 70 4d 65 6d 2d 3e 6e 2d 32 2c 20 62 6f 6d 2c   pMem->n-2, bom,
4190: 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49   .          SQLI
41a0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
41b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
41c0: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
41d0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
41e0: 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 70 5a  F16 */../*.** pZ
41f0: 20 69 73 20 61 20 55 54 46 2d 38 20 65 6e 63 6f   is a UTF-8 enco
4200: 64 65 64 20 75 6e 69 63 6f 64 65 20 73 74 72 69  ded unicode stri
4210: 6e 67 2e 20 49 66 20 6e 42 79 74 65 20 69 73 20  ng. If nByte is 
4220: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 0a  less than zero,.
4230: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  ** return the nu
4240: 6d 62 65 72 20 6f 66 20 75 6e 69 63 6f 64 65 20  mber of unicode 
4250: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 70 5a  characters in pZ
4260: 20 75 70 20 74 6f 20 28 62 75 74 20 6e 6f 74 20   up to (but not 
4270: 69 6e 63 6c 75 64 69 6e 67 29 0a 2a 2a 20 74 68  including).** th
4280: 65 20 66 69 72 73 74 20 30 78 30 30 20 62 79 74  e first 0x00 byt
4290: 65 2e 20 49 66 20 6e 42 79 74 65 20 69 73 20 6e  e. If nByte is n
42a0: 6f 74 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  ot less than zer
42b0: 6f 2c 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a  o, return the.**
42c0: 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 63 6f   number of unico
42d0: 64 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  de characters in
42e0: 20 74 68 65 20 66 69 72 73 74 20 6e 42 79 74 65   the first nByte
42f0: 20 6f 66 20 70 5a 20 28 6f 72 20 75 70 20 74 6f   of pZ (or up to
4300: 20 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 30   .** the first 0
4310: 78 30 30 2c 20 77 68 69 63 68 65 76 65 72 20 63  x00, whichever c
4320: 6f 6d 65 73 20 66 69 72 73 74 29 2e 0a 2a 2f 0a  omes first)..*/.
4330: 69 6e 74 20 73 71 6c 69 74 65 33 75 74 66 38 43  int sqlite3utf8C
4340: 68 61 72 4c 65 6e 28 63 6f 6e 73 74 20 63 68 61  harLen(const cha
4350: 72 20 2a 7a 2c 20 69 6e 74 20 6e 42 79 74 65 29  r *z, int nByte)
4360: 7b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  {.  int r = 0;. 
4370: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
4380: 72 6d 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e  rm;.  if( nByte>
4390: 3d 30 20 29 7b 0a 20 20 20 20 7a 54 65 72 6d 20  =0 ){.    zTerm 
43a0: 3d 20 26 7a 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d  = &z[nByte];.  }
43b0: 65 6c 73 65 7b 0a 20 20 20 20 7a 54 65 72 6d 20  else{.    zTerm 
43c0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
43d0: 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  (-1);.  }.  asse
43e0: 72 74 28 20 7a 3c 3d 7a 54 65 72 6d 20 29 3b 0a  rt( z<=zTerm );.
43f0: 20 20 77 68 69 6c 65 28 20 2a 7a 21 3d 30 20 26    while( *z!=0 &
4400: 26 20 7a 3c 7a 54 65 72 6d 20 29 7b 0a 20 20 20  & z<zTerm ){.   
4410: 20 53 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a 20   SKIP_UTF8(z);. 
4420: 20 20 20 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65     r++;.  }.  re
4430: 74 75 72 6e 20 72 3b 0a 7d 0a 0a 23 69 66 6e 64  turn r;.}..#ifnd
4440: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
4450: 54 46 31 36 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  TF16./*.** Conve
4460: 72 74 20 61 20 55 54 46 2d 31 36 20 73 74 72 69  rt a UTF-16 stri
4470: 6e 67 20 69 6e 20 74 68 65 20 6e 61 74 69 76 65  ng in the native
4480: 20 65 6e 63 6f 64 69 6e 67 20 69 6e 74 6f 20 61   encoding into a
4490: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e 0a 2a   UTF-8 string..*
44a0: 2a 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64  * Memory to hold
44b0: 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e   the UTF-8 strin
44c0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
44d0: 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75  om malloc and mu
44e0: 73 74 20 62 65 0a 2a 2a 20 66 72 65 65 64 20 62  st be.** freed b
44f0: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
4500: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 55  nction..**.** NU
4510: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  LL is returned i
4520: 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 6c  f there is an al
4530: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2e 0a  location error..
4540: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
4550: 75 74 66 31 36 74 6f 38 28 63 6f 6e 73 74 20 76  utf16to8(const v
4560: 6f 69 64 20 2a 7a 2c 20 69 6e 74 20 6e 42 79 74  oid *z, int nByt
4570: 65 29 7b 0a 20 20 4d 65 6d 20 6d 3b 0a 20 20 6d  e){.  Mem m;.  m
4580: 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a  emset(&m, 0, siz
4590: 65 6f 66 28 6d 29 29 3b 0a 20 20 73 71 6c 69 74  eof(m));.  sqlit
45a0: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
45b0: 26 6d 2c 20 7a 2c 20 6e 42 79 74 65 2c 20 53 51  &m, z, nByte, SQ
45c0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
45d0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
45e0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
45f0: 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 26 6d  hangeEncoding(&m
4600: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
4610: 20 20 61 73 73 65 72 74 28 20 28 6d 2e 66 6c 61    assert( (m.fla
4620: 67 73 20 26 20 4d 45 4d 5f 54 65 72 6d 29 21 3d  gs & MEM_Term)!=
4630: 30 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c  0 || sqlite3Mall
4640: 6f 63 46 61 69 6c 65 64 28 29 20 29 3b 0a 20 20  ocFailed() );.  
4650: 61 73 73 65 72 74 28 20 28 6d 2e 66 6c 61 67 73  assert( (m.flags
4660: 20 26 20 4d 45 4d 5f 53 74 72 29 21 3d 30 20 7c   & MEM_Str)!=0 |
4670: 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  | sqlite3MallocF
4680: 61 69 6c 65 64 28 29 20 29 3b 0a 20 20 72 65 74  ailed() );.  ret
4690: 75 72 6e 20 28 6d 2e 66 6c 61 67 73 20 26 20 4d  urn (m.flags & M
46a0: 45 4d 5f 44 79 6e 29 21 3d 30 20 3f 20 6d 2e 7a  EM_Dyn)!=0 ? m.z
46b0: 20 3a 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   : sqliteStrDup(
46c0: 6d 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  m.z);.}../*.** p
46d0: 5a 20 69 73 20 61 20 55 54 46 2d 31 36 20 65 6e  Z is a UTF-16 en
46e0: 63 6f 64 65 64 20 75 6e 69 63 6f 64 65 20 73 74  coded unicode st
46f0: 72 69 6e 67 2e 20 49 66 20 6e 43 68 61 72 20 69  ring. If nChar i
4700: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
4710: 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20  ,.** return the 
4720: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
4730: 75 70 20 74 6f 20 28 62 75 74 20 6e 6f 74 20 69  up to (but not i
4740: 6e 63 6c 75 64 69 6e 67 29 2c 20 74 68 65 20 66  ncluding), the f
4750: 69 72 73 74 20 70 61 69 72 0a 2a 2a 20 6f 66 20  irst pair.** of 
4760: 63 6f 6e 73 65 63 75 74 69 76 65 20 30 78 30 30  consecutive 0x00
4770: 20 62 79 74 65 73 20 69 6e 20 70 5a 2e 20 49 66   bytes in pZ. If
4780: 20 6e 43 68 61 72 20 69 73 20 6e 6f 74 20 6c 65   nChar is not le
4790: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 0a 2a 2a  ss than zero,.**
47a0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
47b0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
47c0: 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 43   in the first nC
47d0: 68 61 72 20 75 6e 69 63 6f 64 65 20 63 68 61 72  har unicode char
47e0: 61 63 74 65 72 73 0a 2a 2a 20 69 6e 20 70 5a 20  acters.** in pZ 
47f0: 28 6f 72 20 75 70 20 75 6e 74 69 6c 20 74 68 65  (or up until the
4800: 20 66 69 72 73 74 20 70 61 69 72 20 6f 66 20 30   first pair of 0
4810: 78 30 30 20 62 79 74 65 73 2c 20 77 68 69 63 68  x00 bytes, which
4820: 65 76 65 72 20 63 6f 6d 65 73 20 66 69 72 73 74  ever comes first
4830: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
4840: 33 75 74 66 31 36 42 79 74 65 4c 65 6e 28 63 6f  3utf16ByteLen(co
4850: 6e 73 74 20 76 6f 69 64 20 2a 7a 49 6e 2c 20 69  nst void *zIn, i
4860: 6e 74 20 6e 43 68 61 72 29 7b 0a 20 20 75 6e 73  nt nChar){.  uns
4870: 69 67 6e 65 64 20 69 6e 74 20 63 20 3d 20 31 3b  igned int c = 1;
4880: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
4890: 20 3d 20 7a 49 6e 3b 0a 20 20 69 6e 74 20 6e 20   = zIn;.  int n 
48a0: 3d 20 30 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  = 0;.  if( SQLIT
48b0: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3d 3d 53  E_UTF16NATIVE==S
48c0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b  QLITE_UTF16BE ){
48d0: 0a 20 20 20 20 2f 2a 20 55 73 69 6e 67 20 61 6e  .    /* Using an
48e0: 20 22 69 66 20 28 53 51 4c 49 54 45 5f 55 54 46   "if (SQLITE_UTF
48f0: 31 36 4e 41 54 49 56 45 3d 3d 53 51 4c 49 54 45  16NATIVE==SQLITE
4900: 5f 55 54 46 31 36 42 45 29 22 20 63 6f 6e 73 74  _UTF16BE)" const
4910: 72 75 63 74 20 68 65 72 65 0a 20 20 20 20 2a 2a  ruct here.    **
4920: 20 61 6e 64 20 69 6e 20 6f 74 68 65 72 20 70 61   and in other pa
4930: 72 74 73 20 6f 66 20 74 68 69 73 20 66 69 6c 65  rts of this file
4940: 20 6d 65 61 6e 73 20 74 68 61 74 20 61 74 20 6f   means that at o
4950: 6e 65 20 62 72 61 6e 63 68 20 77 69 6c 6c 0a 20  ne branch will. 
4960: 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 63 6f 76     ** not be cov
4970: 65 72 65 64 20 62 79 20 63 6f 76 65 72 61 67 65  ered by coverage
4980: 20 74 65 73 74 69 6e 67 20 6f 6e 20 61 6e 79 20   testing on any 
4990: 73 69 6e 67 6c 65 20 68 6f 73 74 2e 20 42 75 74  single host. But
49a0: 20 63 6f 76 65 72 61 67 65 0a 20 20 20 20 2a 2a   coverage.    **
49b0: 20 77 69 6c 6c 20 62 65 20 63 6f 6d 70 6c 65 74   will be complet
49c0: 65 20 69 66 20 74 68 65 20 74 65 73 74 73 20 61  e if the tests a
49d0: 72 65 20 72 75 6e 20 6f 6e 20 62 6f 74 68 20 61  re run on both a
49e0: 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 61   little-endian a
49f0: 6e 64 20 0a 20 20 20 20 2a 2a 20 62 69 67 2d 65  nd .    ** big-e
4a00: 6e 64 69 61 6e 20 68 6f 73 74 2e 20 42 65 63 61  ndian host. Beca
4a10: 75 73 65 20 62 6f 74 68 20 74 68 65 20 55 54 46  use both the UTF
4a20: 31 36 4e 41 54 49 56 45 20 61 6e 64 20 53 51 4c  16NATIVE and SQL
4a30: 49 54 45 5f 55 54 46 31 36 42 45 0a 20 20 20 20  ITE_UTF16BE.    
4a40: 2a 2a 20 6d 61 63 72 6f 73 20 61 72 65 20 63 6f  ** macros are co
4a50: 6e 73 74 61 6e 74 20 61 74 20 63 6f 6d 70 69 6c  nstant at compil
4a60: 65 20 74 69 6d 65 20 74 68 65 20 63 6f 6d 70 69  e time the compi
4a70: 6c 65 72 20 63 61 6e 20 64 65 74 65 72 6d 69 6e  ler can determin
4a80: 65 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 62  e.    ** which b
4a90: 72 61 6e 63 68 20 77 69 6c 6c 20 62 65 20 66 6f  ranch will be fo
4aa0: 6c 6c 6f 77 65 64 2e 20 49 74 20 69 73 20 74 68  llowed. It is th
4ab0: 65 72 65 66 6f 72 65 20 61 73 73 75 6d 65 64 20  erefore assumed 
4ac0: 74 68 61 74 20 6e 6f 20 72 75 6e 74 69 6d 65 0a  that no runtime.
4ad0: 20 20 20 20 2a 2a 20 70 65 6e 61 6c 74 79 20 69      ** penalty i
4ae0: 73 20 70 61 69 64 20 66 6f 72 20 74 68 69 73 20  s paid for this 
4af0: 22 69 66 22 20 73 74 61 74 65 6d 65 6e 74 2e 0a  "if" statement..
4b00: 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
4b10: 28 20 63 20 26 26 20 28 28 6e 43 68 61 72 3c 30  ( c && ((nChar<0
4b20: 29 20 7c 7c 20 6e 3c 6e 43 68 61 72 29 20 29 7b  ) || n<nChar) ){
4b30: 0a 20 20 20 20 20 20 52 45 41 44 5f 55 54 46 31  .      READ_UTF1
4b40: 36 42 45 28 7a 2c 20 63 29 3b 0a 20 20 20 20 20  6BE(z, c);.     
4b50: 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   n++;.    }.  }e
4b60: 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
4b70: 63 20 26 26 20 28 28 6e 43 68 61 72 3c 30 29 20  c && ((nChar<0) 
4b80: 7c 7c 20 6e 3c 6e 43 68 61 72 29 20 29 7b 0a 20  || n<nChar) ){. 
4b90: 20 20 20 20 20 52 45 41 44 5f 55 54 46 31 36 4c       READ_UTF16L
4ba0: 45 28 7a 2c 20 63 29 3b 0a 20 20 20 20 20 20 6e  E(z, c);.      n
4bb0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
4bc0: 72 65 74 75 72 6e 20 28 7a 2d 28 63 68 61 72 20  return (z-(char 
4bd0: 63 6f 6e 73 74 20 2a 29 7a 49 6e 29 2d 28 28 63  const *)zIn)-((c
4be0: 3d 3d 30 29 3f 32 3a 30 29 3b 0a 7d 0a 0a 2f 2a  ==0)?2:0);.}../*
4bf0: 0a 2a 2a 20 55 54 46 2d 31 36 20 69 6d 70 6c 65  .** UTF-16 imple
4c00: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
4c10: 20 73 75 62 73 74 72 28 29 0a 2a 2f 0a 76 6f 69   substr().*/.voi
4c20: 64 20 73 71 6c 69 74 65 33 75 74 66 31 36 53 75  d sqlite3utf16Su
4c30: 62 73 74 72 28 0a 20 20 73 71 6c 69 74 65 33 5f  bstr(.  sqlite3_
4c40: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
4c50: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
4c60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
4c70: 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 79 2c  argv.){.  int y,
4c80: 20 7a 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   z;.  unsigned c
4c90: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 53 74 72 3b  har const *zStr;
4ca0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4cb0: 20 63 6f 6e 73 74 20 2a 7a 53 74 72 45 6e 64 3b   const *zStrEnd;
4cc0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4cd0: 20 63 6f 6e 73 74 20 2a 7a 53 74 61 72 74 3b 0a   const *zStart;.
4ce0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
4cf0: 63 6f 6e 73 74 20 2a 7a 45 6e 64 3b 0a 20 20 69  const *zEnd;.  i
4d00: 6e 74 20 69 3b 0a 0a 20 20 7a 53 74 72 20 3d 20  nt i;..  zStr = 
4d10: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  (unsigned char c
4d20: 6f 6e 73 74 20 2a 29 73 71 6c 69 74 65 33 5f 76  onst *)sqlite3_v
4d30: 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67 76  alue_text16(argv
4d40: 5b 30 5d 29 3b 0a 20 20 7a 53 74 72 45 6e 64 20  [0]);.  zStrEnd 
4d50: 3d 20 26 7a 53 74 72 5b 73 71 6c 69 74 65 33 5f  = &zStr[sqlite3_
4d60: 76 61 6c 75 65 5f 62 79 74 65 73 31 36 28 61 72  value_bytes16(ar
4d70: 67 76 5b 30 5d 29 5d 3b 0a 20 20 79 20 3d 20 73  gv[0])];.  y = s
4d80: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
4d90: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 7a 20 3d  (argv[1]);.  z =
4da0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
4db0: 6e 74 28 61 72 67 76 5b 32 5d 29 3b 0a 0a 20 20  nt(argv[2]);..  
4dc0: 69 66 28 20 79 3e 30 20 29 7b 0a 20 20 20 20 79  if( y>0 ){.    y
4dd0: 20 3d 20 79 2d 31 3b 0a 20 20 20 20 7a 53 74 61   = y-1;.    zSta
4de0: 72 74 20 3d 20 7a 53 74 72 3b 0a 20 20 20 20 69  rt = zStr;.    i
4df0: 66 28 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  f( SQLITE_UTF16B
4e00: 45 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  E==SQLITE_UTF16N
4e10: 41 54 49 56 45 20 29 7b 0a 20 20 20 20 20 20 66  ATIVE ){.      f
4e20: 6f 72 28 69 3d 30 3b 20 69 3c 79 20 26 26 20 7a  or(i=0; i<y && z
4e30: 53 74 61 72 74 3c 7a 53 74 72 45 6e 64 3b 20 69  Start<zStrEnd; i
4e40: 2b 2b 29 20 53 4b 49 50 5f 55 54 46 31 36 42 45  ++) SKIP_UTF16BE
4e50: 28 7a 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65  (zStart);.    }e
4e60: 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  lse{.      for(i
4e70: 3d 30 3b 20 69 3c 79 20 26 26 20 7a 53 74 61 72  =0; i<y && zStar
4e80: 74 3c 7a 53 74 72 45 6e 64 3b 20 69 2b 2b 29 20  t<zStrEnd; i++) 
4e90: 53 4b 49 50 5f 55 54 46 31 36 4c 45 28 7a 53 74  SKIP_UTF16LE(zSt
4ea0: 61 72 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  art);.    }.  }e
4eb0: 6c 73 65 7b 0a 20 20 20 20 7a 53 74 61 72 74 20  lse{.    zStart 
4ec0: 3d 20 7a 53 74 72 45 6e 64 3b 0a 20 20 20 20 69  = zStrEnd;.    i
4ed0: 66 28 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  f( SQLITE_UTF16B
4ee0: 45 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  E==SQLITE_UTF16N
4ef0: 41 54 49 56 45 20 29 7b 0a 20 20 20 20 20 20 66  ATIVE ){.      f
4f00: 6f 72 28 69 3d 79 3b 20 69 3c 30 20 26 26 20 7a  or(i=y; i<0 && z
4f10: 53 74 61 72 74 3e 7a 53 74 72 3b 20 69 2b 2b 29  Start>zStr; i++)
4f20: 20 52 53 4b 49 50 5f 55 54 46 31 36 42 45 28 7a   RSKIP_UTF16BE(z
4f30: 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73  Start);.    }els
4f40: 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 79  e{.      for(i=y
4f50: 3b 20 69 3c 30 20 26 26 20 7a 53 74 61 72 74 3e  ; i<0 && zStart>
4f60: 7a 53 74 72 3b 20 69 2b 2b 29 20 52 53 4b 49 50  zStr; i++) RSKIP
4f70: 5f 55 54 46 31 36 4c 45 28 7a 53 74 61 72 74 29  _UTF16LE(zStart)
4f80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
4f90: 3b 20 69 3c 30 3b 20 69 2b 2b 29 20 7a 20 2d 3d  ; i<0; i++) z -=
4fa0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 7a 45 6e 64 20   1;.  }..  zEnd 
4fb0: 3d 20 7a 53 74 61 72 74 3b 0a 20 20 69 66 28 20  = zStart;.  if( 
4fc0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3d 3d  SQLITE_UTF16BE==
4fd0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
4fe0: 56 45 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  VE ){.    for(i=
4ff0: 30 3b 20 69 3c 7a 20 26 26 20 7a 45 6e 64 3c 7a  0; i<z && zEnd<z
5000: 53 74 72 45 6e 64 3b 20 69 2b 2b 29 20 53 4b 49  StrEnd; i++) SKI
5010: 50 5f 55 54 46 31 36 42 45 28 7a 45 6e 64 29 3b  P_UTF16BE(zEnd);
5020: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
5030: 72 28 69 3d 30 3b 20 69 3c 7a 20 26 26 20 7a 45  r(i=0; i<z && zE
5040: 6e 64 3c 7a 53 74 72 45 6e 64 3b 20 69 2b 2b 29  nd<zStrEnd; i++)
5050: 20 53 4b 49 50 5f 55 54 46 31 36 4c 45 28 7a 45   SKIP_UTF16LE(zE
5060: 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  nd);.  }..  sqli
5070: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31  te3_result_text1
5080: 36 28 63 6f 6e 74 65 78 74 2c 20 7a 53 74 61 72  6(context, zStar
5090: 74 2c 20 7a 45 6e 64 2d 7a 53 74 61 72 74 2c 20  t, zEnd-zStart, 
50a0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
50b0: 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  );.}..#if define
50c0: 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
50d0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
50e0: 65 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  e is called from
50f0: 20 74 68 65 20 54 43 4c 20 74 65 73 74 20 66 75   the TCL test fu
5100: 6e 63 74 69 6f 6e 20 22 74 72 61 6e 73 6c 61 74  nction "translat
5110: 65 5f 73 65 6c 66 74 65 73 74 22 2e 0a 2a 2a 20  e_selftest"..** 
5120: 49 74 20 63 68 65 63 6b 73 20 74 68 61 74 20 74  It checks that t
5130: 68 65 20 70 72 69 6d 69 74 69 76 65 73 20 66 6f  he primitives fo
5140: 72 20 73 65 72 69 61 6c 69 7a 69 6e 67 20 61 6e  r serializing an
5150: 64 20 64 65 73 65 72 69 61 6c 69 7a 69 6e 67 0a  d deserializing.
5160: 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  ** characters in
5170: 20 65 61 63 68 20 65 6e 63 6f 64 69 6e 67 20 61   each encoding a
5180: 72 65 20 69 6e 76 65 72 73 65 73 20 6f 66 20 65  re inverses of e
5190: 61 63 68 20 6f 74 68 65 72 2e 0a 2a 2f 0a 76 6f  ach other..*/.vo
51a0: 69 64 20 73 71 6c 69 74 65 33 75 74 66 53 65 6c  id sqlite3utfSel
51b0: 66 54 65 73 74 28 29 7b 0a 20 20 75 6e 73 69 67  fTest(){.  unsig
51c0: 6e 65 64 20 69 6e 74 20 69 2c 20 74 3b 0a 20 20  ned int i, t;.  
51d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 42  unsigned char zB
51e0: 75 66 5b 32 30 5d 3b 0a 20 20 75 6e 73 69 67 6e  uf[20];.  unsign
51f0: 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e  ed char *z;.  in
5200: 74 20 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t n;.  unsigned 
5210: 69 6e 74 20 63 3b 0a 0a 20 20 66 6f 72 28 69 3d  int c;..  for(i=
5220: 30 3b 20 69 3c 30 78 30 30 31 31 30 30 30 30 3b  0; i<0x00110000;
5230: 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 20 3d 20 7a   i++){.    z = z
5240: 42 75 66 3b 0a 20 20 20 20 57 52 49 54 45 5f 55  Buf;.    WRITE_U
5250: 54 46 38 28 7a 2c 20 69 29 3b 0a 20 20 20 20 6e  TF8(z, i);.    n
5260: 20 3d 20 7a 2d 7a 42 75 66 3b 0a 20 20 20 20 7a   = z-zBuf;.    z
5270: 20 3d 20 7a 42 75 66 3b 0a 20 20 20 20 52 45 41   = zBuf;.    REA
5280: 44 5f 55 54 46 38 28 7a 2c 20 63 29 3b 0a 20 20  D_UTF8(z, c);.  
5290: 20 20 74 20 3d 20 69 3b 0a 20 20 20 20 69 66 28    t = i;.    if(
52a0: 20 69 3e 3d 30 78 44 38 30 30 20 26 26 20 69 3c   i>=0xD800 && i<
52b0: 3d 30 78 44 46 46 46 20 29 20 74 20 3d 20 30 78  =0xDFFF ) t = 0x
52c0: 46 46 46 44 3b 0a 20 20 20 20 69 66 28 20 28 69  FFFD;.    if( (i
52d0: 26 30 78 46 46 46 46 46 46 46 45 29 3d 3d 30 78  &0xFFFFFFFE)==0x
52e0: 46 46 46 45 20 29 20 74 20 3d 20 30 78 46 46 46  FFFE ) t = 0xFFF
52f0: 44 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  D;.    assert( c
5300: 3d 3d 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==t );.    asser
5310: 74 28 20 28 7a 2d 7a 42 75 66 29 3d 3d 6e 20 29  t( (z-zBuf)==n )
5320: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
5330: 20 69 3c 30 78 30 30 31 31 30 30 30 30 3b 20 69   i<0x00110000; i
5340: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3e 3d  ++){.    if( i>=
5350: 30 78 44 38 30 30 20 26 26 20 69 3c 3d 30 78 45  0xD800 && i<=0xE
5360: 30 30 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  000 ) continue;.
5370: 20 20 20 20 7a 20 3d 20 7a 42 75 66 3b 0a 20 20      z = zBuf;.  
5380: 20 20 57 52 49 54 45 5f 55 54 46 31 36 4c 45 28    WRITE_UTF16LE(
5390: 7a 2c 20 69 29 3b 0a 20 20 20 20 6e 20 3d 20 7a  z, i);.    n = z
53a0: 2d 7a 42 75 66 3b 0a 20 20 20 20 7a 20 3d 20 7a  -zBuf;.    z = z
53b0: 42 75 66 3b 0a 20 20 20 20 52 45 41 44 5f 55 54  Buf;.    READ_UT
53c0: 46 31 36 4c 45 28 7a 2c 20 63 29 3b 0a 20 20 20  F16LE(z, c);.   
53d0: 20 61 73 73 65 72 74 28 20 63 3d 3d 69 20 29 3b   assert( c==i );
53e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 7a 2d  .    assert( (z-
53f0: 7a 42 75 66 29 3d 3d 6e 20 29 3b 0a 20 20 7d 0a  zBuf)==n );.  }.
5400: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 30 78 30    for(i=0; i<0x0
5410: 30 31 31 30 30 30 30 3b 20 69 2b 2b 29 7b 0a 20  0110000; i++){. 
5420: 20 20 20 69 66 28 20 69 3e 3d 30 78 44 38 30 30     if( i>=0xD800
5430: 20 26 26 20 69 3c 3d 30 78 45 30 30 30 20 29 20   && i<=0xE000 ) 
5440: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 20  continue;.    z 
5450: 3d 20 7a 42 75 66 3b 0a 20 20 20 20 57 52 49 54  = zBuf;.    WRIT
5460: 45 5f 55 54 46 31 36 42 45 28 7a 2c 20 69 29 3b  E_UTF16BE(z, i);
5470: 0a 20 20 20 20 6e 20 3d 20 7a 2d 7a 42 75 66 3b  .    n = z-zBuf;
5480: 0a 20 20 20 20 7a 20 3d 20 7a 42 75 66 3b 0a 20  .    z = zBuf;. 
5490: 20 20 20 52 45 41 44 5f 55 54 46 31 36 42 45 28     READ_UTF16BE(
54a0: 7a 2c 20 63 29 3b 0a 20 20 20 20 61 73 73 65 72  z, c);.    asser
54b0: 74 28 20 63 3d 3d 69 20 29 3b 0a 20 20 20 20 61  t( c==i );.    a
54c0: 73 73 65 72 74 28 20 28 7a 2d 7a 42 75 66 29 3d  ssert( (z-zBuf)=
54d0: 3d 6e 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  =n );.  }.}.#end
54e0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53  if /* SQLITE_TES
54f0: 54 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53  T */.#endif /* S
5500: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
5510: 20 2a 2f 0a                                       */.