/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 67ecb1032bc0b42c105e88d65ef9d9f626eb0e1f:


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 33 20 32  : utf.c,v 1.43 2
01f0: 30 30 36 2f 31 30 2f 31 39 20 30 31 3a 35 38 3a  006/10/19 01:58:
0200: 34 34 20 64 72 68 20 45 78 70 20 24 0a 2a 2a 0a  44 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 69 73 20  .h"../*.** This 
0950: 74 61 62 6c 65 20 6d 61 70 73 20 66 72 6f 6d 20  table maps from 
0960: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
0970: 66 20 61 20 55 54 46 2d 38 20 63 68 61 72 61 63  f a UTF-8 charac
0980: 74 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ter to the numbe
0990: 72 0a 2a 2a 20 6f 66 20 74 72 61 69 6c 69 6e 67  r.** of trailing
09a0: 20 62 79 74 65 73 20 65 78 70 65 63 74 65 64 2e   bytes expected.
09b0: 20 41 20 76 61 6c 75 65 20 27 34 27 20 69 6e 64   A value '4' ind
09c0: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
09d0: 74 61 62 6c 65 20 6b 65 79 0a 2a 2a 20 69 73 20  table key.** is 
09e0: 6e 6f 74 20 61 20 6c 65 67 61 6c 20 66 69 72 73  not a legal firs
09f0: 74 20 62 79 74 65 20 66 6f 72 20 61 20 55 54 46  t byte for a UTF
0a00: 2d 38 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  -8 character..*/
0a10: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38  .static const u8
0a20: 20 78 74 72 61 5f 75 74 66 38 5f 62 79 74 65 73   xtra_utf8_bytes
0a30: 5b 32 35 36 5d 20 20 3d 20 7b 0a 2f 2a 20 30 78  [256]  = {./* 0x
0a40: 78 78 78 78 78 78 20 2a 2f 0a 30 2c 20 30 2c 20  xxxxxx */.0, 0, 
0a50: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0a60: 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  ,     0, 0, 0, 0
0a70: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 30 2c  , 0, 0, 0, 0,.0,
0a80: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0a90: 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20  0, 0,     0, 0, 
0aa0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0ab0: 2c 0a 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  ,.0, 0, 0, 0, 0,
0ac0: 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c   0, 0, 0,     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 0a 30 2c 20 30 2c 20 30 2c 20 30  0, 0,.0, 0, 0, 0
0af0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
0b00: 20 20 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 0a 30 2c 20 30 2c 20   0, 0, 0,.0, 0, 
0b20: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0b30: 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  ,     0, 0, 0, 0
0b40: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 30 2c  , 0, 0, 0, 0,.0,
0b50: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0b60: 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20  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 0a 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  ,.0, 0, 0, 0, 0,
0b90: 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c   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 0a 30 2c 20 30 2c 20 30 2c 20 30  0, 0,.0, 0, 0, 0
0bc0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
0bd0: 20 20 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 0a 0a 2f 2a 20 31 30   0, 0, 0,../* 10
0bf0: 77 77 77 77 77 77 20 2a 2f 0a 34 2c 20 34 2c 20  wwwwww */.4, 4, 
0c00: 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34  4, 4, 4, 4, 4, 4
0c10: 2c 20 20 20 20 20 34 2c 20 34 2c 20 34 2c 20 34  ,     4, 4, 4, 4
0c20: 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 0a 34 2c  , 4, 4, 4, 4,.4,
0c30: 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20   4, 4, 4, 4, 4, 
0c40: 34 2c 20 34 2c 20 20 20 20 20 34 2c 20 34 2c 20  4, 4,     4, 4, 
0c50: 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34  4, 4, 4, 4, 4, 4
0c60: 2c 0a 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c  ,.4, 4, 4, 4, 4,
0c70: 20 34 2c 20 34 2c 20 34 2c 20 20 20 20 20 34 2c   4, 4, 4,     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 0a 34 2c 20 34 2c 20 34 2c 20 34  4, 4,.4, 4, 4, 4
0ca0: 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 20 20  , 4, 4, 4, 4,   
0cb0: 20 20 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 0a 0a 2f 2a 20 31 31   4, 4, 4,../* 11
0cd0: 30 79 79 79 79 79 20 2a 2f 0a 31 2c 20 31 2c 20  0yyyyy */.1, 1, 
0ce0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
0cf0: 2c 20 20 20 20 20 31 2c 20 31 2c 20 31 2c 20 31  ,     1, 1, 1, 1
0d00: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 31 2c  , 1, 1, 1, 1,.1,
0d10: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
0d20: 31 2c 20 31 2c 20 20 20 20 20 31 2c 20 31 2c 20  1, 1,     1, 1, 
0d30: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
0d40: 2c 0a 0a 2f 2a 20 31 31 31 30 7a 7a 7a 7a 20 2a  ,../* 1110zzzz *
0d50: 2f 0a 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c  /.2, 2, 2, 2, 2,
0d60: 20 32 2c 20 32 2c 20 32 2c 20 20 20 20 20 32 2c   2, 2, 2,     2,
0d70: 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20   2, 2, 2, 2, 2, 
0d80: 32 2c 20 32 2c 0a 0a 2f 2a 20 31 31 31 31 30 79  2, 2,../* 11110y
0d90: 79 79 20 2a 2f 0a 33 2c 20 33 2c 20 33 2c 20 33  yy */.3, 3, 3, 3
0da0: 2c 20 33 2c 20 33 2c 20 33 2c 20 33 2c 20 20 20  , 3, 3, 3, 3,   
0db0: 20 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 34 2c    4, 4, 4, 4, 4,
0dc0: 20 34 2c 20 34 2c 20 34 2c 0a 7d 3b 0a 0a 2f 2a   4, 4, 4,.};../*
0dd0: 0a 2a 2a 20 54 68 69 73 20 74 61 62 6c 65 20 6d  .** This table m
0de0: 61 70 73 20 66 72 6f 6d 20 74 68 65 20 6e 75 6d  aps from the num
0df0: 62 65 72 20 6f 66 20 74 72 61 69 6c 69 6e 67 20  ber of trailing 
0e00: 62 79 74 65 73 20 69 6e 20 61 20 55 54 46 2d 38  bytes in a UTF-8
0e10: 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 74 6f   character.** to
0e20: 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73   an integer cons
0e30: 74 61 6e 74 20 74 68 61 74 20 69 73 20 65 66 66  tant that is eff
0e40: 65 63 74 69 76 65 6c 79 20 63 61 6c 63 75 6c 61  ectively calcula
0e50: 74 65 64 20 66 6f 72 20 65 61 63 68 20 63 68 61  ted for each cha
0e60: 72 61 63 74 65 72 0a 2a 2a 20 72 65 61 64 20 62  racter.** read b
0e70: 79 20 61 20 6e 61 69 76 65 20 69 6d 70 6c 65 6d  y a naive implem
0e80: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 55 54  entation of a UT
0e90: 46 2d 38 20 63 68 61 72 61 63 74 65 72 20 72 65  F-8 character re
0ea0: 61 64 65 72 2e 20 54 68 65 20 63 6f 64 65 0a 2a  ader. The code.*
0eb0: 2a 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 54  * in the READ_UT
0ec0: 46 38 20 6d 61 63 72 6f 20 65 78 70 6c 61 69 6e  F8 macro explain
0ed0: 73 20 74 68 69 6e 67 73 20 62 65 73 74 2e 0a 2a  s things best..*
0ee0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69  /.static const i
0ef0: 6e 74 20 78 74 72 61 5f 75 74 66 38 5f 62 69 74  nt xtra_utf8_bit
0f00: 73 5b 5d 20 3d 20 20 7b 0a 20 20 30 2c 0a 20 20  s[] =  {.  0,.  
0f10: 31 32 34 31 36 2c 20 20 20 20 20 20 20 20 20 20  12416,          
0f20: 2f 2a 20 28 30 78 43 30 20 3c 3c 20 36 29 20 2b  /* (0xC0 << 6) +
0f30: 20 28 30 78 38 30 29 20 2a 2f 0a 20 20 39 32 35   (0x80) */.  925
0f40: 38 32 34 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  824,         /* 
0f50: 28 30 78 45 30 20 3c 3c 20 31 32 29 20 2b 20 28  (0xE0 << 12) + (
0f60: 30 78 38 30 20 3c 3c 20 36 29 20 2b 20 28 30 78  0x80 << 6) + (0x
0f70: 38 30 29 20 2a 2f 0a 20 20 36 33 34 34 37 31 36  80) */.  6344716
0f80: 38 20 20 20 20 20 20 20 20 2f 2a 20 28 30 78 46  8        /* (0xF
0f90: 30 20 3c 3c 20 31 38 29 20 2b 20 28 30 78 38 30  0 << 18) + (0x80
0fa0: 20 3c 3c 20 31 32 29 20 2b 20 28 30 78 38 30 20   << 12) + (0x80 
0fb0: 3c 3c 20 36 29 20 2b 20 30 78 38 30 20 2a 2f 0a  << 6) + 0x80 */.
0fc0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 55  };../*.** If a U
0fd0: 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 20 63  TF-8 character c
0fe0: 6f 6e 74 61 69 6e 73 20 4e 20 62 79 74 65 73 20  ontains N bytes 
0ff0: 65 78 74 72 61 20 62 79 74 65 73 20 28 4e 20 62  extra bytes (N b
1000: 79 74 65 73 20 66 6f 6c 6c 6f 77 0a 2a 2a 20 74  ytes follow.** t
1010: 68 65 20 69 6e 69 74 69 61 6c 20 62 79 74 65 20  he initial byte 
1020: 73 6f 20 74 68 61 74 20 74 68 65 20 74 6f 74 61  so that the tota
1030: 6c 20 63 68 61 72 61 63 74 65 72 20 6c 65 6e 67  l character leng
1040: 74 68 20 69 73 20 4e 2b 31 29 20 74 68 65 6e 0a  th is N+1) then.
1050: 2a 2a 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 63  ** masking the c
1060: 68 61 72 61 63 74 65 72 20 77 69 74 68 20 75 74  haracter with ut
1070: 66 38 5f 6d 61 73 6b 5b 4e 5d 20 6d 75 73 74 20  f8_mask[N] must 
1080: 70 72 6f 64 75 63 65 20 61 20 6e 6f 6e 2d 7a 65  produce a non-ze
1090: 72 6f 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 4f  ro.** result.  O
10a0: 74 68 65 72 77 69 73 65 2c 20 77 65 20 68 61 76  therwise, we hav
10b0: 65 20 61 6e 20 28 69 6c 6c 65 67 61 6c 29 20 6f  e an (illegal) o
10c0: 76 65 72 6c 6f 6e 67 20 65 6e 63 6f 64 69 6e 67  verlong encoding
10d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
10e0: 74 20 69 6e 74 20 75 74 66 5f 6d 61 73 6b 5b 5d  t int utf_mask[]
10f0: 20 3d 20 7b 0a 20 20 30 78 30 30 30 30 30 30 30   = {.  0x0000000
1100: 30 2c 0a 20 20 30 78 66 66 66 66 66 66 38 30 2c  0,.  0xffffff80,
1110: 0a 20 20 30 78 66 66 66 66 66 38 30 30 2c 0a 20  .  0xfffff800,. 
1120: 20 30 78 66 66 66 66 30 30 30 30 2c 0a 7d 3b 0a   0xffff0000,.};.
1130: 0a 23 64 65 66 69 6e 65 20 52 45 41 44 5f 55 54  .#define READ_UT
1140: 46 38 28 7a 49 6e 2c 20 63 29 20 7b 20 5c 0a 20  F8(zIn, c) { \. 
1150: 20 69 6e 74 20 78 74 72 61 3b 20 20 20 20 20 20   int xtra;      
1160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1180: 20 20 20 20 20 20 5c 0a 20 20 63 20 3d 20 2a 28        \.  c = *(
1190: 7a 49 6e 29 2b 2b 3b 20 20 20 20 20 20 20 20 20  zIn)++;         
11a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
11c0: 0a 20 20 78 74 72 61 20 3d 20 78 74 72 61 5f 75  .  xtra = xtra_u
11d0: 74 66 38 5f 62 79 74 65 73 5b 63 5d 3b 20 20 20  tf8_bytes[c];   
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 5c 0a 20 20 73 77 69 74          \.  swit
1200: 63 68 28 20 78 74 72 61 20 29 7b 20 20 20 20 20  ch( xtra ){     
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1230: 20 5c 0a 20 20 20 20 63 61 73 65 20 34 3a 20 63   \.    case 4: c
1240: 20 3d 20 28 69 6e 74 29 30 78 46 46 46 44 3b 20   = (int)0xFFFD; 
1250: 62 72 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20  break;          
1260: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
1270: 63 61 73 65 20 33 3a 20 63 20 3d 20 28 63 3c 3c  case 3: c = (c<<
1280: 36 29 20 2b 20 2a 28 7a 49 6e 29 2b 2b 3b 20 20  6) + *(zIn)++;  
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a0: 20 20 20 5c 0a 20 20 20 20 63 61 73 65 20 32 3a     \.    case 2:
12b0: 20 63 20 3d 20 28 63 3c 3c 36 29 20 2b 20 2a 28   c = (c<<6) + *(
12c0: 7a 49 6e 29 2b 2b 3b 20 20 20 20 20 20 20 20 20  zIn)++;         
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
12e0: 20 20 63 61 73 65 20 31 3a 20 63 20 3d 20 28 63    case 1: c = (c
12f0: 3c 3c 36 29 20 2b 20 2a 28 7a 49 6e 29 2b 2b 3b  <<6) + *(zIn)++;
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1310: 20 20 20 20 20 5c 0a 20 20 20 20 63 20 2d 3d 20       \.    c -= 
1320: 78 74 72 61 5f 75 74 66 38 5f 62 69 74 73 5b 78  xtra_utf8_bits[x
1330: 74 72 61 5d 3b 20 20 20 20 20 20 20 20 20 20 20  tra];           
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1350: 20 20 20 20 69 66 28 20 28 75 74 66 5f 6d 61 73      if( (utf_mas
1360: 6b 5b 78 74 72 61 5d 26 63 29 3d 3d 30 20 20 20  k[xtra]&c)==0   
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20         \.       
1390: 20 7c 7c 20 28 63 26 30 78 46 46 46 46 46 38 30   || (c&0xFFFFF80
13a0: 30 29 3d 3d 30 78 44 38 30 30 20 20 20 20 20 20  0)==0xD800      
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c0: 5c 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 63 26  \.        || (c&
13d0: 30 78 46 46 46 46 46 46 46 45 29 3d 3d 30 78 46  0xFFFFFFFE)==0xF
13e0: 46 46 45 20 29 7b 20 20 63 20 3d 20 30 78 46 46  FFE ){  c = 0xFF
13f0: 46 44 3b 20 7d 20 20 20 20 5c 0a 20 20 7d 20 20  FD; }    \.  }  
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 5c 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65    \.}.int sqlite
1440: 33 52 65 61 64 55 74 66 38 28 63 6f 6e 73 74 20  3ReadUtf8(const 
1450: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
1460: 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 52 45  ){.  int c;.  RE
1470: 41 44 5f 55 54 46 38 28 7a 2c 20 63 29 3b 0a 20  AD_UTF8(z, c);. 
1480: 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 23 64   return c;.}..#d
1490: 65 66 69 6e 65 20 53 4b 49 50 5f 55 54 46 38 28  efine SKIP_UTF8(
14a0: 7a 49 6e 29 20 7b 20 20 20 20 20 20 20 20 20 20  zIn) {          
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c0: 20 20 20 20 20 5c 0a 20 20 7a 49 6e 20 2b 3d 20       \.  zIn += 
14d0: 28 78 74 72 61 5f 75 74 66 38 5f 62 79 74 65 73  (xtra_utf8_bytes
14e0: 5b 2a 28 75 38 20 2a 29 7a 49 6e 5d 20 2b 20 31  [*(u8 *)zIn] + 1
14f0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a  );            \.
1500: 7d 0a 0a 23 64 65 66 69 6e 65 20 57 52 49 54 45  }..#define WRITE
1510: 5f 55 54 46 38 28 7a 4f 75 74 2c 20 63 29 20 7b  _UTF8(zOut, c) {
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1530: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66            \.  if
1540: 28 20 63 3c 30 78 30 30 30 38 30 20 29 7b 20 20  ( c<0x00080 ){  
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1570: 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b     \.    *zOut++
1580: 20 3d 20 28 63 26 30 78 46 46 29 3b 20 20 20 20   = (c&0xFF);    
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
15b0: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e0: 20 20 20 20 20 5c 0a 20 20 65 6c 73 65 20 69 66       \.  else if
15f0: 28 20 63 3c 30 78 30 30 38 30 30 20 29 7b 20 20  ( c<0x00800 ){  
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1620: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78      *zOut++ = 0x
1630: 43 30 20 2b 20 28 28 63 3e 3e 36 29 26 30 78 31  C0 + ((c>>6)&0x1
1640: 46 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  F);             
1650: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f         \.    *zO
1660: 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 63  ut++ = 0x80 + (c
1670: 20 26 20 30 78 33 46 29 3b 20 20 20 20 20 20 20   & 0x3F);       
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 5c 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20 20  \.  }           
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 65 6c 73           \.  els
16d0: 65 20 69 66 28 20 63 3c 30 78 31 30 30 30 30 20  e if( c<0x10000 
16e0: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1700: 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20    \.    *zOut++ 
1710: 3d 20 30 78 45 30 20 2b 20 28 28 63 3e 3e 31 32  = 0xE0 + ((c>>12
1720: 29 26 30 78 30 46 29 3b 20 20 20 20 20 20 20 20  )&0x0F);        
1730: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1740: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20   *zOut++ = 0x80 
1750: 2b 20 28 28 63 3e 3e 36 29 20 26 20 30 78 33 46  + ((c>>6) & 0x3F
1760: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1770: 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b      \.    *zOut+
1780: 2b 20 3d 20 30 78 38 30 20 2b 20 28 63 20 26 20  + = 0x80 + (c & 
1790: 30 78 33 46 29 3b 20 20 20 20 20 20 20 20 20 20  0x3F);          
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
17b0: 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20   }else{         
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e0: 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75        \.    *zOu
17f0: 74 2b 2b 20 3d 20 30 78 46 30 20 2b 20 28 28 63  t++ = 0xF0 + ((c
1800: 3e 3e 31 38 29 20 26 20 30 78 30 37 29 3b 20 20  >>18) & 0x07);  
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1820: 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30  .    *zOut++ = 0
1830: 78 38 30 20 2b 20 28 28 63 3e 3e 31 32 29 20 26  x80 + ((c>>12) &
1840: 20 30 78 33 46 29 3b 20 20 20 20 20 20 20 20 20   0x3F);         
1850: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a          \.    *z
1860: 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28  Out++ = 0x80 + (
1870: 28 63 3e 3e 36 29 20 26 20 30 78 33 46 29 3b 20  (c>>6) & 0x3F); 
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d   \.    *zOut++ =
18a0: 20 30 78 38 30 20 2b 20 28 63 20 26 20 30 78 33   0x80 + (c & 0x3
18b0: 46 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  F);             
18c0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 20            \.  } 
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 20 20 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20     \.}..#define 
1910: 57 52 49 54 45 5f 55 54 46 31 36 4c 45 28 7a 4f  WRITE_UTF16LE(zO
1920: 75 74 2c 20 63 29 20 7b 20 20 20 20 20 20 20 20  ut, c) {        
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1940: 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20          \.  if( 
1950: 63 3c 3d 30 78 46 46 46 46 20 29 7b 20 20 20 20  c<=0xFFFF ){    
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 20 20 20 5c 0a 20 20 20 20            \.    
1990: 2a 7a 4f 75 74 2b 2b 20 3d 20 28 63 26 30 78 30  *zOut++ = (c&0x0
19a0: 30 46 46 29 3b 20 20 20 20 20 20 20 20 20 20 20  0FF);           
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: 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 28 63 3e    *zOut++ = ((c>
19e0: 3e 38 29 26 30 78 30 30 46 46 29 3b 20 20 20 20  >8)&0x00FF);    
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 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20    }else{        
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 28 63 3e 3e 31 30 29 26 30 78 30 30 33 46  (((c>>10)&0x003F
1a70: 29 20 2b 20 28 28 28 63 2d 30 78 31 30 30 30 30  ) + (((c-0x10000
1a80: 29 3e 3e 31 30 29 26 30 78 30 30 43 30 29 29 3b  )>>10)&0x00C0));
1a90: 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20    \.    *zOut++ 
1aa0: 3d 20 28 30 78 30 30 44 38 20 2b 20 28 28 28 63  = (0x00D8 + (((c
1ab0: 2d 30 78 31 30 30 30 30 29 3e 3e 31 38 29 26 30  -0x10000)>>18)&0
1ac0: 78 30 33 29 29 3b 20 20 20 20 20 20 20 20 20 20  x03));          
1ad0: 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b      \.    *zOut+
1ae0: 2b 20 3d 20 28 63 26 30 78 30 30 46 46 29 3b 20  + = (c&0x00FF); 
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75        \.    *zOu
1b20: 74 2b 2b 20 3d 20 28 30 78 30 30 44 43 20 2b 20  t++ = (0x00DC + 
1b30: 28 28 63 3e 3e 38 29 26 30 78 30 33 29 29 3b 20  ((c>>8)&0x03)); 
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 20 20 20          \.  }   
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 7d 0a 0a 23            \.}..#
1ba0: 64 65 66 69 6e 65 20 57 52 49 54 45 5f 55 54 46  define WRITE_UTF
1bb0: 31 36 42 45 28 7a 4f 75 74 2c 20 63 29 20 7b 20  16BE(zOut, c) { 
1bc0: 20 20 20 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 20 20 20 5c                 \
1be0: 0a 20 20 69 66 28 20 63 3c 3d 30 78 46 46 46 46  .  if( c<=0xFFFF
1bf0: 20 29 7b 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 20 20                  
1c20: 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d   \.    *zOut++ =
1c30: 20 28 28 63 3e 3e 38 29 26 30 78 30 30 46 46 29   ((c>>8)&0x00FF)
1c40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b     \.    *zOut++
1c70: 20 3d 20 28 63 26 30 78 30 30 46 46 29 3b 20 20   = (c&0x00FF);  
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 7d 65 6c 73 65 7b 20       \.  }else{ 
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 30 78 30 30 44 38 20 2b  ut++ = (0x00D8 +
1d00: 20 28 28 28 63 2d 30 78 31 30 30 30 30 29 3e 3e   (((c-0x10000)>>
1d10: 31 38 29 26 30 78 30 33 29 29 3b 20 20 20 20 20  18)&0x03));     
1d20: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a           \.    *
1d30: 7a 4f 75 74 2b 2b 20 3d 20 28 28 28 63 3e 3e 31  zOut++ = (((c>>1
1d40: 30 29 26 30 78 30 30 33 46 29 20 2b 20 28 28 28  0)&0x003F) + (((
1d50: 63 2d 30 78 31 30 30 30 30 29 3e 3e 31 30 29 26  c-0x10000)>>10)&
1d60: 30 78 30 30 43 30 29 29 3b 20 20 5c 0a 20 20 20  0x00C0));  \.   
1d70: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 30 78 30 30   *zOut++ = (0x00
1d80: 44 43 20 2b 20 28 28 63 3e 3e 38 29 26 30 78 30  DC + ((c>>8)&0x0
1d90: 33 29 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  3));            
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 63 26     *zOut++ = (c&
1dc0: 30 78 30 30 46 46 29 3b 20 20 20 20 20 20 20 20  0x00FF);        
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1df0: 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  .  }            
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 52 45   \.}..#define RE
1e40: 41 44 5f 55 54 46 31 36 4c 45 28 7a 49 6e 2c 20  AD_UTF16LE(zIn, 
1e50: 63 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  c){             
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1e80: 63 20 3d 20 28 2a 7a 49 6e 2b 2b 29 3b 20 20 20  c = (*zIn++);   
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 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 20 20 20 5c 0a 20 20 63 20 2b 3d 20 28 28 2a      \.  c += ((*
1ed0: 7a 49 6e 2b 2b 29 3c 3c 38 29 3b 20 20 20 20 20  zIn++)<<8);     
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: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1f10: 69 66 28 20 63 3e 3d 30 78 44 38 30 30 20 26 26  if( c>=0xD800 &&
1f20: 20 63 3c 3d 30 78 45 30 30 30 20 29 7b 20 20 20   c<=0xE000 ){   
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 20 20 20 20 20 20 20 20                  
1f50: 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 63 32      \.    int c2
1f60: 20 3d 20 28 2a 7a 49 6e 2b 2b 29 3b 20 20 20 20   = (*zIn++);    
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: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1fa0: 20 20 63 32 20 2b 3d 20 28 28 2a 7a 49 6e 2b 2b    c2 += ((*zIn++
1fb0: 29 3c 3c 38 29 3b 20 20 20 20 20 20 20 20 20 20  )<<8);          
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 20 20 20 20 20 20 20 20                  
1fe0: 20 20 20 20 5c 0a 20 20 20 20 63 20 3d 20 28 63      \.    c = (c
1ff0: 32 26 30 78 30 33 46 46 29 20 2b 20 28 28 63 26  2&0x03FF) + ((c&
2000: 30 78 30 30 33 46 29 3c 3c 31 30 29 20 2b 20 28  0x003F)<<10) + (
2010: 28 28 63 26 30 78 30 33 43 30 29 2b 30 78 30 30  ((c&0x03C0)+0x00
2020: 34 30 29 3c 3c 31 30 29 3b 20 20 20 5c 0a 20 20  40)<<10);   \.  
2030: 20 20 69 66 28 20 28 63 20 26 20 30 78 46 46 46    if( (c & 0xFFF
2040: 46 30 30 30 30 29 3d 3d 30 20 29 20 63 20 3d 20  F0000)==0 ) c = 
2050: 30 78 46 46 46 44 3b 20 20 20 20 20 20 20 20 20  0xFFFD;         
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 5c 0a 20 20 7d 20 20 20 20 20 20 20      \.  }       
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a              \.}.
20c0: 0a 23 64 65 66 69 6e 65 20 52 45 41 44 5f 55 54  .#define READ_UT
20d0: 46 31 36 42 45 28 7a 49 6e 2c 20 63 29 7b 20 20  F16BE(zIn, c){  
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 20 20 20 20 20 20 20 20                  
2100: 20 20 20 20 20 20 20 5c 0a 20 20 63 20 3d 20 28         \.  c = (
2110: 28 2a 7a 49 6e 2b 2b 29 3c 3c 38 29 3b 20 20 20  (*zIn++)<<8);   
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: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2150: 0a 20 20 63 20 2b 3d 20 28 2a 7a 49 6e 2b 2b 29  .  c += (*zIn++)
2160: 3b 20 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 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 63         \.  if( c
21a0: 3e 3d 30 78 44 38 30 30 20 26 26 20 63 3c 3d 30  >=0xD800 && c<=0
21b0: 78 45 30 30 30 20 29 7b 20 20 20 20 20 20 20 20  xE000 ){        
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
21e0: 0a 20 20 20 20 69 6e 74 20 63 32 20 3d 20 28 28  .    int c2 = ((
21f0: 2a 7a 49 6e 2b 2b 29 3c 3c 38 29 3b 20 20 20 20  *zIn++)<<8);    
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 20 20 20 20 20                  
2220: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 63 32 20         \.    c2 
2230: 2b 3d 20 28 2a 7a 49 6e 2b 2b 29 3b 20 20 20 20  += (*zIn++);    
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 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2270: 0a 20 20 20 20 63 20 3d 20 28 63 32 26 30 78 30  .    c = (c2&0x0
2280: 33 46 46 29 20 2b 20 28 28 63 26 30 78 30 30 33  3FF) + ((c&0x003
2290: 46 29 3c 3c 31 30 29 20 2b 20 28 28 28 63 26 30  F)<<10) + (((c&0
22a0: 78 30 33 43 30 29 2b 30 78 30 30 34 30 29 3c 3c  x03C0)+0x0040)<<
22b0: 31 30 29 3b 20 20 20 5c 0a 20 20 20 20 69 66 28  10);   \.    if(
22c0: 20 28 63 20 26 20 30 78 46 46 46 46 30 30 30 30   (c & 0xFFFF0000
22d0: 29 3d 3d 30 20 29 20 63 20 3d 20 30 78 46 46 46  )==0 ) c = 0xFFF
22e0: 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D;              
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2300: 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  .  }            
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2340: 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66         \.}..#def
2350: 69 6e 65 20 53 4b 49 50 5f 55 54 46 31 36 42 45  ine SKIP_UTF16BE
2360: 28 7a 49 6e 29 7b 20 20 20 20 20 20 20 20 20 20  (zIn){          
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2390: 20 20 5c 0a 20 20 69 66 28 20 2a 7a 49 6e 3e 3d    \.  if( *zIn>=
23a0: 30 78 44 38 20 26 26 20 28 2a 7a 49 6e 3c 30 78  0xD8 && (*zIn<0x
23b0: 45 30 20 7c 7c 20 28 2a 7a 49 6e 3d 3d 30 78 45  E0 || (*zIn==0xE
23c0: 30 20 26 26 20 2a 28 7a 49 6e 2b 31 29 3d 3d 30  0 && *(zIn+1)==0
23d0: 78 30 30 29 29 20 29 7b 20 20 5c 0a 20 20 20 20  x00)) ){  \.    
23e0: 7a 49 6e 20 2b 3d 20 34 3b 20 20 20 20 20 20 20  zIn += 4;       
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 20 20 20 20 20 20 20 20 20 20                  
2420: 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20    \.  }else{    
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
2470: 7a 49 6e 20 2b 3d 20 32 3b 20 20 20 20 20 20 20  zIn += 2;       
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 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 5c 0a 20 20 7d 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 20 20                  
24f0: 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 23 64            \.}.#d
2500: 65 66 69 6e 65 20 53 4b 49 50 5f 55 54 46 31 36  efine SKIP_UTF16
2510: 4c 45 28 7a 49 6e 29 7b 20 20 20 20 20 20 20 20  LE(zIn){        
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2540: 20 20 20 20 5c 0a 20 20 7a 49 6e 2b 2b 3b 20 20      \.  zIn++;  
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 20 20                  
2580: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2590: 69 66 28 20 2a 7a 49 6e 3e 3d 30 78 44 38 20 26  if( *zIn>=0xD8 &
25a0: 26 20 28 2a 7a 49 6e 3c 30 78 45 30 20 7c 7c 20  & (*zIn<0xE0 || 
25b0: 28 2a 7a 49 6e 3d 3d 30 78 45 30 20 26 26 20 2a  (*zIn==0xE0 && *
25c0: 28 7a 49 6e 2d 31 29 3d 3d 30 78 30 30 29 29 20  (zIn-1)==0x00)) 
25d0: 29 7b 20 20 5c 0a 20 20 20 20 7a 49 6e 20 2b 3d  ){  \.    zIn +=
25e0: 20 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   3;             
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: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2620: 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20  }else{          
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 20 20 5c 0a 20 20 20 20 7a 49 6e 20 2b 3d      \.    zIn +=
2670: 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
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: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
26b0: 7d 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 20 20 20 20 20 20 20 20                  
26f0: 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65      \.}..#define
2700: 20 52 53 4b 49 50 5f 55 54 46 31 36 4c 45 28 7a   RSKIP_UTF16LE(z
2710: 49 6e 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  In){            
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2740: 5c 0a 20 20 69 66 28 20 2a 7a 49 6e 3e 3d 30 78  \.  if( *zIn>=0x
2750: 44 38 20 26 26 20 28 2a 7a 49 6e 3c 30 78 45 30  D8 && (*zIn<0xE0
2760: 20 7c 7c 20 28 2a 7a 49 6e 3d 3d 30 78 45 30 20   || (*zIn==0xE0 
2770: 26 26 20 2a 28 7a 49 6e 2d 31 29 3d 3d 30 78 30  && *(zIn-1)==0x0
2780: 30 29 29 20 29 7b 20 20 5c 0a 20 20 20 20 7a 49  0)) ){  \.    zI
2790: 6e 20 2d 3d 20 34 3b 20 20 20 20 20 20 20 20 20  n -= 4;         
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 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20  \.  }else{      
27e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 7a 49          \.    zI
2820: 6e 20 2d 3d 20 32 3b 20 20 20 20 20 20 20 20 20  n -= 2;         
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 20 20 20 20 20 20 20 20 20 20 20 20                  
2860: 5c 0a 20 20 7d 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 20 20 20 20                  
28a0: 20 20 20 20 20 20 20 20 5c 0a 7d 0a 23 64 65 66          \.}.#def
28b0: 69 6e 65 20 52 53 4b 49 50 5f 55 54 46 31 36 42  ine RSKIP_UTF16B
28c0: 45 28 7a 49 6e 29 7b 20 20 20 20 20 20 20 20 20  E(zIn){         
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f0: 20 20 20 5c 0a 20 20 7a 49 6e 2d 2d 3b 20 20 20     \.  zIn--;   
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 20 20 20 20                  
2930: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
2940: 66 28 20 2a 7a 49 6e 3e 3d 30 78 44 38 20 26 26  f( *zIn>=0xD8 &&
2950: 20 28 2a 7a 49 6e 3c 30 78 45 30 20 7c 7c 20 28   (*zIn<0xE0 || (
2960: 2a 7a 49 6e 3d 3d 30 78 45 30 20 26 26 20 2a 28  *zIn==0xE0 && *(
2970: 7a 49 6e 2b 31 29 3d 3d 30 78 30 30 29 29 20 29  zIn+1)==0x00)) )
2980: 7b 20 20 5c 0a 20 20 20 20 7a 49 6e 20 2d 3d 20  {  \.    zIn -= 
2990: 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3;              
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 20                  
29c0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
29d0: 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 5c 0a 20 20 20 20 7a 49 6e 20 2d 3d 20     \.    zIn -= 
2a20: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
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 20                  
2a50: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
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 20 20 20 20 20 20 20 20 20                  
2aa0: 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66     \.}../*.** If
2ab0: 20 74 68 65 20 54 52 41 4e 53 4c 41 54 45 5f 54   the TRANSLATE_T
2ac0: 52 41 43 45 20 6d 61 63 72 6f 20 69 73 20 64 65  RACE macro is de
2ad0: 66 69 6e 65 64 2c 20 74 68 65 20 76 61 6c 75 65  fined, the value
2ae0: 20 6f 66 20 65 61 63 68 20 4d 65 6d 20 69 73 0a   of each Mem is.
2af0: 2a 2a 20 70 72 69 6e 74 65 64 20 6f 6e 20 73 74  ** printed on st
2b00: 64 65 72 72 20 6f 6e 20 74 68 65 20 77 61 79 20  derr on the way 
2b10: 69 6e 74 6f 20 61 6e 64 20 6f 75 74 20 6f 66 20  into and out of 
2b20: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54 72  sqlite3VdbeMemTr
2b30: 61 6e 73 6c 61 74 65 28 29 2e 0a 2a 2f 20 0a 2f  anslate()..*/ ./
2b40: 2a 20 23 64 65 66 69 6e 65 20 54 52 41 4e 53 4c  * #define TRANSL
2b50: 41 54 45 5f 54 52 41 43 45 20 31 20 2a 2f 0a 0a  ATE_TRACE 1 */..
2b60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2b70: 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
2b80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61  This routine tra
2b90: 6e 73 66 6f 72 6d 73 20 74 68 65 20 69 6e 74 65  nsforms the inte
2ba0: 72 6e 61 6c 20 74 65 78 74 20 65 6e 63 6f 64 69  rnal text encodi
2bb0: 6e 67 20 75 73 65 64 20 62 79 20 70 4d 65 6d 20  ng used by pMem 
2bc0: 74 6f 0a 2a 2a 20 64 65 73 69 72 65 64 45 6e 63  to.** desiredEnc
2bd0: 2e 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72  . It is an error
2be0: 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 20 69   if the string i
2bf0: 73 20 61 6c 72 65 61 64 79 20 6f 66 20 74 68 65  s already of the
2c00: 20 64 65 73 69 72 65 64 0a 2a 2a 20 65 6e 63 6f   desired.** enco
2c10: 64 69 6e 67 2c 20 6f 72 20 69 66 20 2a 70 4d 65  ding, or if *pMe
2c20: 6d 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  m does not conta
2c30: 69 6e 20 61 20 73 74 72 69 6e 67 20 76 61 6c 75  in a string valu
2c40: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2c50: 33 56 64 62 65 4d 65 6d 54 72 61 6e 73 6c 61 74  3VdbeMemTranslat
2c60: 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 38 20  e(Mem *pMem, u8 
2c70: 64 65 73 69 72 65 64 45 6e 63 29 7b 0a 20 20 75  desiredEnc){.  u
2c80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 53 68  nsigned char zSh
2c90: 6f 72 74 5b 4e 42 46 53 5d 3b 20 2f 2a 20 54 65  ort[NBFS]; /* Te
2ca0: 6d 70 6f 72 61 72 79 20 73 68 6f 72 74 20 6f 75  mporary short ou
2cb0: 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  tput buffer */. 
2cc0: 20 69 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20 20   int len;       
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ce0: 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f  Maximum length o
2cf0: 66 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67 20  f output string 
2d00: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  in bytes */.  un
2d10: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4f 75  signed char *zOu
2d20: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2d30: 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
2d40: 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ffer */.  unsign
2d50: 65 64 20 63 68 61 72 20 2a 7a 49 6e 3b 20 20 20  ed char *zIn;   
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 2f 2a 20 49 6e 70 75 74 20 69 74 65 72 61 74 6f  /* Input iterato
2d80: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
2d90: 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20  char *zTerm;    
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2db0: 45 6e 64 20 6f 66 20 69 6e 70 75 74 20 2a 2f 0a  End of input */.
2dc0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2dd0: 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *z;             
2de0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
2df0: 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  t iterator */.  
2e00: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 3b 0a  unsigned int c;.
2e10: 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d  .  assert( pMem-
2e20: 3e 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29  >flags&MEM_Str )
2e30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  ;.  assert( pMem
2e40: 2d 3e 65 6e 63 21 3d 64 65 73 69 72 65 64 45 6e  ->enc!=desiredEn
2e50: 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  c );.  assert( p
2e60: 4d 65 6d 2d 3e 65 6e 63 21 3d 30 20 29 3b 0a 20  Mem->enc!=0 );. 
2e70: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
2e80: 3e 3d 30 20 29 3b 0a 0a 23 69 66 20 64 65 66 69  >=0 );..#if defi
2e90: 6e 65 64 28 54 52 41 4e 53 4c 41 54 45 5f 54 52  ned(TRANSLATE_TR
2ea0: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
2eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 20 20  SQLITE_DEBUG).  
2ec0: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
2ed0: 31 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  100];.    sqlite
2ee0: 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79 50 72  3VdbeMemPrettyPr
2ef0: 69 6e 74 28 70 4d 65 6d 2c 20 7a 42 75 66 29 3b  int(pMem, zBuf);
2f00: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
2f10: 65 72 72 2c 20 22 49 4e 50 55 54 3a 20 20 25 73  err, "INPUT:  %s
2f20: 5c 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a  \n", zBuf);.  }.
2f30: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
2f40: 74 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  the translation 
2f50: 69 73 20 62 65 74 77 65 65 6e 20 55 54 46 2d 31  is between UTF-1
2f60: 36 20 6c 69 74 74 6c 65 20 61 6e 64 20 62 69 67  6 little and big
2f70: 20 65 6e 64 69 61 6e 2c 20 74 68 65 6e 20 0a 20   endian, then . 
2f80: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
2f90: 72 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 73  required is to s
2fa0: 77 61 70 20 74 68 65 20 62 79 74 65 20 6f 72 64  wap the byte ord
2fb0: 65 72 2e 20 54 68 69 73 20 63 61 73 65 20 69 73  er. This case is
2fc0: 20 68 61 6e 64 6c 65 64 0a 20 20 2a 2a 20 64 69   handled.  ** di
2fd0: 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74  fferently from t
2fe0: 68 65 20 6f 74 68 65 72 73 2e 0a 20 20 2a 2f 0a  he others..  */.
2ff0: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 65 6e 63 21    if( pMem->enc!
3000: 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 26 26 20  =SQLITE_UTF8 && 
3010: 64 65 73 69 72 65 64 45 6e 63 21 3d 53 51 4c 49  desiredEnc!=SQLI
3020: 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 75  TE_UTF8 ){.    u
3030: 38 20 74 65 6d 70 3b 0a 20 20 20 20 69 6e 74 20  8 temp;.    int 
3040: 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
3050: 69 74 65 33 56 64 62 65 4d 65 6d 4d 61 6b 65 57  ite3VdbeMemMakeW
3060: 72 69 74 65 61 62 6c 65 28 70 4d 65 6d 29 3b 0a  riteable(pMem);.
3070: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
3080: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
3090: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
30a0: 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
30b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
30c0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
30d0: 7a 49 6e 20 3d 20 28 75 38 2a 29 70 4d 65 6d 2d  zIn = (u8*)pMem-
30e0: 3e 7a 3b 0a 20 20 20 20 7a 54 65 72 6d 20 3d 20  >z;.    zTerm = 
30f0: 26 7a 49 6e 5b 70 4d 65 6d 2d 3e 6e 5d 3b 0a 20  &zIn[pMem->n];. 
3100: 20 20 20 77 68 69 6c 65 28 20 7a 49 6e 3c 7a 54     while( zIn<zT
3110: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 74 65 6d  erm ){.      tem
3120: 70 20 3d 20 2a 7a 49 6e 3b 0a 20 20 20 20 20 20  p = *zIn;.      
3130: 2a 7a 49 6e 20 3d 20 2a 28 7a 49 6e 2b 31 29 3b  *zIn = *(zIn+1);
3140: 0a 20 20 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20  .      zIn++;.  
3150: 20 20 20 20 2a 7a 49 6e 2b 2b 20 3d 20 74 65 6d      *zIn++ = tem
3160: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65  p;.    }.    pMe
3170: 6d 2d 3e 65 6e 63 20 3d 20 64 65 73 69 72 65 64  m->enc = desired
3180: 45 6e 63 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  Enc;.    goto tr
3190: 61 6e 73 6c 61 74 65 5f 6f 75 74 3b 0a 20 20 7d  anslate_out;.  }
31a0: 0a 0a 20 20 2f 2a 20 53 65 74 20 6c 65 6e 20 74  ..  /* Set len t
31b0: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  o the maximum nu
31c0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
31d0: 71 75 69 72 65 64 20 69 6e 20 74 68 65 20 6f 75  quired in the ou
31e0: 74 70 75 74 20 62 75 66 66 65 72 2e 20 2a 2f 0a  tput buffer. */.
31f0: 20 20 69 66 28 20 64 65 73 69 72 65 64 45 6e 63    if( desiredEnc
3200: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b  ==SQLITE_UTF8 ){
3210: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 63 6f 6e  .    /* When con
3220: 76 65 72 74 69 6e 67 20 66 72 6f 6d 20 55 54 46  verting from UTF
3230: 2d 31 36 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d  -16, the maximum
3240: 20 67 72 6f 77 74 68 20 72 65 73 75 6c 74 73 20   growth results 
3250: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 72 61 6e  from.    ** tran
3260: 73 6c 61 74 69 6e 67 20 61 20 32 2d 62 79 74 65  slating a 2-byte
3270: 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 61 20   character to a 
3280: 34 2d 62 79 74 65 20 55 54 46 2d 38 20 63 68 61  4-byte UTF-8 cha
3290: 72 61 63 74 65 72 2e 0a 20 20 20 20 2a 2a 20 41  racter..    ** A
32a0: 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 73 20   single byte is 
32b0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65  required for the
32c0: 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67 0a 20   output string. 
32d0: 20 20 20 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e     ** nul-termin
32e0: 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ator..    */.   
32f0: 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 20 2a   len = pMem->n *
3300: 20 32 20 2b 20 31 3b 0a 20 20 7d 65 6c 73 65 7b   2 + 1;.  }else{
3310: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 63 6f 6e  .    /* When con
3320: 76 65 72 74 69 6e 67 20 66 72 6f 6d 20 55 54 46  verting from UTF
3330: 2d 38 20 74 6f 20 55 54 46 2d 31 36 20 74 68 65  -8 to UTF-16 the
3340: 20 6d 61 78 69 6d 75 6d 20 67 72 6f 77 74 68 20   maximum growth 
3350: 69 73 20 63 61 75 73 65 64 0a 20 20 20 20 2a 2a  is caused.    **
3360: 20 77 68 65 6e 20 61 20 31 2d 62 79 74 65 20 55   when a 1-byte U
3370: 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 20 69  TF-8 character i
3380: 73 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  s translated int
3390: 6f 20 61 20 32 2d 62 79 74 65 20 55 54 46 2d 31  o a 2-byte UTF-1
33a0: 36 0a 20 20 20 20 2a 2a 20 63 68 61 72 61 63 74  6.    ** charact
33b0: 65 72 2e 20 54 77 6f 20 62 79 74 65 73 20 61 72  er. Two bytes ar
33c0: 65 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68  e required in th
33d0: 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
33e0: 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  for the.    ** n
33f0: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 20  ul-terminator.. 
3400: 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20     */.    len = 
3410: 70 4d 65 6d 2d 3e 6e 20 2a 20 32 20 2b 20 32 3b  pMem->n * 2 + 2;
3420: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 7a  .  }..  /* Set z
3430: 49 6e 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  In to point at t
3440: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
3450: 69 6e 70 75 74 20 62 75 66 66 65 72 20 61 6e 64  input buffer and
3460: 20 7a 54 65 72 6d 20 74 6f 20 70 6f 69 6e 74 20   zTerm to point 
3470: 31 0a 20 20 2a 2a 20 62 79 74 65 20 70 61 73 74  1.  ** byte past
3480: 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2a 0a 20   the end..  **. 
3490: 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 7a 4f 75   ** Variable zOu
34a0: 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  t is set to poin
34b0: 74 20 61 74 20 74 68 65 20 6f 75 74 70 75 74 20  t at the output 
34c0: 62 75 66 66 65 72 2e 20 54 68 69 73 20 6d 61 79  buffer. This may
34d0: 20 62 65 20 73 70 61 63 65 0a 20 20 2a 2a 20 6f   be space.  ** o
34e0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
34f0: 6c 6f 63 28 29 2c 20 6f 72 20 4d 65 6d 2e 7a 53  loc(), or Mem.zS
3500: 68 6f 72 74 2c 20 69 66 20 69 74 20 6c 61 72 67  hort, if it larg
3510: 65 20 65 6e 6f 75 67 68 20 61 6e 64 20 6e 6f 74  e enough and not
3520: 20 69 6e 0a 20 20 2a 2a 20 75 73 65 2c 20 6f 72   in.  ** use, or
3530: 20 74 68 65 20 7a 53 68 6f 72 74 20 61 72 72 61   the zShort arra
3540: 79 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 28  y on the stack (
3550: 73 65 65 20 61 62 6f 76 65 29 2e 0a 20 20 2a 2f  see above)..  */
3560: 0a 20 20 7a 49 6e 20 3d 20 28 75 38 2a 29 70 4d  .  zIn = (u8*)pM
3570: 65 6d 2d 3e 7a 3b 0a 20 20 7a 54 65 72 6d 20 3d  em->z;.  zTerm =
3580: 20 26 7a 49 6e 5b 70 4d 65 6d 2d 3e 6e 5d 3b 0a   &zIn[pMem->n];.
3590: 20 20 69 66 28 20 6c 65 6e 3e 4e 42 46 53 20 29    if( len>NBFS )
35a0: 7b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c  {.    zOut = sql
35b0: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 6c 65 6e  iteMallocRaw(len
35c0: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74  );.    if( !zOut
35d0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
35e0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
35f0: 0a 20 20 20 20 7a 4f 75 74 20 3d 20 7a 53 68 6f  .    zOut = zSho
3600: 72 74 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 7a 4f  rt;.  }.  z = zO
3610: 75 74 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 2d  ut;..  if( pMem-
3620: 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
3630: 38 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 73  8 ){.    if( des
3640: 69 72 65 64 45 6e 63 3d 3d 53 51 4c 49 54 45 5f  iredEnc==SQLITE_
3650: 55 54 46 31 36 4c 45 20 29 7b 0a 20 20 20 20 20  UTF16LE ){.     
3660: 20 2f 2a 20 55 54 46 2d 38 20 2d 3e 20 55 54 46   /* UTF-8 -> UTF
3670: 2d 31 36 20 4c 69 74 74 6c 65 2d 65 6e 64 69 61  -16 Little-endia
3680: 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65  n */.      while
3690: 28 20 7a 49 6e 3c 7a 54 65 72 6d 20 29 7b 0a 20  ( zIn<zTerm ){. 
36a0: 20 20 20 20 20 20 20 52 45 41 44 5f 55 54 46 38         READ_UTF8
36b0: 28 7a 49 6e 2c 20 63 29 3b 20 0a 20 20 20 20 20  (zIn, c); .     
36c0: 20 20 20 57 52 49 54 45 5f 55 54 46 31 36 4c 45     WRITE_UTF16LE
36d0: 28 7a 2c 20 63 29 3b 0a 20 20 20 20 20 20 7d 0a  (z, c);.      }.
36e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36f0: 20 61 73 73 65 72 74 28 20 64 65 73 69 72 65 64   assert( desired
3700: 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  Enc==SQLITE_UTF1
3710: 36 42 45 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  6BE );.      /* 
3720: 55 54 46 2d 38 20 2d 3e 20 55 54 46 2d 31 36 20  UTF-8 -> UTF-16 
3730: 42 69 67 2d 65 6e 64 69 61 6e 20 2a 2f 0a 20 20  Big-endian */.  
3740: 20 20 20 20 77 68 69 6c 65 28 20 7a 49 6e 3c 7a      while( zIn<z
3750: 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Term ){.        
3760: 52 45 41 44 5f 55 54 46 38 28 7a 49 6e 2c 20 63  READ_UTF8(zIn, c
3770: 29 3b 20 0a 20 20 20 20 20 20 20 20 57 52 49 54  ); .        WRIT
3780: 45 5f 55 54 46 31 36 42 45 28 7a 2c 20 63 29 3b  E_UTF16BE(z, c);
3790: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
37a0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 7a 20 2d     pMem->n = z -
37b0: 20 7a 4f 75 74 3b 0a 20 20 20 20 2a 7a 2b 2b 20   zOut;.    *z++ 
37c0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
37d0: 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72 65    assert( desire
37e0: 64 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  dEnc==SQLITE_UTF
37f0: 38 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 65  8 );.    if( pMe
3800: 6d 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  m->enc==SQLITE_U
3810: 54 46 31 36 4c 45 20 29 7b 0a 20 20 20 20 20 20  TF16LE ){.      
3820: 2f 2a 20 55 54 46 2d 31 36 20 4c 69 74 74 6c 65  /* UTF-16 Little
3830: 2d 65 6e 64 69 61 6e 20 2d 3e 20 55 54 46 2d 38  -endian -> UTF-8
3840: 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
3850: 20 7a 49 6e 3c 7a 54 65 72 6d 20 29 7b 0a 20 20   zIn<zTerm ){.  
3860: 20 20 20 20 20 20 52 45 41 44 5f 55 54 46 31 36        READ_UTF16
3870: 4c 45 28 7a 49 6e 2c 20 63 29 3b 20 0a 20 20 20  LE(zIn, c); .   
3880: 20 20 20 20 20 57 52 49 54 45 5f 55 54 46 38 28       WRITE_UTF8(
3890: 7a 2c 20 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, c);.      }. 
38a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
38b0: 2f 2a 20 55 54 46 2d 31 36 20 4c 69 74 74 6c 65  /* UTF-16 Little
38c0: 2d 65 6e 64 69 61 6e 20 2d 3e 20 55 54 46 2d 38  -endian -> UTF-8
38d0: 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
38e0: 20 7a 49 6e 3c 7a 54 65 72 6d 20 29 7b 0a 20 20   zIn<zTerm ){.  
38f0: 20 20 20 20 20 20 52 45 41 44 5f 55 54 46 31 36        READ_UTF16
3900: 42 45 28 7a 49 6e 2c 20 63 29 3b 20 0a 20 20 20  BE(zIn, c); .   
3910: 20 20 20 20 20 57 52 49 54 45 5f 55 54 46 38 28       WRITE_UTF8(
3920: 7a 2c 20 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, c);.      }. 
3930: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e     }.    pMem->n
3940: 20 3d 20 7a 20 2d 20 7a 4f 75 74 3b 0a 20 20 7d   = z - zOut;.  }
3950: 0a 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 61 73 73  .  *z = 0;.  ass
3960: 65 72 74 28 20 28 70 4d 65 6d 2d 3e 6e 2b 28 64  ert( (pMem->n+(d
3970: 65 73 69 72 65 64 45 6e 63 3d 3d 53 51 4c 49 54  esiredEnc==SQLIT
3980: 45 5f 55 54 46 38 3f 31 3a 32 29 29 3c 3d 6c 65  E_UTF8?1:2))<=le
3990: 6e 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56  n );..  sqlite3V
39a0: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d  dbeMemRelease(pM
39b0: 65 6d 29 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61  em);.  pMem->fla
39c0: 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 53 74 61 74  gs &= ~(MEM_Stat
39d0: 69 63 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45  ic|MEM_Dyn|MEM_E
39e0: 70 68 65 6d 7c 4d 45 4d 5f 53 68 6f 72 74 29 3b  phem|MEM_Short);
39f0: 0a 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 64  .  pMem->enc = d
3a00: 65 73 69 72 65 64 45 6e 63 3b 0a 20 20 69 66 28  esiredEnc;.  if(
3a10: 20 7a 4f 75 74 3d 3d 7a 53 68 6f 72 74 20 29 7b   zOut==zShort ){
3a20: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4d 65 6d  .    memcpy(pMem
3a30: 2d 3e 7a 53 68 6f 72 74 2c 20 7a 4f 75 74 2c 20  ->zShort, zOut, 
3a40: 6c 65 6e 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d  len);.    zOut =
3a50: 20 28 75 38 2a 29 70 4d 65 6d 2d 3e 7a 53 68 6f   (u8*)pMem->zSho
3a60: 72 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  rt;.    pMem->fl
3a70: 61 67 73 20 7c 3d 20 28 4d 45 4d 5f 54 65 72 6d  ags |= (MEM_Term
3a80: 7c 4d 45 4d 5f 53 68 6f 72 74 29 3b 0a 20 20 7d  |MEM_Short);.  }
3a90: 65 6c 73 65 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e  else{.    pMem->
3aa0: 66 6c 61 67 73 20 7c 3d 20 28 4d 45 4d 5f 54 65  flags |= (MEM_Te
3ab0: 72 6d 7c 4d 45 4d 5f 44 79 6e 29 3b 0a 20 20 7d  rm|MEM_Dyn);.  }
3ac0: 0a 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68  .  pMem->z = (ch
3ad0: 61 72 2a 29 7a 4f 75 74 3b 0a 0a 74 72 61 6e 73  ar*)zOut;..trans
3ae0: 6c 61 74 65 5f 6f 75 74 3a 0a 23 69 66 20 64 65  late_out:.#if de
3af0: 66 69 6e 65 64 28 54 52 41 4e 53 4c 41 54 45 5f  fined(TRANSLATE_
3b00: 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65  TRACE) && define
3b10: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
3b20: 20 20 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75    {.    char zBu
3b30: 66 5b 31 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69  f[100];.    sqli
3b40: 74 65 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79  te3VdbeMemPretty
3b50: 50 72 69 6e 74 28 70 4d 65 6d 2c 20 7a 42 75 66  Print(pMem, zBuf
3b60: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  );.    fprintf(s
3b70: 74 64 65 72 72 2c 20 22 4f 55 54 50 55 54 3a 20  tderr, "OUTPUT: 
3b80: 25 73 5c 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20  %s\n", zBuf);.  
3b90: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
3ba0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
3bb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3bc0: 6e 65 20 63 68 65 63 6b 73 20 66 6f 72 20 61 20  ne checks for a 
3bd0: 62 79 74 65 2d 6f 72 64 65 72 20 6d 61 72 6b 20  byte-order mark 
3be0: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
3bf0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 55 54 46 2d   of the .** UTF-
3c00: 31 36 20 73 74 72 69 6e 67 20 73 74 6f 72 65 64  16 string stored
3c10: 20 69 6e 20 2a 70 4d 65 6d 2e 20 49 66 20 6f 6e   in *pMem. If on
3c20: 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74  e is present, it
3c30: 20 69 73 20 72 65 6d 6f 76 65 64 20 61 6e 64 0a   is removed and.
3c40: 2a 2a 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  ** the encoding 
3c50: 6f 66 20 74 68 65 20 4d 65 6d 20 61 64 6a 75 73  of the Mem adjus
3c60: 74 65 64 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ted. This routin
3c70: 65 20 64 6f 65 73 20 6e 6f 74 20 64 6f 20 61 6e  e does not do an
3c80: 79 0a 2a 2a 20 62 79 74 65 2d 73 77 61 70 70 69  y.** byte-swappi
3c90: 6e 67 2c 20 69 74 20 6a 75 73 74 20 73 65 74 73  ng, it just sets
3ca0: 20 4d 65 6d 2e 65 6e 63 20 61 70 70 72 6f 70 72   Mem.enc appropr
3cb0: 69 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  iately..**.** Th
3cc0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 28 73 74  e allocation (st
3cd0: 61 74 69 63 2c 20 64 79 6e 61 6d 69 63 20 65 74  atic, dynamic et
3ce0: 63 2e 29 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67  c.) and encoding
3cf0: 20 6f 66 20 74 68 65 20 4d 65 6d 20 6d 61 79 20   of the Mem may 
3d00: 62 65 0a 2a 2a 20 63 68 61 6e 67 65 64 20 62 79  be.** changed by
3d10: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
3d20: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
3d30: 62 65 4d 65 6d 48 61 6e 64 6c 65 42 6f 6d 28 4d  beMemHandleBom(M
3d40: 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 6e 74  em *pMem){.  int
3d50: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
3d60: 0a 20 20 75 38 20 62 6f 6d 20 3d 20 30 3b 0a 0a  .  u8 bom = 0;..
3d70: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 6e 3c 30 20    if( pMem->n<0 
3d80: 7c 7c 20 70 4d 65 6d 2d 3e 6e 3e 31 20 29 7b 0a  || pMem->n>1 ){.
3d90: 20 20 20 20 75 38 20 62 31 20 3d 20 2a 28 75 38      u8 b1 = *(u8
3da0: 20 2a 29 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   *)pMem->z;.    
3db0: 75 38 20 62 32 20 3d 20 2a 28 28 28 75 38 20 2a  u8 b2 = *(((u8 *
3dc0: 29 70 4d 65 6d 2d 3e 7a 29 20 2b 20 31 29 3b 0a  )pMem->z) + 1);.
3dd0: 20 20 20 20 69 66 28 20 62 31 3d 3d 30 78 46 45      if( b1==0xFE
3de0: 20 26 26 20 62 32 3d 3d 30 78 46 46 20 29 7b 0a   && b2==0xFF ){.
3df0: 20 20 20 20 20 20 62 6f 6d 20 3d 20 53 51 4c 49        bom = SQLI
3e00: 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 20 20  TE_UTF16BE;.    
3e10: 7d 0a 20 20 20 20 69 66 28 20 62 31 3d 3d 30 78  }.    if( b1==0x
3e20: 46 46 20 26 26 20 62 32 3d 3d 30 78 46 45 20 29  FF && b2==0xFE )
3e30: 7b 0a 20 20 20 20 20 20 62 6f 6d 20 3d 20 53 51  {.      bom = SQ
3e40: 4c 49 54 45 5f 55 54 46 31 36 4c 45 3b 0a 20 20  LITE_UTF16LE;.  
3e50: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28    }.  }.  .  if(
3e60: 20 62 6f 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54   bom ){.    /* T
3e70: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3e80: 63 61 6c 6c 65 64 20 61 73 20 73 6f 6f 6e 20 61  called as soon a
3e90: 73 20 61 20 73 74 72 69 6e 67 20 69 73 20 73 74  s a string is st
3ea0: 6f 72 65 64 20 69 6e 20 61 20 4d 65 6d 2a 2c 0a  ored in a Mem*,.
3eb0: 20 20 20 20 2a 2a 20 66 72 6f 6d 20 77 69 74 68      ** from with
3ec0: 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  in sqlite3VdbeMe
3ed0: 6d 53 65 74 53 74 72 28 29 2e 20 41 74 20 74 68  mSetStr(). At th
3ee0: 61 74 20 70 6f 69 6e 74 20 69 74 20 69 73 20 6e  at point it is n
3ef0: 6f 74 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  ot possible.    
3f00: 2a 2a 20 66 6f 72 20 74 68 65 20 73 74 72 69 6e  ** for the strin
3f10: 67 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69  g to be stored i
3f20: 6e 20 4d 65 6d 2e 7a 53 68 6f 72 74 2c 20 6f 72  n Mem.zShort, or
3f30: 20 66 6f 72 20 69 74 20 74 6f 20 62 65 20 73 74   for it to be st
3f40: 6f 72 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 64  ored.    ** in d
3f50: 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69  ynamic memory wi
3f60: 74 68 20 6e 6f 20 64 65 73 74 72 75 63 74 6f 72  th no destructor
3f70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
3f80: 65 72 74 28 20 21 28 70 4d 65 6d 2d 3e 66 6c 61  ert( !(pMem->fla
3f90: 67 73 26 4d 45 4d 5f 53 68 6f 72 74 29 20 29 3b  gs&MEM_Short) );
3fa0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 28 70  .    assert( !(p
3fb0: 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44  Mem->flags&MEM_D
3fc0: 79 6e 29 20 7c 7c 20 70 4d 65 6d 2d 3e 78 44 65  yn) || pMem->xDe
3fd0: 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 65  l );.    if( pMe
3fe0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  m->flags & MEM_D
3ff0: 79 6e 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  yn ){.      void
4000: 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20   (*xDel)(void*) 
4010: 3d 20 70 4d 65 6d 2d 3e 78 44 65 6c 3b 0a 20 20  = pMem->xDel;.  
4020: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 70 4d      char *z = pM
4030: 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 70 4d 65  em->z;.      pMe
4040: 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20  m->z = 0;.      
4050: 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a  pMem->xDel = 0;.
4060: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
4070: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
4080: 70 4d 65 6d 2c 20 26 7a 5b 32 5d 2c 20 70 4d 65  pMem, &z[2], pMe
4090: 6d 2d 3e 6e 2d 32 2c 20 62 6f 6d 2c 20 53 51 4c  m->n-2, bom, SQL
40a0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
40b0: 20 20 20 20 20 20 78 44 65 6c 28 7a 29 3b 0a 20        xDel(z);. 
40c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
40d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
40e0: 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20  MemSetStr(pMem, 
40f0: 26 70 4d 65 6d 2d 3e 7a 5b 32 5d 2c 20 70 4d 65  &pMem->z[2], pMe
4100: 6d 2d 3e 6e 2d 32 2c 20 62 6f 6d 2c 20 0a 20 20  m->n-2, bom, .  
4110: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
4120: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
4130: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
4140: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
4150: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
4160: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 70 5a 20 69 73 20  */../*.** pZ is 
4170: 61 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  a UTF-8 encoded 
4180: 75 6e 69 63 6f 64 65 20 73 74 72 69 6e 67 2e 20  unicode string. 
4190: 49 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73  If nByte is less
41a0: 20 74 68 61 6e 20 7a 65 72 6f 2c 0a 2a 2a 20 72   than zero,.** r
41b0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
41c0: 20 6f 66 20 75 6e 69 63 6f 64 65 20 63 68 61 72   of unicode char
41d0: 61 63 74 65 72 73 20 69 6e 20 70 5a 20 75 70 20  acters in pZ up 
41e0: 74 6f 20 28 62 75 74 20 6e 6f 74 20 69 6e 63 6c  to (but not incl
41f0: 75 64 69 6e 67 29 0a 2a 2a 20 74 68 65 20 66 69  uding).** the fi
4200: 72 73 74 20 30 78 30 30 20 62 79 74 65 2e 20 49  rst 0x00 byte. I
4210: 66 20 6e 42 79 74 65 20 69 73 20 6e 6f 74 20 6c  f nByte is not l
4220: 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 72  ess than zero, r
4230: 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 6e 75 6d  eturn the.** num
4240: 62 65 72 20 6f 66 20 75 6e 69 63 6f 64 65 20 63  ber of unicode c
4250: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
4260: 20 66 69 72 73 74 20 6e 42 79 74 65 20 6f 66 20   first nByte of 
4270: 70 5a 20 28 6f 72 20 75 70 20 74 6f 20 0a 2a 2a  pZ (or up to .**
4280: 20 74 68 65 20 66 69 72 73 74 20 30 78 30 30 2c   the first 0x00,
4290: 20 77 68 69 63 68 65 76 65 72 20 63 6f 6d 65 73   whichever comes
42a0: 20 66 69 72 73 74 29 2e 0a 2a 2f 0a 69 6e 74 20   first)..*/.int 
42b0: 73 71 6c 69 74 65 33 75 74 66 38 43 68 61 72 4c  sqlite3utf8CharL
42c0: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
42d0: 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20  , int nByte){.  
42e0: 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 63 6f 6e  int r = 0;.  con
42f0: 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 0a  st char *zTerm;.
4300: 20 20 69 66 28 20 6e 42 79 74 65 3e 3d 30 20 29    if( nByte>=0 )
4310: 7b 0a 20 20 20 20 7a 54 65 72 6d 20 3d 20 26 7a  {.    zTerm = &z
4320: 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d 65 6c 73 65  [nByte];.  }else
4330: 7b 0a 20 20 20 20 7a 54 65 72 6d 20 3d 20 28 63  {.    zTerm = (c
4340: 6f 6e 73 74 20 63 68 61 72 20 2a 29 28 2d 31 29  onst char *)(-1)
4350: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4360: 7a 3c 3d 7a 54 65 72 6d 20 29 3b 0a 20 20 77 68  z<=zTerm );.  wh
4370: 69 6c 65 28 20 2a 7a 21 3d 30 20 26 26 20 7a 3c  ile( *z!=0 && z<
4380: 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20 53 4b 49  zTerm ){.    SKI
4390: 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20 20 20 72  P_UTF8(z);.    r
43a0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
43b0: 20 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   r;.}..#ifndef S
43c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
43d0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
43e0: 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67 20 69   UTF-16 string i
43f0: 6e 20 74 68 65 20 6e 61 74 69 76 65 20 65 6e 63  n the native enc
4400: 6f 64 69 6e 67 20 69 6e 74 6f 20 61 20 55 54 46  oding into a UTF
4410: 2d 38 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 4d 65  -8 string..** Me
4420: 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  mory to hold the
4430: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 69 73   UTF-8 string is
4440: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
4450: 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62  alloc and must b
4460: 65 0a 2a 2a 20 66 72 65 65 64 20 62 79 20 74 68  e.** freed by th
4470: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
4480: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 55 4c 4c 20 69  on..**.** NULL i
4490: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
44a0: 65 72 65 20 69 73 20 61 6e 20 61 6c 6c 6f 63 61  ere is an alloca
44b0: 74 69 6f 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63  tion error..*/.c
44c0: 68 61 72 20 2a 73 71 6c 69 74 65 33 75 74 66 31  har *sqlite3utf1
44d0: 36 74 6f 38 28 63 6f 6e 73 74 20 76 6f 69 64 20  6to8(const void 
44e0: 2a 7a 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a  *z, int nByte){.
44f0: 20 20 4d 65 6d 20 6d 3b 0a 20 20 6d 65 6d 73 65    Mem m;.  memse
4500: 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&m, 0, sizeof(
4510: 6d 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  m));.  sqlite3Vd
4520: 62 65 4d 65 6d 53 65 74 53 74 72 28 26 6d 2c 20  beMemSetStr(&m, 
4530: 7a 2c 20 6e 42 79 74 65 2c 20 53 51 4c 49 54 45  z, nByte, SQLITE
4540: 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51  _UTF16NATIVE, SQ
4550: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
4560: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
4570: 65 45 6e 63 6f 64 69 6e 67 28 26 6d 2c 20 53 51  eEncoding(&m, SQ
4580: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 61 73  LITE_UTF8);.  as
4590: 73 65 72 74 28 20 28 6d 2e 66 6c 61 67 73 20 26  sert( (m.flags &
45a0: 20 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 7c 7c   MEM_Term)!=0 ||
45b0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61   sqlite3MallocFa
45c0: 69 6c 65 64 28 29 20 29 3b 0a 20 20 61 73 73 65  iled() );.  asse
45d0: 72 74 28 20 28 6d 2e 66 6c 61 67 73 20 26 20 4d  rt( (m.flags & M
45e0: 45 4d 5f 53 74 72 29 21 3d 30 20 7c 7c 20 73 71  EM_Str)!=0 || sq
45f0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
4600: 64 28 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  d() );.  return 
4610: 28 6d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  (m.flags & MEM_D
4620: 79 6e 29 21 3d 30 20 3f 20 6d 2e 7a 20 3a 20 73  yn)!=0 ? m.z : s
4630: 71 6c 69 74 65 53 74 72 44 75 70 28 6d 2e 7a 29  qliteStrDup(m.z)
4640: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 5a 20 69 73  ;.}../*.** pZ is
4650: 20 61 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65   a UTF-16 encode
4660: 64 20 75 6e 69 63 6f 64 65 20 73 74 72 69 6e 67  d unicode string
4670: 2e 20 49 66 20 6e 43 68 61 72 20 69 73 20 6c 65  . If nChar is le
4680: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 0a 2a 2a  ss than zero,.**
4690: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
46a0: 65 72 20 6f 66 20 62 79 74 65 73 20 75 70 20 74  er of bytes up t
46b0: 6f 20 28 62 75 74 20 6e 6f 74 20 69 6e 63 6c 75  o (but not inclu
46c0: 64 69 6e 67 29 2c 20 74 68 65 20 66 69 72 73 74  ding), the first
46d0: 20 70 61 69 72 0a 2a 2a 20 6f 66 20 63 6f 6e 73   pair.** of cons
46e0: 65 63 75 74 69 76 65 20 30 78 30 30 20 62 79 74  ecutive 0x00 byt
46f0: 65 73 20 69 6e 20 70 5a 2e 20 49 66 20 6e 43 68  es in pZ. If nCh
4700: 61 72 20 69 73 20 6e 6f 74 20 6c 65 73 73 20 74  ar is not less t
4710: 68 61 6e 20 7a 65 72 6f 2c 0a 2a 2a 20 74 68 65  han zero,.** the
4720: 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  n return the num
4730: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
4740: 74 68 65 20 66 69 72 73 74 20 6e 43 68 61 72 20  the first nChar 
4750: 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65  unicode characte
4760: 72 73 0a 2a 2a 20 69 6e 20 70 5a 20 28 6f 72 20  rs.** in pZ (or 
4770: 75 70 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  up until the fir
4780: 73 74 20 70 61 69 72 20 6f 66 20 30 78 30 30 20  st pair of 0x00 
4790: 62 79 74 65 73 2c 20 77 68 69 63 68 65 76 65 72  bytes, whichever
47a0: 20 63 6f 6d 65 73 20 66 69 72 73 74 29 2e 0a 2a   comes first)..*
47b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 75 74 66  /.int sqlite3utf
47c0: 31 36 42 79 74 65 4c 65 6e 28 63 6f 6e 73 74 20  16ByteLen(const 
47d0: 76 6f 69 64 20 2a 7a 49 6e 2c 20 69 6e 74 20 6e  void *zIn, int n
47e0: 43 68 61 72 29 7b 0a 20 20 75 6e 73 69 67 6e 65  Char){.  unsigne
47f0: 64 20 69 6e 74 20 63 20 3d 20 31 3b 0a 20 20 63  d int c = 1;.  c
4800: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 20 3d 20 7a  har const *z = z
4810: 49 6e 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  In;.  int n = 0;
4820: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 55 54  .  if( SQLITE_UT
4830: 46 31 36 4e 41 54 49 56 45 3d 3d 53 51 4c 49 54  F16NATIVE==SQLIT
4840: 45 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20  E_UTF16BE ){.   
4850: 20 2f 2a 20 55 73 69 6e 67 20 61 6e 20 22 69 66   /* Using an "if
4860: 20 28 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41   (SQLITE_UTF16NA
4870: 54 49 56 45 3d 3d 53 51 4c 49 54 45 5f 55 54 46  TIVE==SQLITE_UTF
4880: 31 36 42 45 29 22 20 63 6f 6e 73 74 72 75 63 74  16BE)" construct
4890: 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 61 6e 64   here.    ** and
48a0: 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74 73 20   in other parts 
48b0: 6f 66 20 74 68 69 73 20 66 69 6c 65 20 6d 65 61  of this file mea
48c0: 6e 73 20 74 68 61 74 20 61 74 20 6f 6e 65 20 62  ns that at one b
48d0: 72 61 6e 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a  ranch will.    *
48e0: 2a 20 6e 6f 74 20 62 65 20 63 6f 76 65 72 65 64  * not be covered
48f0: 20 62 79 20 63 6f 76 65 72 61 67 65 20 74 65 73   by coverage tes
4900: 74 69 6e 67 20 6f 6e 20 61 6e 79 20 73 69 6e 67  ting on any sing
4910: 6c 65 20 68 6f 73 74 2e 20 42 75 74 20 63 6f 76  le host. But cov
4920: 65 72 61 67 65 0a 20 20 20 20 2a 2a 20 77 69 6c  erage.    ** wil
4930: 6c 20 62 65 20 63 6f 6d 70 6c 65 74 65 20 69 66  l be complete if
4940: 20 74 68 65 20 74 65 73 74 73 20 61 72 65 20 72   the tests are r
4950: 75 6e 20 6f 6e 20 62 6f 74 68 20 61 20 6c 69 74  un on both a lit
4960: 74 6c 65 2d 65 6e 64 69 61 6e 20 61 6e 64 20 0a  tle-endian and .
4970: 20 20 20 20 2a 2a 20 62 69 67 2d 65 6e 64 69 61      ** big-endia
4980: 6e 20 68 6f 73 74 2e 20 42 65 63 61 75 73 65 20  n host. Because 
4990: 62 6f 74 68 20 74 68 65 20 55 54 46 31 36 4e 41  both the UTF16NA
49a0: 54 49 56 45 20 61 6e 64 20 53 51 4c 49 54 45 5f  TIVE and SQLITE_
49b0: 55 54 46 31 36 42 45 0a 20 20 20 20 2a 2a 20 6d  UTF16BE.    ** m
49c0: 61 63 72 6f 73 20 61 72 65 20 63 6f 6e 73 74 61  acros are consta
49d0: 6e 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  nt at compile ti
49e0: 6d 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  me the compiler 
49f0: 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 0a 20 20  can determine.  
4a00: 20 20 2a 2a 20 77 68 69 63 68 20 62 72 61 6e 63    ** which branc
4a10: 68 20 77 69 6c 6c 20 62 65 20 66 6f 6c 6c 6f 77  h will be follow
4a20: 65 64 2e 20 49 74 20 69 73 20 74 68 65 72 65 66  ed. It is theref
4a30: 6f 72 65 20 61 73 73 75 6d 65 64 20 74 68 61 74  ore assumed that
4a40: 20 6e 6f 20 72 75 6e 74 69 6d 65 0a 20 20 20 20   no runtime.    
4a50: 2a 2a 20 70 65 6e 61 6c 74 79 20 69 73 20 70 61  ** penalty is pa
4a60: 69 64 20 66 6f 72 20 74 68 69 73 20 22 69 66 22  id for this "if"
4a70: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
4a80: 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 63 20  */.    while( c 
4a90: 26 26 20 28 28 6e 43 68 61 72 3c 30 29 20 7c 7c  && ((nChar<0) ||
4aa0: 20 6e 3c 6e 43 68 61 72 29 20 29 7b 0a 20 20 20   n<nChar) ){.   
4ab0: 20 20 20 52 45 41 44 5f 55 54 46 31 36 42 45 28     READ_UTF16BE(
4ac0: 7a 2c 20 63 29 3b 0a 20 20 20 20 20 20 6e 2b 2b  z, c);.      n++
4ad0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
4ae0: 0a 20 20 20 20 77 68 69 6c 65 28 20 63 20 26 26  .    while( c &&
4af0: 20 28 28 6e 43 68 61 72 3c 30 29 20 7c 7c 20 6e   ((nChar<0) || n
4b00: 3c 6e 43 68 61 72 29 20 29 7b 0a 20 20 20 20 20  <nChar) ){.     
4b10: 20 52 45 41 44 5f 55 54 46 31 36 4c 45 28 7a 2c   READ_UTF16LE(z,
4b20: 20 63 29 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a   c);.      n++;.
4b30: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4b40: 72 6e 20 28 7a 2d 28 63 68 61 72 20 63 6f 6e 73  rn (z-(char cons
4b50: 74 20 2a 29 7a 49 6e 29 2d 28 28 63 3d 3d 30 29  t *)zIn)-((c==0)
4b60: 3f 32 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ?2:0);.}../*.** 
4b70: 55 54 46 2d 31 36 20 69 6d 70 6c 65 6d 65 6e 74  UTF-16 implement
4b80: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62  ation of the sub
4b90: 73 74 72 28 29 0a 2a 2f 0a 76 6f 69 64 20 73 71  str().*/.void sq
4ba0: 6c 69 74 65 33 75 74 66 31 36 53 75 62 73 74 72  lite3utf16Substr
4bb0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
4bc0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
4bd0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
4be0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
4bf0: 0a 29 7b 0a 20 20 69 6e 74 20 79 2c 20 7a 3b 0a  .){.  int y, z;.
4c00: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
4c10: 63 6f 6e 73 74 20 2a 7a 53 74 72 3b 0a 20 20 75  const *zStr;.  u
4c20: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6f 6e  nsigned char con
4c30: 73 74 20 2a 7a 53 74 72 45 6e 64 3b 0a 20 20 75  st *zStrEnd;.  u
4c40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6f 6e  nsigned char con
4c50: 73 74 20 2a 7a 53 74 61 72 74 3b 0a 20 20 75 6e  st *zStart;.  un
4c60: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73  signed char cons
4c70: 74 20 2a 7a 45 6e 64 3b 0a 20 20 69 6e 74 20 69  t *zEnd;.  int i
4c80: 3b 0a 0a 20 20 7a 53 74 72 20 3d 20 28 75 6e 73  ;..  zStr = (uns
4c90: 69 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74  igned char const
4ca0: 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
4cb0: 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d 29  _text16(argv[0])
4cc0: 3b 0a 20 20 7a 53 74 72 45 6e 64 20 3d 20 26 7a  ;.  zStrEnd = &z
4cd0: 53 74 72 5b 73 71 6c 69 74 65 33 5f 76 61 6c 75  Str[sqlite3_valu
4ce0: 65 5f 62 79 74 65 73 31 36 28 61 72 67 76 5b 30  e_bytes16(argv[0
4cf0: 5d 29 5d 3b 0a 20 20 79 20 3d 20 73 71 6c 69 74  ])];.  y = sqlit
4d00: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
4d10: 76 5b 31 5d 29 3b 0a 20 20 7a 20 3d 20 73 71 6c  v[1]);.  z = sql
4d20: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
4d30: 72 67 76 5b 32 5d 29 3b 0a 0a 20 20 69 66 28 20  rgv[2]);..  if( 
4d40: 79 3e 30 20 29 7b 0a 20 20 20 20 79 20 3d 20 79  y>0 ){.    y = y
4d50: 2d 31 3b 0a 20 20 20 20 7a 53 74 61 72 74 20 3d  -1;.    zStart =
4d60: 20 7a 53 74 72 3b 0a 20 20 20 20 69 66 28 20 53   zStr;.    if( S
4d70: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3d 3d 53  QLITE_UTF16BE==S
4d80: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
4d90: 45 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  E ){.      for(i
4da0: 3d 30 3b 20 69 3c 79 20 26 26 20 7a 53 74 61 72  =0; i<y && zStar
4db0: 74 3c 7a 53 74 72 45 6e 64 3b 20 69 2b 2b 29 20  t<zStrEnd; i++) 
4dc0: 53 4b 49 50 5f 55 54 46 31 36 42 45 28 7a 53 74  SKIP_UTF16BE(zSt
4dd0: 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  art);.    }else{
4de0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
4df0: 69 3c 79 20 26 26 20 7a 53 74 61 72 74 3c 7a 53  i<y && zStart<zS
4e00: 74 72 45 6e 64 3b 20 69 2b 2b 29 20 53 4b 49 50  trEnd; i++) SKIP
4e10: 5f 55 54 46 31 36 4c 45 28 7a 53 74 61 72 74 29  _UTF16LE(zStart)
4e20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
4e30: 0a 20 20 20 20 7a 53 74 61 72 74 20 3d 20 7a 53  .    zStart = zS
4e40: 74 72 45 6e 64 3b 0a 20 20 20 20 69 66 28 20 53  trEnd;.    if( S
4e50: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3d 3d 53  QLITE_UTF16BE==S
4e60: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
4e70: 45 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  E ){.      for(i
4e80: 3d 79 3b 20 69 3c 30 20 26 26 20 7a 53 74 61 72  =y; i<0 && zStar
4e90: 74 3e 7a 53 74 72 3b 20 69 2b 2b 29 20 52 53 4b  t>zStr; i++) RSK
4ea0: 49 50 5f 55 54 46 31 36 42 45 28 7a 53 74 61 72  IP_UTF16BE(zStar
4eb0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
4ec0: 20 20 20 20 20 66 6f 72 28 69 3d 79 3b 20 69 3c       for(i=y; i<
4ed0: 30 20 26 26 20 7a 53 74 61 72 74 3e 7a 53 74 72  0 && zStart>zStr
4ee0: 3b 20 69 2b 2b 29 20 52 53 4b 49 50 5f 55 54 46  ; i++) RSKIP_UTF
4ef0: 31 36 4c 45 28 7a 53 74 61 72 74 29 3b 0a 20 20  16LE(zStart);.  
4f00: 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 20 69 3c    }.    for(; i<
4f10: 30 3b 20 69 2b 2b 29 20 7a 20 2d 3d 20 31 3b 0a  0; i++) z -= 1;.
4f20: 20 20 7d 0a 0a 20 20 7a 45 6e 64 20 3d 20 7a 53    }..  zEnd = zS
4f30: 74 61 72 74 3b 0a 20 20 69 66 28 20 53 51 4c 49  tart;.  if( SQLI
4f40: 54 45 5f 55 54 46 31 36 42 45 3d 3d 53 51 4c 49  TE_UTF16BE==SQLI
4f50: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 29  TE_UTF16NATIVE )
4f60: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
4f70: 3c 7a 20 26 26 20 7a 45 6e 64 3c 7a 53 74 72 45  <z && zEnd<zStrE
4f80: 6e 64 3b 20 69 2b 2b 29 20 53 4b 49 50 5f 55 54  nd; i++) SKIP_UT
4f90: 46 31 36 42 45 28 7a 45 6e 64 29 3b 0a 20 20 7d  F16BE(zEnd);.  }
4fa0: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
4fb0: 30 3b 20 69 3c 7a 20 26 26 20 7a 45 6e 64 3c 7a  0; i<z && zEnd<z
4fc0: 53 74 72 45 6e 64 3b 20 69 2b 2b 29 20 53 4b 49  StrEnd; i++) SKI
4fd0: 50 5f 55 54 46 31 36 4c 45 28 7a 45 6e 64 29 3b  P_UTF16LE(zEnd);
4fe0: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
4ff0: 72 65 73 75 6c 74 5f 74 65 78 74 31 36 28 63 6f  result_text16(co
5000: 6e 74 65 78 74 2c 20 7a 53 74 61 72 74 2c 20 7a  ntext, zStart, z
5010: 45 6e 64 2d 7a 53 74 61 72 74 2c 20 53 51 4c 49  End-zStart, SQLI
5020: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d  TE_TRANSIENT);.}
5030: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
5040: 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
5050: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5060: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65   called from the
5070: 20 54 43 4c 20 74 65 73 74 20 66 75 6e 63 74 69   TCL test functi
5080: 6f 6e 20 22 74 72 61 6e 73 6c 61 74 65 5f 73 65  on "translate_se
5090: 6c 66 74 65 73 74 22 2e 0a 2a 2a 20 49 74 20 63  lftest"..** It c
50a0: 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 70  hecks that the p
50b0: 72 69 6d 69 74 69 76 65 73 20 66 6f 72 20 73 65  rimitives for se
50c0: 72 69 61 6c 69 7a 69 6e 67 20 61 6e 64 20 64 65  rializing and de
50d0: 73 65 72 69 61 6c 69 7a 69 6e 67 0a 2a 2a 20 63  serializing.** c
50e0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 65 61 63  haracters in eac
50f0: 68 20 65 6e 63 6f 64 69 6e 67 20 61 72 65 20 69  h encoding are i
5100: 6e 76 65 72 73 65 73 20 6f 66 20 65 61 63 68 20  nverses of each 
5110: 6f 74 68 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  other..*/.void s
5120: 71 6c 69 74 65 33 75 74 66 53 65 6c 66 54 65 73  qlite3utfSelfTes
5130: 74 28 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t(){.  unsigned 
5140: 69 6e 74 20 69 2c 20 74 3b 0a 20 20 75 6e 73 69  int i, t;.  unsi
5150: 67 6e 65 64 20 63 68 61 72 20 7a 42 75 66 5b 32  gned char zBuf[2
5160: 30 5d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  0];.  unsigned c
5170: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b  har *z;.  int n;
5180: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
5190: 63 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  c;..  for(i=0; i
51a0: 3c 30 78 30 30 31 31 30 30 30 30 3b 20 69 2b 2b  <0x00110000; i++
51b0: 29 7b 0a 20 20 20 20 7a 20 3d 20 7a 42 75 66 3b  ){.    z = zBuf;
51c0: 0a 20 20 20 20 57 52 49 54 45 5f 55 54 46 38 28  .    WRITE_UTF8(
51d0: 7a 2c 20 69 29 3b 0a 20 20 20 20 6e 20 3d 20 7a  z, i);.    n = z
51e0: 2d 7a 42 75 66 3b 0a 20 20 20 20 7a 20 3d 20 7a  -zBuf;.    z = z
51f0: 42 75 66 3b 0a 20 20 20 20 52 45 41 44 5f 55 54  Buf;.    READ_UT
5200: 46 38 28 7a 2c 20 63 29 3b 0a 20 20 20 20 74 20  F8(z, c);.    t 
5210: 3d 20 69 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d  = i;.    if( i>=
5220: 30 78 44 38 30 30 20 26 26 20 69 3c 3d 30 78 44  0xD800 && i<=0xD
5230: 46 46 46 20 29 20 74 20 3d 20 30 78 46 46 46 44  FFF ) t = 0xFFFD
5240: 3b 0a 20 20 20 20 69 66 28 20 28 69 26 30 78 46  ;.    if( (i&0xF
5250: 46 46 46 46 46 46 45 29 3d 3d 30 78 46 46 46 45  FFFFFFE)==0xFFFE
5260: 20 29 20 74 20 3d 20 30 78 46 46 46 44 3b 0a 20   ) t = 0xFFFD;. 
5270: 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 74 20     assert( c==t 
5280: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
5290: 7a 2d 7a 42 75 66 29 3d 3d 6e 20 29 3b 0a 20 20  z-zBuf)==n );.  
52a0: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 30  }.  for(i=0; i<0
52b0: 78 30 30 31 31 30 30 30 30 3b 20 69 2b 2b 29 7b  x00110000; i++){
52c0: 0a 20 20 20 20 69 66 28 20 69 3e 3d 30 78 44 38  .    if( i>=0xD8
52d0: 30 30 20 26 26 20 69 3c 3d 30 78 45 30 30 30 20  00 && i<=0xE000 
52e0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
52f0: 7a 20 3d 20 7a 42 75 66 3b 0a 20 20 20 20 57 52  z = zBuf;.    WR
5300: 49 54 45 5f 55 54 46 31 36 4c 45 28 7a 2c 20 69  ITE_UTF16LE(z, i
5310: 29 3b 0a 20 20 20 20 6e 20 3d 20 7a 2d 7a 42 75  );.    n = z-zBu
5320: 66 3b 0a 20 20 20 20 7a 20 3d 20 7a 42 75 66 3b  f;.    z = zBuf;
5330: 0a 20 20 20 20 52 45 41 44 5f 55 54 46 31 36 4c  .    READ_UTF16L
5340: 45 28 7a 2c 20 63 29 3b 0a 20 20 20 20 61 73 73  E(z, c);.    ass
5350: 65 72 74 28 20 63 3d 3d 69 20 29 3b 0a 20 20 20  ert( c==i );.   
5360: 20 61 73 73 65 72 74 28 20 28 7a 2d 7a 42 75 66   assert( (z-zBuf
5370: 29 3d 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 66 6f  )==n );.  }.  fo
5380: 72 28 69 3d 30 3b 20 69 3c 30 78 30 30 31 31 30  r(i=0; i<0x00110
5390: 30 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  000; i++){.    i
53a0: 66 28 20 69 3e 3d 30 78 44 38 30 30 20 26 26 20  f( i>=0xD800 && 
53b0: 69 3c 3d 30 78 45 30 30 30 20 29 20 63 6f 6e 74  i<=0xE000 ) cont
53c0: 69 6e 75 65 3b 0a 20 20 20 20 7a 20 3d 20 7a 42  inue;.    z = zB
53d0: 75 66 3b 0a 20 20 20 20 57 52 49 54 45 5f 55 54  uf;.    WRITE_UT
53e0: 46 31 36 42 45 28 7a 2c 20 69 29 3b 0a 20 20 20  F16BE(z, i);.   
53f0: 20 6e 20 3d 20 7a 2d 7a 42 75 66 3b 0a 20 20 20   n = z-zBuf;.   
5400: 20 7a 20 3d 20 7a 42 75 66 3b 0a 20 20 20 20 52   z = zBuf;.    R
5410: 45 41 44 5f 55 54 46 31 36 42 45 28 7a 2c 20 63  EAD_UTF16BE(z, c
5420: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  );.    assert( c
5430: 3d 3d 69 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==i );.    asser
5440: 74 28 20 28 7a 2d 7a 42 75 66 29 3d 3d 6e 20 29  t( (z-zBuf)==n )
5450: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
5460: 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f  * SQLITE_TEST */
5470: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5480: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.