/ Hex Artifact Content
Login

Artifact bda5eb85039ef16f2d17004c1e18c96e1ab0a80c:


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 33 32 20 32  : utf.c,v 1.32 2
01f0: 30 30 35 2f 30 31 2f 32 38 20 30 31 3a 32 39 3a  005/01/28 01:29:
0200: 30 38 20 64 72 68 20 45 78 70 20 24 0a 2a 2a 0a  08 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 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 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2940: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
2950: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2960: 74 72 61 6e 73 66 6f 72 6d 73 20 74 68 65 20 69  transforms the i
2970: 6e 74 65 72 6e 61 6c 20 74 65 78 74 20 65 6e 63  nternal text enc
2980: 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 70 4d  oding used by pM
2990: 65 6d 20 74 6f 0a 2a 2a 20 64 65 73 69 72 65 64  em to.** desired
29a0: 45 6e 63 2e 20 49 74 20 69 73 20 61 6e 20 65 72  Enc. It is an er
29b0: 72 6f 72 20 69 66 20 74 68 65 20 73 74 72 69 6e  ror if the strin
29c0: 67 20 69 73 20 61 6c 72 65 61 64 79 20 6f 66 20  g is already of 
29d0: 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 65  the desired.** e
29e0: 6e 63 6f 64 69 6e 67 2c 20 6f 72 20 69 66 20 2a  ncoding, or if *
29f0: 70 4d 65 6d 20 64 6f 65 73 20 6e 6f 74 20 63 6f  pMem does not co
2a00: 6e 74 61 69 6e 20 61 20 73 74 72 69 6e 67 20 76  ntain a string v
2a10: 61 6c 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  alue..*/.int sql
2a20: 69 74 65 33 56 64 62 65 4d 65 6d 54 72 61 6e 73  ite3VdbeMemTrans
2a30: 6c 61 74 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20  late(Mem *pMem, 
2a40: 75 38 20 64 65 73 69 72 65 64 45 6e 63 29 7b 0a  u8 desiredEnc){.
2a50: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2a60: 7a 53 68 6f 72 74 5b 4e 42 46 53 5d 3b 20 2f 2a  zShort[NBFS]; /*
2a70: 20 54 65 6d 70 6f 72 61 72 79 20 73 68 6f 72 74   Temporary short
2a80: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   output buffer *
2a90: 2f 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20 20  /.  int len;    
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74  /* Maximum lengt
2ac0: 68 20 6f 66 20 6f 75 74 70 75 74 20 73 74 72 69  h of output stri
2ad0: 6e 67 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  ng in bytes */. 
2ae0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2af0: 7a 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  zOut;           
2b00: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
2b10: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73   buffer */.  uns
2b20: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 3b  igned char *zIn;
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b40: 20 20 20 2f 2a 20 49 6e 70 75 74 20 69 74 65 72     /* Input iter
2b50: 61 74 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ator */.  unsign
2b60: 65 64 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20  ed char *zTerm; 
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b80: 2f 2a 20 45 6e 64 20 6f 66 20 69 6e 70 75 74 20  /* End of input 
2b90: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
2ba0: 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
2bb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
2bc0: 74 70 75 74 20 69 74 65 72 61 74 6f 72 20 2a 2f  tput iterator */
2bd0: 0a 20 20 69 6e 74 20 63 3b 0a 0a 20 20 61 73 73  .  int c;..  ass
2be0: 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  ert( pMem->flags
2bf0: 26 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 61 73  &MEM_Str );.  as
2c00: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 65 6e 63 21  sert( pMem->enc!
2c10: 3d 64 65 73 69 72 65 64 45 6e 63 20 29 3b 0a 20  =desiredEnc );. 
2c20: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 65   assert( pMem->e
2c30: 6e 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  nc!=0 );.  asser
2c40: 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b  t( pMem->n>=0 );
2c50: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 54 52  ..#if defined(TR
2c60: 41 4e 53 4c 41 54 45 5f 54 52 41 43 45 29 20 26  ANSLATE_TRACE) &
2c70: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
2c80: 5f 44 45 42 55 47 29 0a 20 20 7b 0a 20 20 20 20  _DEBUG).  {.    
2c90: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
2ca0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
2cb0: 65 6d 50 72 65 74 74 79 50 72 69 6e 74 28 70 4d  emPrettyPrint(pM
2cc0: 65 6d 2c 20 7a 42 75 66 2c 20 31 30 30 29 3b 0a  em, zBuf, 100);.
2cd0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
2ce0: 72 72 2c 20 22 49 4e 50 55 54 3a 20 20 25 73 5c  rr, "INPUT:  %s\
2cf0: 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23  n", zBuf);.  }.#
2d00: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
2d10: 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69  he translation i
2d20: 73 20 62 65 74 77 65 65 6e 20 55 54 46 2d 31 36  s between UTF-16
2d30: 20 6c 69 74 74 6c 65 20 61 6e 64 20 62 69 67 20   little and big 
2d40: 65 6e 64 69 61 6e 2c 20 74 68 65 6e 20 0a 20 20  endian, then .  
2d50: 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72  ** all that is r
2d60: 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 77  equired is to sw
2d70: 61 70 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  ap the byte orde
2d80: 72 2e 20 54 68 69 73 20 63 61 73 65 20 69 73 20  r. This case is 
2d90: 68 61 6e 64 6c 65 64 0a 20 20 2a 2a 20 64 69 66  handled.  ** dif
2da0: 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68  ferently from th
2db0: 65 20 6f 74 68 65 72 73 2e 0a 20 20 2a 2f 0a 20  e others..  */. 
2dc0: 20 69 66 28 20 70 4d 65 6d 2d 3e 65 6e 63 21 3d   if( pMem->enc!=
2dd0: 53 51 4c 49 54 45 5f 55 54 46 38 20 26 26 20 64  SQLITE_UTF8 && d
2de0: 65 73 69 72 65 64 45 6e 63 21 3d 53 51 4c 49 54  esiredEnc!=SQLIT
2df0: 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 75 38  E_UTF8 ){.    u8
2e00: 20 74 65 6d 70 3b 0a 20 20 20 20 69 6e 74 20 72   temp;.    int r
2e10: 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
2e20: 74 65 33 56 64 62 65 4d 65 6d 4d 61 6b 65 57 72  te3VdbeMemMakeWr
2e30: 69 74 65 61 62 6c 65 28 70 4d 65 6d 29 3b 0a 20  iteable(pMem);. 
2e40: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2e50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
2e60: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2e70: 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
2e80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2e90: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  MEM;.    }.    z
2ea0: 49 6e 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20  In = pMem->z;.  
2eb0: 20 20 7a 54 65 72 6d 20 3d 20 26 7a 49 6e 5b 70    zTerm = &zIn[p
2ec0: 4d 65 6d 2d 3e 6e 5d 3b 0a 20 20 20 20 77 68 69  Mem->n];.    whi
2ed0: 6c 65 28 20 7a 49 6e 3c 7a 54 65 72 6d 20 29 7b  le( zIn<zTerm ){
2ee0: 0a 20 20 20 20 20 20 74 65 6d 70 20 3d 20 2a 7a  .      temp = *z
2ef0: 49 6e 3b 0a 20 20 20 20 20 20 2a 7a 49 6e 20 3d  In;.      *zIn =
2f00: 20 2a 28 7a 49 6e 2b 31 29 3b 0a 20 20 20 20 20   *(zIn+1);.     
2f10: 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 2a 7a   zIn++;.      *z
2f20: 49 6e 2b 2b 20 3d 20 74 65 6d 70 3b 0a 20 20 20  In++ = temp;.   
2f30: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63   }.    pMem->enc
2f40: 20 3d 20 64 65 73 69 72 65 64 45 6e 63 3b 0a 20   = desiredEnc;. 
2f50: 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 6c 61 74     goto translat
2f60: 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e_out;.  }..  /*
2f70: 20 53 65 74 20 6c 65 6e 20 74 6f 20 74 68 65 20   Set len to the 
2f80: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
2f90: 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
2fa0: 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62   in the output b
2fb0: 75 66 66 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20  uffer. */.  if( 
2fc0: 64 65 73 69 72 65 64 45 6e 63 3d 3d 53 51 4c 49  desiredEnc==SQLI
2fd0: 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 2f  TE_UTF8 ){.    /
2fe0: 2a 20 57 68 65 6e 20 63 6f 6e 76 65 72 74 69 6e  * When convertin
2ff0: 67 20 66 72 6f 6d 20 55 54 46 2d 31 36 2c 20 74  g from UTF-16, t
3000: 68 65 20 6d 61 78 69 6d 75 6d 20 67 72 6f 77 74  he maximum growt
3010: 68 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 0a 20  h results from. 
3020: 20 20 20 2a 2a 20 74 72 61 6e 73 6c 61 74 69 6e     ** translatin
3030: 67 20 61 20 32 2d 62 79 74 65 20 63 68 61 72 61  g a 2-byte chara
3040: 63 74 65 72 20 74 6f 20 61 20 33 2d 62 79 74 65  cter to a 3-byte
3050: 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72   UTF-8 character
3060: 20 28 69 2e 65 2e 0a 20 20 20 20 2a 2a 20 63 6f   (i.e..    ** co
3070: 64 65 2d 70 6f 69 6e 74 20 30 78 46 46 46 43 29  de-point 0xFFFC)
3080: 2e 20 41 20 73 69 6e 67 6c 65 20 62 79 74 65 20  . A single byte 
3090: 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
30a0: 74 68 65 20 6f 75 74 70 75 74 20 73 74 72 69 6e  the output strin
30b0: 67 0a 20 20 20 20 2a 2a 20 6e 75 6c 2d 74 65 72  g.    ** nul-ter
30c0: 6d 69 6e 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a  minator..    */.
30d0: 20 20 20 20 6c 65 6e 20 3d 20 28 70 4d 65 6d 2d      len = (pMem-
30e0: 3e 6e 2f 32 29 20 2a 20 33 20 2b 20 31 3b 0a 20  >n/2) * 3 + 1;. 
30f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57   }else{.    /* W
3100: 68 65 6e 20 63 6f 6e 76 65 72 74 69 6e 67 20 66  hen converting f
3110: 72 6f 6d 20 55 54 46 2d 38 20 74 6f 20 55 54 46  rom UTF-8 to UTF
3120: 2d 31 36 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  -16 the maximum 
3130: 67 72 6f 77 74 68 20 69 73 20 63 61 75 73 65 64  growth is caused
3140: 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 61 20 31  .    ** when a 1
3150: 2d 62 79 74 65 20 55 54 46 2d 38 20 63 68 61 72  -byte UTF-8 char
3160: 61 63 74 65 72 20 69 73 20 74 72 61 6e 73 6c 61  acter is transla
3170: 74 65 64 20 69 6e 74 6f 20 61 20 32 2d 62 79 74  ted into a 2-byt
3180: 65 20 55 54 46 2d 31 36 0a 20 20 20 20 2a 2a 20  e UTF-16.    ** 
3190: 63 68 61 72 61 63 74 65 72 2e 20 54 77 6f 20 62  character. Two b
31a0: 79 74 65 73 20 61 72 65 20 72 65 71 75 69 72 65  ytes are require
31b0: 64 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  d in the output 
31c0: 62 75 66 66 65 72 20 66 6f 72 20 74 68 65 0a 20  buffer for the. 
31d0: 20 20 20 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e     ** nul-termin
31e0: 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ator..    */.   
31f0: 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 20 2a   len = pMem->n *
3200: 20 32 20 2b 20 32 3b 0a 20 20 7d 0a 0a 20 20 2f   2 + 2;.  }..  /
3210: 2a 20 53 65 74 20 7a 49 6e 20 74 6f 20 70 6f 69  * Set zIn to poi
3220: 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
3230: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 62 75 66  of the input buf
3240: 66 65 72 20 61 6e 64 20 7a 54 65 72 6d 20 74 6f  fer and zTerm to
3250: 20 70 6f 69 6e 74 20 31 0a 20 20 2a 2a 20 62 79   point 1.  ** by
3260: 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 2e  te past the end.
3270: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61  .  **.  ** Varia
3280: 62 6c 65 20 7a 4f 75 74 20 69 73 20 73 65 74 20  ble zOut is set 
3290: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
32a0: 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54  output buffer. T
32b0: 68 69 73 20 6d 61 79 20 62 65 20 73 70 61 63 65  his may be space
32c0: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66  .  ** obtained f
32d0: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20 6f 72  rom malloc(), or
32e0: 20 4d 65 6d 2e 7a 53 68 6f 72 74 2c 20 69 66 20   Mem.zShort, if 
32f0: 69 74 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  it large enough 
3300: 61 6e 64 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20  and not in.  ** 
3310: 75 73 65 2c 20 6f 72 20 74 68 65 20 7a 53 68 6f  use, or the zSho
3320: 72 74 20 61 72 72 61 79 20 6f 6e 20 74 68 65 20  rt array on the 
3330: 73 74 61 63 6b 20 28 73 65 65 20 61 62 6f 76 65  stack (see above
3340: 29 2e 0a 20 20 2a 2f 0a 20 20 7a 49 6e 20 3d 20  )..  */.  zIn = 
3350: 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 7a 54 65 72 6d  pMem->z;.  zTerm
3360: 20 3d 20 26 7a 49 6e 5b 70 4d 65 6d 2d 3e 6e 5d   = &zIn[pMem->n]
3370: 3b 0a 20 20 69 66 28 20 6c 65 6e 3e 4e 42 46 53  ;.  if( len>NBFS
3380: 20 29 7b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73   ){.    zOut = s
3390: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 6c  qliteMallocRaw(l
33a0: 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f  en);.    if( !zO
33b0: 75 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ut ) return SQLI
33c0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
33d0: 65 7b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 7a 53  e{.    zOut = zS
33e0: 68 6f 72 74 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  hort;.  }.  z = 
33f0: 7a 4f 75 74 3b 0a 0a 20 20 69 66 28 20 70 4d 65  zOut;..  if( pMe
3400: 6d 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  m->enc==SQLITE_U
3410: 54 46 38 20 29 7b 0a 20 20 20 20 69 66 28 20 64  TF8 ){.    if( d
3420: 65 73 69 72 65 64 45 6e 63 3d 3d 53 51 4c 49 54  esiredEnc==SQLIT
3430: 45 5f 55 54 46 31 36 4c 45 20 29 7b 0a 20 20 20  E_UTF16LE ){.   
3440: 20 20 20 2f 2a 20 55 54 46 2d 38 20 2d 3e 20 55     /* UTF-8 -> U
3450: 54 46 2d 31 36 20 4c 69 74 74 6c 65 2d 65 6e 64  TF-16 Little-end
3460: 69 61 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  ian */.      whi
3470: 6c 65 28 20 7a 49 6e 3c 7a 54 65 72 6d 20 29 7b  le( zIn<zTerm ){
3480: 0a 20 20 20 20 20 20 20 20 52 45 41 44 5f 55 54  .        READ_UT
3490: 46 38 28 7a 49 6e 2c 20 63 29 3b 20 0a 20 20 20  F8(zIn, c); .   
34a0: 20 20 20 20 20 57 52 49 54 45 5f 55 54 46 31 36       WRITE_UTF16
34b0: 4c 45 28 7a 2c 20 63 29 3b 0a 20 20 20 20 20 20  LE(z, c);.      
34c0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
34d0: 20 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72     assert( desir
34e0: 65 64 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  edEnc==SQLITE_UT
34f0: 46 31 36 42 45 20 29 3b 0a 20 20 20 20 20 20 2f  F16BE );.      /
3500: 2a 20 55 54 46 2d 38 20 2d 3e 20 55 54 46 2d 31  * UTF-8 -> UTF-1
3510: 36 20 42 69 67 2d 65 6e 64 69 61 6e 20 2a 2f 0a  6 Big-endian */.
3520: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 49 6e        while( zIn
3530: 3c 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20  <zTerm ){.      
3540: 20 20 52 45 41 44 5f 55 54 46 38 28 7a 49 6e 2c    READ_UTF8(zIn,
3550: 20 63 29 3b 20 0a 20 20 20 20 20 20 20 20 57 52   c); .        WR
3560: 49 54 45 5f 55 54 46 31 36 42 45 28 7a 2c 20 63  ITE_UTF16BE(z, c
3570: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
3580: 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 7a  .    pMem->n = z
3590: 20 2d 20 7a 4f 75 74 3b 0a 20 20 20 20 2a 7a 2b   - zOut;.    *z+
35a0: 2b 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  + = 0;.  }else{.
35b0: 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73 69      assert( desi
35c0: 72 65 64 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  redEnc==SQLITE_U
35d0: 54 46 38 20 29 3b 0a 20 20 20 20 69 66 28 20 70  TF8 );.    if( p
35e0: 4d 65 6d 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  Mem->enc==SQLITE
35f0: 5f 55 54 46 31 36 4c 45 20 29 7b 0a 20 20 20 20  _UTF16LE ){.    
3600: 20 20 2f 2a 20 55 54 46 2d 31 36 20 4c 69 74 74    /* UTF-16 Litt
3610: 6c 65 2d 65 6e 64 69 61 6e 20 2d 3e 20 55 54 46  le-endian -> UTF
3620: 2d 38 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  -8 */.      whil
3630: 65 28 20 7a 49 6e 3c 7a 54 65 72 6d 20 29 7b 0a  e( zIn<zTerm ){.
3640: 20 20 20 20 20 20 20 20 52 45 41 44 5f 55 54 46          READ_UTF
3650: 31 36 4c 45 28 7a 49 6e 2c 20 63 29 3b 20 0a 20  16LE(zIn, c); . 
3660: 20 20 20 20 20 20 20 57 52 49 54 45 5f 55 54 46         WRITE_UTF
3670: 38 28 7a 2c 20 63 29 3b 0a 20 20 20 20 20 20 7d  8(z, c);.      }
3680: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3690: 20 20 2f 2a 20 55 54 46 2d 31 36 20 4c 69 74 74    /* UTF-16 Litt
36a0: 6c 65 2d 65 6e 64 69 61 6e 20 2d 3e 20 55 54 46  le-endian -> UTF
36b0: 2d 38 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  -8 */.      whil
36c0: 65 28 20 7a 49 6e 3c 7a 54 65 72 6d 20 29 7b 0a  e( zIn<zTerm ){.
36d0: 20 20 20 20 20 20 20 20 52 45 41 44 5f 55 54 46          READ_UTF
36e0: 31 36 42 45 28 7a 49 6e 2c 20 63 29 3b 20 0a 20  16BE(zIn, c); . 
36f0: 20 20 20 20 20 20 20 57 52 49 54 45 5f 55 54 46         WRITE_UTF
3700: 38 28 7a 2c 20 63 29 3b 0a 20 20 20 20 20 20 7d  8(z, c);.      }
3710: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d  .    }.    pMem-
3720: 3e 6e 20 3d 20 7a 20 2d 20 7a 4f 75 74 3b 0a 20  >n = z - zOut;. 
3730: 20 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 61   }.  *z = 0;.  a
3740: 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 6e 2b  ssert( (pMem->n+
3750: 28 64 65 73 69 72 65 64 45 6e 63 3d 3d 53 51 4c  (desiredEnc==SQL
3760: 49 54 45 5f 55 54 46 38 3f 31 3a 32 29 29 3c 3d  ITE_UTF8?1:2))<=
3770: 6c 65 6e 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  len );..  sqlite
3780: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
3790: 70 4d 65 6d 29 3b 0a 20 20 70 4d 65 6d 2d 3e 66  pMem);.  pMem->f
37a0: 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 53 74  lags &= ~(MEM_St
37b0: 61 74 69 63 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  atic|MEM_Dyn|MEM
37c0: 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53 68 6f 72 74  _Ephem|MEM_Short
37d0: 29 3b 0a 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d  );.  pMem->enc =
37e0: 20 64 65 73 69 72 65 64 45 6e 63 3b 0a 20 20 69   desiredEnc;.  i
37f0: 66 28 20 7a 4f 75 74 3d 3d 7a 53 68 6f 72 74 20  f( zOut==zShort 
3800: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4d  ){.    memcpy(pM
3810: 65 6d 2d 3e 7a 53 68 6f 72 74 2c 20 7a 4f 75 74  em->zShort, zOut
3820: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 7a 4f 75 74  , len);.    zOut
3830: 20 3d 20 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 3b   = pMem->zShort;
3840: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
3850: 20 7c 3d 20 28 4d 45 4d 5f 54 65 72 6d 7c 4d 45   |= (MEM_Term|ME
3860: 4d 5f 53 68 6f 72 74 29 3b 0a 20 20 7d 65 6c 73  M_Short);.  }els
3870: 65 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  e{.    pMem->fla
3880: 67 73 20 7c 3d 20 28 4d 45 4d 5f 54 65 72 6d 7c  gs |= (MEM_Term|
3890: 4d 45 4d 5f 44 79 6e 29 3b 0a 20 20 7d 0a 20 20  MEM_Dyn);.  }.  
38a0: 70 4d 65 6d 2d 3e 7a 20 3d 20 7a 4f 75 74 3b 0a  pMem->z = zOut;.
38b0: 0a 74 72 61 6e 73 6c 61 74 65 5f 6f 75 74 3a 0a  .translate_out:.
38c0: 23 69 66 20 64 65 66 69 6e 65 64 28 54 52 41 4e  #if defined(TRAN
38d0: 53 4c 41 54 45 5f 54 52 41 43 45 29 20 26 26 20  SLATE_TRACE) && 
38e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
38f0: 45 42 55 47 29 0a 20 20 7b 0a 20 20 20 20 63 68  EBUG).  {.    ch
3900: 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20  ar zBuf[100];.  
3910: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
3920: 50 72 65 74 74 79 50 72 69 6e 74 28 70 4d 65 6d  PrettyPrint(pMem
3930: 2c 20 7a 42 75 66 2c 20 31 30 30 29 3b 0a 20 20  , zBuf, 100);.  
3940: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
3950: 2c 20 22 4f 55 54 50 55 54 3a 20 25 73 5c 6e 22  , "OUTPUT: %s\n"
3960: 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e  , zBuf);.  }.#en
3970: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
3980: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
3990: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
39a0: 65 63 6b 73 20 66 6f 72 20 61 20 62 79 74 65 2d  ecks for a byte-
39b0: 6f 72 64 65 72 20 6d 61 72 6b 20 61 74 20 74 68  order mark at th
39c0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
39d0: 68 65 20 0a 2a 2a 20 55 54 46 2d 31 36 20 73 74  he .** UTF-16 st
39e0: 72 69 6e 67 20 73 74 6f 72 65 64 20 69 6e 20 2a  ring stored in *
39f0: 70 4d 65 6d 2e 20 49 66 20 6f 6e 65 20 69 73 20  pMem. If one is 
3a00: 70 72 65 73 65 6e 74 2c 20 69 74 20 69 73 20 72  present, it is r
3a10: 65 6d 6f 76 65 64 20 61 6e 64 0a 2a 2a 20 74 68  emoved and.** th
3a20: 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68  e encoding of th
3a30: 65 20 4d 65 6d 20 61 64 6a 75 73 74 65 64 2e 20  e Mem adjusted. 
3a40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
3a50: 73 20 6e 6f 74 20 64 6f 20 61 6e 79 0a 2a 2a 20  s not do any.** 
3a60: 62 79 74 65 2d 73 77 61 70 70 69 6e 67 2c 20 69  byte-swapping, i
3a70: 74 20 6a 75 73 74 20 73 65 74 73 20 4d 65 6d 2e  t just sets Mem.
3a80: 65 6e 63 20 61 70 70 72 6f 70 72 69 61 74 65 6c  enc appropriatel
3a90: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 6c 6c  y..**.** The all
3aa0: 6f 63 61 74 69 6f 6e 20 28 73 74 61 74 69 63 2c  ocation (static,
3ab0: 20 64 79 6e 61 6d 69 63 20 65 74 63 2e 29 20 61   dynamic etc.) a
3ac0: 6e 64 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74  nd encoding of t
3ad0: 68 65 20 4d 65 6d 20 6d 61 79 20 62 65 0a 2a 2a  he Mem may be.**
3ae0: 20 63 68 61 6e 67 65 64 20 62 79 20 74 68 69 73   changed by this
3af0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
3b00: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  t sqlite3VdbeMem
3b10: 48 61 6e 64 6c 65 42 6f 6d 28 4d 65 6d 20 2a 70  HandleBom(Mem *p
3b20: 4d 65 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Mem){.  int rc =
3b30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
3b40: 20 62 6f 6d 20 3d 20 30 3b 0a 0a 20 20 69 66 28   bom = 0;..  if(
3b50: 20 70 4d 65 6d 2d 3e 6e 3c 30 20 7c 7c 20 70 4d   pMem->n<0 || pM
3b60: 65 6d 2d 3e 6e 3e 31 20 29 7b 0a 20 20 20 20 75  em->n>1 ){.    u
3b70: 38 20 62 31 20 3d 20 2a 28 75 38 20 2a 29 70 4d  8 b1 = *(u8 *)pM
3b80: 65 6d 2d 3e 7a 3b 0a 20 20 20 20 75 38 20 62 32  em->z;.    u8 b2
3b90: 20 3d 20 2a 28 28 28 75 38 20 2a 29 70 4d 65 6d   = *(((u8 *)pMem
3ba0: 2d 3e 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20 69  ->z) + 1);.    i
3bb0: 66 28 20 62 31 3d 3d 30 78 46 45 20 26 26 20 62  f( b1==0xFE && b
3bc0: 32 3d 3d 30 78 46 46 20 29 7b 0a 20 20 20 20 20  2==0xFF ){.     
3bd0: 20 62 6f 6d 20 3d 20 53 51 4c 49 54 45 5f 55 54   bom = SQLITE_UT
3be0: 46 31 36 42 45 3b 0a 20 20 20 20 7d 0a 20 20 20  F16BE;.    }.   
3bf0: 20 69 66 28 20 62 31 3d 3d 30 78 46 46 20 26 26   if( b1==0xFF &&
3c00: 20 62 32 3d 3d 30 78 46 45 20 29 7b 0a 20 20 20   b2==0xFE ){.   
3c10: 20 20 20 62 6f 6d 20 3d 20 53 51 4c 49 54 45 5f     bom = SQLITE_
3c20: 55 54 46 31 36 4c 45 3b 0a 20 20 20 20 7d 0a 20  UTF16LE;.    }. 
3c30: 20 7d 0a 20 20 0a 20 20 69 66 28 20 62 6f 6d 20   }.  .  if( bom 
3c40: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66  ){.    /* This f
3c50: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
3c60: 64 20 61 73 20 73 6f 6f 6e 20 61 73 20 61 20 73  d as soon as a s
3c70: 74 72 69 6e 67 20 69 73 20 73 74 6f 72 65 64 20  tring is stored 
3c80: 69 6e 20 61 20 4d 65 6d 2a 2c 0a 20 20 20 20 2a  in a Mem*,.    *
3c90: 2a 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 73 71  * from within sq
3ca0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
3cb0: 74 72 28 29 2e 20 41 74 20 74 68 61 74 20 70 6f  tr(). At that po
3cc0: 69 6e 74 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  int it is not po
3cd0: 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 66 6f  ssible.    ** fo
3ce0: 72 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f 20  r the string to 
3cf0: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d  be stored in Mem
3d00: 2e 7a 53 68 6f 72 74 2c 20 6f 72 20 66 6f 72 20  .zShort, or for 
3d10: 69 74 20 74 6f 20 62 65 20 73 74 6f 72 65 64 0a  it to be stored.
3d20: 20 20 20 20 2a 2a 20 69 6e 20 64 79 6e 61 6d 69      ** in dynami
3d30: 63 20 6d 65 6d 6f 72 79 20 77 69 74 68 20 6e 6f  c memory with no
3d40: 20 64 65 73 74 72 75 63 74 6f 72 2e 0a 20 20 20   destructor..   
3d50: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
3d60: 21 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45  !(pMem->flags&ME
3d70: 4d 5f 53 68 6f 72 74 29 20 29 3b 0a 20 20 20 20  M_Short) );.    
3d80: 61 73 73 65 72 74 28 20 21 28 70 4d 65 6d 2d 3e  assert( !(pMem->
3d90: 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 29 20 7c  flags&MEM_Dyn) |
3da0: 7c 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 29 3b 0a  | pMem->xDel );.
3db0: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
3dc0: 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 7b  ags & MEM_Dyn ){
3dd0: 0a 20 20 20 20 20 20 76 6f 69 64 20 28 2a 78 44  .      void (*xD
3de0: 65 6c 29 28 76 6f 69 64 2a 29 20 3d 20 70 4d 65  el)(void*) = pMe
3df0: 6d 2d 3e 78 44 65 6c 3b 0a 20 20 20 20 20 20 63  m->xDel;.      c
3e00: 68 61 72 20 2a 7a 20 3d 20 70 4d 65 6d 2d 3e 7a  har *z = pMem->z
3e10: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  ;.      pMem->z 
3e20: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  = 0;.      pMem-
3e30: 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >xDel = 0;.     
3e40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
3e50: 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c  eMemSetStr(pMem,
3e60: 20 26 7a 5b 32 5d 2c 20 70 4d 65 6d 2d 3e 6e 2d   &z[2], pMem->n-
3e70: 32 2c 20 62 6f 6d 2c 20 53 51 4c 49 54 45 5f 54  2, bom, SQLITE_T
3e80: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
3e90: 20 78 44 65 6c 28 7a 29 3b 0a 20 20 20 20 7d 65   xDel(z);.    }e
3ea0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
3eb0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
3ec0: 74 53 74 72 28 70 4d 65 6d 2c 20 26 70 4d 65 6d  tStr(pMem, &pMem
3ed0: 2d 3e 7a 5b 32 5d 2c 20 70 4d 65 6d 2d 3e 6e 2d  ->z[2], pMem->n-
3ee0: 32 2c 20 62 6f 6d 2c 20 0a 20 20 20 20 20 20 20  2, bom, .       
3ef0: 20 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49     SQLITE_TRANSI
3f00: 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ENT);.    }.  }.
3f10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
3f20: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3f30: 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f  OMIT_UTF16 */../
3f40: 2a 0a 2a 2a 20 70 5a 20 69 73 20 61 20 55 54 46  *.** pZ is a UTF
3f50: 2d 38 20 65 6e 63 6f 64 65 64 20 75 6e 69 63 6f  -8 encoded unico
3f60: 64 65 20 73 74 72 69 6e 67 2e 20 49 66 20 6e 42  de string. If nB
3f70: 79 74 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  yte is less than
3f80: 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 74 75 72 6e   zero,.** return
3f90: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75   the number of u
3fa0: 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72  nicode character
3fb0: 73 20 69 6e 20 70 5a 20 75 70 20 74 6f 20 28 62  s in pZ up to (b
3fc0: 75 74 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  ut not including
3fd0: 29 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 30  ).** the first 0
3fe0: 78 30 30 20 62 79 74 65 2e 20 49 66 20 6e 42 79  x00 byte. If nBy
3ff0: 74 65 20 69 73 20 6e 6f 74 20 6c 65 73 73 20 74  te is not less t
4000: 68 61 6e 20 7a 65 72 6f 2c 20 72 65 74 75 72 6e  han zero, return
4010: 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
4020: 66 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63  f unicode charac
4030: 74 65 72 73 20 69 6e 20 74 68 65 20 66 69 72 73  ters in the firs
4040: 74 20 6e 42 79 74 65 20 6f 66 20 70 5a 20 28 6f  t nByte of pZ (o
4050: 72 20 75 70 20 74 6f 20 0a 2a 2a 20 74 68 65 20  r up to .** the 
4060: 66 69 72 73 74 20 30 78 30 30 2c 20 77 68 69 63  first 0x00, whic
4070: 68 65 76 65 72 20 63 6f 6d 65 73 20 66 69 72 73  hever comes firs
4080: 74 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  t)..*/.int sqlit
4090: 65 33 75 74 66 38 43 68 61 72 4c 65 6e 28 63 6f  e3utf8CharLen(co
40a0: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
40b0: 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 72   nByte){.  int r
40c0: 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68   = 0;.  const ch
40d0: 61 72 20 2a 7a 54 65 72 6d 3b 0a 20 20 69 66 28  ar *zTerm;.  if(
40e0: 20 6e 42 79 74 65 3e 3d 30 20 29 7b 0a 20 20 20   nByte>=0 ){.   
40f0: 20 7a 54 65 72 6d 20 3d 20 26 7a 5b 6e 42 79 74   zTerm = &z[nByt
4100: 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e];.  }else{.   
4110: 20 7a 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20   zTerm = (const 
4120: 63 68 61 72 20 2a 29 28 2d 31 29 3b 0a 20 20 7d  char *)(-1);.  }
4130: 0a 20 20 61 73 73 65 72 74 28 20 7a 3c 3d 7a 54  .  assert( z<=zT
4140: 65 72 6d 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  erm );.  while( 
4150: 2a 7a 21 3d 30 20 26 26 20 7a 3c 7a 54 65 72 6d  *z!=0 && z<zTerm
4160: 20 29 7b 0a 20 20 20 20 53 4b 49 50 5f 55 54 46   ){.    SKIP_UTF
4170: 38 28 7a 29 3b 0a 20 20 20 20 72 2b 2b 3b 0a 20  8(z);.    r++;. 
4180: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
4190: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
41a0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
41b0: 2a 20 70 5a 20 69 73 20 61 20 55 54 46 2d 31 36  * pZ is a UTF-16
41c0: 20 65 6e 63 6f 64 65 64 20 75 6e 69 63 6f 64 65   encoded unicode
41d0: 20 73 74 72 69 6e 67 2e 20 49 66 20 6e 43 68 61   string. If nCha
41e0: 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  r is less than z
41f0: 65 72 6f 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 74  ero,.** 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 75 70 20 74 6f 20 28 62 75 74 20 6e 6f  es up to (but no
4220: 74 20 69 6e 63 6c 75 64 69 6e 67 29 2c 20 74 68  t including), th
4230: 65 20 66 69 72 73 74 20 70 61 69 72 0a 2a 2a 20  e first pair.** 
4240: 6f 66 20 63 6f 6e 73 65 63 75 74 69 76 65 20 30  of consecutive 0
4250: 78 30 30 20 62 79 74 65 73 20 69 6e 20 70 5a 2e  x00 bytes in pZ.
4260: 20 49 66 20 6e 43 68 61 72 20 69 73 20 6e 6f 74   If nChar is not
4270: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
4280: 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
4290: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
42a0: 74 65 73 20 69 6e 20 74 68 65 20 66 69 72 73 74  tes in the first
42b0: 20 6e 43 68 61 72 20 75 6e 69 63 6f 64 65 20 63   nChar unicode c
42c0: 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 69 6e 20  haracters.** in 
42d0: 70 5a 20 28 6f 72 20 75 70 20 75 6e 74 69 6c 20  pZ (or up until 
42e0: 74 68 65 20 66 69 72 73 74 20 70 61 69 72 20 6f  the first pair o
42f0: 66 20 30 78 30 30 20 62 79 74 65 73 2c 20 77 68  f 0x00 bytes, wh
4300: 69 63 68 65 76 65 72 20 63 6f 6d 65 73 20 66 69  ichever comes fi
4310: 72 73 74 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rst)..*/.int sql
4320: 69 74 65 33 75 74 66 31 36 42 79 74 65 4c 65 6e  ite3utf16ByteLen
4330: 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 49 6e  (const void *zIn
4340: 2c 20 69 6e 74 20 6e 43 68 61 72 29 7b 0a 20 20  , int nChar){.  
4350: 69 6e 74 20 63 20 3d 20 31 3b 0a 20 20 63 68 61  int c = 1;.  cha
4360: 72 20 63 6f 6e 73 74 20 2a 7a 20 3d 20 7a 49 6e  r const *z = zIn
4370: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  ;.  int n = 0;. 
4380: 20 69 66 28 20 53 51 4c 49 54 45 5f 55 54 46 31   if( SQLITE_UTF1
4390: 36 4e 41 54 49 56 45 3d 3d 53 51 4c 49 54 45 5f  6NATIVE==SQLITE_
43a0: 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20 77  UTF16BE ){.    w
43b0: 68 69 6c 65 28 20 63 20 26 26 20 28 28 6e 43 68  hile( c && ((nCh
43c0: 61 72 3c 30 29 20 7c 7c 20 6e 3c 6e 43 68 61 72  ar<0) || n<nChar
43d0: 29 20 29 7b 0a 20 20 20 20 20 20 52 45 41 44 5f  ) ){.      READ_
43e0: 55 54 46 31 36 42 45 28 7a 2c 20 63 29 3b 0a 20  UTF16BE(z, c);. 
43f0: 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a       n++;.    }.
4400: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
4410: 6c 65 28 20 63 20 26 26 20 28 28 6e 43 68 61 72  le( c && ((nChar
4420: 3c 30 29 20 7c 7c 20 6e 3c 6e 43 68 61 72 29 20  <0) || n<nChar) 
4430: 29 7b 0a 20 20 20 20 20 20 52 45 41 44 5f 55 54  ){.      READ_UT
4440: 46 31 36 4c 45 28 7a 2c 20 63 29 3b 0a 20 20 20  F16LE(z, c);.   
4450: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
4460: 7d 0a 20 20 72 65 74 75 72 6e 20 28 7a 2d 28 63  }.  return (z-(c
4470: 68 61 72 20 63 6f 6e 73 74 20 2a 29 7a 49 6e 29  har const *)zIn)
4480: 2d 28 28 63 3d 3d 30 29 3f 32 3a 30 29 3b 0a 7d  -((c==0)?2:0);.}
4490: 0a 0a 2f 2a 0a 2a 2a 20 55 54 46 2d 31 36 20 69  ../*.** UTF-16 i
44a0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
44b0: 20 74 68 65 20 73 75 62 73 74 72 28 29 0a 2a 2f   the substr().*/
44c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 75 74 66  .void sqlite3utf
44d0: 31 36 53 75 62 73 74 72 28 0a 20 20 73 71 6c 69  16Substr(.  sqli
44e0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
44f0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
4500: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
4510: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  e **argv.){.  in
4520: 74 20 79 2c 20 7a 3b 0a 20 20 75 6e 73 69 67 6e  t y, z;.  unsign
4530: 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  ed char const *z
4540: 53 74 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  Str;.  unsigned 
4550: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 53 74 72  char const *zStr
4560: 45 6e 64 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  End;.  unsigned 
4570: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 53 74 61  char const *zSta
4580: 72 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rt;.  unsigned c
4590: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 45 6e 64 3b  har const *zEnd;
45a0: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 7a 53 74  .  int i;..  zSt
45b0: 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  r = (unsigned ch
45c0: 61 72 20 63 6f 6e 73 74 20 2a 29 73 71 6c 69 74  ar const *)sqlit
45d0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
45e0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 53 74 72  argv[0]);.  zStr
45f0: 45 6e 64 20 3d 20 26 7a 53 74 72 5b 73 71 6c 69  End = &zStr[sqli
4600: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31  te3_value_bytes1
4610: 36 28 61 72 67 76 5b 30 5d 29 5d 3b 0a 20 20 79  6(argv[0])];.  y
4620: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
4630: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20  _int(argv[1]);. 
4640: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
4650: 75 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d 29 3b  ue_int(argv[2]);
4660: 0a 0a 20 20 69 66 28 20 79 3e 30 20 29 7b 0a 20  ..  if( y>0 ){. 
4670: 20 20 20 79 20 3d 20 79 2d 31 3b 0a 20 20 20 20     y = y-1;.    
4680: 7a 53 74 61 72 74 20 3d 20 7a 53 74 72 3b 0a 20  zStart = zStr;. 
4690: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 55 54     if( SQLITE_UT
46a0: 46 31 36 42 45 3d 3d 53 51 4c 49 54 45 5f 55 54  F16BE==SQLITE_UT
46b0: 46 31 36 4e 41 54 49 56 45 20 29 7b 0a 20 20 20  F16NATIVE ){.   
46c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 79 20     for(i=0; i<y 
46d0: 26 26 20 7a 53 74 61 72 74 3c 7a 53 74 72 45 6e  && zStart<zStrEn
46e0: 64 3b 20 69 2b 2b 29 20 53 4b 49 50 5f 55 54 46  d; i++) SKIP_UTF
46f0: 31 36 42 45 28 7a 53 74 61 72 74 29 3b 0a 20 20  16BE(zStart);.  
4700: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
4710: 6f 72 28 69 3d 30 3b 20 69 3c 79 20 26 26 20 7a  or(i=0; i<y && z
4720: 53 74 61 72 74 3c 7a 53 74 72 45 6e 64 3b 20 69  Start<zStrEnd; i
4730: 2b 2b 29 20 53 4b 49 50 5f 55 54 46 31 36 4c 45  ++) SKIP_UTF16LE
4740: 28 7a 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 0a  (zStart);.    }.
4750: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 74    }else{.    zSt
4760: 61 72 74 20 3d 20 7a 53 74 72 45 6e 64 3b 0a 20  art = zStrEnd;. 
4770: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 55 54     if( SQLITE_UT
4780: 46 31 36 42 45 3d 3d 53 51 4c 49 54 45 5f 55 54  F16BE==SQLITE_UT
4790: 46 31 36 4e 41 54 49 56 45 20 29 7b 0a 20 20 20  F16NATIVE ){.   
47a0: 20 20 20 66 6f 72 28 69 3d 79 3b 20 69 3c 30 20     for(i=y; i<0 
47b0: 26 26 20 7a 53 74 61 72 74 3e 7a 53 74 72 3b 20  && zStart>zStr; 
47c0: 69 2b 2b 29 20 52 53 4b 49 50 5f 55 54 46 31 36  i++) RSKIP_UTF16
47d0: 42 45 28 7a 53 74 61 72 74 29 3b 0a 20 20 20 20  BE(zStart);.    
47e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72  }else{.      for
47f0: 28 69 3d 79 3b 20 69 3c 30 20 26 26 20 7a 53 74  (i=y; i<0 && zSt
4800: 61 72 74 3e 7a 53 74 72 3b 20 69 2b 2b 29 20 52  art>zStr; i++) R
4810: 53 4b 49 50 5f 55 54 46 31 36 4c 45 28 7a 53 74  SKIP_UTF16LE(zSt
4820: 61 72 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  art);.    }.    
4830: 66 6f 72 28 3b 20 69 3c 30 3b 20 69 2b 2b 29 20  for(; i<0; i++) 
4840: 7a 20 2d 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 7a  z -= 1;.  }..  z
4850: 45 6e 64 20 3d 20 7a 53 74 61 72 74 3b 0a 20 20  End = zStart;.  
4860: 69 66 28 20 53 51 4c 49 54 45 5f 55 54 46 31 36  if( SQLITE_UTF16
4870: 42 45 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  BE==SQLITE_UTF16
4880: 4e 41 54 49 56 45 20 29 7b 0a 20 20 20 20 66 6f  NATIVE ){.    fo
4890: 72 28 69 3d 30 3b 20 69 3c 7a 20 26 26 20 7a 45  r(i=0; i<z && zE
48a0: 6e 64 3c 7a 53 74 72 45 6e 64 3b 20 69 2b 2b 29  nd<zStrEnd; i++)
48b0: 20 53 4b 49 50 5f 55 54 46 31 36 42 45 28 7a 45   SKIP_UTF16BE(zE
48c0: 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nd);.  }else{.  
48d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 7a 20 26    for(i=0; i<z &
48e0: 26 20 7a 45 6e 64 3c 7a 53 74 72 45 6e 64 3b 20  & zEnd<zStrEnd; 
48f0: 69 2b 2b 29 20 53 4b 49 50 5f 55 54 46 31 36 4c  i++) SKIP_UTF16L
4900: 45 28 7a 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20  E(zEnd);.  }..  
4910: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
4920: 65 78 74 31 36 28 63 6f 6e 74 65 78 74 2c 20 7a  ext16(context, z
4930: 53 74 61 72 74 2c 20 7a 45 6e 64 2d 7a 53 74 61  Start, zEnd-zSta
4940: 72 74 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  rt, SQLITE_TRANS
4950: 49 45 4e 54 29 3b 0a 7d 0a 0a 23 69 66 20 64 65  IENT);.}..#if de
4960: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
4970: 54 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  T)./*.** This ro
4980: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
4990: 66 72 6f 6d 20 74 68 65 20 54 43 4c 20 74 65 73  from the TCL tes
49a0: 74 20 66 75 6e 63 74 69 6f 6e 20 22 74 72 61 6e  t function "tran
49b0: 73 6c 61 74 65 5f 73 65 6c 66 74 65 73 74 22 2e  slate_selftest".
49c0: 0a 2a 2a 20 49 74 20 63 68 65 63 6b 73 20 74 68  .** It checks th
49d0: 61 74 20 74 68 65 20 70 72 69 6d 69 74 69 76 65  at the primitive
49e0: 73 20 66 6f 72 20 73 65 72 69 61 6c 69 7a 69 6e  s for serializin
49f0: 67 20 61 6e 64 20 64 65 73 65 72 69 61 6c 69 7a  g and deserializ
4a00: 69 6e 67 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  ing.** character
4a10: 73 20 69 6e 20 65 61 63 68 20 65 6e 63 6f 64 69  s in each encodi
4a20: 6e 67 20 61 72 65 20 69 6e 76 65 72 73 65 73 20  ng are inverses 
4a30: 6f 66 20 65 61 63 68 20 6f 74 68 65 72 2e 0a 2a  of each other..*
4a40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 75 74  /.void sqlite3ut
4a50: 66 53 65 6c 66 54 65 73 74 28 29 7b 0a 20 20 69  fSelfTest(){.  i
4a60: 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
4a70: 20 63 68 61 72 20 7a 42 75 66 5b 32 30 5d 3b 0a   char zBuf[20];.
4a80: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
4a90: 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  *z;.  int n;.  i
4aa0: 6e 74 20 63 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  nt c;..  for(i=0
4ab0: 3b 20 69 3c 30 78 30 30 31 31 30 30 30 30 3b 20  ; i<0x00110000; 
4ac0: 69 2b 2b 29 7b 0a 20 20 20 20 7a 20 3d 20 7a 42  i++){.    z = zB
4ad0: 75 66 3b 0a 20 20 20 20 57 52 49 54 45 5f 55 54  uf;.    WRITE_UT
4ae0: 46 38 28 7a 2c 20 69 29 3b 0a 20 20 20 20 6e 20  F8(z, i);.    n 
4af0: 3d 20 7a 2d 7a 42 75 66 3b 0a 20 20 20 20 7a 20  = z-zBuf;.    z 
4b00: 3d 20 7a 42 75 66 3b 0a 20 20 20 20 52 45 41 44  = zBuf;.    READ
4b10: 5f 55 54 46 38 28 7a 2c 20 63 29 3b 0a 20 20 20  _UTF8(z, c);.   
4b20: 20 61 73 73 65 72 74 28 20 63 3d 3d 69 20 29 3b   assert( c==i );
4b30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 7a 2d  .    assert( (z-
4b40: 7a 42 75 66 29 3d 3d 6e 20 29 3b 0a 20 20 7d 0a  zBuf)==n );.  }.
4b50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 30 78 30    for(i=0; i<0x0
4b60: 30 31 31 30 30 30 30 3b 20 69 2b 2b 29 7b 0a 20  0110000; i++){. 
4b70: 20 20 20 69 66 28 20 69 3e 3d 30 78 44 38 30 30     if( i>=0xD800
4b80: 20 26 26 20 69 3c 3d 30 78 45 30 30 30 20 29 20   && i<=0xE000 ) 
4b90: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 20  continue;.    z 
4ba0: 3d 20 7a 42 75 66 3b 0a 20 20 20 20 57 52 49 54  = zBuf;.    WRIT
4bb0: 45 5f 55 54 46 31 36 4c 45 28 7a 2c 20 69 29 3b  E_UTF16LE(z, i);
4bc0: 0a 20 20 20 20 6e 20 3d 20 7a 2d 7a 42 75 66 3b  .    n = z-zBuf;
4bd0: 0a 20 20 20 20 7a 20 3d 20 7a 42 75 66 3b 0a 20  .    z = zBuf;. 
4be0: 20 20 20 52 45 41 44 5f 55 54 46 31 36 4c 45 28     READ_UTF16LE(
4bf0: 7a 2c 20 63 29 3b 0a 20 20 20 20 61 73 73 65 72  z, c);.    asser
4c00: 74 28 20 63 3d 3d 69 20 29 3b 0a 20 20 20 20 61  t( c==i );.    a
4c10: 73 73 65 72 74 28 20 28 7a 2d 7a 42 75 66 29 3d  ssert( (z-zBuf)=
4c20: 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  =n );.  }.  for(
4c30: 69 3d 30 3b 20 69 3c 30 78 30 30 31 31 30 30 30  i=0; i<0x0011000
4c40: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  0; i++){.    if(
4c50: 20 69 3e 3d 30 78 44 38 30 30 20 26 26 20 69 3c   i>=0xD800 && i<
4c60: 3d 30 78 45 30 30 30 20 29 20 63 6f 6e 74 69 6e  =0xE000 ) contin
4c70: 75 65 3b 0a 20 20 20 20 7a 20 3d 20 7a 42 75 66  ue;.    z = zBuf
4c80: 3b 0a 20 20 20 20 57 52 49 54 45 5f 55 54 46 31  ;.    WRITE_UTF1
4c90: 36 42 45 28 7a 2c 20 69 29 3b 0a 20 20 20 20 6e  6BE(z, i);.    n
4ca0: 20 3d 20 7a 2d 7a 42 75 66 3b 0a 20 20 20 20 7a   = z-zBuf;.    z
4cb0: 20 3d 20 7a 42 75 66 3b 0a 20 20 20 20 52 45 41   = zBuf;.    REA
4cc0: 44 5f 55 54 46 31 36 42 45 28 7a 2c 20 63 29 3b  D_UTF16BE(z, c);
4cd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d  .    assert( c==
4ce0: 69 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  i );.    assert(
4cf0: 20 28 7a 2d 7a 42 75 66 29 3d 3d 6e 20 29 3b 0a   (z-zBuf)==n );.
4d00: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
4d10: 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 23  SQLITE_TEST */.#
4d20: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
4d30: 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a        OMIT_UTF16 */.