/ Hex Artifact Content
Login

Artifact f4f83acd73389090e32d6589d307fc55d794c7ed:


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 32 39 20 32  : utf.c,v 1.29 2
01f0: 30 30 34 2f 30 39 2f 32 34 20 32 33 3a 32 30 3a  004/09/24 23:20:
0200: 35 32 20 64 72 68 20 45 78 70 20 24 0a 2a 2a 0a  52 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 3c 61 73  .*/.#include <as
0910: 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  sert.h>.#include
0920: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23   "sqliteInt.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 32 35 35 27 20 69   A value '255' i
09c0: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
09d0: 65 20 74 61 62 6c 65 20 6b 65 79 0a 2a 2a 20 69  e table key.** i
09e0: 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 66 69  s not a legal fi
09f0: 72 73 74 20 62 79 74 65 20 66 6f 72 20 61 20 55  rst byte for a U
0a00: 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 2e 0a  TF-8 character..
0a10: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
0a20: 75 38 20 78 74 72 61 5f 75 74 66 38 5f 62 79 74  u8 xtra_utf8_byt
0a30: 65 73 5b 32 35 36 5d 20 20 3d 20 7b 0a 2f 2a 20  es[256]  = {./* 
0a40: 30 78 78 78 78 78 78 78 20 2a 2f 0a 30 2c 20 30  0xxxxxxx */.0, 0
0a50: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0a60: 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c   0,     0, 0, 0,
0a70: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
0a80: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0a90: 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30  , 0, 0,     0, 0
0aa0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0ab0: 20 30 2c 0a 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0,.0, 0, 0, 0, 
0ac0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20  0, 0, 0, 0,     
0ad0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0ae0: 2c 20 30 2c 20 30 2c 0a 30 2c 20 30 2c 20 30 2c  , 0, 0,.0, 0, 0,
0af0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0b00: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20      0, 0, 0, 0, 
0b10: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 30 2c 20 30  0, 0, 0, 0,.0, 0
0b20: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0b30: 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c   0,     0, 0, 0,
0b40: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
0b50: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0b60: 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30  , 0, 0,     0, 0
0b70: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0b80: 20 30 2c 0a 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0,.0, 0, 0, 0, 
0b90: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20  0, 0, 0, 0,     
0ba0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0bb0: 2c 20 30 2c 20 30 2c 0a 30 2c 20 30 2c 20 30 2c  , 0, 0,.0, 0, 0,
0bc0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0bd0: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20      0, 0, 0, 0, 
0be0: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 0a 2f 2a 20  0, 0, 0, 0,../* 
0bf0: 31 30 77 77 77 77 77 77 20 2a 2f 0a 32 35 35 2c  10wwwwww */.255,
0c00: 20 32 35 35 2c 20 32 35 35 2c 20 32 35 35 2c 20   255, 255, 255, 
0c10: 32 35 35 2c 20 32 35 35 2c 20 32 35 35 2c 20 32  255, 255, 255, 2
0c20: 35 35 2c 20 32 35 35 2c 20 32 35 35 2c 20 32 35  55, 255, 255, 25
0c30: 35 2c 20 32 35 35 2c 20 32 35 35 2c 20 32 35 35  5, 255, 255, 255
0c40: 2c 20 32 35 35 2c 20 32 35 35 2c 0a 32 35 35 2c  , 255, 255,.255,
0c50: 20 32 35 35 2c 20 32 35 35 2c 20 32 35 35 2c 20   255, 255, 255, 
0c60: 32 35 35 2c 20 32 35 35 2c 20 32 35 35 2c 20 32  255, 255, 255, 2
0c70: 35 35 2c 20 32 35 35 2c 20 32 35 35 2c 20 32 35  55, 255, 255, 25
0c80: 35 2c 20 32 35 35 2c 20 32 35 35 2c 20 32 35 35  5, 255, 255, 255
0c90: 2c 20 32 35 35 2c 20 32 35 35 2c 0a 32 35 35 2c  , 255, 255,.255,
0ca0: 20 32 35 35 2c 20 32 35 35 2c 20 32 35 35 2c 20   255, 255, 255, 
0cb0: 32 35 35 2c 20 32 35 35 2c 20 32 35 35 2c 20 32  255, 255, 255, 2
0cc0: 35 35 2c 20 32 35 35 2c 20 32 35 35 2c 20 32 35  55, 255, 255, 25
0cd0: 35 2c 20 32 35 35 2c 20 32 35 35 2c 20 32 35 35  5, 255, 255, 255
0ce0: 2c 20 32 35 35 2c 20 32 35 35 2c 0a 32 35 35 2c  , 255, 255,.255,
0cf0: 20 32 35 35 2c 20 32 35 35 2c 20 32 35 35 2c 20   255, 255, 255, 
0d00: 32 35 35 2c 20 32 35 35 2c 20 32 35 35 2c 20 32  255, 255, 255, 2
0d10: 35 35 2c 20 32 35 35 2c 20 32 35 35 2c 20 32 35  55, 255, 255, 25
0d20: 35 2c 20 32 35 35 2c 20 32 35 35 2c 20 32 35 35  5, 255, 255, 255
0d30: 2c 20 32 35 35 2c 20 32 35 35 2c 0a 0a 2f 2a 20  , 255, 255,../* 
0d40: 31 31 30 79 79 79 79 79 20 2a 2f 0a 31 2c 20 31  110yyyyy */.1, 1
0d50: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
0d60: 20 31 2c 20 20 20 20 20 31 2c 20 31 2c 20 31 2c   1,     1, 1, 1,
0d70: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
0d80: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
0d90: 2c 20 31 2c 20 31 2c 20 20 20 20 20 31 2c 20 31  , 1, 1,     1, 1
0da0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
0db0: 20 31 2c 0a 0a 2f 2a 20 31 31 31 30 7a 7a 7a 7a   1,../* 1110zzzz
0dc0: 20 2a 2f 0a 32 2c 20 32 2c 20 32 2c 20 32 2c 20   */.2, 2, 2, 2, 
0dd0: 32 2c 20 32 2c 20 32 2c 20 32 2c 20 20 20 20 20  2, 2, 2, 2,     
0de0: 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32  2, 2, 2, 2, 2, 2
0df0: 2c 20 32 2c 20 32 2c 0a 0a 2f 2a 20 31 31 31 31  , 2, 2,../* 1111
0e00: 30 79 79 79 20 2a 2f 0a 33 2c 20 33 2c 20 33 2c  0yyy */.3, 3, 3,
0e10: 20 33 2c 20 33 2c 20 33 2c 20 33 2c 20 33 2c 20   3, 3, 3, 3, 3, 
0e20: 20 20 20 20 32 35 35 2c 20 32 35 35 2c 20 32 35      255, 255, 25
0e30: 35 2c 20 32 35 35 2c 20 32 35 35 2c 20 32 35 35  5, 255, 255, 255
0e40: 2c 20 32 35 35 2c 20 32 35 35 2c 0a 7d 3b 0a 0a  , 255, 255,.};..
0e50: 2f 2a 0a 2a 2a 20 54 68 69 73 20 74 61 62 6c 65  /*.** This table
0e60: 20 6d 61 70 73 20 66 72 6f 6d 20 74 68 65 20 6e   maps from the n
0e70: 75 6d 62 65 72 20 6f 66 20 74 72 61 69 6c 69 6e  umber of trailin
0e80: 67 20 62 79 74 65 73 20 69 6e 20 61 20 55 54 46  g bytes in a UTF
0e90: 2d 38 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20  -8 character.** 
0ea0: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  to an integer co
0eb0: 6e 73 74 61 6e 74 20 74 68 61 74 20 69 73 20 65  nstant that is e
0ec0: 66 66 65 63 74 69 76 65 6c 79 20 63 61 6c 63 75  ffectively calcu
0ed0: 6c 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 63  lated for each c
0ee0: 68 61 72 61 63 74 65 72 0a 2a 2a 20 72 65 61 64  haracter.** read
0ef0: 20 62 79 20 61 20 6e 61 69 76 65 20 69 6d 70 6c   by a naive impl
0f00: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20  ementation of a 
0f10: 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 20  UTF-8 character 
0f20: 72 65 61 64 65 72 2e 20 54 68 65 20 63 6f 64 65  reader. The code
0f30: 0a 2a 2a 20 69 6e 20 74 68 65 20 52 45 41 44 5f  .** in the READ_
0f40: 55 54 46 38 20 6d 61 63 72 6f 20 65 78 70 6c 61  UTF8 macro expla
0f50: 69 6e 73 20 74 68 69 6e 67 73 20 62 65 73 74 2e  ins things best.
0f60: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
0f70: 20 69 6e 74 20 78 74 72 61 5f 75 74 66 38 5f 62   int xtra_utf8_b
0f80: 69 74 73 5b 34 5d 20 3d 20 20 7b 0a 30 2c 0a 31  its[4] =  {.0,.1
0f90: 32 34 31 36 2c 20 20 20 20 20 20 20 20 20 20 2f  2416,          /
0fa0: 2a 20 28 30 78 43 30 20 3c 3c 20 36 29 20 2b 20  * (0xC0 << 6) + 
0fb0: 28 30 78 38 30 29 20 2a 2f 0a 39 32 35 38 32 34  (0x80) */.925824
0fc0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 28 30 78  ,         /* (0x
0fd0: 45 30 20 3c 3c 20 31 32 29 20 2b 20 28 30 78 38  E0 << 12) + (0x8
0fe0: 30 20 3c 3c 20 36 29 20 2b 20 28 30 78 38 30 29  0 << 6) + (0x80)
0ff0: 20 2a 2f 0a 36 33 34 34 37 31 36 38 20 20 20 20   */.63447168    
1000: 20 20 20 20 2f 2a 20 28 30 78 46 30 20 3c 3c 20      /* (0xF0 << 
1010: 31 38 29 20 2b 20 28 30 78 38 30 20 3c 3c 20 31  18) + (0x80 << 1
1020: 32 29 20 2b 20 28 30 78 38 30 20 3c 3c 20 36 29  2) + (0x80 << 6)
1030: 20 2b 20 30 78 38 30 20 2a 2f 0a 7d 3b 0a 0a 23   + 0x80 */.};..#
1040: 64 65 66 69 6e 65 20 52 45 41 44 5f 55 54 46 38  define READ_UTF8
1050: 28 7a 49 6e 2c 20 63 29 20 7b 20 5c 0a 20 20 69  (zIn, c) { \.  i
1060: 6e 74 20 78 74 72 61 3b 20 20 20 20 20 20 20 20  nt xtra;        
1070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1090: 20 20 20 20 5c 0a 20 20 63 20 3d 20 2a 28 7a 49      \.  c = *(zI
10a0: 6e 29 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20  n)++;           
10b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
10d0: 20 78 74 72 61 20 3d 20 78 74 72 61 5f 75 74 66   xtra = xtra_utf
10e0: 38 5f 62 79 74 65 73 5b 63 5d 3b 20 20 20 20 20  8_bytes[c];     
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 20 20 20 20 20 5c 0a 20 20 73 77 69 74 63 68        \.  switch
1110: 28 20 78 74 72 61 20 29 7b 20 20 20 20 20 20 20  ( xtra ){       
1120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1140: 0a 20 20 20 20 63 61 73 65 20 32 35 35 3a 20 63  .    case 255: c
1150: 20 3d 20 28 69 6e 74 29 30 78 46 46 46 44 3b 20   = (int)0xFFFD; 
1160: 62 72 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20  break;          
1170: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 63 61          \.    ca
1180: 73 65 20 33 3a 20 63 20 3d 20 28 63 3c 3c 36 29  se 3: c = (c<<6)
1190: 20 2b 20 2a 28 7a 49 6e 29 2b 2b 3b 20 20 20 20   + *(zIn)++;    
11a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b0: 20 5c 0a 20 20 20 20 63 61 73 65 20 32 3a 20 63   \.    case 2: c
11c0: 20 3d 20 28 63 3c 3c 36 29 20 2b 20 2a 28 7a 49   = (c<<6) + *(zI
11d0: 6e 29 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20  n)++;           
11e0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
11f0: 63 61 73 65 20 31 3a 20 63 20 3d 20 28 63 3c 3c  case 1: c = (c<<
1200: 36 29 20 2b 20 2a 28 7a 49 6e 29 2b 2b 3b 20 20  6) + *(zIn)++;  
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1220: 20 20 20 5c 0a 20 20 20 20 63 20 2d 3d 20 78 74     \.    c -= xt
1230: 72 61 5f 75 74 66 38 5f 62 69 74 73 5b 78 74 72  ra_utf8_bits[xtr
1240: 61 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  a];             
1250: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1260: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
1270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 20 20 20 20 20 5c 0a 7d 0a 69 6e 74 20 73 71 6c       \.}.int sql
12a0: 69 74 65 33 52 65 61 64 55 74 66 38 28 63 6f 6e  ite3ReadUtf8(con
12b0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
12c0: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20   *z){.  int c;. 
12d0: 20 52 45 41 44 5f 55 54 46 38 28 7a 2c 20 63 29   READ_UTF8(z, c)
12e0: 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  ;.  return c;.}.
12f0: 0a 23 64 65 66 69 6e 65 20 53 4b 49 50 5f 55 54  .#define SKIP_UT
1300: 46 38 28 7a 49 6e 29 20 7b 20 20 20 20 20 20 20  F8(zIn) {       
1310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1320: 20 20 20 20 20 20 20 20 5c 0a 20 20 7a 49 6e 20          \.  zIn 
1330: 2b 3d 20 28 78 74 72 61 5f 75 74 66 38 5f 62 79  += (xtra_utf8_by
1340: 74 65 73 5b 2a 28 75 38 20 2a 29 7a 49 6e 5d 20  tes[*(u8 *)zIn] 
1350: 2b 20 31 29 3b 20 20 20 20 20 20 20 20 20 20 20  + 1);           
1360: 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 57 52   \.}..#define WR
1370: 49 54 45 5f 55 54 46 38 28 7a 4f 75 74 2c 20 63  ITE_UTF8(zOut, c
1380: 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) {             
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
13a0: 20 69 66 28 20 63 3c 30 78 30 30 30 38 30 20 29   if( c<0x00080 )
13b0: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d0: 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75        \.    *zOu
13e0: 74 2b 2b 20 3d 20 28 63 26 30 78 46 46 29 3b 20  t++ = (c&0xFF); 
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1410: 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  .  }            
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 20 20 20 20 20 5c 0a 20 20 65 6c 73 65          \.  else
1450: 20 69 66 28 20 63 3c 30 78 30 30 38 30 30 20 29   if( c<0x00800 )
1460: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1480: 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d   \.    *zOut++ =
1490: 20 30 78 43 30 20 2b 20 28 28 63 3e 3e 36 29 26   0xC0 + ((c>>6)&
14a0: 30 78 31 46 29 3b 20 20 20 20 20 20 20 20 20 20  0x1F);          
14b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
14c0: 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b  *zOut++ = 0x80 +
14d0: 20 28 63 20 26 20 30 78 33 46 29 3b 20 20 20 20   (c & 0x3F);    
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f0: 20 20 20 5c 0a 20 20 7d 20 20 20 20 20 20 20 20     \.  }        
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1520: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1530: 65 6c 73 65 20 69 66 28 20 63 3c 30 78 31 30 30  else if( c<0x100
1540: 30 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  00 ){           
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74       \.    *zOut
1570: 2b 2b 20 3d 20 30 78 45 30 20 2b 20 28 28 63 3e  ++ = 0xE0 + ((c>
1580: 3e 31 32 29 26 30 78 30 46 29 3b 20 20 20 20 20  >12)&0x0F);     
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
15a0: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78      *zOut++ = 0x
15b0: 38 30 20 2b 20 28 28 63 3e 3e 36 29 20 26 20 30  80 + ((c>>6) & 0
15c0: 78 33 46 29 3b 20 20 20 20 20 20 20 20 20 20 20  x3F);           
15d0: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f         \.    *zO
15e0: 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 63  ut++ = 0x80 + (c
15f0: 20 26 20 30 78 33 46 29 3b 20 20 20 20 20 20 20   & 0x3F);       
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1610: 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20  \.  }else{      
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1640: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a           \.    *
1650: 7a 4f 75 74 2b 2b 20 3d 20 30 78 46 30 20 2b 20  zOut++ = 0xF0 + 
1660: 28 28 63 3e 3e 31 38 29 20 26 20 30 78 30 37 29  ((c>>18) & 0x07)
1670: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1680: 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20    \.    *zOut++ 
1690: 3d 20 30 78 38 30 20 2b 20 28 28 63 3e 3e 31 32  = 0x80 + ((c>>12
16a0: 29 20 26 20 30 78 33 46 29 3b 20 20 20 20 20 20  ) & 0x3F);      
16b0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
16c0: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20   *zOut++ = 0x80 
16d0: 2b 20 28 28 63 3e 3e 36 29 20 26 20 30 78 33 46  + ((c>>6) & 0x3F
16e0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
16f0: 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b      \.    *zOut+
1700: 2b 20 3d 20 30 78 38 30 20 2b 20 28 63 20 26 20  + = 0x80 + (c & 
1710: 30 78 33 46 29 3b 20 20 20 20 20 20 20 20 20 20  0x3F);          
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1730: 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1760: 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66 69        \.}..#defi
1770: 6e 65 20 57 52 49 54 45 5f 55 54 46 31 36 4c 45  ne WRITE_UTF16LE
1780: 28 7a 4f 75 74 2c 20 63 29 20 7b 20 20 20 20 20  (zOut, c) {     
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
17b0: 66 28 20 63 3c 3d 30 78 46 46 46 46 20 29 7b 20  f( c<=0xFFFF ){ 
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 20 20 20 20 20 20 20 5c 0a 20               \. 
17f0: 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 63 26     *zOut++ = (c&
1800: 30 78 30 30 46 46 29 3b 20 20 20 20 20 20 20 20  0x00FF);        
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1830: 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28  .    *zOut++ = (
1840: 28 63 3e 3e 38 29 26 30 78 30 30 46 46 29 3b 20  (c>>8)&0x00FF); 
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20   \.  }else{     
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b     \.    *zOut++
18c0: 20 3d 20 28 28 28 63 3e 3e 31 30 29 26 30 78 30   = (((c>>10)&0x0
18d0: 30 33 46 29 20 2b 20 28 28 28 63 2d 30 78 31 30  03F) + (((c-0x10
18e0: 30 30 30 29 3e 3e 31 30 29 26 30 78 30 30 43 30  000)>>10)&0x00C0
18f0: 29 29 3b 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74  ));  \.    *zOut
1900: 2b 2b 20 3d 20 28 30 78 30 30 44 38 20 2b 20 28  ++ = (0x00D8 + (
1910: 28 28 63 2d 30 78 31 30 30 30 30 29 3e 3e 31 38  ((c-0x10000)>>18
1920: 29 26 30 78 30 33 29 29 3b 20 20 20 20 20 20 20  )&0x03));       
1930: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f         \.    *zO
1940: 75 74 2b 2b 20 3d 20 28 63 26 30 78 30 30 46 46  ut++ = (c&0x00FF
1950: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a           \.    *
1980: 7a 4f 75 74 2b 2b 20 3d 20 28 30 78 30 30 44 43  zOut++ = (0x00DC
1990: 20 2b 20 28 28 63 3e 3e 38 29 26 30 78 30 33 29   + ((c>>8)&0x03)
19a0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
19b0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
1a00: 0a 0a 23 64 65 66 69 6e 65 20 57 52 49 54 45 5f  ..#define WRITE_
1a10: 55 54 46 31 36 42 45 28 7a 4f 75 74 2c 20 63 29  UTF16BE(zOut, c)
1a20: 20 7b 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 5c 0a 20 20 69 66 28 20 63 3c 3d 30 78 46    \.  if( c<=0xF
1a50: 46 46 46 20 29 7b 20 20 20 20 20 20 20 20 20 20  FFF ){          
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a80: 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b      \.    *zOut+
1a90: 2b 20 3d 20 28 28 63 3e 3e 38 29 26 30 78 30 30  + = ((c>>8)&0x00
1aa0: 46 46 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  FF);            
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75        \.    *zOu
1ad0: 74 2b 2b 20 3d 20 28 63 26 30 78 30 30 46 46 29  t++ = (c&0x00FF)
1ae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73          \.  }els
1b10: 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e{              
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b40: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
1b50: 2a 7a 4f 75 74 2b 2b 20 3d 20 28 30 78 30 30 44  *zOut++ = (0x00D
1b60: 38 20 2b 20 28 28 28 63 2d 30 78 31 30 30 30 30  8 + (((c-0x10000
1b70: 29 3e 3e 31 38 29 26 30 78 30 33 29 29 3b 20 20  )>>18)&0x03));  
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1b90: 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 28 28 63    *zOut++ = (((c
1ba0: 3e 3e 31 30 29 26 30 78 30 30 33 46 29 20 2b 20  >>10)&0x003F) + 
1bb0: 28 28 28 63 2d 30 78 31 30 30 30 30 29 3e 3e 31  (((c-0x10000)>>1
1bc0: 30 29 26 30 78 30 30 43 30 29 29 3b 20 20 5c 0a  0)&0x00C0));  \.
1bd0: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 30      *zOut++ = (0
1be0: 78 30 30 44 43 20 2b 20 28 28 63 3e 3e 38 29 26  x00DC + ((c>>8)&
1bf0: 30 78 30 33 29 29 3b 20 20 20 20 20 20 20 20 20  0x03));         
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c10: 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20  \.    *zOut++ = 
1c20: 28 63 26 30 78 30 30 46 46 29 3b 20 20 20 20 20  (c&0x00FF);     
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 20 5c 0a 20 20 7d 20 20 20 20 20 20 20 20 20    \.  }         
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c90: 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65      \.}..#define
1ca0: 20 52 45 41 44 5f 55 54 46 31 36 4c 45 28 7a 49   READ_UTF16LE(zI
1cb0: 6e 2c 20 63 29 7b 20 20 20 20 20 20 20 20 20 20  n, c){          
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 5c                 \
1ce0: 0a 20 20 63 20 3d 20 28 2a 7a 49 6e 2b 2b 29 3b  .  c = (*zIn++);
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 20 20 20 20 20 20 5c 0a 20 20 63 20 2b 3d 20         \.  c += 
1d30: 28 28 2a 7a 49 6e 2b 2b 29 3c 3c 38 29 3b 20 20  ((*zIn++)<<8);  
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1d70: 0a 20 20 69 66 28 20 63 3e 3d 30 78 44 38 30 30  .  if( c>=0xD800
1d80: 20 26 26 20 63 3c 3d 30 78 45 30 30 30 20 29 7b   && c<=0xE000 ){
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db0: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74         \.    int
1dc0: 20 63 32 20 3d 20 28 2a 7a 49 6e 2b 2b 29 3b 20   c2 = (*zIn++); 
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 20                  
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1e00: 0a 20 20 20 20 63 32 20 2b 3d 20 28 28 2a 7a 49  .    c2 += ((*zI
1e10: 6e 2b 2b 29 3c 3c 38 29 3b 20 20 20 20 20 20 20  n++)<<8);       
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 63 20 3d         \.    c =
1e50: 20 28 63 32 26 30 78 30 33 46 46 29 20 2b 20 28   (c2&0x03FF) + (
1e60: 28 63 26 30 78 30 30 33 46 29 3c 3c 31 30 29 20  (c&0x003F)<<10) 
1e70: 2b 20 28 28 28 63 26 30 78 30 33 43 30 29 2b 30  + (((c&0x03C0)+0
1e80: 78 30 30 34 30 29 3c 3c 31 30 29 3b 20 20 20 5c  x0040)<<10);   \
1e90: 0a 20 20 7d 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 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed0: 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66         \.}..#def
1ee0: 69 6e 65 20 52 45 41 44 5f 55 54 46 31 36 42 45  ine READ_UTF16BE
1ef0: 28 7a 49 6e 2c 20 63 29 7b 20 20 20 20 20 20 20  (zIn, c){       
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 20 5c 0a 20 20 63 20 3d 20 28 28 2a 7a 49 6e    \.  c = ((*zIn
1f30: 2b 2b 29 3c 3c 38 29 3b 20 20 20 20 20 20 20 20  ++)<<8);        
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 63 20            \.  c 
1f70: 2b 3d 20 28 2a 7a 49 6e 2b 2b 29 3b 20 20 20 20  += (*zIn++);    
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 20 20 20 20                  
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 20 5c 0a 20 20 69 66 28 20 63 3e 3d 30 78 44    \.  if( c>=0xD
1fc0: 38 30 30 20 26 26 20 63 3c 3d 30 78 45 30 30 30  800 && c<=0xE000
1fd0: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
2000: 69 6e 74 20 63 32 20 3d 20 28 28 2a 7a 49 6e 2b  int c2 = ((*zIn+
2010: 2b 29 3c 3c 38 29 3b 20 20 20 20 20 20 20 20 20  +)<<8);         
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2040: 20 20 5c 0a 20 20 20 20 63 32 20 2b 3d 20 28 2a    \.    c2 += (*
2050: 7a 49 6e 2b 2b 29 3b 20 20 20 20 20 20 20 20 20  zIn++);         
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
2090: 63 20 3d 20 28 63 32 26 30 78 30 33 46 46 29 20  c = (c2&0x03FF) 
20a0: 2b 20 28 28 63 26 30 78 30 30 33 46 29 3c 3c 31  + ((c&0x003F)<<1
20b0: 30 29 20 2b 20 28 28 28 63 26 30 78 30 33 43 30  0) + (((c&0x03C0
20c0: 29 2b 30 78 30 30 34 30 29 3c 3c 31 30 29 3b 20  )+0x0040)<<10); 
20d0: 20 20 5c 0a 20 20 7d 20 20 20 20 20 20 20 20 20    \.  }         
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 20 20 20 20 20 20 20 20 20                  
2110: 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23            \.}..#
2120: 64 65 66 69 6e 65 20 53 4b 49 50 5f 55 54 46 31  define SKIP_UTF1
2130: 36 42 45 28 7a 49 6e 29 7b 20 20 20 20 20 20 20  6BE(zIn){       
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 5c 0a 20 20 69 66 28 20 2a 7a 49       \.  if( *zI
2170: 6e 3e 3d 30 78 44 38 20 26 26 20 28 2a 7a 49 6e  n>=0xD8 && (*zIn
2180: 3c 30 78 45 30 20 7c 7c 20 28 2a 7a 49 6e 3d 3d  <0xE0 || (*zIn==
2190: 30 78 45 30 20 26 26 20 2a 28 7a 49 6e 2b 31 29  0xE0 && *(zIn+1)
21a0: 3d 3d 30 78 30 30 29 29 20 29 7b 20 20 5c 0a 20  ==0x00)) ){  \. 
21b0: 20 20 20 7a 49 6e 20 2b 3d 20 34 3b 20 20 20 20     zIn += 4;    
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 20                  
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20       \.  }else{ 
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 20 20 20 20 20 20 20 20 20                  
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2240: 20 20 20 7a 49 6e 20 2b 3d 20 32 3b 20 20 20 20     zIn += 2;    
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 20                  
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 20 20 5c 0a 20 20 7d 20 20 20 20 20 20       \.  }      
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
22d0: 0a 23 64 65 66 69 6e 65 20 53 4b 49 50 5f 55 54  .#define SKIP_UT
22e0: 46 31 36 4c 45 28 7a 49 6e 29 7b 20 20 20 20 20  F16LE(zIn){     
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2310: 20 20 20 20 20 20 20 5c 0a 20 20 7a 49 6e 2b 2b         \.  zIn++
2320: 3b 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 20 20 20 20 20 20 20 20 20                  
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2360: 0a 20 20 69 66 28 20 2a 7a 49 6e 3e 3d 30 78 44  .  if( *zIn>=0xD
2370: 38 20 26 26 20 28 2a 7a 49 6e 3c 30 78 45 30 20  8 && (*zIn<0xE0 
2380: 7c 7c 20 28 2a 7a 49 6e 3d 3d 30 78 45 30 20 26  || (*zIn==0xE0 &
2390: 26 20 2a 28 7a 49 6e 2d 31 29 3d 3d 30 78 30 30  & *(zIn-1)==0x00
23a0: 29 29 20 29 7b 20 20 5c 0a 20 20 20 20 7a 49 6e  )) ){  \.    zIn
23b0: 20 2b 3d 20 33 3b 20 20 20 20 20 20 20 20 20 20   += 3;          
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
23f0: 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20  .  }else{       
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 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 7a 49 6e         \.    zIn
2440: 20 2b 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20   += 1;          
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 20 20 20 20 20 20                  
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2480: 0a 20 20 7d 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 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c0: 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66         \.}..#def
24d0: 69 6e 65 20 52 53 4b 49 50 5f 55 54 46 31 36 4c  ine RSKIP_UTF16L
24e0: 45 28 7a 49 6e 29 7b 20 20 20 20 20 20 20 20 20  E(zIn){         
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 5c 0a 20 20 69 66 28 20 2a 7a 49 6e 3e     \.  if( *zIn>
2520: 3d 30 78 44 38 20 26 26 20 28 2a 7a 49 6e 3c 30  =0xD8 && (*zIn<0
2530: 78 45 30 20 7c 7c 20 28 2a 7a 49 6e 3d 3d 30 78  xE0 || (*zIn==0x
2540: 45 30 20 26 26 20 2a 28 7a 49 6e 2d 31 29 3d 3d  E0 && *(zIn-1)==
2550: 30 78 30 30 29 29 20 29 7b 20 20 5c 0a 20 20 20  0x00)) ){  \.   
2560: 20 7a 49 6e 20 2d 3d 20 34 3b 20 20 20 20 20 20   zIn -= 4;      
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 20 20 20 20                  
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20     \.  }else{   
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
25f0: 20 7a 49 6e 20 2d 3d 20 32 3b 20 20 20 20 20 20   zIn -= 2;      
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 20 20 20 20                  
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2630: 20 20 20 5c 0a 20 20 7d 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 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 23             \.}.#
2680: 64 65 66 69 6e 65 20 52 53 4b 49 50 5f 55 54 46  define RSKIP_UTF
2690: 31 36 42 45 28 7a 49 6e 29 7b 20 20 20 20 20 20  16BE(zIn){      
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 20 20 20 20 20 20 5c 0a 20 20 7a 49 6e 2d 2d 3b        \.  zIn--;
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 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2710: 20 20 69 66 28 20 2a 7a 49 6e 3e 3d 30 78 44 38    if( *zIn>=0xD8
2720: 20 26 26 20 28 2a 7a 49 6e 3c 30 78 45 30 20 7c   && (*zIn<0xE0 |
2730: 7c 20 28 2a 7a 49 6e 3d 3d 30 78 45 30 20 26 26  | (*zIn==0xE0 &&
2740: 20 2a 28 7a 49 6e 2b 31 29 3d 3d 30 78 30 30 29   *(zIn+1)==0x00)
2750: 29 20 29 7b 20 20 5c 0a 20 20 20 20 7a 49 6e 20  ) ){  \.    zIn 
2760: 2d 3d 20 33 3b 20 20 20 20 20 20 20 20 20 20 20  -= 3;           
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
27a0: 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20    }else{        
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: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 20 20 20 20 20 20 5c 0a 20 20 20 20 7a 49 6e 20        \.    zIn 
27f0: 2d 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20  -= 1;           
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 20 20 20 20 20 20 20 20                  
2820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2830: 20 20 7d 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: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2870: 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a        \.}../*.**
2880: 20 49 66 20 74 68 65 20 54 52 41 4e 53 4c 41 54   If the TRANSLAT
2890: 45 5f 54 52 41 43 45 20 6d 61 63 72 6f 20 69 73  E_TRACE macro is
28a0: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20 76 61   defined, the va
28b0: 6c 75 65 20 6f 66 20 65 61 63 68 20 4d 65 6d 20  lue of each Mem 
28c0: 69 73 0a 2a 2a 20 70 72 69 6e 74 65 64 20 6f 6e  is.** printed on
28d0: 20 73 74 64 65 72 72 20 6f 6e 20 74 68 65 20 77   stderr on the w
28e0: 61 79 20 69 6e 74 6f 20 61 6e 64 20 6f 75 74 20  ay into and out 
28f0: 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  of sqlite3VdbeMe
2900: 6d 54 72 61 6e 73 6c 61 74 65 28 29 2e 0a 2a 2f  mTranslate()..*/
2910: 20 0a 2f 2a 20 23 64 65 66 69 6e 65 20 54 52 41   ./* #define TRA
2920: 4e 53 4c 41 54 45 5f 54 52 41 43 45 20 31 20 2a  NSLATE_TRACE 1 *
2930: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  /../*.** This ro
2940: 75 74 69 6e 65 20 74 72 61 6e 73 66 6f 72 6d 73  utine transforms
2950: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 74 65   the internal te
2960: 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64  xt encoding used
2970: 20 62 79 20 70 4d 65 6d 20 74 6f 0a 2a 2a 20 64   by pMem to.** d
2980: 65 73 69 72 65 64 45 6e 63 2e 20 49 74 20 69 73  esiredEnc. It is
2990: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
29a0: 20 73 74 72 69 6e 67 20 69 73 20 61 6c 72 65 61   string is alrea
29b0: 64 79 20 6f 66 20 74 68 65 20 64 65 73 69 72 65  dy of the desire
29c0: 64 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 2c 20 6f  d.** encoding, o
29d0: 72 20 69 66 20 2a 70 4d 65 6d 20 64 6f 65 73 20  r if *pMem does 
29e0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 73 74  not contain a st
29f0: 72 69 6e 67 20 76 61 6c 75 65 2e 0a 2a 2f 0a 69  ring value..*/.i
2a00: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  nt sqlite3VdbeMe
2a10: 6d 54 72 61 6e 73 6c 61 74 65 28 4d 65 6d 20 2a  mTranslate(Mem *
2a20: 70 4d 65 6d 2c 20 75 38 20 64 65 73 69 72 65 64  pMem, u8 desired
2a30: 45 6e 63 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Enc){.  unsigned
2a40: 20 63 68 61 72 20 7a 53 68 6f 72 74 5b 4e 42 46   char zShort[NBF
2a50: 53 5d 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79  S]; /* Temporary
2a60: 20 73 68 6f 72 74 20 6f 75 74 70 75 74 20 62 75   short output bu
2a70: 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  ffer */.  int le
2a80: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
2a90: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
2aa0: 20 6c 65 6e 67 74 68 20 6f 66 20 6f 75 74 70 75   length of outpu
2ab0: 74 20 73 74 72 69 6e 67 20 69 6e 20 62 79 74 65  t string in byte
2ac0: 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
2ad0: 63 68 61 72 20 2a 7a 4f 75 74 3b 20 20 20 20 20  char *zOut;     
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2af0: 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  Output buffer */
2b00: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2b10: 20 2a 7a 49 6e 3b 20 20 20 20 20 20 20 20 20 20   *zIn;          
2b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
2b30: 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  t iterator */.  
2b40: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
2b50: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
2b60: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
2b70: 69 6e 70 75 74 20 2a 2f 0a 20 20 75 6e 73 69 67  input */.  unsig
2b80: 6e 65 64 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  ned char *z;    
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 2f 2a 20 4f 75 74 70 75 74 20 69 74 65 72 61   /* Output itera
2bb0: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 0a  tor */.  int c;.
2bc0: 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d  .  assert( pMem-
2bd0: 3e 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29  >flags&MEM_Str )
2be0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  ;.  assert( pMem
2bf0: 2d 3e 65 6e 63 21 3d 64 65 73 69 72 65 64 45 6e  ->enc!=desiredEn
2c00: 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  c );.  assert( p
2c10: 4d 65 6d 2d 3e 65 6e 63 21 3d 30 20 29 3b 0a 20  Mem->enc!=0 );. 
2c20: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
2c30: 3e 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 54  >=0 );..#ifdef T
2c40: 52 41 4e 53 4c 41 54 45 5f 54 52 41 43 45 0a 20  RANSLATE_TRACE. 
2c50: 20 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66   {.    char zBuf
2c60: 5b 31 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  [100];.    sqlit
2c70: 65 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79 50  e3VdbeMemPrettyP
2c80: 72 69 6e 74 28 70 4d 65 6d 2c 20 7a 42 75 66 2c  rint(pMem, zBuf,
2c90: 20 31 30 30 29 3b 0a 20 20 20 20 66 70 72 69 6e   100);.    fprin
2ca0: 74 66 28 73 74 64 65 72 72 2c 20 22 49 4e 50 55  tf(stderr, "INPU
2cb0: 54 3a 20 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29  T:  %s\n", zBuf)
2cc0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2cd0: 2f 2a 20 49 66 20 74 68 65 20 74 72 61 6e 73 6c  /* If the transl
2ce0: 61 74 69 6f 6e 20 69 73 20 62 65 74 77 65 65 6e  ation is between
2cf0: 20 55 54 46 2d 31 36 20 6c 69 74 74 6c 65 20 61   UTF-16 little a
2d00: 6e 64 20 62 69 67 20 65 6e 64 69 61 6e 2c 20 74  nd big endian, t
2d10: 68 65 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 74 68  hen .  ** all th
2d20: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
2d30: 73 20 74 6f 20 73 77 61 70 20 74 68 65 20 62 79  s to swap the by
2d40: 74 65 20 6f 72 64 65 72 2e 20 54 68 69 73 20 63  te order. This c
2d50: 61 73 65 20 69 73 20 68 61 6e 64 6c 65 64 0a 20  ase is handled. 
2d60: 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 6c 79 20   ** differently 
2d70: 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 2e  from the others.
2d80: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 65 6d  .  */.  if( pMem
2d90: 2d 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54  ->enc!=SQLITE_UT
2da0: 46 38 20 26 26 20 64 65 73 69 72 65 64 45 6e 63  F8 && desiredEnc
2db0: 21 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b  !=SQLITE_UTF8 ){
2dc0: 0a 20 20 20 20 75 38 20 74 65 6d 70 3b 0a 20 20  .    u8 temp;.  
2dd0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63    int rc;.    rc
2de0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
2df0: 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c 65 28 70  mMakeWriteable(p
2e00: 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Mem);.    if( rc
2e10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e20: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
2e30: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
2e40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2e50: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2e60: 7d 0a 20 20 20 20 7a 49 6e 20 3d 20 70 4d 65 6d  }.    zIn = pMem
2e70: 2d 3e 7a 3b 0a 20 20 20 20 7a 54 65 72 6d 20 3d  ->z;.    zTerm =
2e80: 20 26 7a 49 6e 5b 70 4d 65 6d 2d 3e 6e 5d 3b 0a   &zIn[pMem->n];.
2e90: 20 20 20 20 77 68 69 6c 65 28 20 7a 49 6e 3c 7a      while( zIn<z
2ea0: 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 74 65  Term ){.      te
2eb0: 6d 70 20 3d 20 2a 7a 49 6e 3b 0a 20 20 20 20 20  mp = *zIn;.     
2ec0: 20 2a 7a 49 6e 20 3d 20 2a 28 7a 49 6e 2b 31 29   *zIn = *(zIn+1)
2ed0: 3b 0a 20 20 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20  ;.      zIn++;. 
2ee0: 20 20 20 20 20 2a 7a 49 6e 2b 2b 20 3d 20 74 65       *zIn++ = te
2ef0: 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  mp;.    }.    pM
2f00: 65 6d 2d 3e 65 6e 63 20 3d 20 64 65 73 69 72 65  em->enc = desire
2f10: 64 45 6e 63 3b 0a 20 20 20 20 67 6f 74 6f 20 74  dEnc;.    goto t
2f20: 72 61 6e 73 6c 61 74 65 5f 6f 75 74 3b 0a 20 20  ranslate_out;.  
2f30: 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 6c 65 6e 20  }..  /* Set len 
2f40: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  to the maximum n
2f50: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
2f60: 65 71 75 69 72 65 64 20 69 6e 20 74 68 65 20 6f  equired in the o
2f70: 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 2a 2f  utput buffer. */
2f80: 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 45 6e  .  if( desiredEn
2f90: 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29  c==SQLITE_UTF8 )
2fa0: 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 63 6f  {.    /* When co
2fb0: 6e 76 65 72 74 69 6e 67 20 66 72 6f 6d 20 55 54  nverting from UT
2fc0: 46 2d 31 36 2c 20 74 68 65 20 6d 61 78 69 6d 75  F-16, the maximu
2fd0: 6d 20 67 72 6f 77 74 68 20 72 65 73 75 6c 74 73  m growth results
2fe0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 72 61   from.    ** tra
2ff0: 6e 73 6c 61 74 69 6e 67 20 61 20 32 2d 62 79 74  nslating a 2-byt
3000: 65 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 61  e character to a
3010: 20 33 2d 62 79 74 65 20 55 54 46 2d 38 20 63 68   3-byte UTF-8 ch
3020: 61 72 61 63 74 65 72 20 28 69 2e 65 2e 0a 20 20  aracter (i.e..  
3030: 20 20 2a 2a 20 63 6f 64 65 2d 70 6f 69 6e 74 20    ** code-point 
3040: 30 78 46 46 46 43 29 2e 20 41 20 73 69 6e 67 6c  0xFFFC). A singl
3050: 65 20 62 79 74 65 20 69 73 20 72 65 71 75 69 72  e byte is requir
3060: 65 64 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  ed for the outpu
3070: 74 20 73 74 72 69 6e 67 0a 20 20 20 20 2a 2a 20  t string.    ** 
3080: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  nul-terminator..
3090: 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d      */.    len =
30a0: 20 28 70 4d 65 6d 2d 3e 6e 2f 32 29 20 2a 20 33   (pMem->n/2) * 3
30b0: 20 2b 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   + 1;.  }else{. 
30c0: 20 20 20 2f 2a 20 57 68 65 6e 20 63 6f 6e 76 65     /* When conve
30d0: 72 74 69 6e 67 20 66 72 6f 6d 20 55 54 46 2d 38  rting from UTF-8
30e0: 20 74 6f 20 55 54 46 2d 31 36 20 74 68 65 20 6d   to UTF-16 the m
30f0: 61 78 69 6d 75 6d 20 67 72 6f 77 74 68 20 69 73  aximum growth is
3100: 20 63 61 75 73 65 64 0a 20 20 20 20 2a 2a 20 77   caused.    ** w
3110: 68 65 6e 20 61 20 31 2d 62 79 74 65 20 55 54 46  hen a 1-byte UTF
3120: 2d 38 20 63 68 61 72 61 63 74 65 72 20 69 73 20  -8 character is 
3130: 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20  translated into 
3140: 61 20 32 2d 62 79 74 65 20 55 54 46 2d 31 36 0a  a 2-byte UTF-16.
3150: 20 20 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72      ** character
3160: 2e 20 54 77 6f 20 62 79 74 65 73 20 61 72 65 20  . Two bytes are 
3170: 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65 20  required in the 
3180: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 66 6f  output buffer fo
3190: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6c  r the.    ** nul
31a0: 2d 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 20 20 20  -terminator..   
31b0: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d   */.    len = pM
31c0: 65 6d 2d 3e 6e 20 2a 20 32 20 2b 20 32 3b 0a 20  em->n * 2 + 2;. 
31d0: 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 7a 49 6e   }..  /* Set zIn
31e0: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
31f0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 6e   start of the in
3200: 70 75 74 20 62 75 66 66 65 72 20 61 6e 64 20 7a  put buffer and z
3210: 54 65 72 6d 20 74 6f 20 70 6f 69 6e 74 20 31 0a  Term to point 1.
3220: 20 20 2a 2a 20 62 79 74 65 20 70 61 73 74 20 74    ** byte past t
3230: 68 65 20 65 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a  he end..  **.  *
3240: 2a 20 56 61 72 69 61 62 6c 65 20 7a 4f 75 74 20  * Variable zOut 
3250: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
3260: 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  at the output bu
3270: 66 66 65 72 2e 20 54 68 69 73 20 6d 61 79 20 62  ffer. This may b
3280: 65 20 73 70 61 63 65 0a 20 20 2a 2a 20 6f 62 74  e space.  ** obt
3290: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
32a0: 63 28 29 2c 20 6f 72 20 4d 65 6d 2e 7a 53 68 6f  c(), or Mem.zSho
32b0: 72 74 2c 20 69 66 20 69 74 20 6c 61 72 67 65 20  rt, if it large 
32c0: 65 6e 6f 75 67 68 20 61 6e 64 20 6e 6f 74 20 69  enough and not i
32d0: 6e 0a 20 20 2a 2a 20 75 73 65 2c 20 6f 72 20 74  n.  ** use, or t
32e0: 68 65 20 7a 53 68 6f 72 74 20 61 72 72 61 79 20  he zShort array 
32f0: 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 28 73 65  on the stack (se
3300: 65 20 61 62 6f 76 65 29 2e 0a 20 20 2a 2f 0a 20  e above)..  */. 
3310: 20 7a 49 6e 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a   zIn = pMem->z;.
3320: 20 20 7a 54 65 72 6d 20 3d 20 26 7a 49 6e 5b 70    zTerm = &zIn[p
3330: 4d 65 6d 2d 3e 6e 5d 3b 0a 20 20 69 66 28 20 6c  Mem->n];.  if( l
3340: 65 6e 3e 4e 42 46 53 20 29 7b 0a 20 20 20 20 7a  en>NBFS ){.    z
3350: 4f 75 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Out = sqliteMall
3360: 6f 63 52 61 77 28 6c 65 6e 29 3b 0a 20 20 20 20  ocRaw(len);.    
3370: 69 66 28 20 21 7a 4f 75 74 20 29 20 72 65 74 75  if( !zOut ) retu
3380: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
3390: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4f  .  }else{.    zO
33a0: 75 74 20 3d 20 7a 53 68 6f 72 74 3b 0a 20 20 7d  ut = zShort;.  }
33b0: 0a 20 20 7a 20 3d 20 7a 4f 75 74 3b 0a 0a 20 20  .  z = zOut;..  
33c0: 69 66 28 20 70 4d 65 6d 2d 3e 65 6e 63 3d 3d 53  if( pMem->enc==S
33d0: 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20  QLITE_UTF8 ){.  
33e0: 20 20 69 66 28 20 64 65 73 69 72 65 64 45 6e 63    if( desiredEnc
33f0: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  ==SQLITE_UTF16LE
3400: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 54 46   ){.      /* UTF
3410: 2d 38 20 2d 3e 20 55 54 46 2d 31 36 20 4c 69 74  -8 -> UTF-16 Lit
3420: 74 6c 65 2d 65 6e 64 69 61 6e 20 2a 2f 0a 20 20  tle-endian */.  
3430: 20 20 20 20 77 68 69 6c 65 28 20 7a 49 6e 3c 7a      while( zIn<z
3440: 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Term ){.        
3450: 52 45 41 44 5f 55 54 46 38 28 7a 49 6e 2c 20 63  READ_UTF8(zIn, c
3460: 29 3b 20 0a 20 20 20 20 20 20 20 20 57 52 49 54  ); .        WRIT
3470: 45 5f 55 54 46 31 36 4c 45 28 7a 2c 20 63 29 3b  E_UTF16LE(z, c);
3480: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
3490: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
34a0: 28 20 64 65 73 69 72 65 64 45 6e 63 3d 3d 53 51  ( desiredEnc==SQ
34b0: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a  LITE_UTF16BE );.
34c0: 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 2d        /* UTF-8 -
34d0: 3e 20 55 54 46 2d 31 36 20 42 69 67 2d 65 6e 64  > UTF-16 Big-end
34e0: 69 61 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  ian */.      whi
34f0: 6c 65 28 20 7a 49 6e 3c 7a 54 65 72 6d 20 29 7b  le( zIn<zTerm ){
3500: 0a 20 20 20 20 20 20 20 20 52 45 41 44 5f 55 54  .        READ_UT
3510: 46 38 28 7a 49 6e 2c 20 63 29 3b 20 0a 20 20 20  F8(zIn, c); .   
3520: 20 20 20 20 20 57 52 49 54 45 5f 55 54 46 31 36       WRITE_UTF16
3530: 42 45 28 7a 2c 20 63 29 3b 0a 20 20 20 20 20 20  BE(z, c);.      
3540: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  }.    }.    pMem
3550: 2d 3e 6e 20 3d 20 7a 20 2d 20 7a 4f 75 74 3b 0a  ->n = z - zOut;.
3560: 20 20 20 20 2a 7a 2b 2b 20 3d 20 30 3b 0a 20 20      *z++ = 0;.  
3570: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
3580: 74 28 20 64 65 73 69 72 65 64 45 6e 63 3d 3d 53  t( desiredEnc==S
3590: 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a 20 20  QLITE_UTF8 );.  
35a0: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 65 6e 63 3d    if( pMem->enc=
35b0: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20  =SQLITE_UTF16LE 
35c0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 54 46 2d  ){.      /* UTF-
35d0: 31 36 20 4c 69 74 74 6c 65 2d 65 6e 64 69 61 6e  16 Little-endian
35e0: 20 2d 3e 20 55 54 46 2d 38 20 2a 2f 0a 20 20 20   -> UTF-8 */.   
35f0: 20 20 20 77 68 69 6c 65 28 20 7a 49 6e 3c 7a 54     while( zIn<zT
3600: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 52  erm ){.        R
3610: 45 41 44 5f 55 54 46 31 36 4c 45 28 7a 49 6e 2c  EAD_UTF16LE(zIn,
3620: 20 63 29 3b 20 0a 20 20 20 20 20 20 20 20 57 52   c); .        WR
3630: 49 54 45 5f 55 54 46 38 28 7a 2c 20 63 29 3b 0a  ITE_UTF8(z, c);.
3640: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
3650: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 55 54 46 2d  e{.      /* UTF-
3660: 31 36 20 4c 69 74 74 6c 65 2d 65 6e 64 69 61 6e  16 Little-endian
3670: 20 2d 3e 20 55 54 46 2d 38 20 2a 2f 0a 20 20 20   -> UTF-8 */.   
3680: 20 20 20 77 68 69 6c 65 28 20 7a 49 6e 3c 7a 54     while( zIn<zT
3690: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 52  erm ){.        R
36a0: 45 41 44 5f 55 54 46 31 36 42 45 28 7a 49 6e 2c  EAD_UTF16BE(zIn,
36b0: 20 63 29 3b 20 0a 20 20 20 20 20 20 20 20 57 52   c); .        WR
36c0: 49 54 45 5f 55 54 46 38 28 7a 2c 20 63 29 3b 0a  ITE_UTF8(z, c);.
36d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
36e0: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 7a 20 2d 20    pMem->n = z - 
36f0: 7a 4f 75 74 3b 0a 20 20 7d 0a 20 20 2a 7a 20 3d  zOut;.  }.  *z =
3700: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   0;.  assert( (p
3710: 4d 65 6d 2d 3e 6e 2b 28 64 65 73 69 72 65 64 45  Mem->n+(desiredE
3720: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 3f  nc==SQLITE_UTF8?
3730: 31 3a 32 29 29 3c 3d 6c 65 6e 20 29 3b 0a 0a 20  1:2))<=len );.. 
3740: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
3750: 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20  elease(pMem);.  
3760: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  pMem->flags &= ~
3770: 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f  (MEM_Static|MEM_
3780: 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 7c 4d 45  Dyn|MEM_Ephem|ME
3790: 4d 5f 53 68 6f 72 74 29 3b 0a 20 20 70 4d 65 6d  M_Short);.  pMem
37a0: 2d 3e 65 6e 63 20 3d 20 64 65 73 69 72 65 64 45  ->enc = desiredE
37b0: 6e 63 3b 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d  nc;.  if( zOut==
37c0: 7a 53 68 6f 72 74 20 29 7b 0a 20 20 20 20 6d 65  zShort ){.    me
37d0: 6d 63 70 79 28 70 4d 65 6d 2d 3e 7a 53 68 6f 72  mcpy(pMem->zShor
37e0: 74 2c 20 7a 4f 75 74 2c 20 6c 65 6e 29 3b 0a 20  t, zOut, len);. 
37f0: 20 20 20 7a 4f 75 74 20 3d 20 70 4d 65 6d 2d 3e     zOut = pMem->
3800: 7a 53 68 6f 72 74 3b 0a 20 20 20 20 70 4d 65 6d  zShort;.    pMem
3810: 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 4d 45 4d 5f  ->flags |= (MEM_
3820: 54 65 72 6d 7c 4d 45 4d 5f 53 68 6f 72 74 29 3b  Term|MEM_Short);
3830: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4d  .  }else{.    pM
3840: 65 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 4d 45  em->flags |= (ME
3850: 4d 5f 54 65 72 6d 7c 4d 45 4d 5f 44 79 6e 29 3b  M_Term|MEM_Dyn);
3860: 0a 20 20 7d 0a 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .  }.  pMem->z =
3870: 20 7a 4f 75 74 3b 0a 0a 74 72 61 6e 73 6c 61 74   zOut;..translat
3880: 65 5f 6f 75 74 3a 0a 23 69 66 64 65 66 20 54 52  e_out:.#ifdef TR
3890: 41 4e 53 4c 41 54 45 5f 54 52 41 43 45 0a 20 20  ANSLATE_TRACE.  
38a0: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
38b0: 31 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  100];.    sqlite
38c0: 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79 50 72  3VdbeMemPrettyPr
38d0: 69 6e 74 28 70 4d 65 6d 2c 20 7a 42 75 66 2c 20  int(pMem, zBuf, 
38e0: 31 30 30 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  100);.    fprint
38f0: 66 28 73 74 64 65 72 72 2c 20 22 4f 55 54 50 55  f(stderr, "OUTPU
3900: 54 3a 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29 3b  T: %s\n", zBuf);
3910: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
3920: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3930: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
3940: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 66 6f 72  utine checks for
3950: 20 61 20 62 79 74 65 2d 6f 72 64 65 72 20 6d 61   a byte-order ma
3960: 72 6b 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  rk at the beginn
3970: 69 6e 67 20 6f 66 20 74 68 65 20 0a 2a 2a 20 55  ing of the .** U
3980: 54 46 2d 31 36 20 73 74 72 69 6e 67 20 73 74 6f  TF-16 string sto
3990: 72 65 64 20 69 6e 20 2a 70 4d 65 6d 2e 20 49 66  red in *pMem. If
39a0: 20 6f 6e 65 20 69 73 20 70 72 65 73 65 6e 74 2c   one is present,
39b0: 20 69 74 20 69 73 20 72 65 6d 6f 76 65 64 20 61   it is removed a
39c0: 6e 64 0a 2a 2a 20 74 68 65 20 65 6e 63 6f 64 69  nd.** the encodi
39d0: 6e 67 20 6f 66 20 74 68 65 20 4d 65 6d 20 61 64  ng of the Mem ad
39e0: 6a 75 73 74 65 64 2e 20 54 68 69 73 20 72 6f 75  justed. This rou
39f0: 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 64 6f  tine does not do
3a00: 20 61 6e 79 0a 2a 2a 20 62 79 74 65 2d 73 77 61   any.** byte-swa
3a10: 70 70 69 6e 67 2c 20 69 74 20 6a 75 73 74 20 73  pping, it just s
3a20: 65 74 73 20 4d 65 6d 2e 65 6e 63 20 61 70 70 72  ets Mem.enc appr
3a30: 6f 70 72 69 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  opriately..**.**
3a40: 20 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   The allocation 
3a50: 28 73 74 61 74 69 63 2c 20 64 79 6e 61 6d 69 63  (static, dynamic
3a60: 20 65 74 63 2e 29 20 61 6e 64 20 65 6e 63 6f 64   etc.) and encod
3a70: 69 6e 67 20 6f 66 20 74 68 65 20 4d 65 6d 20 6d  ing of the Mem m
3a80: 61 79 20 62 65 0a 2a 2a 20 63 68 61 6e 67 65 64  ay be.** changed
3a90: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
3aa0: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
3ab0: 33 56 64 62 65 4d 65 6d 48 61 6e 64 6c 65 42 6f  3VdbeMemHandleBo
3ac0: 6d 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20  m(Mem *pMem){.  
3ad0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
3ae0: 4f 4b 3b 0a 20 20 75 38 20 62 6f 6d 20 3d 20 30  OK;.  u8 bom = 0
3af0: 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e 6e  ;..  if( pMem->n
3b00: 3c 30 20 7c 7c 20 70 4d 65 6d 2d 3e 6e 3e 31 20  <0 || pMem->n>1 
3b10: 29 7b 0a 20 20 20 20 75 38 20 62 31 20 3d 20 2a  ){.    u8 b1 = *
3b20: 28 75 38 20 2a 29 70 4d 65 6d 2d 3e 7a 3b 0a 20  (u8 *)pMem->z;. 
3b30: 20 20 20 75 38 20 62 32 20 3d 20 2a 28 28 28 75     u8 b2 = *(((u
3b40: 38 20 2a 29 70 4d 65 6d 2d 3e 7a 29 20 2b 20 31  8 *)pMem->z) + 1
3b50: 29 3b 0a 20 20 20 20 69 66 28 20 62 31 3d 3d 30  );.    if( b1==0
3b60: 78 46 45 20 26 26 20 62 32 3d 3d 30 78 46 46 20  xFE && b2==0xFF 
3b70: 29 7b 0a 20 20 20 20 20 20 62 6f 6d 20 3d 20 53  ){.      bom = S
3b80: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20  QLITE_UTF16BE;. 
3b90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 31 3d     }.    if( b1=
3ba0: 3d 30 78 46 46 20 26 26 20 62 32 3d 3d 30 78 46  =0xFF && b2==0xF
3bb0: 45 20 29 7b 0a 20 20 20 20 20 20 62 6f 6d 20 3d  E ){.      bom =
3bc0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3b   SQLITE_UTF16LE;
3bd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
3be0: 69 66 28 20 62 6f 6d 20 29 7b 0a 20 20 20 20 2f  if( bom ){.    /
3bf0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3c00: 69 73 20 63 61 6c 6c 65 64 20 61 73 20 73 6f 6f  is called as soo
3c10: 6e 20 61 73 20 61 20 73 74 72 69 6e 67 20 69 73  n as a string is
3c20: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 4d 65 6d   stored in a Mem
3c30: 2a 2c 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 77  *,.    ** from w
3c40: 69 74 68 69 6e 20 73 71 6c 69 74 65 33 56 64 62  ithin sqlite3Vdb
3c50: 65 4d 65 6d 53 65 74 53 74 72 28 29 2e 20 41 74  eMemSetStr(). At
3c60: 20 74 68 61 74 20 70 6f 69 6e 74 20 69 74 20 69   that point it i
3c70: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 0a 20  s not possible. 
3c80: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 73 74     ** for the st
3c90: 72 69 6e 67 20 74 6f 20 62 65 20 73 74 6f 72 65  ring to be store
3ca0: 64 20 69 6e 20 4d 65 6d 2e 7a 53 68 6f 72 74 2c  d in Mem.zShort,
3cb0: 20 6f 72 20 66 6f 72 20 69 74 20 74 6f 20 62 65   or for it to be
3cc0: 20 73 74 6f 72 65 64 0a 20 20 20 20 2a 2a 20 69   stored.    ** i
3cd0: 6e 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79  n dynamic memory
3ce0: 20 77 69 74 68 20 6e 6f 20 64 65 73 74 72 75 63   with no destruc
3cf0: 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tor..    */.    
3d00: 61 73 73 65 72 74 28 20 21 28 70 4d 65 6d 2d 3e  assert( !(pMem->
3d10: 66 6c 61 67 73 26 4d 45 4d 5f 53 68 6f 72 74 29  flags&MEM_Short)
3d20: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
3d30: 21 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45  !(pMem->flags&ME
3d40: 4d 5f 44 79 6e 29 20 7c 7c 20 70 4d 65 6d 2d 3e  M_Dyn) || pMem->
3d50: 78 44 65 6c 20 29 3b 0a 20 20 20 20 69 66 28 20  xDel );.    if( 
3d60: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
3d70: 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 76  M_Dyn ){.      v
3d80: 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64  oid (*xDel)(void
3d90: 2a 29 20 3d 20 70 4d 65 6d 2d 3e 78 44 65 6c 3b  *) = pMem->xDel;
3da0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  .      char *z =
3db0: 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20   pMem->z;.      
3dc0: 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20  pMem->z = 0;.   
3dd0: 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20     pMem->xDel = 
3de0: 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
3df0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
3e00: 74 72 28 70 4d 65 6d 2c 20 26 7a 5b 32 5d 2c 20  tr(pMem, &z[2], 
3e10: 70 4d 65 6d 2d 3e 6e 2d 32 2c 20 62 6f 6d 2c 20  pMem->n-2, bom, 
3e20: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
3e30: 29 3b 0a 20 20 20 20 20 20 78 44 65 6c 28 7a 29  );.      xDel(z)
3e40: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3e50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
3e60: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65  dbeMemSetStr(pMe
3e70: 6d 2c 20 26 70 4d 65 6d 2d 3e 7a 5b 32 5d 2c 20  m, &pMem->z[2], 
3e80: 70 4d 65 6d 2d 3e 6e 2d 32 2c 20 62 6f 6d 2c 20  pMem->n-2, bom, 
3e90: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
3ea0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
3eb0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3ec0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 5a   rc;.}../*.** pZ
3ed0: 20 69 73 20 61 20 55 54 46 2d 38 20 65 6e 63 6f   is a UTF-8 enco
3ee0: 64 65 64 20 75 6e 69 63 6f 64 65 20 73 74 72 69  ded unicode stri
3ef0: 6e 67 2e 20 49 66 20 6e 42 79 74 65 20 69 73 20  ng. If nByte is 
3f00: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 0a  less than zero,.
3f10: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  ** return the nu
3f20: 6d 62 65 72 20 6f 66 20 75 6e 69 63 6f 64 65 20  mber of unicode 
3f30: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 70 5a  characters in pZ
3f40: 20 75 70 20 74 6f 20 28 62 75 74 20 6e 6f 74 20   up to (but not 
3f50: 69 6e 63 6c 75 64 69 6e 67 29 0a 2a 2a 20 74 68  including).** th
3f60: 65 20 66 69 72 73 74 20 30 78 30 30 20 62 79 74  e first 0x00 byt
3f70: 65 2e 20 49 66 20 6e 42 79 74 65 20 69 73 20 6e  e. If nByte is n
3f80: 6f 74 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  ot less than zer
3f90: 6f 2c 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a  o, return the.**
3fa0: 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 63 6f   number of unico
3fb0: 64 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  de characters in
3fc0: 20 74 68 65 20 66 69 72 73 74 20 6e 42 79 74 65   the first nByte
3fd0: 20 6f 66 20 70 5a 20 28 6f 72 20 75 70 20 74 6f   of pZ (or up to
3fe0: 20 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 30   .** the first 0
3ff0: 78 30 30 2c 20 77 68 69 63 68 65 76 65 72 20 63  x00, whichever c
4000: 6f 6d 65 73 20 66 69 72 73 74 29 2e 0a 2a 2f 0a  omes first)..*/.
4010: 69 6e 74 20 73 71 6c 69 74 65 33 75 74 66 38 43  int sqlite3utf8C
4020: 68 61 72 4c 65 6e 28 63 6f 6e 73 74 20 63 68 61  harLen(const cha
4030: 72 20 2a 7a 2c 20 69 6e 74 20 6e 42 79 74 65 29  r *z, int nByte)
4040: 7b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  {.  int r = 0;. 
4050: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
4060: 72 6d 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e  rm;.  if( nByte>
4070: 3d 30 20 29 7b 0a 20 20 20 20 7a 54 65 72 6d 20  =0 ){.    zTerm 
4080: 3d 20 26 7a 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d  = &z[nByte];.  }
4090: 65 6c 73 65 7b 0a 20 20 20 20 7a 54 65 72 6d 20  else{.    zTerm 
40a0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
40b0: 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  (-1);.  }.  asse
40c0: 72 74 28 20 7a 3c 3d 7a 54 65 72 6d 20 29 3b 0a  rt( z<=zTerm );.
40d0: 20 20 77 68 69 6c 65 28 20 2a 7a 21 3d 30 20 26    while( *z!=0 &
40e0: 26 20 7a 3c 7a 54 65 72 6d 20 29 7b 0a 20 20 20  & z<zTerm ){.   
40f0: 20 53 4b 49 50 5f 55 54 46 38 28 7a 29 3b 0a 20   SKIP_UTF8(z);. 
4100: 20 20 20 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65     r++;.  }.  re
4110: 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn r;.}../*.**
4120: 20 70 5a 20 69 73 20 61 20 55 54 46 2d 31 36 20   pZ is a UTF-16 
4130: 65 6e 63 6f 64 65 64 20 75 6e 69 63 6f 64 65 20  encoded unicode 
4140: 73 74 72 69 6e 67 2e 20 49 66 20 6e 43 68 61 72  string. If nChar
4150: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
4160: 72 6f 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68  ro,.** return th
4170: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
4180: 73 20 75 70 20 74 6f 20 28 62 75 74 20 6e 6f 74  s up to (but not
4190: 20 69 6e 63 6c 75 64 69 6e 67 29 2c 20 74 68 65   including), the
41a0: 20 66 69 72 73 74 20 70 61 69 72 0a 2a 2a 20 6f   first pair.** o
41b0: 66 20 63 6f 6e 73 65 63 75 74 69 76 65 20 30 78  f consecutive 0x
41c0: 30 30 20 62 79 74 65 73 20 69 6e 20 70 5a 2e 20  00 bytes in pZ. 
41d0: 49 66 20 6e 43 68 61 72 20 69 73 20 6e 6f 74 20  If nChar is not 
41e0: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 0a  less than zero,.
41f0: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  ** then return t
4200: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
4210: 65 73 20 69 6e 20 74 68 65 20 66 69 72 73 74 20  es in the first 
4220: 6e 43 68 61 72 20 75 6e 69 63 6f 64 65 20 63 68  nChar unicode ch
4230: 61 72 61 63 74 65 72 73 0a 2a 2a 20 69 6e 20 70  aracters.** in p
4240: 5a 20 28 6f 72 20 75 70 20 75 6e 74 69 6c 20 74  Z (or up until t
4250: 68 65 20 66 69 72 73 74 20 70 61 69 72 20 6f 66  he first pair of
4260: 20 30 78 30 30 20 62 79 74 65 73 2c 20 77 68 69   0x00 bytes, whi
4270: 63 68 65 76 65 72 20 63 6f 6d 65 73 20 66 69 72  chever comes fir
4280: 73 74 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  st)..*/.int sqli
4290: 74 65 33 75 74 66 31 36 42 79 74 65 4c 65 6e 28  te3utf16ByteLen(
42a0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 49 6e 2c  const void *zIn,
42b0: 20 69 6e 74 20 6e 43 68 61 72 29 7b 0a 20 20 69   int nChar){.  i
42c0: 6e 74 20 63 20 3d 20 31 3b 0a 20 20 63 68 61 72  nt c = 1;.  char
42d0: 20 63 6f 6e 73 74 20 2a 7a 20 3d 20 7a 49 6e 3b   const *z = zIn;
42e0: 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
42f0: 69 66 28 20 53 51 4c 49 54 45 5f 55 54 46 31 36  if( SQLITE_UTF16
4300: 4e 41 54 49 56 45 3d 3d 53 51 4c 49 54 45 5f 55  NATIVE==SQLITE_U
4310: 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20 77 68  TF16BE ){.    wh
4320: 69 6c 65 28 20 63 20 26 26 20 28 28 6e 43 68 61  ile( c && ((nCha
4330: 72 3c 30 29 20 7c 7c 20 6e 3c 6e 43 68 61 72 29  r<0) || n<nChar)
4340: 20 29 7b 0a 20 20 20 20 20 20 52 45 41 44 5f 55   ){.      READ_U
4350: 54 46 31 36 42 45 28 7a 2c 20 63 29 3b 0a 20 20  TF16BE(z, c);.  
4360: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
4370: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
4380: 65 28 20 63 20 26 26 20 28 28 6e 43 68 61 72 3c  e( c && ((nChar<
4390: 30 29 20 7c 7c 20 6e 3c 6e 43 68 61 72 29 20 29  0) || n<nChar) )
43a0: 7b 0a 20 20 20 20 20 20 52 45 41 44 5f 55 54 46  {.      READ_UTF
43b0: 31 36 4c 45 28 7a 2c 20 63 29 3b 0a 20 20 20 20  16LE(z, c);.    
43c0: 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
43d0: 0a 20 20 72 65 74 75 72 6e 20 28 7a 2d 28 63 68  .  return (z-(ch
43e0: 61 72 20 63 6f 6e 73 74 20 2a 29 7a 49 6e 29 2d  ar const *)zIn)-
43f0: 28 28 63 3d 3d 30 29 3f 32 3a 30 29 3b 0a 7d 0a  ((c==0)?2:0);.}.
4400: 0a 2f 2a 0a 2a 2a 20 55 54 46 2d 31 36 20 69 6d  ./*.** UTF-16 im
4410: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
4420: 74 68 65 20 73 75 62 73 74 72 28 29 0a 2a 2f 0a  the substr().*/.
4430: 76 6f 69 64 20 73 71 6c 69 74 65 33 75 74 66 31  void sqlite3utf1
4440: 36 53 75 62 73 74 72 28 0a 20 20 73 71 6c 69 74  6Substr(.  sqlit
4450: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
4460: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
4470: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
4480: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
4490: 20 79 2c 20 7a 3b 0a 20 20 75 6e 73 69 67 6e 65   y, z;.  unsigne
44a0: 64 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 53  d char const *zS
44b0: 74 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  tr;.  unsigned c
44c0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 53 74 72 45  har const *zStrE
44d0: 6e 64 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  nd;.  unsigned c
44e0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 53 74 61 72  har const *zStar
44f0: 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
4500: 61 72 20 63 6f 6e 73 74 20 2a 7a 45 6e 64 3b 0a  ar const *zEnd;.
4510: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 7a 53 74 72    int i;..  zStr
4520: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
4530: 72 20 63 6f 6e 73 74 20 2a 29 73 71 6c 69 74 65  r const *)sqlite
4540: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61  3_value_text16(a
4550: 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 53 74 72 45  rgv[0]);.  zStrE
4560: 6e 64 20 3d 20 26 7a 53 74 72 5b 73 71 6c 69 74  nd = &zStr[sqlit
4570: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36  e3_value_bytes16
4580: 28 61 72 67 76 5b 30 5d 29 5d 3b 0a 20 20 79 20  (argv[0])];.  y 
4590: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
45a0: 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  int(argv[1]);.  
45b0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
45c0: 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d 29 3b 0a  e_int(argv[2]);.
45d0: 0a 20 20 69 66 28 20 79 3e 30 20 29 7b 0a 20 20  .  if( y>0 ){.  
45e0: 20 20 79 20 3d 20 79 2d 31 3b 0a 20 20 20 20 7a    y = y-1;.    z
45f0: 53 74 61 72 74 20 3d 20 7a 53 74 72 3b 0a 20 20  Start = zStr;.  
4600: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 55 54 46    if( SQLITE_UTF
4610: 31 36 42 45 3d 3d 53 51 4c 49 54 45 5f 55 54 46  16BE==SQLITE_UTF
4620: 31 36 4e 41 54 49 56 45 20 29 7b 0a 20 20 20 20  16NATIVE ){.    
4630: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 79 20 26    for(i=0; i<y &
4640: 26 20 7a 53 74 61 72 74 3c 7a 53 74 72 45 6e 64  & zStart<zStrEnd
4650: 3b 20 69 2b 2b 29 20 53 4b 49 50 5f 55 54 46 31  ; i++) SKIP_UTF1
4660: 36 42 45 28 7a 53 74 61 72 74 29 3b 0a 20 20 20  6BE(zStart);.   
4670: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
4680: 72 28 69 3d 30 3b 20 69 3c 79 20 26 26 20 7a 53  r(i=0; i<y && zS
4690: 74 61 72 74 3c 7a 53 74 72 45 6e 64 3b 20 69 2b  tart<zStrEnd; i+
46a0: 2b 29 20 53 4b 49 50 5f 55 54 46 31 36 4c 45 28  +) SKIP_UTF16LE(
46b0: 7a 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 0a 20  zStart);.    }. 
46c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 74 61   }else{.    zSta
46d0: 72 74 20 3d 20 7a 53 74 72 45 6e 64 3b 0a 20 20  rt = zStrEnd;.  
46e0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 55 54 46    if( SQLITE_UTF
46f0: 31 36 42 45 3d 3d 53 51 4c 49 54 45 5f 55 54 46  16BE==SQLITE_UTF
4700: 31 36 4e 41 54 49 56 45 20 29 7b 0a 20 20 20 20  16NATIVE ){.    
4710: 20 20 66 6f 72 28 69 3d 79 3b 20 69 3c 30 20 26    for(i=y; i<0 &
4720: 26 20 7a 53 74 61 72 74 3e 7a 53 74 72 3b 20 69  & zStart>zStr; i
4730: 2b 2b 29 20 52 53 4b 49 50 5f 55 54 46 31 36 42  ++) RSKIP_UTF16B
4740: 45 28 7a 53 74 61 72 74 29 3b 0a 20 20 20 20 7d  E(zStart);.    }
4750: 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28  else{.      for(
4760: 69 3d 79 3b 20 69 3c 30 20 26 26 20 7a 53 74 61  i=y; i<0 && zSta
4770: 72 74 3e 7a 53 74 72 3b 20 69 2b 2b 29 20 52 53  rt>zStr; i++) RS
4780: 4b 49 50 5f 55 54 46 31 36 4c 45 28 7a 53 74 61  KIP_UTF16LE(zSta
4790: 72 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  rt);.    }.    f
47a0: 6f 72 28 3b 20 69 3c 30 3b 20 69 2b 2b 29 20 7a  or(; i<0; i++) z
47b0: 20 2d 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 7a 45   -= 1;.  }..  zE
47c0: 6e 64 20 3d 20 7a 53 74 61 72 74 3b 0a 20 20 69  nd = zStart;.  i
47d0: 66 28 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  f( SQLITE_UTF16B
47e0: 45 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  E==SQLITE_UTF16N
47f0: 41 54 49 56 45 20 29 7b 0a 20 20 20 20 66 6f 72  ATIVE ){.    for
4800: 28 69 3d 30 3b 20 69 3c 7a 20 26 26 20 7a 45 6e  (i=0; i<z && zEn
4810: 64 3c 7a 53 74 72 45 6e 64 3b 20 69 2b 2b 29 20  d<zStrEnd; i++) 
4820: 53 4b 49 50 5f 55 54 46 31 36 42 45 28 7a 45 6e  SKIP_UTF16BE(zEn
4830: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
4840: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 7a 20 26 26   for(i=0; i<z &&
4850: 20 7a 45 6e 64 3c 7a 53 74 72 45 6e 64 3b 20 69   zEnd<zStrEnd; i
4860: 2b 2b 29 20 53 4b 49 50 5f 55 54 46 31 36 4c 45  ++) SKIP_UTF16LE
4870: 28 7a 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 73  (zEnd);.  }..  s
4880: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
4890: 78 74 31 36 28 63 6f 6e 74 65 78 74 2c 20 7a 53  xt16(context, zS
48a0: 74 61 72 74 2c 20 7a 45 6e 64 2d 7a 53 74 61 72  tart, zEnd-zStar
48b0: 74 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  t, SQLITE_TRANSI
48c0: 45 4e 54 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  ENT);.}..#if def
48d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
48e0: 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  )./*.** This rou
48f0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
4900: 72 6f 6d 20 74 68 65 20 54 43 4c 20 74 65 73 74  rom the TCL test
4910: 20 66 75 6e 63 74 69 6f 6e 20 22 74 72 61 6e 73   function "trans
4920: 6c 61 74 65 5f 73 65 6c 66 74 65 73 74 22 2e 0a  late_selftest"..
4930: 2a 2a 20 49 74 20 63 68 65 63 6b 73 20 74 68 61  ** It checks tha
4940: 74 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 73  t the primitives
4950: 20 66 6f 72 20 73 65 72 69 61 6c 69 7a 69 6e 67   for serializing
4960: 20 61 6e 64 20 64 65 73 65 72 69 61 6c 69 7a 69   and deserializi
4970: 6e 67 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  ng.** characters
4980: 20 69 6e 20 65 61 63 68 20 65 6e 63 6f 64 69 6e   in each encodin
4990: 67 20 61 72 65 20 69 6e 76 65 72 73 65 73 20 6f  g are inverses o
49a0: 66 20 65 61 63 68 20 6f 74 68 65 72 2e 0a 2a 2f  f each other..*/
49b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 75 74 66  .void sqlite3utf
49c0: 53 65 6c 66 54 65 73 74 28 29 7b 0a 20 20 69 6e  SelfTest(){.  in
49d0: 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t i;.  unsigned 
49e0: 63 68 61 72 20 7a 42 75 66 5b 32 30 5d 3b 0a 20  char zBuf[20];. 
49f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4a00: 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  z;.  int n;.  in
4a10: 74 20 63 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  t c;..  for(i=0;
4a20: 20 69 3c 30 78 30 30 31 31 30 30 30 30 3b 20 69   i<0x00110000; i
4a30: 2b 2b 29 7b 0a 20 20 20 20 7a 20 3d 20 7a 42 75  ++){.    z = zBu
4a40: 66 3b 0a 20 20 20 20 57 52 49 54 45 5f 55 54 46  f;.    WRITE_UTF
4a50: 38 28 7a 2c 20 69 29 3b 0a 20 20 20 20 6e 20 3d  8(z, i);.    n =
4a60: 20 7a 2d 7a 42 75 66 3b 0a 20 20 20 20 7a 20 3d   z-zBuf;.    z =
4a70: 20 7a 42 75 66 3b 0a 20 20 20 20 52 45 41 44 5f   zBuf;.    READ_
4a80: 55 54 46 38 28 7a 2c 20 63 29 3b 0a 20 20 20 20  UTF8(z, c);.    
4a90: 61 73 73 65 72 74 28 20 63 3d 3d 69 20 29 3b 0a  assert( c==i );.
4aa0: 20 20 20 20 61 73 73 65 72 74 28 20 28 7a 2d 7a      assert( (z-z
4ab0: 42 75 66 29 3d 3d 6e 20 29 3b 0a 20 20 7d 0a 20  Buf)==n );.  }. 
4ac0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 30 78 30 30   for(i=0; i<0x00
4ad0: 31 31 30 30 30 30 3b 20 69 2b 2b 29 7b 0a 20 20  110000; i++){.  
4ae0: 20 20 69 66 28 20 69 3e 3d 30 78 44 38 30 30 20    if( i>=0xD800 
4af0: 26 26 20 69 3c 3d 30 78 45 30 30 30 20 29 20 63  && i<=0xE000 ) c
4b00: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 20 3d  ontinue;.    z =
4b10: 20 7a 42 75 66 3b 0a 20 20 20 20 57 52 49 54 45   zBuf;.    WRITE
4b20: 5f 55 54 46 31 36 4c 45 28 7a 2c 20 69 29 3b 0a  _UTF16LE(z, i);.
4b30: 20 20 20 20 6e 20 3d 20 7a 2d 7a 42 75 66 3b 0a      n = z-zBuf;.
4b40: 20 20 20 20 7a 20 3d 20 7a 42 75 66 3b 0a 20 20      z = zBuf;.  
4b50: 20 20 52 45 41 44 5f 55 54 46 31 36 4c 45 28 7a    READ_UTF16LE(z
4b60: 2c 20 63 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , c);.    assert
4b70: 28 20 63 3d 3d 69 20 29 3b 0a 20 20 20 20 61 73  ( c==i );.    as
4b80: 73 65 72 74 28 20 28 7a 2d 7a 42 75 66 29 3d 3d  sert( (z-zBuf)==
4b90: 6e 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  n );.  }.  for(i
4ba0: 3d 30 3b 20 69 3c 30 78 30 30 31 31 30 30 30 30  =0; i<0x00110000
4bb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
4bc0: 69 3e 3d 30 78 44 38 30 30 20 26 26 20 69 3c 3d  i>=0xD800 && i<=
4bd0: 30 78 45 30 30 30 20 29 20 63 6f 6e 74 69 6e 75  0xE000 ) continu
4be0: 65 3b 0a 20 20 20 20 7a 20 3d 20 7a 42 75 66 3b  e;.    z = zBuf;
4bf0: 0a 20 20 20 20 57 52 49 54 45 5f 55 54 46 31 36  .    WRITE_UTF16
4c00: 42 45 28 7a 2c 20 69 29 3b 0a 20 20 20 20 6e 20  BE(z, i);.    n 
4c10: 3d 20 7a 2d 7a 42 75 66 3b 0a 20 20 20 20 7a 20  = z-zBuf;.    z 
4c20: 3d 20 7a 42 75 66 3b 0a 20 20 20 20 52 45 41 44  = zBuf;.    READ
4c30: 5f 55 54 46 31 36 42 45 28 7a 2c 20 63 29 3b 0a  _UTF16BE(z, c);.
4c40: 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 69      assert( c==i
4c50: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
4c60: 28 7a 2d 7a 42 75 66 29 3d 3d 6e 20 29 3b 0a 20  (z-zBuf)==n );. 
4c70: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a               }.}.#endif.