/ Hex Artifact Content
Login

Artifact 441c5918ee3777cd8e9611cbb810312ed314737d:


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 39 20 32 30  : utf.c,v 1.9 20
01f0: 30 34 2f 30 35 2f 32 33 20 31 33 3a 33 30 3a 35  04/05/23 13:30:5
0200: 38 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45 78  8 danielk1977 Ex
0210: 70 20 24 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73 20  p $.**.** Notes 
0220: 6f 6e 20 55 54 46 2d 38 3a 0a 2a 2a 0a 2a 2a 20  on UTF-8:.**.** 
0230: 20 20 42 79 74 65 2d 30 20 20 20 20 42 79 74 65    Byte-0    Byte
0240: 2d 31 20 20 20 20 42 79 74 65 2d 32 20 20 20 20  -1    Byte-2    
0250: 42 79 74 65 2d 33 20 20 20 20 56 61 6c 75 65 0a  Byte-3    Value.
0260: 2a 2a 20 20 30 78 78 78 78 78 78 78 20 20 20 20  **  0xxxxxxx    
0270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0280: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 30 30               000
0290: 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 30  00000 00000000 0
02a0: 78 78 78 78 78 78 78 0a 2a 2a 20 20 31 31 30 79  xxxxxxx.**  110y
02b0: 79 79 79 79 20 20 31 30 78 78 78 78 78 78 20 20  yyyy  10xxxxxx  
02c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02d0: 20 20 20 20 20 30 30 30 30 30 30 30 30 20 30 30       00000000 00
02e0: 30 30 30 79 79 79 20 79 79 78 78 78 78 78 78 0a  000yyy yyxxxxxx.
02f0: 2a 2a 20 20 31 31 31 30 7a 7a 7a 7a 20 20 31 30  **  1110zzzz  10
0300: 79 79 79 79 79 79 20 20 31 30 78 78 78 78 78 78  yyyyyy  10xxxxxx
0310: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 30 30               000
0320: 30 30 30 30 30 20 7a 7a 7a 7a 79 79 79 79 20 79  00000 zzzzyyyy y
0330: 79 78 78 78 78 78 78 0a 2a 2a 20 20 31 31 31 31  yxxxxxx.**  1111
0340: 30 75 75 75 20 20 31 30 75 75 7a 7a 7a 7a 20 20  0uuu  10uuzzzz  
0350: 31 30 79 79 79 79 79 79 20 20 31 30 78 78 78 78  10yyyyyy  10xxxx
0360: 78 78 20 20 20 30 30 30 75 75 75 75 75 20 7a 7a  xx   000uuuuu zz
0370: 7a 7a 79 79 79 79 20 79 79 78 78 78 78 78 78 0a  zzyyyy yyxxxxxx.
0380: 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73 20 6f  **.**.** Notes o
0390: 6e 20 55 54 46 2d 31 36 3a 20 20 28 77 69 74 68  n UTF-16:  (with
03a0: 20 77 77 77 77 2b 31 3d 3d 75 75 75 75 75 29 0a   wwww+1==uuuuu).
03b0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 57 6f 72 64 2d  **.**      Word-
03c0: 30 20 20 20 20 20 20 20 20 20 20 20 20 57 6f 72  0            Wor
03d0: 64 2d 31 20 20 20 20 20 20 20 20 20 20 20 20 20  d-1             
03e0: 56 61 6c 75 65 0a 2a 2a 20 20 31 31 30 31 31 30  Value.**  110110
03f0: 77 77 77 77 78 78 78 78 78 78 20 31 31 30 31 31  wwwwxxxxxx 11011
0400: 31 79 79 79 79 79 79 79 79 79 79 20 20 20 20 20  1yyyyyyyyyy     
0410: 20 20 20 30 30 30 75 75 75 75 75 20 78 78 78 78     000uuuuu xxxx
0420: 78 78 79 79 20 79 79 79 79 79 79 79 79 0a 2a 2a  xxyy yyyyyyyy.**
0430: 20 20 78 78 78 78 78 78 78 78 79 79 79 79 79 79    xxxxxxxxyyyyyy
0440: 79 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  yy              
0450: 20 20 20 20 20 20 20 20 20 20 20 30 30 30 30 30             00000
0460: 30 30 30 20 78 78 78 78 78 78 78 78 20 79 79 79  000 xxxxxxxx yyy
0470: 79 79 79 79 79 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 42  yyyyy.**.**.** B
0480: 4f 4d 20 6f 72 20 42 79 74 65 20 4f 72 64 65 72  OM or Byte Order
0490: 20 4d 61 72 6b 3a 0a 2a 2a 20 20 20 20 20 30 78   Mark:.**     0x
04a0: 66 66 20 30 78 66 65 20 20 20 6c 69 74 74 6c 65  ff 0xfe   little
04b0: 2d 65 6e 64 69 61 6e 20 75 74 66 2d 31 36 20 66  -endian utf-16 f
04c0: 6f 6c 6c 6f 77 73 0a 2a 2a 20 20 20 20 20 30 78  ollows.**     0x
04d0: 66 65 20 30 78 66 66 20 20 20 62 69 67 2d 65 6e  fe 0xff   big-en
04e0: 64 69 61 6e 20 75 74 66 2d 31 36 20 66 6f 6c 6c  dian utf-16 foll
04f0: 6f 77 73 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 61 6e  ows.**.**.** Han
0500: 64 6c 69 6e 67 20 6f 66 20 6d 61 6c 66 6f 72 6d  dling of malform
0510: 65 64 20 73 74 72 69 6e 67 73 3a 0a 2a 2a 0a 2a  ed strings:.**.*
0520: 2a 20 53 51 4c 69 74 65 20 61 63 63 65 70 74 73  * SQLite accepts
0530: 20 61 6e 64 20 70 72 6f 63 65 73 73 65 73 20 6d   and processes m
0540: 61 6c 66 6f 72 6d 65 64 20 73 74 72 69 6e 67 73  alformed strings
0550: 20 77 69 74 68 6f 75 74 20 61 6e 20 65 72 72 6f   without an erro
0560: 72 20 77 68 65 72 65 76 65 72 0a 2a 2a 20 70 6f  r wherever.** po
0570: 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 20  ssible. However 
0580: 74 68 69 73 20 69 73 20 6e 6f 74 20 70 6f 73 73  this is not poss
0590: 69 62 6c 65 20 77 68 65 6e 20 63 6f 6e 76 65 72  ible when conver
05a0: 74 69 6e 67 20 62 65 74 77 65 65 6e 20 55 54 46  ting between UTF
05b0: 2d 38 20 61 6e 64 0a 2a 2a 20 55 54 46 2d 31 36  -8 and.** UTF-16
05c0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6e  ..**.** When con
05d0: 76 65 72 74 69 6e 67 20 6d 61 6c 66 6f 72 6d 65  verting malforme
05e0: 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67 73 20  d UTF-8 strings 
05f0: 74 6f 20 55 54 46 2d 31 36 2c 20 6f 6e 65 20 69  to UTF-16, one i
0600: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 0a 2a  nstance of the.*
0610: 2a 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 63 68  * replacement ch
0620: 61 72 61 63 74 65 72 20 55 2b 46 46 46 44 20 66  aracter U+FFFD f
0630: 6f 72 20 65 61 63 68 20 62 79 74 65 20 74 68 61  or each byte tha
0640: 74 20 63 61 6e 6e 6f 74 20 62 65 20 69 6e 74 65  t cannot be inte
0650: 72 70 65 74 65 64 20 61 73 0a 2a 2a 20 70 61 72  rpeted as.** par
0660: 74 20 6f 66 20 61 20 76 61 6c 69 64 20 75 6e 69  t of a valid uni
0670: 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 2e 0a  code character..
0680: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6e 76 65  **.** When conve
0690: 72 74 69 6e 67 20 6d 61 6c 66 6f 72 6d 65 64 20  rting malformed 
06a0: 55 54 46 2d 31 36 20 73 74 72 69 6e 67 73 20 74  UTF-16 strings t
06b0: 6f 20 55 54 46 2d 38 2c 20 6f 6e 65 20 69 6e 73  o UTF-8, one ins
06c0: 74 61 6e 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  tance of the.** 
06d0: 72 65 70 6c 61 63 65 6d 65 6e 74 20 63 68 61 72  replacement char
06e0: 61 63 74 65 72 20 55 2b 46 46 46 44 20 66 6f 72  acter U+FFFD for
06f0: 20 65 61 63 68 20 70 61 69 72 20 6f 66 20 62 79   each pair of by
0700: 74 65 73 20 74 68 61 74 20 63 61 6e 6e 6f 74 20  tes that cannot 
0710: 62 65 0a 2a 2a 20 69 6e 74 65 72 70 65 74 65 64  be.** interpeted
0720: 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 76 61   as part of a va
0730: 6c 69 64 20 75 6e 69 63 6f 64 65 20 63 68 61 72  lid unicode char
0740: 61 63 74 65 72 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  acter..*/.#inclu
0750: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69  de <assert.h>.#i
0760: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0770: 74 2e 68 22 0a 0a 74 79 70 65 64 65 66 20 73 74  t.h"..typedef st
0780: 72 75 63 74 20 55 74 66 53 74 72 69 6e 67 20 55  ruct UtfString U
0790: 74 66 53 74 72 69 6e 67 3b 0a 73 74 72 75 63 74  tfString;.struct
07a0: 20 55 74 66 53 74 72 69 6e 67 20 7b 0a 20 20 75   UtfString {.  u
07b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5a  nsigned char *pZ
07c0: 3b 20 20 20 20 2f 2a 20 52 61 77 20 73 74 72 69  ;    /* Raw stri
07d0: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ng data */.  int
07e0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
07f0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
0800: 6c 65 6e 67 74 68 20 6f 66 20 70 5a 20 69 6e 20  length of pZ in 
0810: 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63  bytes */.  int c
0820: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0830: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 5a   /* Number of pZ
0840: 20 62 79 74 65 73 20 61 6c 72 65 61 64 79 20 72   bytes already r
0850: 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 2a  ead or written *
0860: 2f 0a 7d 3b 0a 0a 2f 2a 20 54 4f 44 4f 3a 20 49  /.};../* TODO: I
0870: 6d 70 6c 65 6d 65 6e 74 20 74 68 69 73 20 6d 61  mplement this ma
0880: 63 72 6f 20 69 6e 20 6f 73 2e 68 2e 20 49 74 20  cro in os.h. It 
0890: 73 68 6f 75 6c 64 20 62 65 20 31 20 6f 6e 20 62  should be 1 on b
08a0: 69 67 2d 65 6e 64 69 61 6e 0a 2a 2a 20 6d 61 63  ig-endian.** mac
08b0: 68 69 6e 65 73 2c 20 61 6e 64 20 30 20 6f 6e 20  hines, and 0 on 
08c0: 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2e 0a 2a  little-endian..*
08d0: 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  /.#define SQLITE
08e0: 33 5f 4e 41 54 49 56 45 5f 42 49 47 45 4e 44 49  3_NATIVE_BIGENDI
08f0: 41 4e 20 30 0a 0a 23 69 66 20 53 51 4c 49 54 45  AN 0..#if SQLITE
0900: 33 5f 4e 41 54 49 56 45 5f 42 49 47 45 4e 44 49  3_NATIVE_BIGENDI
0910: 41 4e 20 3d 3d 20 31 0a 23 64 65 66 69 6e 65 20  AN == 1.#define 
0920: 42 4f 4d 5f 42 49 47 45 4e 44 49 41 4e 20 30 78  BOM_BIGENDIAN 0x
0930: 30 30 30 30 46 46 46 45 0a 23 64 65 66 69 6e 65  0000FFFE.#define
0940: 20 42 4f 4d 5f 4c 49 54 54 4c 45 45 4e 44 49 41   BOM_LITTLEENDIA
0950: 4e 20 30 78 30 30 30 30 46 45 46 46 0a 23 65 6c  N 0x0000FEFF.#el
0960: 73 65 0a 23 64 65 66 69 6e 65 20 42 4f 4d 5f 42  se.#define BOM_B
0970: 49 47 45 4e 44 49 41 4e 20 30 78 30 30 30 30 46  IGENDIAN 0x0000F
0980: 45 46 46 0a 23 64 65 66 69 6e 65 20 42 4f 4d 5f  EFF.#define BOM_
0990: 4c 49 54 54 4c 45 45 4e 44 49 41 4e 20 30 78 30  LITTLEENDIAN 0x0
09a0: 30 30 30 46 46 46 45 0a 23 65 6e 64 69 66 0a 0a  000FFFE.#endif..
09b0: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 74 77 6f 20  /*.** These two 
09c0: 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65 64 20  macros are used 
09d0: 74 6f 20 69 6e 74 65 72 70 72 65 74 20 74 68 65  to interpret the
09e0: 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73   first two bytes
09f0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 75 6e 73 69   of the .** unsi
0a00: 67 6e 65 64 20 63 68 61 72 20 61 72 72 61 79 20  gned char array 
0a10: 70 5a 20 61 73 20 61 20 31 36 2d 62 69 74 20 75  pZ as a 16-bit u
0a20: 6e 73 69 67 6e 65 64 20 69 6e 74 2e 20 42 45 31  nsigned int. BE1
0a30: 36 28 29 20 66 6f 72 20 61 20 62 69 67 2d 65 6e  6() for a big-en
0a40: 64 69 61 6e 0a 2a 2a 20 69 6e 74 65 72 70 72 65  dian.** interpre
0a50: 74 61 74 69 6f 6e 2c 20 4c 45 31 36 28 29 20 66  tation, LE16() f
0a60: 6f 72 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e  or little-endian
0a70: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 42 45 31  ..*/.#define BE1
0a80: 36 28 70 5a 29 20 28 28 28 75 31 36 29 28 28 70  6(pZ) (((u16)((p
0a90: 5a 29 5b 30 5d 29 3c 3c 38 29 20 2b 20 28 75 31  Z)[0])<<8) + (u1
0aa0: 36 29 28 28 70 5a 29 5b 31 5d 29 29 0a 23 64 65  6)((pZ)[1])).#de
0ab0: 66 69 6e 65 20 4c 45 31 36 28 70 5a 29 20 28 28  fine LE16(pZ) ((
0ac0: 28 75 31 36 29 28 28 70 5a 29 5b 31 5d 29 3c 3c  (u16)((pZ)[1])<<
0ad0: 38 29 20 2b 20 28 75 31 36 29 28 28 70 5a 29 5b  8) + (u16)((pZ)[
0ae0: 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 45 41 44  0]))../*.** READ
0af0: 5f 31 36 20 69 6e 74 65 72 70 72 65 74 73 20 74  _16 interprets t
0b00: 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79 74  he first two byt
0b10: 65 73 20 6f 66 20 74 68 65 20 75 6e 73 69 67 6e  es of the unsign
0b20: 65 64 20 63 68 61 72 20 61 72 72 61 79 20 70 5a  ed char array pZ
0b30: 20 0a 2a 2a 20 61 73 20 61 20 31 36 2d 62 69 74   .** as a 16-bit
0b40: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 2e 20 49   unsigned int. I
0b50: 66 20 62 69 67 5f 65 6e 64 69 61 6e 20 69 73 20  f big_endian is 
0b60: 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 20 69 6e 74  non-zero the int
0b70: 65 70 72 65 74 61 74 69 6f 6e 0a 2a 2a 20 69 73  epretation.** is
0b80: 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 6f 74 68   big-endian, oth
0b90: 65 72 77 69 73 65 20 6c 69 74 74 6c 65 2d 65 6e  erwise little-en
0ba0: 64 69 61 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  dian..*/.#define
0bb0: 20 52 45 41 44 5f 31 36 28 70 5a 2c 62 69 67 5f   READ_16(pZ,big_
0bc0: 65 6e 64 69 61 6e 29 20 28 62 69 67 5f 65 6e 64  endian) (big_end
0bd0: 69 61 6e 3f 42 45 31 36 28 70 5a 29 3a 4c 45 31  ian?BE16(pZ):LE1
0be0: 36 28 70 5a 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65  6(pZ))../*.** Re
0bf0: 61 64 20 74 68 65 20 42 4f 4d 20 66 72 6f 6d 20  ad the BOM from 
0c00: 74 68 65 20 73 74 61 72 74 20 6f 66 20 2a 70 53  the start of *pS
0c10: 74 72 2c 20 69 66 20 6f 6e 65 20 69 73 20 70 72  tr, if one is pr
0c20: 65 73 65 6e 74 2e 20 52 65 74 75 72 6e 20 7a 65  esent. Return ze
0c30: 72 6f 0a 2a 2a 20 66 6f 72 20 6c 69 74 74 6c 65  ro.** for little
0c40: 2d 65 6e 64 69 61 6e 2c 20 6e 6f 6e 2d 7a 65 72  -endian, non-zer
0c50: 6f 20 66 6f 72 20 62 69 67 2d 65 6e 64 69 61 6e  o for big-endian
0c60: 2e 20 49 66 20 6e 6f 20 42 4f 4d 20 69 73 20 70  . If no BOM is p
0c70: 72 65 73 65 6e 74 2c 20 72 65 74 75 72 6e 0a 2a  resent, return.*
0c80: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
0c90: 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 62 69  he parameter "bi
0ca0: 67 5f 65 6e 64 69 61 6e 22 2e 0a 2a 2a 0a 2a 2a  g_endian"..**.**
0cb0: 20 52 65 74 75 72 6e 20 76 61 6c 75 65 73 3a 0a   Return values:.
0cc0: 2a 2a 20 20 20 20 20 31 20 2d 3e 20 62 69 67 2d  **     1 -> big-
0cd0: 65 6e 64 69 61 6e 20 73 74 72 69 6e 67 0a 2a 2a  endian string.**
0ce0: 20 20 20 20 20 30 20 2d 3e 20 6c 69 74 74 6c 65       0 -> little
0cf0: 2d 65 6e 64 69 61 6e 20 73 74 72 69 6e 67 0a 2a  -endian string.*
0d00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
0d10: 64 55 74 66 31 36 42 6f 6d 28 55 74 66 53 74 72  dUtf16Bom(UtfStr
0d20: 69 6e 67 20 2a 70 53 74 72 2c 20 69 6e 74 20 62  ing *pStr, int b
0d30: 69 67 5f 65 6e 64 69 61 6e 29 7b 0a 20 20 2f 2a  ig_endian){.  /*
0d40: 20 54 68 65 20 42 4f 4d 20 6d 75 73 74 20 62 65   The BOM must be
0d50: 20 74 68 65 20 66 69 72 73 74 20 74 68 69 6e 67   the first thing
0d60: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
0d70: 74 72 69 6e 67 20 2a 2f 0a 20 20 61 73 73 65 72  tring */.  asser
0d80: 74 28 20 70 53 74 72 2d 3e 63 3d 3d 30 20 29 3b  t( pStr->c==0 );
0d90: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74  ..  /* If the st
0da0: 72 69 6e 67 20 64 61 74 61 20 63 6f 6e 73 69 73  ring data consis
0db0: 74 73 20 6f 66 20 31 20 62 79 74 65 20 6f 72 20  ts of 1 byte or 
0dc0: 6c 65 73 73 2c 20 74 68 65 20 42 4f 4d 20 77 69  less, the BOM wi
0dd0: 6c 6c 20 6d 61 6b 65 20 6e 6f 0a 20 20 2a 2a 20  ll make no.  ** 
0de0: 64 69 66 66 65 72 65 6e 63 65 20 61 6e 79 77 61  difference anywa
0df0: 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  y. In this case 
0e00: 6a 75 73 74 20 66 61 6c 6c 20 74 68 72 6f 75 67  just fall throug
0e10: 68 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74  h to the default
0e20: 20 63 61 73 65 0a 20 20 2a 2a 20 61 6e 64 20 72   case.  ** and r
0e30: 65 74 75 72 6e 20 74 68 65 20 6e 61 74 69 76 65  eturn the native
0e40: 20 62 79 74 65 2d 6f 72 64 65 72 20 66 6f 72 20   byte-order for 
0e50: 74 68 69 73 20 6d 61 63 68 69 6e 65 2e 0a 20 20  this machine..  
0e60: 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  **.  ** Otherwis
0e70: 65 2c 20 63 68 65 63 6b 20 74 68 65 20 66 69 72  e, check the fir
0e80: 73 74 20 32 20 62 79 74 65 73 20 6f 66 20 74 68  st 2 bytes of th
0e90: 65 20 73 74 72 69 6e 67 20 74 6f 20 73 65 65 20  e string to see 
0ea0: 69 66 20 61 20 42 4f 4d 20 69 73 0a 20 20 2a 2a  if a BOM is.  **
0eb0: 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2f 0a 20   present..  */. 
0ec0: 20 69 66 28 20 70 53 74 72 2d 3e 6e 3e 31 20 29   if( pStr->n>1 )
0ed0: 7b 0a 20 20 20 20 75 33 32 20 62 6f 6d 20 3d 20  {.    u32 bom = 
0ee0: 42 45 31 36 28 70 53 74 72 2d 3e 70 5a 29 3b 0a  BE16(pStr->pZ);.
0ef0: 20 20 20 20 69 66 28 20 62 6f 6d 3d 3d 42 4f 4d      if( bom==BOM
0f00: 5f 42 49 47 45 4e 44 49 41 4e 20 29 7b 0a 20 20  _BIGENDIAN ){.  
0f10: 20 20 20 20 70 53 74 72 2d 3e 63 20 3d 20 32 3b      pStr->c = 2;
0f20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
0f30: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
0f40: 6f 6d 3d 3d 42 4f 4d 5f 4c 49 54 54 4c 45 45 4e  om==BOM_LITTLEEN
0f50: 44 49 41 4e 20 29 7b 0a 20 20 20 20 20 20 70 53  DIAN ){.      pS
0f60: 74 72 2d 3e 63 20 3d 20 32 3b 0a 20 20 20 20 20  tr->c = 2;.     
0f70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
0f80: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 62  .  }..  return b
0f90: 69 67 5f 65 6e 64 69 61 6e 3b 0a 7d 0a 0a 2f 2a  ig_endian;.}../*
0fa0: 0a 2a 2a 20 7a 44 61 74 61 20 69 73 20 61 20 55  .** zData is a U
0fb0: 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 73 74  TF-16 encoded st
0fc0: 72 69 6e 67 2c 20 6e 44 61 74 61 20 62 79 74 65  ring, nData byte
0fd0: 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69  s in length. Thi
0fe0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 68 65  s routine.** che
0ff0: 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
1000: 61 20 62 79 74 65 2d 6f 72 64 65 72 20 6d 61 72  a byte-order mar
1010: 6b 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  k at the start o
1020: 66 20 7a 44 61 74 61 2e 20 49 66 20 6e 6f 0a 2a  f zData. If no.*
1030: 2a 20 62 79 74 65 20 6f 72 64 65 72 20 6d 61 72  * byte order mar
1040: 6b 20 69 73 20 66 6f 75 6e 64 20 30 20 69 73 20  k is found 0 is 
1050: 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
1060: 69 73 65 20 54 45 58 54 5f 55 74 66 31 36 62 65  ise TEXT_Utf16be
1070: 20 6f 72 0a 2a 2a 20 54 45 58 54 5f 55 74 66 31   or.** TEXT_Utf1
1080: 36 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c  6le is returned,
1090: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
10a0: 65 74 68 65 72 20 54 68 65 20 42 4f 4d 20 69 6e  ether The BOM in
10b0: 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20  dicates that.** 
10c0: 74 68 65 20 74 65 78 74 20 69 73 20 62 69 67 2d  the text is big-
10d0: 65 6e 64 69 61 6e 20 6f 72 20 6c 69 74 74 6c 65  endian or little
10e0: 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 75 38 20 73  -endian..*/.u8 s
10f0: 71 6c 69 74 65 33 55 74 66 52 65 61 64 42 6f 6d  qlite3UtfReadBom
1100: 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 44 61  (const void *zDa
1110: 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a  ta, int nData){.
1120: 20 20 69 66 28 20 6e 44 61 74 61 3c 30 20 7c 7c    if( nData<0 ||
1130: 20 6e 44 61 74 61 3e 31 20 29 7b 0a 20 20 20 20   nData>1 ){.    
1140: 75 38 20 62 31 20 3d 20 2a 28 75 38 20 2a 29 7a  u8 b1 = *(u8 *)z
1150: 44 61 74 61 3b 0a 20 20 20 20 75 38 20 62 32 20  Data;.    u8 b2 
1160: 3d 20 2a 28 28 28 75 38 20 2a 29 7a 44 61 74 61  = *(((u8 *)zData
1170: 29 20 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20  ) + 1);.    if( 
1180: 62 31 3d 3d 30 78 46 45 20 26 26 20 62 32 3d 3d  b1==0xFE && b2==
1190: 30 78 46 46 20 29 7b 0a 20 20 20 20 20 20 72 65  0xFF ){.      re
11a0: 74 75 72 6e 20 54 45 58 54 5f 55 74 66 31 36 62  turn TEXT_Utf16b
11b0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
11c0: 20 62 31 3d 3d 30 78 46 46 20 26 26 20 62 32 3d   b1==0xFF && b2=
11d0: 3d 30 78 46 45 20 29 7b 0a 20 20 20 20 20 20 72  =0xFE ){.      r
11e0: 65 74 75 72 6e 20 54 45 58 54 5f 55 74 66 31 36  eturn TEXT_Utf16
11f0: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  le;.    }.  }.  
1200: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
1210: 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
1220: 65 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63  e unicode charac
1230: 74 65 72 20 66 72 6f 6d 20 74 68 65 20 55 54 46  ter from the UTF
1240: 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e  -8 encoded strin
1250: 67 20 2a 70 53 74 72 2e 20 54 68 65 0a 2a 2a 20  g *pStr. The.** 
1260: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
1270: 73 20 61 20 75 6e 69 63 6f 64 65 20 73 63 61 6c  s a unicode scal
1280: 61 72 20 76 61 6c 75 65 2e 20 49 6e 20 74 68 65  ar value. In the
1290: 20 63 61 73 65 20 6f 66 20 6d 61 6c 66 6f 72 6d   case of malform
12a0: 65 64 0a 2a 2a 20 73 74 72 69 6e 67 73 2c 20 74  ed.** strings, t
12b0: 68 65 20 75 6e 69 63 6f 64 65 20 72 65 70 6c 61  he unicode repla
12c0: 63 65 6d 65 6e 74 20 63 68 61 72 61 63 74 65 72  cement character
12d0: 20 55 2b 46 46 46 44 20 6d 61 79 20 62 65 20 72   U+FFFD may be r
12e0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
12f0: 69 63 20 75 33 32 20 72 65 61 64 55 74 66 38 28  ic u32 readUtf8(
1300: 55 74 66 53 74 72 69 6e 67 20 2a 70 53 74 72 29  UtfString *pStr)
1310: 7b 0a 20 20 73 74 72 75 63 74 20 55 74 66 38 54  {.  struct Utf8T
1320: 62 6c 52 6f 77 20 7b 0a 20 20 20 20 75 38 20 62  blRow {.    u8 b
1330: 31 5f 6d 61 73 6b 3b 0a 20 20 20 20 75 38 20 62  1_mask;.    u8 b
1340: 31 5f 6d 61 73 6b 65 64 5f 76 61 6c 3b 0a 20 20  1_masked_val;.  
1350: 20 20 75 38 20 62 31 5f 76 61 6c 75 65 5f 6d 61    u8 b1_value_ma
1360: 73 6b 3b 0a 20 20 20 20 69 6e 74 20 74 72 61 69  sk;.    int trai
1370: 6c 69 6e 67 5f 62 79 74 65 73 3b 0a 20 20 7d 3b  ling_bytes;.  };
1380: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1390: 73 74 72 75 63 74 20 55 74 66 38 54 62 6c 52 6f  struct Utf8TblRo
13a0: 77 20 75 74 66 38 74 62 6c 5b 5d 20 3d 20 7b 0a  w utf8tbl[] = {.
13b0: 20 20 20 20 7b 20 30 78 38 30 2c 20 30 78 30 30      { 0x80, 0x00
13c0: 2c 20 30 78 37 46 2c 20 30 20 7d 2c 0a 20 20 20  , 0x7F, 0 },.   
13d0: 20 7b 20 30 78 45 30 2c 20 30 78 43 30 2c 20 30   { 0xE0, 0xC0, 0
13e0: 78 31 46 2c 20 31 20 7d 2c 0a 20 20 20 20 7b 20  x1F, 1 },.    { 
13f0: 30 78 46 30 2c 20 30 78 45 30 2c 20 30 78 30 46  0xF0, 0xE0, 0x0F
1400: 2c 20 32 20 7d 2c 0a 20 20 20 20 7b 20 30 78 46  , 2 },.    { 0xF
1410: 38 2c 20 30 78 46 30 2c 20 30 78 30 45 2c 20 33  8, 0xF0, 0x0E, 3
1420: 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 2c 20   },.    { 0, 0, 
1430: 30 2c 20 30 7d 0a 20 20 7d 3b 0a 0a 20 20 75 38  0, 0}.  };..  u8
1440: 20 62 31 3b 20 20 20 20 20 20 20 2f 2a 20 46 69   b1;       /* Fi
1450: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
1460: 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6d 75 6c 74  potentially mult
1470: 69 2d 62 79 74 65 20 75 74 66 2d 38 20 63 68 61  i-byte utf-8 cha
1480: 72 61 63 74 65 72 20 2a 2f 0a 20 20 75 33 32 20  racter */.  u32 
1490: 72 65 74 20 3d 20 30 3b 20 2f 2a 20 52 65 74 75  ret = 0; /* Retu
14a0: 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  rn value */.  in
14b0: 74 20 69 69 3b 0a 20 20 73 74 72 75 63 74 20 55  t ii;.  struct U
14c0: 74 66 38 54 62 6c 52 6f 77 20 63 6f 6e 73 74 20  tf8TblRow const 
14d0: 2a 70 52 6f 77 3b 0a 0a 20 20 70 52 6f 77 20 3d  *pRow;..  pRow =
14e0: 20 26 28 75 74 66 38 74 62 6c 5b 30 5d 29 3b 0a   &(utf8tbl[0]);.
14f0: 0a 20 20 62 31 20 3d 20 70 53 74 72 2d 3e 70 5a  .  b1 = pStr->pZ
1500: 5b 70 53 74 72 2d 3e 63 5d 3b 0a 20 20 70 53 74  [pStr->c];.  pSt
1510: 72 2d 3e 63 2b 2b 3b 0a 20 20 77 68 69 6c 65 28  r->c++;.  while(
1520: 20 70 52 6f 77 2d 3e 62 31 5f 6d 61 73 6b 20 26   pRow->b1_mask &
1530: 26 20 28 62 31 26 70 52 6f 77 2d 3e 62 31 5f 6d  & (b1&pRow->b1_m
1540: 61 73 6b 29 21 3d 70 52 6f 77 2d 3e 62 31 5f 6d  ask)!=pRow->b1_m
1550: 61 73 6b 65 64 5f 76 61 6c 20 29 7b 0a 20 20 20  asked_val ){.   
1560: 20 70 52 6f 77 2b 2b 3b 0a 20 20 7d 0a 20 20 69   pRow++;.  }.  i
1570: 66 28 20 21 70 52 6f 77 2d 3e 62 31 5f 6d 61 73  f( !pRow->b1_mas
1580: 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
1590: 30 78 46 46 46 44 3b 0a 20 20 7d 0a 20 20 0a 20  0xFFFD;.  }.  . 
15a0: 20 72 65 74 20 3d 20 28 75 33 32 29 28 62 31 26   ret = (u32)(b1&
15b0: 70 52 6f 77 2d 3e 62 31 5f 76 61 6c 75 65 5f 6d  pRow->b1_value_m
15c0: 61 73 6b 29 3b 0a 20 20 66 6f 72 28 20 69 69 3d  ask);.  for( ii=
15d0: 30 3b 20 69 69 3c 70 52 6f 77 2d 3e 74 72 61 69  0; ii<pRow->trai
15e0: 6c 69 6e 67 5f 62 79 74 65 73 3b 20 69 69 2b 2b  ling_bytes; ii++
15f0: 20 29 7b 0a 20 20 20 20 75 38 20 62 20 3d 20 70   ){.    u8 b = p
1600: 53 74 72 2d 3e 70 5a 5b 70 53 74 72 2d 3e 63 2b  Str->pZ[pStr->c+
1610: 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 62 26  ii];.    if( (b&
1620: 30 78 43 30 29 21 3d 30 78 38 30 20 29 7b 0a 20  0xC0)!=0x80 ){. 
1630: 20 20 20 20 20 72 65 74 75 72 6e 20 30 78 46 46       return 0xFF
1640: 46 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  FD;.    }.    re
1650: 74 20 3d 20 28 72 65 74 3c 3c 36 29 20 2b 20 28  t = (ret<<6) + (
1660: 75 33 32 29 28 62 26 30 78 33 46 29 3b 0a 20 20  u32)(b&0x3F);.  
1670: 7d 0a 20 20 0a 20 20 70 53 74 72 2d 3e 63 20 2b  }.  .  pStr->c +
1680: 3d 20 70 52 6f 77 2d 3e 74 72 61 69 6c 69 6e 67  = pRow->trailing
1690: 5f 62 79 74 65 73 3b 0a 20 20 72 65 74 75 72 6e  _bytes;.  return
16a0: 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   ret;.}../*.** W
16b0: 72 69 74 65 20 74 68 65 20 75 6e 69 63 6f 64 65  rite the unicode
16c0: 20 63 68 61 72 61 63 74 65 72 20 27 63 6f 64 65   character 'code
16d0: 27 20 74 6f 20 74 68 65 20 73 74 72 69 6e 67 20  ' to the string 
16e0: 70 53 74 72 20 75 73 69 6e 67 20 55 54 46 2d 38  pStr using UTF-8
16f0: 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 2e 20 53 51  .** encoding. SQ
1700: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61 79 20 62  LITE_NOMEM may b
1710: 65 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 71  e returned if sq
1720: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 66 61  lite3Malloc() fa
1730: 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
1740: 6e 74 20 77 72 69 74 65 55 74 66 38 28 55 74 66  nt writeUtf8(Utf
1750: 53 74 72 69 6e 67 20 2a 70 53 74 72 2c 20 75 33  String *pStr, u3
1760: 32 20 63 6f 64 65 29 7b 0a 20 20 73 74 72 75 63  2 code){.  struc
1770: 74 20 55 74 66 38 57 72 69 74 65 54 62 6c 52 6f  t Utf8WriteTblRo
1780: 77 20 7b 0a 20 20 20 20 75 33 32 20 6d 61 78 5f  w {.    u32 max_
1790: 63 6f 64 65 3b 0a 20 20 20 20 69 6e 74 20 74 72  code;.    int tr
17a0: 61 69 6c 69 6e 67 5f 62 79 74 65 73 3b 0a 20 20  ailing_bytes;.  
17b0: 20 20 75 38 20 62 31 5f 61 6e 64 5f 6d 61 73 6b    u8 b1_and_mask
17c0: 3b 0a 20 20 20 20 75 38 20 62 31 5f 6f 72 5f 6d  ;.    u8 b1_or_m
17d0: 61 73 6b 3b 0a 20 20 7d 3b 0a 20 20 73 74 61 74  ask;.  };.  stat
17e0: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
17f0: 55 74 66 38 57 72 69 74 65 54 62 6c 52 6f 77 20  Utf8WriteTblRow 
1800: 75 74 66 38 74 62 6c 5b 5d 20 3d 20 7b 0a 20 20  utf8tbl[] = {.  
1810: 20 20 7b 30 78 30 30 30 30 30 30 37 46 2c 20 30    {0x0000007F, 0
1820: 2c 20 30 78 37 46 2c 20 30 78 30 30 7d 2c 0a 20  , 0x7F, 0x00},. 
1830: 20 20 20 7b 30 78 30 30 30 30 30 37 46 46 2c 20     {0x000007FF, 
1840: 31 2c 20 30 78 44 46 2c 20 30 78 43 30 7d 2c 0a  1, 0xDF, 0xC0},.
1850: 20 20 20 20 7b 30 78 30 30 30 30 46 46 46 46 2c      {0x0000FFFF,
1860: 20 32 2c 20 30 78 45 46 2c 20 30 78 45 30 7d 2c   2, 0xEF, 0xE0},
1870: 0a 20 20 20 20 7b 30 78 30 30 31 30 46 46 46 46  .    {0x0010FFFF
1880: 2c 20 33 2c 20 30 78 46 37 2c 20 30 78 46 30 7d  , 3, 0xF7, 0xF0}
1890: 2c 0a 20 20 20 20 7b 30 78 30 30 30 30 30 30 30  ,.    {0x0000000
18a0: 30 2c 20 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0, 0, 0x00, 0x00
18b0: 7d 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 73  }.  };.  const s
18c0: 74 72 75 63 74 20 55 74 66 38 57 72 69 74 65 54  truct Utf8WriteT
18d0: 62 6c 52 6f 77 20 2a 70 52 6f 77 20 3d 20 26 75  blRow *pRow = &u
18e0: 74 66 38 74 62 6c 5b 30 5d 3b 0a 0a 20 20 77 68  tf8tbl[0];..  wh
18f0: 69 6c 65 28 20 63 6f 64 65 3e 70 52 6f 77 2d 3e  ile( code>pRow->
1900: 6d 61 78 5f 63 6f 64 65 20 29 7b 0a 20 20 20 20  max_code ){.    
1910: 61 73 73 65 72 74 28 20 70 52 6f 77 2d 3e 6d 61  assert( pRow->ma
1920: 78 5f 63 6f 64 65 20 29 3b 0a 20 20 20 20 70 52  x_code );.    pR
1930: 6f 77 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ow++;.  }..  /* 
1940: 45 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 20  Ensure there is 
1950: 65 6e 6f 75 67 68 20 72 6f 6f 6d 20 6c 65 66 74  enough room left
1960: 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62   in the output b
1970: 75 66 66 65 72 20 74 6f 20 77 72 69 74 65 0a 20  uffer to write. 
1980: 20 2a 2a 20 74 68 69 73 20 55 54 46 2d 38 20 63   ** this UTF-8 c
1990: 68 61 72 61 63 74 65 72 2e 20 0a 20 20 2a 2f 0a  haracter. .  */.
19a0: 20 20 61 73 73 65 72 74 28 20 28 70 53 74 72 2d    assert( (pStr-
19b0: 3e 6e 2d 70 53 74 72 2d 3e 63 29 3e 3d 28 70 52  >n-pStr->c)>=(pR
19c0: 6f 77 2d 3e 74 72 61 69 6c 69 6e 67 5f 62 79 74  ow->trailing_byt
19d0: 65 73 2b 31 29 20 29 3b 0a 0a 20 20 2f 2a 20 57  es+1) );..  /* W
19e0: 72 69 74 65 20 74 68 65 20 55 54 46 2d 38 20 65  rite the UTF-8 e
19f0: 6e 63 6f 64 65 64 20 63 68 61 72 61 63 74 65 72  ncoded character
1a00: 20 74 6f 20 70 53 74 72 2e 20 41 6c 6c 20 63 61   to pStr. All ca
1a10: 73 65 73 20 62 65 6c 6f 77 20 61 72 65 0a 20 20  ses below are.  
1a20: 2a 2a 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 6c 79  ** intentionally
1a30: 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 2e 0a 20   fall-through.. 
1a40: 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 52   */.  switch( pR
1a50: 6f 77 2d 3e 74 72 61 69 6c 69 6e 67 5f 62 79 74  ow->trailing_byt
1a60: 65 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 33  es ){.    case 3
1a70: 3a 0a 20 20 20 20 20 20 70 53 74 72 2d 3e 70 5a  :.      pStr->pZ
1a80: 5b 70 53 74 72 2d 3e 63 2b 33 5d 20 3d 20 28 28  [pStr->c+3] = ((
1a90: 28 75 38 29 63 6f 64 65 29 26 30 78 33 46 29 7c  (u8)code)&0x3F)|
1aa0: 30 78 38 30 3b 0a 20 20 20 20 20 20 63 6f 64 65  0x80;.      code
1ab0: 20 3d 20 63 6f 64 65 3e 3e 36 3b 0a 20 20 20 20   = code>>6;.    
1ac0: 63 61 73 65 20 32 3a 0a 20 20 20 20 20 20 70 53  case 2:.      pS
1ad0: 74 72 2d 3e 70 5a 5b 70 53 74 72 2d 3e 63 2b 32  tr->pZ[pStr->c+2
1ae0: 5d 20 3d 20 28 28 28 75 38 29 63 6f 64 65 29 26  ] = (((u8)code)&
1af0: 30 78 33 46 29 7c 30 78 38 30 3b 0a 20 20 20 20  0x3F)|0x80;.    
1b00: 20 20 63 6f 64 65 20 3d 20 63 6f 64 65 3e 3e 36    code = code>>6
1b10: 3b 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20  ;.    case 1:.  
1b20: 20 20 20 20 70 53 74 72 2d 3e 70 5a 5b 70 53 74      pStr->pZ[pSt
1b30: 72 2d 3e 63 2b 31 5d 20 3d 20 28 28 28 75 38 29  r->c+1] = (((u8)
1b40: 63 6f 64 65 29 26 30 78 33 46 29 7c 30 78 38 30  code)&0x3F)|0x80
1b50: 3b 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20 63  ;.      code = c
1b60: 6f 64 65 3e 3e 36 3b 0a 20 20 20 20 63 61 73 65  ode>>6;.    case
1b70: 20 30 3a 0a 20 20 20 20 20 20 70 53 74 72 2d 3e   0:.      pStr->
1b80: 70 5a 5b 70 53 74 72 2d 3e 63 5d 20 3d 20 28 28  pZ[pStr->c] = ((
1b90: 28 75 38 29 63 6f 64 65 29 26 28 70 52 6f 77 2d  (u8)code)&(pRow-
1ba0: 3e 62 31 5f 61 6e 64 5f 6d 61 73 6b 29 29 7c 28  >b1_and_mask))|(
1bb0: 70 52 6f 77 2d 3e 62 31 5f 6f 72 5f 6d 61 73 6b  pRow->b1_or_mask
1bc0: 29 3b 0a 20 20 7d 0a 20 20 70 53 74 72 2d 3e 63  );.  }.  pStr->c
1bd0: 20 2b 3d 20 28 70 52 6f 77 2d 3e 74 72 61 69 6c   += (pRow->trail
1be0: 69 6e 67 5f 62 79 74 65 73 20 2b 20 31 29 3b 0a  ing_bytes + 1);.
1bf0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1c00: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
1c10: 67 6c 65 20 75 6e 69 63 6f 64 65 20 63 68 61 72  gle unicode char
1c20: 61 63 74 65 72 20 66 72 6f 6d 20 74 68 65 20 55  acter from the U
1c30: 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 73 74  TF-16 encoded st
1c40: 72 69 6e 67 20 2a 70 53 74 72 2e 20 54 68 65 0a  ring *pStr. The.
1c50: 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  ** value returne
1c60: 64 20 69 73 20 61 20 75 6e 69 63 6f 64 65 20 73  d is a unicode s
1c70: 63 61 6c 61 72 20 76 61 6c 75 65 2e 20 49 6e 20  calar value. In 
1c80: 74 68 65 20 63 61 73 65 20 6f 66 20 6d 61 6c 66  the case of malf
1c90: 6f 72 6d 65 64 0a 2a 2a 20 73 74 72 69 6e 67 73  ormed.** strings
1ca0: 2c 20 74 68 65 20 75 6e 69 63 6f 64 65 20 72 65  , the unicode re
1cb0: 70 6c 61 63 65 6d 65 6e 74 20 63 68 61 72 61 63  placement charac
1cc0: 74 65 72 20 55 2b 46 46 46 44 20 6d 61 79 20 62  ter U+FFFD may b
1cd0: 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  e returned..**.*
1ce0: 2a 20 49 66 20 62 69 67 5f 65 6e 64 69 61 6e 20  * If big_endian 
1cf0: 69 73 20 74 72 75 65 2c 20 74 68 65 20 73 74 72  is true, the str
1d00: 69 6e 67 20 69 73 20 61 73 73 75 6d 65 64 20 74  ing is assumed t
1d10: 6f 20 62 65 20 55 54 46 2d 31 36 42 45 20 65 6e  o be UTF-16BE en
1d20: 63 6f 64 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77  coded..** Otherw
1d30: 69 73 65 2c 20 69 74 20 69 73 20 55 54 46 2d 31  ise, it is UTF-1
1d40: 36 4c 45 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a  6LE encoded..*/.
1d50: 73 74 61 74 69 63 20 75 33 32 20 72 65 61 64 55  static u32 readU
1d60: 74 66 31 36 28 55 74 66 53 74 72 69 6e 67 20 2a  tf16(UtfString *
1d70: 70 53 74 72 2c 20 69 6e 74 20 62 69 67 5f 65 6e  pStr, int big_en
1d80: 64 69 61 6e 29 7b 0a 20 20 75 33 32 20 63 6f 64  dian){.  u32 cod
1d90: 65 5f 70 6f 69 6e 74 3b 20 20 20 2f 2a 20 74 68  e_point;   /* th
1da0: 65 20 66 69 72 73 74 20 63 6f 64 65 2d 70 6f 69  e first code-poi
1db0: 6e 74 20 69 6e 20 74 68 65 20 63 68 61 72 61 63  nt in the charac
1dc0: 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ter */..  /* If 
1dd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e  there is only on
1de0: 65 20 62 79 74 65 20 6f 66 20 64 61 74 61 20 6c  e byte of data l
1df0: 65 66 74 20 69 6e 20 74 68 65 20 73 74 72 69 6e  eft in the strin
1e00: 67 2c 20 72 65 74 75 72 6e 20 74 68 65 20 0a 20  g, return the . 
1e10: 20 2a 2a 20 72 65 70 6c 61 63 65 6d 65 6e 74 20   ** replacement 
1e20: 63 68 61 72 61 63 74 65 72 2e 0a 20 20 2a 2f 0a  character..  */.
1e30: 20 20 69 66 28 20 28 70 53 74 72 2d 3e 6e 2d 70    if( (pStr->n-p
1e40: 53 74 72 2d 3e 63 29 3d 3d 31 20 29 7b 0a 20 20  Str->c)==1 ){.  
1e50: 20 20 70 53 74 72 2d 3e 63 2b 2b 3b 0a 20 20 20    pStr->c++;.   
1e60: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 30 78 46   return (int)0xF
1e70: 46 46 44 3b 0a 20 20 7d 0a 0a 20 20 63 6f 64 65  FFD;.  }..  code
1e80: 5f 70 6f 69 6e 74 20 3d 20 52 45 41 44 5f 31 36  _point = READ_16
1e90: 28 26 28 70 53 74 72 2d 3e 70 5a 5b 70 53 74 72  (&(pStr->pZ[pStr
1ea0: 2d 3e 63 5d 29 2c 20 62 69 67 5f 65 6e 64 69 61  ->c]), big_endia
1eb0: 6e 29 3b 0a 20 20 70 53 74 72 2d 3e 63 20 2b 3d  n);.  pStr->c +=
1ec0: 20 32 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   2;..  /* If thi
1ed0: 73 20 69 73 20 61 20 6e 6f 6e 2d 73 75 72 72 6f  s is a non-surro
1ee0: 67 61 74 65 20 63 6f 64 65 2d 70 6f 69 6e 74 2c  gate code-point,
1ef0: 20 6a 75 73 74 20 63 61 73 74 20 69 74 20 74 6f   just cast it to
1f00: 20 61 6e 20 69 6e 74 20 61 6e 64 0a 20 20 2a 2a   an int and.  **
1f10: 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 64 65   return the code
1f20: 2d 70 6f 69 6e 74 20 76 61 6c 75 65 2e 0a 20 20  -point value..  
1f30: 2a 2f 0a 20 20 69 66 28 20 63 6f 64 65 5f 70 6f  */.  if( code_po
1f40: 69 6e 74 3c 30 78 44 38 30 30 20 7c 7c 20 63 6f  int<0xD800 || co
1f50: 64 65 5f 70 6f 69 6e 74 3e 30 78 45 30 30 30 20  de_point>0xE000 
1f60: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 6f  ){.    return co
1f70: 64 65 5f 70 6f 69 6e 74 3b 0a 20 20 7d 0a 0a 20  de_point;.  }.. 
1f80: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
1f90: 20 74 72 61 69 6c 69 6e 67 20 73 75 72 72 6f 67   trailing surrog
1fa0: 61 74 65 20 63 6f 64 65 2d 70 6f 69 6e 74 2c 20  ate code-point, 
1fb0: 74 68 65 6e 20 74 68 65 20 73 74 72 69 6e 67 20  then the string 
1fc0: 69 73 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65  is.  ** malforme
1fd0: 64 3b 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  d; return the re
1fe0: 70 6c 61 63 65 6d 65 6e 74 20 63 68 61 72 61 63  placement charac
1ff0: 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ter..  */.  if( 
2000: 63 6f 64 65 5f 70 6f 69 6e 74 3e 30 78 44 42 46  code_point>0xDBF
2010: 46 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  F ){.    return 
2020: 30 78 46 46 46 44 3b 0a 20 20 7d 0a 0a 20 20 2f  0xFFFD;.  }..  /
2030: 2a 20 54 68 65 20 63 6f 64 65 2d 70 6f 69 6e 74  * The code-point
2040: 20 6a 75 73 74 20 72 65 61 64 20 69 73 20 61 20   just read is a 
2050: 6c 65 61 64 69 6e 67 20 73 75 72 72 6f 67 61 74  leading surrogat
2060: 65 20 63 6f 64 65 2d 70 6f 69 6e 74 2e 20 49 66  e code-point. If
2070: 20 74 68 65 69 72 0a 20 20 2a 2a 20 69 73 20 6e   their.  ** is n
2080: 6f 74 20 65 6e 6f 75 67 68 20 64 61 74 61 20 6c  ot enough data l
2090: 65 66 74 20 6f 72 20 74 68 65 20 6e 65 78 74 20  eft or the next 
20a0: 63 6f 64 65 2d 70 6f 69 6e 74 20 69 73 20 6e 6f  code-point is no
20b0: 74 20 61 20 74 72 61 69 6c 69 6e 67 0a 20 20 2a  t a trailing.  *
20c0: 2a 20 73 75 72 72 6f 67 61 74 65 2c 20 72 65 74  * surrogate, ret
20d0: 75 72 6e 20 74 68 65 20 72 65 70 6c 61 63 65 6d  urn the replacem
20e0: 65 6e 74 20 63 68 61 72 61 63 74 65 72 2e 0a 20  ent character.. 
20f0: 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 74 72 2d   */.  if( (pStr-
2100: 3e 6e 2d 70 53 74 72 2d 3e 63 29 3e 31 20 29 7b  >n-pStr->c)>1 ){
2110: 0a 20 20 20 20 75 33 32 20 63 6f 64 65 5f 70 6f  .    u32 code_po
2120: 69 6e 74 32 20 3d 20 52 45 41 44 5f 31 36 28 26  int2 = READ_16(&
2130: 70 53 74 72 2d 3e 70 5a 5b 70 53 74 72 2d 3e 63  pStr->pZ[pStr->c
2140: 5d 2c 20 62 69 67 5f 65 6e 64 69 61 6e 29 3b 0a  ], big_endian);.
2150: 20 20 20 20 69 66 28 20 63 6f 64 65 5f 70 6f 69      if( code_poi
2160: 6e 74 32 3c 30 78 44 43 30 30 20 7c 7c 20 63 6f  nt2<0xDC00 || co
2170: 64 65 5f 70 6f 69 6e 74 3e 30 78 44 46 46 46 20  de_point>0xDFFF 
2180: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2190: 30 78 46 46 46 44 3b 0a 20 20 20 20 7d 0a 20 20  0xFFFD;.    }.  
21a0: 20 20 70 53 74 72 2d 3e 63 20 2b 3d 20 32 3b 0a    pStr->c += 2;.
21b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 20 0a 20  .    return ( . 
21c0: 20 20 20 20 20 20 20 28 28 28 63 6f 64 65 5f 70         (((code_p
21d0: 6f 69 6e 74 26 30 78 30 33 43 30 29 2b 30 78 30  oint&0x03C0)+0x0
21e0: 30 34 30 29 3c 3c 31 36 29 20 2b 20 20 20 2f 2a  040)<<16) +   /*
21f0: 20 75 75 75 75 75 20 2a 2f 0a 20 20 20 20 20 20   uuuuu */.      
2200: 20 20 28 28 63 6f 64 65 5f 70 6f 69 6e 74 26 30    ((code_point&0
2210: 78 30 30 33 46 29 3c 3c 31 30 29 20 2b 20 20 20  x003F)<<10) +   
2220: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 78 78 78           /* xxxx
2230: 78 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 63  xx */.        (c
2240: 6f 64 65 5f 70 6f 69 6e 74 32 26 30 78 30 33 46  ode_point2&0x03F
2250: 46 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  F)              
2260: 20 20 20 20 20 2f 2a 20 79 79 20 79 79 79 79 79       /* yy yyyyy
2270: 79 79 79 20 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20  yyy */.    );.. 
2280: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2290: 72 6e 20 28 69 6e 74 29 30 78 46 46 46 44 3b 0a  rn (int)0xFFFD;.
22a0: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 74 20    }.  .  /* not 
22b0: 72 65 61 63 68 65 64 20 2a 2f 0a 7d 0a 0a 73 74  reached */.}..st
22c0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 55 74  atic int writeUt
22d0: 66 31 36 28 55 74 66 53 74 72 69 6e 67 20 2a 70  f16(UtfString *p
22e0: 53 74 72 2c 20 69 6e 74 20 63 6f 64 65 2c 20 69  Str, int code, i
22f0: 6e 74 20 62 69 67 5f 65 6e 64 69 61 6e 29 7b 0a  nt big_endian){.
2300: 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 75    int bytes;.  u
2310: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 68 69  nsigned char *hi
2320: 5f 62 79 74 65 3b 0a 20 20 75 6e 73 69 67 6e 65  _byte;.  unsigne
2330: 64 20 63 68 61 72 20 2a 6c 6f 5f 62 79 74 65 3b  d char *lo_byte;
2340: 0a 0a 20 20 62 79 74 65 73 20 3d 20 28 63 6f 64  ..  bytes = (cod
2350: 65 3e 30 78 30 30 30 30 46 46 46 46 3f 34 3a 32  e>0x0000FFFF?4:2
2360: 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  );..  /* Ensure 
2370: 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
2380: 72 6f 6f 6d 20 6c 65 66 74 20 69 6e 20 74 68 65  room left in the
2390: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 74   output buffer t
23a0: 6f 20 77 72 69 74 65 0a 20 20 2a 2a 20 74 68 69  o write.  ** thi
23b0: 73 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65  s UTF-8 characte
23c0: 72 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  r..  */.  assert
23d0: 28 20 28 70 53 74 72 2d 3e 6e 2d 70 53 74 72 2d  ( (pStr->n-pStr-
23e0: 3e 63 29 3e 3d 62 79 74 65 73 20 29 3b 0a 20 20  >c)>=bytes );.  
23f0: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 73 65  .  /* Initialise
2400: 20 68 69 5f 62 79 74 65 20 61 6e 64 20 6c 6f 5f   hi_byte and lo_
2410: 62 79 74 65 20 74 6f 20 70 6f 69 6e 74 20 61 74  byte to point at
2420: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 73 20 69   the locations i
2430: 6e 74 6f 20 77 68 69 63 68 0a 20 20 2a 2a 20 74  nto which.  ** t
2440: 68 65 20 4d 53 42 20 61 6e 64 20 4c 53 42 20 6f  he MSB and LSB o
2450: 66 20 74 68 65 20 28 66 69 72 73 74 29 20 31 36  f the (first) 16
2460: 2d 62 69 74 20 75 6e 69 63 6f 64 65 20 63 6f 64  -bit unicode cod
2470: 65 2d 70 6f 69 6e 74 20 77 72 69 74 74 65 6e 20  e-point written 
2480: 66 6f 72 0a 20 20 2a 2a 20 74 68 69 73 20 63 68  for.  ** this ch
2490: 61 72 61 63 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  aracter..  */.  
24a0: 68 69 5f 62 79 74 65 20 3d 20 28 62 69 67 5f 65  hi_byte = (big_e
24b0: 6e 64 69 61 6e 3f 26 70 53 74 72 2d 3e 70 5a 5b  ndian?&pStr->pZ[
24c0: 70 53 74 72 2d 3e 63 5d 3a 26 70 53 74 72 2d 3e  pStr->c]:&pStr->
24d0: 70 5a 5b 70 53 74 72 2d 3e 63 2b 31 5d 29 3b 0a  pZ[pStr->c+1]);.
24e0: 20 20 6c 6f 5f 62 79 74 65 20 3d 20 28 62 69 67    lo_byte = (big
24f0: 5f 65 6e 64 69 61 6e 3f 26 70 53 74 72 2d 3e 70  _endian?&pStr->p
2500: 5a 5b 70 53 74 72 2d 3e 63 2b 31 5d 3a 26 70 53  Z[pStr->c+1]:&pS
2510: 74 72 2d 3e 70 5a 5b 70 53 74 72 2d 3e 63 5d 29  tr->pZ[pStr->c])
2520: 3b 0a 0a 20 20 69 66 28 20 62 79 74 65 73 3d 3d  ;..  if( bytes==
2530: 32 20 29 7b 0a 20 20 20 20 2a 68 69 5f 62 79 74  2 ){.    *hi_byt
2540: 65 20 3d 20 28 75 38 29 28 28 63 6f 64 65 26 30  e = (u8)((code&0
2550: 78 30 30 30 30 46 46 30 30 29 3e 3e 38 29 3b 0a  x0000FF00)>>8);.
2560: 20 20 20 20 2a 6c 6f 5f 62 79 74 65 20 3d 20 28      *lo_byte = (
2570: 75 38 29 28 63 6f 64 65 26 30 78 30 30 30 30 30  u8)(code&0x00000
2580: 30 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  0FF);.  }else{. 
2590: 20 20 20 75 33 32 20 77 72 64 3b 0a 20 20 20 20     u32 wrd;.    
25a0: 77 72 64 20 3d 20 28 28 28 28 63 6f 64 65 26 30  wrd = ((((code&0
25b0: 78 30 30 31 46 30 30 30 30 29 2d 30 78 30 30 30  x001F0000)-0x000
25c0: 31 30 30 30 30 29 2b 28 63 6f 64 65 26 30 78 30  10000)+(code&0x0
25d0: 30 30 30 46 43 30 30 29 29 3e 3e 31 30 29 7c 30  000FC00))>>10)|0
25e0: 78 30 30 30 30 44 38 30 30 3b 0a 20 20 20 20 2a  x0000D800;.    *
25f0: 68 69 5f 62 79 74 65 20 3d 20 28 75 38 29 28 28  hi_byte = (u8)((
2600: 77 72 64 26 30 78 30 30 30 30 46 46 30 30 29 3e  wrd&0x0000FF00)>
2610: 3e 38 29 3b 0a 20 20 20 20 2a 6c 6f 5f 62 79 74  >8);.    *lo_byt
2620: 65 20 3d 20 28 75 38 29 28 77 72 64 26 30 78 30  e = (u8)(wrd&0x0
2630: 30 30 30 30 30 46 46 29 3b 0a 0a 20 20 20 20 77  00000FF);..    w
2640: 72 64 20 3d 20 28 63 6f 64 65 26 30 78 30 30 30  rd = (code&0x000
2650: 30 30 33 46 46 29 7c 30 78 30 30 30 30 44 43 30  003FF)|0x0000DC0
2660: 30 3b 0a 20 20 20 20 2a 28 68 69 5f 62 79 74 65  0;.    *(hi_byte
2670: 2b 32 29 20 3d 20 28 75 38 29 28 28 77 72 64 26  +2) = (u8)((wrd&
2680: 30 78 30 30 30 30 46 46 30 30 29 3e 3e 38 29 3b  0x0000FF00)>>8);
2690: 0a 20 20 20 20 2a 28 6c 6f 5f 62 79 74 65 2b 32  .    *(lo_byte+2
26a0: 29 20 3d 20 28 75 38 29 28 77 72 64 26 30 78 30  ) = (u8)(wrd&0x0
26b0: 30 30 30 30 30 46 46 29 3b 0a 20 20 7d 0a 0a 20  00000FF);.  }.. 
26c0: 20 70 53 74 72 2d 3e 63 20 2b 3d 20 62 79 74 65   pStr->c += byte
26d0: 73 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 30  s;.  .  return 0
26e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 5a 20 69 73  ;.}../*.** pZ is
26f0: 20 61 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64   a UTF-8 encoded
2700: 20 75 6e 69 63 6f 64 65 20 73 74 72 69 6e 67 2e   unicode string.
2710: 20 49 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73   If nByte is les
2720: 73 20 74 68 61 6e 20 7a 65 72 6f 2c 0a 2a 2a 20  s than zero,.** 
2730: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
2740: 72 20 6f 66 20 75 6e 69 63 6f 64 65 20 63 68 61  r of unicode cha
2750: 72 61 63 74 65 72 73 20 69 6e 20 70 5a 20 75 70  racters in pZ up
2760: 20 74 6f 20 28 62 75 74 20 6e 6f 74 20 69 6e 63   to (but not inc
2770: 6c 75 64 69 6e 67 29 0a 2a 2a 20 74 68 65 20 66  luding).** the f
2780: 69 72 73 74 20 30 78 30 30 20 62 79 74 65 2e 20  irst 0x00 byte. 
2790: 49 66 20 6e 42 79 74 65 20 69 73 20 6e 6f 74 20  If nByte is not 
27a0: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
27b0: 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 6e 75  return the.** nu
27c0: 6d 62 65 72 20 6f 66 20 75 6e 69 63 6f 64 65 20  mber of unicode 
27d0: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
27e0: 65 20 66 69 72 73 74 20 6e 42 79 74 65 20 6f 66  e first nByte of
27f0: 20 70 5a 20 28 6f 72 20 75 70 20 74 6f 20 0a 2a   pZ (or up to .*
2800: 2a 20 74 68 65 20 66 69 72 73 74 20 30 78 30 30  * the first 0x00
2810: 2c 20 77 68 69 63 68 65 76 65 72 20 63 6f 6d 65  , whichever come
2820: 73 20 66 69 72 73 74 29 2e 0a 2a 2f 0a 69 6e 74  s first)..*/.int
2830: 20 73 71 6c 69 74 65 33 75 74 66 38 43 68 61 72   sqlite3utf8Char
2840: 4c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Len(const char *
2850: 70 5a 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a  pZ, int nByte){.
2860: 20 20 55 74 66 53 74 72 69 6e 67 20 73 74 72 3b    UtfString str;
2870: 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a  .  int ret = 0;.
2880: 20 20 75 33 32 20 63 6f 64 65 20 3d 20 31 3b 0a    u32 code = 1;.
2890: 0a 20 20 73 74 72 2e 70 5a 20 3d 20 28 63 68 61  .  str.pZ = (cha
28a0: 72 20 2a 29 70 5a 3b 0a 20 20 73 74 72 2e 6e 20  r *)pZ;.  str.n 
28b0: 3d 20 6e 42 79 74 65 3b 0a 20 20 73 74 72 2e 63  = nByte;.  str.c
28c0: 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
28d0: 28 6e 42 79 74 65 3c 30 20 7c 7c 20 73 74 72 2e  (nByte<0 || str.
28e0: 63 3c 73 74 72 2e 6e 29 20 26 26 20 63 6f 64 65  c<str.n) && code
28f0: 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f 64 65 20  !=0 ){.    code 
2900: 3d 20 72 65 61 64 55 74 66 38 28 26 73 74 72 29  = readUtf8(&str)
2910: 3b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d  ;.    ret++;.  }
2920: 0a 20 20 69 66 28 20 63 6f 64 65 3d 3d 30 20 29  .  if( code==0 )
2930: 20 72 65 74 2d 2d 3b 0a 0a 20 20 72 65 74 75 72   ret--;..  retur
2940: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
2950: 70 5a 20 69 73 20 61 20 55 54 46 2d 31 36 20 65  pZ is a UTF-16 e
2960: 6e 63 6f 64 65 64 20 75 6e 69 63 6f 64 65 20 73  ncoded unicode s
2970: 74 72 69 6e 67 2e 20 49 66 20 6e 43 68 61 72 20  tring. If nChar 
2980: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
2990: 6f 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  o,.** return the
29a0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
29b0: 20 75 70 20 74 6f 20 28 62 75 74 20 6e 6f 74 20   up to (but not 
29c0: 69 6e 63 6c 75 64 69 6e 67 29 2c 20 74 68 65 20  including), the 
29d0: 66 69 72 73 74 20 70 61 69 72 0a 2a 2a 20 6f 66  first pair.** of
29e0: 20 63 6f 6e 73 65 63 75 74 69 76 65 20 30 78 30   consecutive 0x0
29f0: 30 20 62 79 74 65 73 20 69 6e 20 70 5a 2e 20 49  0 bytes in pZ. I
2a00: 66 20 6e 43 68 61 72 20 69 73 20 6e 6f 74 20 6c  f nChar is not l
2a10: 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 0a 2a  ess than zero,.*
2a20: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  * then return th
2a30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
2a40: 73 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e  s in the first n
2a50: 43 68 61 72 20 75 6e 69 63 6f 64 65 20 63 68 61  Char unicode cha
2a60: 72 61 63 74 65 72 73 0a 2a 2a 20 69 6e 20 70 5a  racters.** in pZ
2a70: 20 28 6f 72 20 75 70 20 75 6e 74 69 6c 20 74 68   (or up until th
2a80: 65 20 66 69 72 73 74 20 70 61 69 72 20 6f 66 20  e first pair of 
2a90: 30 78 30 30 20 62 79 74 65 73 2c 20 77 68 69 63  0x00 bytes, whic
2aa0: 68 65 76 65 72 20 63 6f 6d 65 73 20 66 69 72 73  hever comes firs
2ab0: 74 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  t)..*/.int sqlit
2ac0: 65 33 75 74 66 31 36 42 79 74 65 4c 65 6e 28 63  e3utf16ByteLen(c
2ad0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 5a 2c 20 69  onst void *pZ, i
2ae0: 6e 74 20 6e 43 68 61 72 29 7b 0a 20 20 69 66 28  nt nChar){.  if(
2af0: 20 6e 43 68 61 72 3c 30 20 29 7b 0a 20 20 20 20   nChar<0 ){.    
2b00: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
2b10: 68 61 72 20 2a 70 43 31 20 3d 20 70 5a 3b 0a 20  har *pC1 = pZ;. 
2b20: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
2b30: 64 20 63 68 61 72 20 2a 70 43 32 20 3d 20 70 5a  d char *pC2 = pZ
2b40: 2b 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  +1;.    while( *
2b50: 70 43 31 20 7c 7c 20 2a 70 43 32 20 29 7b 0a 20  pC1 || *pC2 ){. 
2b60: 20 20 20 20 20 70 43 31 20 2b 3d 20 32 3b 0a 20       pC1 += 2;. 
2b70: 20 20 20 20 20 70 43 32 20 2b 3d 20 32 3b 0a 20       pC2 += 2;. 
2b80: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
2b90: 70 43 31 2d 28 75 6e 73 69 67 6e 65 64 20 63 68  pC1-(unsigned ch
2ba0: 61 72 20 2a 29 70 5a 3b 0a 20 20 7d 65 6c 73 65  ar *)pZ;.  }else
2bb0: 7b 0a 20 20 20 20 55 74 66 53 74 72 69 6e 67 20  {.    UtfString 
2bc0: 73 74 72 3b 0a 20 20 20 20 75 33 32 20 63 6f 64  str;.    u32 cod
2bd0: 65 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 62  e = 1;.    int b
2be0: 69 67 5f 65 6e 64 69 61 6e 3b 0a 20 20 20 20 69  ig_endian;.    i
2bf0: 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20  nt nRead = 0;.  
2c00: 20 20 69 6e 74 20 72 65 74 3b 0a 0a 20 20 20 20    int ret;..    
2c10: 73 74 72 2e 70 5a 20 3d 20 28 63 68 61 72 20 2a  str.pZ = (char *
2c20: 29 70 5a 3b 0a 20 20 20 20 73 74 72 2e 63 20 3d  )pZ;.    str.c =
2c30: 20 30 3b 0a 20 20 20 20 73 74 72 2e 6e 20 3d 20   0;.    str.n = 
2c40: 2d 31 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  -1;..    /* Chec
2c50: 6b 20 66 6f 72 20 61 20 42 4f 4d 2e 20 57 65 20  k for a BOM. We 
2c60: 6a 75 73 74 20 69 67 6e 6f 72 65 20 69 74 20 69  just ignore it i
2c70: 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2c 20  f there is one, 
2c80: 69 74 27 73 20 6f 6e 6c 79 20 72 65 61 64 0a 20  it's only read. 
2c90: 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 69 74     ** so that it
2ca0: 20 69 73 20 6e 6f 74 20 63 6f 75 6e 74 65 64 20   is not counted 
2cb0: 61 73 20 61 20 63 68 61 72 61 63 74 65 72 2e 20  as a character. 
2cc0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 62 69 67 5f  .    */.    big_
2cd0: 65 6e 64 69 61 6e 20 3d 20 72 65 61 64 55 74 66  endian = readUtf
2ce0: 31 36 42 6f 6d 28 26 73 74 72 2c 20 30 29 3b 0a  16Bom(&str, 0);.
2cf0: 20 20 20 20 72 65 74 20 3d 20 30 2d 73 74 72 2e      ret = 0-str.
2d00: 63 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 63  c;..    while( c
2d10: 6f 64 65 21 3d 30 20 26 26 20 6e 52 65 61 64 3c  ode!=0 && nRead<
2d20: 6e 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20 63  nChar ){.      c
2d30: 6f 64 65 20 3d 20 72 65 61 64 55 74 66 31 36 28  ode = readUtf16(
2d40: 26 73 74 72 2c 20 62 69 67 5f 65 6e 64 69 61 6e  &str, big_endian
2d50: 29 3b 0a 20 20 20 20 20 20 6e 52 65 61 64 2b 2b  );.      nRead++
2d60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d70: 63 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  code==0 ){.     
2d80: 20 72 65 74 20 2d 3d 20 32 3b 0a 20 20 20 20 7d   ret -= 2;.    }
2d90: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 74 72 2e  .    return str.
2da0: 63 20 2b 20 72 65 74 3b 0a 20 20 7d 0a 7d 0a 0a  c + ret;.  }.}..
2db0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
2dc0: 73 74 72 69 6e 67 20 69 6e 20 55 54 46 2d 31 36  string in UTF-16
2dd0: 20 6e 61 74 69 76 65 20 62 79 74 65 20 28 6f 72   native byte (or
2de0: 20 77 69 74 68 20 61 20 42 79 74 65 2d 6f 72 64   with a Byte-ord
2df0: 65 72 2d 6d 61 72 6b 20 6f 72 0a 2a 2a 20 22 42  er-mark or.** "B
2e00: 4f 4d 22 29 20 69 6e 74 6f 20 61 20 55 54 46 2d  OM") into a UTF-
2e10: 38 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 55  8 string.  The U
2e20: 54 46 2d 38 20 73 74 72 69 6e 67 20 69 73 20 77  TF-8 string is w
2e30: 72 69 74 74 65 6e 20 69 6e 74 6f 20 73 70 61 63  ritten into spac
2e40: 65 20 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66  e .** obtained f
2e50: 72 6f 6d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  rom sqlite3Mallo
2e60: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
2e70: 72 65 6c 65 61 73 65 64 20 62 79 20 74 68 65 20  released by the 
2e80: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2e90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61  ..**.** The para
2ea0: 6d 65 74 65 72 20 4e 20 69 73 20 74 68 65 20 6e  meter N is the n
2eb0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2ec0: 6e 20 74 68 65 20 55 54 46 2d 31 36 20 73 74 72  n the UTF-16 str
2ed0: 69 6e 67 2e 20 20 49 66 20 4e 20 69 73 0a 2a 2a  ing.  If N is.**
2ee0: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 65   negative, the e
2ef0: 6e 74 69 72 65 20 73 74 72 69 6e 67 20 75 70 20  ntire string up 
2f00: 74 6f 20 74 68 65 20 66 69 72 73 74 20 5c 75 30  to the first \u0
2f10: 30 30 30 20 63 68 61 72 61 63 74 65 72 20 69 73  000 character is
2f20: 20 74 72 61 6e 73 6c 61 74 65 64 2e 0a 2a 2a 0a   translated..**.
2f30: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
2f40: 55 54 46 2d 38 20 73 74 72 69 6e 67 20 69 73 20  UTF-8 string is 
2f50: 61 6c 77 61 79 73 20 5c 30 30 30 20 74 65 72 6d  always \000 term
2f60: 69 6e 61 74 65 64 2e 0a 2a 2f 0a 75 6e 73 69 67  inated..*/.unsig
2f70: 6e 65 64 20 63 68 61 72 20 2a 73 71 6c 69 74 65  ned char *sqlite
2f80: 33 75 74 66 31 36 74 6f 38 28 63 6f 6e 73 74 20  3utf16to8(const 
2f90: 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
2fa0: 20 4e 2c 20 69 6e 74 20 62 69 67 5f 65 6e 64 69   N, int big_endi
2fb0: 61 6e 29 7b 0a 20 20 55 74 66 53 74 72 69 6e 67  an){.  UtfString
2fc0: 20 69 6e 3b 0a 20 20 55 74 66 53 74 72 69 6e 67   in;.  UtfString
2fd0: 20 6f 75 74 3b 0a 0a 20 20 6f 75 74 2e 70 5a 20   out;..  out.pZ 
2fe0: 3d 20 30 3b 0a 0a 20 20 69 6e 2e 70 5a 20 3d 20  = 0;..  in.pZ = 
2ff0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
3000: 29 70 44 61 74 61 3b 0a 20 20 69 6e 2e 6e 20 3d  )pData;.  in.n =
3010: 20 4e 3b 0a 20 20 69 6e 2e 63 20 3d 20 30 3b 0a   N;.  in.c = 0;.
3020: 0a 20 20 69 66 28 20 69 6e 2e 6e 3c 30 20 29 7b  .  if( in.n<0 ){
3030: 0a 20 20 20 20 69 6e 2e 6e 20 3d 20 73 71 6c 69  .    in.n = sqli
3040: 74 65 33 75 74 66 31 36 42 79 74 65 4c 65 6e 28  te3utf16ByteLen(
3050: 69 6e 2e 70 5a 2c 20 2d 31 29 3b 0a 20 20 7d 0a  in.pZ, -1);.  }.
3060: 0a 20 20 2f 2a 20 41 20 55 54 46 2d 38 20 65 6e  .  /* A UTF-8 en
3070: 63 6f 64 69 6e 67 20 6f 66 20 61 20 75 6e 69 63  coding of a unic
3080: 6f 64 65 20 73 74 72 69 6e 67 20 63 61 6e 20 72  ode string can r
3090: 65 71 75 69 72 65 20 61 74 20 6d 6f 73 74 20 31  equire at most 1
30a0: 2e 35 20 74 69 6d 65 73 20 61 73 0a 20 20 2a 2a  .5 times as.  **
30b0: 20 6d 75 63 68 20 73 70 61 63 65 20 74 6f 20 73   much space to s
30c0: 74 6f 72 65 20 61 73 20 74 68 65 20 73 61 6d 65  tore as the same
30d0: 20 73 74 72 69 6e 67 20 65 6e 63 6f 64 65 64 20   string encoded 
30e0: 75 73 69 6e 67 20 55 54 46 2d 31 36 2e 20 41 6c  using UTF-16. Al
30f0: 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 69 73  locate.  ** this
3100: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6f 75 74   now..  */.  out
3110: 2e 6e 20 3d 20 28 69 6e 2e 6e 2a 31 2e 35 29 20  .n = (in.n*1.5) 
3120: 2b 20 31 3b 0a 20 20 6f 75 74 2e 70 5a 20 3d 20  + 1;.  out.pZ = 
3130: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6f 75 74  sqliteMalloc(out
3140: 2e 6e 29 3b 0a 20 20 69 66 28 20 21 6f 75 74 2e  .n);.  if( !out.
3150: 70 5a 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  pZ ){.    return
3160: 20 30 3b 0a 20 20 7d 0a 20 20 6f 75 74 2e 63 20   0;.  }.  out.c 
3170: 3d 20 30 3b 0a 0a 20 20 62 69 67 5f 65 6e 64 69  = 0;..  big_endi
3180: 61 6e 20 3d 20 72 65 61 64 55 74 66 31 36 42 6f  an = readUtf16Bo
3190: 6d 28 26 69 6e 2c 20 62 69 67 5f 65 6e 64 69 61  m(&in, big_endia
31a0: 6e 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 6e 2e  n);.  while( in.
31b0: 63 3c 69 6e 2e 6e 20 29 7b 0a 20 20 20 20 77 72  c<in.n ){.    wr
31c0: 69 74 65 55 74 66 38 28 26 6f 75 74 2c 20 72 65  iteUtf8(&out, re
31d0: 61 64 55 74 66 31 36 28 26 69 6e 2c 20 62 69 67  adUtf16(&in, big
31e0: 5f 65 6e 64 69 61 6e 29 29 3b 0a 20 20 7d 0a 0a  _endian));.  }..
31f0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4e 55 4c    /* Add the NUL
3200: 4c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61  L-terminator cha
3210: 72 61 63 74 65 72 20 2a 2f 0a 20 20 61 73 73 65  racter */.  asse
3220: 72 74 28 20 6f 75 74 2e 63 3c 6f 75 74 2e 6e 20  rt( out.c<out.n 
3230: 29 3b 0a 20 20 6f 75 74 2e 70 5a 5b 6f 75 74 2e  );.  out.pZ[out.
3240: 63 5d 20 3d 20 30 78 30 30 3b 0a 0a 20 20 72 65  c] = 0x00;..  re
3250: 74 75 72 6e 20 6f 75 74 2e 70 5a 3b 0a 7d 0a 0a  turn out.pZ;.}..
3260: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 74 66  static void *utf
3270: 38 74 6f 55 74 66 31 36 28 63 6f 6e 73 74 20 75  8toUtf16(const u
3280: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 49  nsigned char *pI
3290: 6e 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 62 69  n, int N, int bi
32a0: 67 5f 65 6e 64 69 61 6e 29 7b 0a 20 20 55 74 66  g_endian){.  Utf
32b0: 53 74 72 69 6e 67 20 69 6e 3b 0a 20 20 55 74 66  String in;.  Utf
32c0: 53 74 72 69 6e 67 20 6f 75 74 3b 0a 0a 20 20 69  String out;..  i
32d0: 6e 2e 70 5a 20 3d 20 28 75 6e 73 69 67 6e 65 64  n.pZ = (unsigned
32e0: 20 63 68 61 72 20 2a 29 70 49 6e 3b 0a 20 20 69   char *)pIn;.  i
32f0: 6e 2e 6e 20 3d 20 4e 3b 0a 20 20 69 6e 2e 63 20  n.n = N;.  in.c 
3300: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 6e 2e 6e  = 0;..  if( in.n
3310: 3c 30 20 29 7b 0a 20 20 20 20 69 6e 2e 6e 20 3d  <0 ){.    in.n =
3320: 20 73 74 72 6c 65 6e 28 69 6e 2e 70 5a 29 3b 0a   strlen(in.pZ);.
3330: 20 20 7d 0a 0a 20 20 2f 2a 20 41 20 55 54 46 2d    }..  /* A UTF-
3340: 31 36 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61  16 encoding of a
3350: 20 75 6e 69 63 6f 64 65 20 73 74 72 69 6e 67 20   unicode string 
3360: 63 61 6e 20 72 65 71 75 69 72 65 20 61 74 20 6d  can require at m
3370: 6f 73 74 20 74 77 69 63 65 20 61 73 0a 20 20 2a  ost twice as.  *
3380: 2a 20 6d 75 63 68 20 73 70 61 63 65 20 74 6f 20  * much space to 
3390: 73 74 6f 72 65 20 61 73 20 74 68 65 20 73 61 6d  store as the sam
33a0: 65 20 73 74 72 69 6e 67 20 65 6e 63 6f 64 65 64  e string encoded
33b0: 20 75 73 69 6e 67 20 55 54 46 2d 38 2e 20 41 6c   using UTF-8. Al
33c0: 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 69 73  locate.  ** this
33d0: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6f 75 74   now..  */.  out
33e0: 2e 6e 20 3d 20 28 69 6e 2e 6e 2a 32 29 20 2b 20  .n = (in.n*2) + 
33f0: 32 3b 0a 20 20 6f 75 74 2e 70 5a 20 3d 20 73 71  2;.  out.pZ = sq
3400: 6c 69 74 65 4d 61 6c 6c 6f 63 28 6f 75 74 2e 6e  liteMalloc(out.n
3410: 29 3b 0a 20 20 69 66 28 20 21 6f 75 74 2e 70 5a  );.  if( !out.pZ
3420: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
3430: 3b 0a 20 20 7d 0a 20 20 6f 75 74 2e 63 20 3d 20  ;.  }.  out.c = 
3440: 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 69 6e 2e  0;..  while( in.
3450: 63 3c 69 6e 2e 6e 20 29 7b 0a 20 20 20 20 77 72  c<in.n ){.    wr
3460: 69 74 65 55 74 66 31 36 28 26 6f 75 74 2c 20 72  iteUtf16(&out, r
3470: 65 61 64 55 74 66 38 28 26 69 6e 29 2c 20 62 69  eadUtf8(&in), bi
3480: 67 5f 65 6e 64 69 61 6e 29 3b 0a 20 20 7d 0a 0a  g_endian);.  }..
3490: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4e 55 4c    /* Add the NUL
34a0: 4c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61  L-terminator cha
34b0: 72 61 63 74 65 72 20 2a 2f 0a 20 20 61 73 73 65  racter */.  asse
34c0: 72 74 28 20 28 6f 75 74 2e 63 2b 31 29 3c 6f 75  rt( (out.c+1)<ou
34d0: 74 2e 6e 20 29 3b 0a 20 20 6f 75 74 2e 70 5a 5b  t.n );.  out.pZ[
34e0: 6f 75 74 2e 63 5d 20 3d 20 30 78 30 30 3b 0a 20  out.c] = 0x00;. 
34f0: 20 6f 75 74 2e 70 5a 5b 6f 75 74 2e 63 2b 31 5d   out.pZ[out.c+1]
3500: 20 3d 20 30 78 30 30 3b 0a 0a 20 20 72 65 74 75   = 0x00;..  retu
3510: 72 6e 20 6f 75 74 2e 70 5a 3b 0a 7d 0a 0a 2f 2a  rn out.pZ;.}../*
3520: 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 55 54  .** Translate UT
3530: 46 2d 38 20 74 6f 20 55 54 46 2d 31 36 42 45 20  F-8 to UTF-16BE 
3540: 6f 72 20 55 54 46 2d 31 36 4c 45 0a 2a 2f 0a 76  or UTF-16LE.*/.v
3550: 6f 69 64 20 2a 73 71 6c 69 74 65 33 75 74 66 38  oid *sqlite3utf8
3560: 74 6f 31 36 62 65 28 63 6f 6e 73 74 20 75 6e 73  to16be(const uns
3570: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 49 6e 2c  igned char *pIn,
3580: 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65 74 75 72   int N){.  retur
3590: 6e 20 75 74 66 38 74 6f 55 74 66 31 36 28 70 49  n utf8toUtf16(pI
35a0: 6e 2c 20 4e 2c 20 31 29 3b 0a 7d 0a 0a 76 6f 69  n, N, 1);.}..voi
35b0: 64 20 2a 73 71 6c 69 74 65 33 75 74 66 38 74 6f  d *sqlite3utf8to
35c0: 31 36 6c 65 28 63 6f 6e 73 74 20 75 6e 73 69 67  16le(const unsig
35d0: 6e 65 64 20 63 68 61 72 20 2a 70 49 6e 2c 20 69  ned char *pIn, i
35e0: 6e 74 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20  nt N){.  return 
35f0: 75 74 66 38 74 6f 55 74 66 31 36 28 70 49 6e 2c  utf8toUtf16(pIn,
3600: 20 4e 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a   N, 0);.}../* .*
3610: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
3620: 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 66 6f 72  oes the work for
3630: 20 73 71 6c 69 74 65 33 75 74 66 31 36 74 6f 31   sqlite3utf16to1
3640: 36 6c 65 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c  6le() and.** sql
3650: 69 74 65 33 75 74 66 31 36 74 6f 31 36 62 65 28  ite3utf16to16be(
3660: 29 2e 20 49 66 20 62 69 67 5f 65 6e 64 69 61 6e  ). If big_endian
3670: 20 69 73 20 31 20 74 68 65 20 69 6e 70 75 74 20   is 1 the input 
3680: 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 74 72 61  string is.** tra
3690: 6e 73 66 6f 72 6d 65 64 20 69 6e 20 70 6c 61 63  nsformed in plac
36a0: 65 20 74 6f 20 55 54 46 2d 31 36 42 45 20 65 6e  e to UTF-16BE en
36b0: 63 6f 64 69 6e 67 2e 20 49 66 20 62 69 67 5f 65  coding. If big_e
36c0: 6e 64 69 61 6e 20 69 73 20 30 20 74 68 65 6e 0a  ndian is 0 then.
36d0: 2a 2a 20 74 68 65 20 69 6e 70 75 74 20 69 73 20  ** the input is 
36e0: 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 20 55  transformed to U
36f0: 54 46 2d 31 36 4c 45 2e 0a 2a 2a 0a 2a 2a 20 55  TF-16LE..**.** U
3700: 6e 6c 65 73 73 20 74 68 65 20 66 69 72 73 74 20  nless the first 
3710: 74 77 6f 20 62 79 74 65 73 20 6f 66 20 74 68 65  two bytes of the
3720: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 69 73   input string is
3730: 20 61 20 42 4f 4d 2c 20 74 68 65 20 69 6e 70 75   a BOM, the inpu
3740: 74 20 69 73 0a 2a 2a 20 61 73 73 75 6d 65 64 20  t is.** assumed 
3750: 74 6f 20 62 65 20 55 54 46 2d 31 36 20 65 6e 63  to be UTF-16 enc
3760: 6f 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 6d  oded using the m
3770: 61 63 68 69 6e 65 73 20 6e 61 74 69 76 65 20 62  achines native b
3780: 79 74 65 20 6f 72 64 65 72 69 6e 67 2e 0a 2a 2f  yte ordering..*/
3790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 74 66  .static void utf
37a0: 31 36 74 6f 31 36 28 76 6f 69 64 20 2a 70 44 61  16to16(void *pDa
37b0: 74 61 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 62  ta, int N, int b
37c0: 69 67 5f 65 6e 64 69 61 6e 29 7b 0a 20 20 55 74  ig_endian){.  Ut
37d0: 66 53 74 72 69 6e 67 20 69 6e 6f 75 74 3b 0a 20  fString inout;. 
37e0: 20 69 6e 6f 75 74 2e 70 5a 20 3d 20 28 75 6e 73   inout.pZ = (uns
37f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 44 61  igned char *)pDa
3800: 74 61 3b 0a 20 20 69 6e 6f 75 74 2e 63 20 3d 20  ta;.  inout.c = 
3810: 30 3b 0a 20 20 69 6e 6f 75 74 2e 6e 20 3d 20 4e  0;.  inout.n = N
3820: 3b 0a 0a 20 20 69 66 28 20 69 6e 6f 75 74 2e 6e  ;..  if( inout.n
3830: 3c 30 20 29 7b 0a 20 20 20 20 69 6e 6f 75 74 2e  <0 ){.    inout.
3840: 6e 20 3d 20 73 71 6c 69 74 65 33 75 74 66 31 36  n = sqlite3utf16
3850: 42 79 74 65 4c 65 6e 28 69 6e 6f 75 74 2e 70 5a  ByteLen(inout.pZ
3860: 2c 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  , -1);.  }..  if
3870: 28 20 72 65 61 64 55 74 66 31 36 42 6f 6d 28 26  ( readUtf16Bom(&
3880: 69 6e 6f 75 74 2c 20 53 51 4c 49 54 45 33 5f 42  inout, SQLITE3_B
3890: 49 47 45 4e 44 49 41 4e 29 21 3d 62 69 67 5f 65  IGENDIAN)!=big_e
38a0: 6e 64 69 61 6e 20 29 7b 0a 20 20 20 20 2f 2a 20  ndian ){.    /* 
38b0: 73 77 61 62 28 26 69 6e 6f 75 74 2e 70 5a 5b 69  swab(&inout.pZ[i
38c0: 6e 6f 75 74 2e 63 5d 2c 20 69 6e 6f 75 74 2e 70  nout.c], inout.p
38d0: 5a 2c 20 69 6e 6f 75 74 2e 6e 2d 69 6e 6f 75 74  Z, inout.n-inout
38e0: 2e 63 29 3b 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .c); */.    int 
38f0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
3900: 69 3c 28 69 6e 6f 75 74 2e 6e 2d 69 6e 6f 75 74  i<(inout.n-inout
3910: 2e 63 29 3b 20 69 20 2b 3d 20 32 29 7b 0a 20 20  .c); i += 2){.  
3920: 20 20 20 20 63 68 61 72 20 63 31 20 3d 20 69 6e      char c1 = in
3930: 6f 75 74 2e 70 5a 5b 69 2b 69 6e 6f 75 74 2e 63  out.pZ[i+inout.c
3940: 5d 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 32  ];.      char c2
3950: 20 3d 20 69 6e 6f 75 74 2e 70 5a 5b 69 2b 69 6e   = inout.pZ[i+in
3960: 6f 75 74 2e 63 2b 31 5d 3b 0a 20 20 20 20 20 20  out.c+1];.      
3970: 69 6e 6f 75 74 2e 70 5a 5b 69 5d 20 3d 20 63 32  inout.pZ[i] = c2
3980: 3b 0a 20 20 20 20 20 20 69 6e 6f 75 74 2e 70 5a  ;.      inout.pZ
3990: 5b 69 2b 31 5d 20 3d 20 63 31 3b 0a 20 20 20 20  [i+1] = c1;.    
39a0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 6e  }.  }else if( in
39b0: 6f 75 74 2e 63 20 29 7b 0a 20 20 20 20 6d 65 6d  out.c ){.    mem
39c0: 6d 6f 76 65 28 69 6e 6f 75 74 2e 70 5a 2c 20 26  move(inout.pZ, &
39d0: 69 6e 6f 75 74 2e 70 5a 5b 69 6e 6f 75 74 2e 63  inout.pZ[inout.c
39e0: 5d 2c 20 69 6e 6f 75 74 2e 6e 2d 69 6e 6f 75 74  ], inout.n-inout
39f0: 2e 63 29 3b 0a 20 20 7d 0a 0a 20 20 69 6e 6f 75  .c);.  }..  inou
3a00: 74 2e 70 5a 5b 69 6e 6f 75 74 2e 6e 2d 69 6e 6f  t.pZ[inout.n-ino
3a10: 75 74 2e 63 5d 20 3d 20 30 78 30 30 3b 0a 20 20  ut.c] = 0x00;.  
3a20: 69 6e 6f 75 74 2e 70 5a 5b 69 6e 6f 75 74 2e 6e  inout.pZ[inout.n
3a30: 2d 69 6e 6f 75 74 2e 63 2b 31 5d 20 3d 20 30 78  -inout.c+1] = 0x
3a40: 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  00;.}../*.** Con
3a50: 76 65 72 74 20 61 20 73 74 72 69 6e 67 20 69 6e  vert a string in
3a60: 20 55 54 46 2d 31 36 20 6e 61 74 69 76 65 20 62   UTF-16 native b
3a70: 79 74 65 20 6f 72 20 77 69 74 68 20 61 20 42 4f  yte or with a BO
3a80: 4d 20 69 6e 74 6f 20 61 20 55 54 46 2d 31 36 4c  M into a UTF-16L
3a90: 45 0a 2a 2a 20 73 74 72 69 6e 67 2e 20 20 54 68  E.** string.  Th
3aa0: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 6f 63 63  e conversion occ
3ab0: 75 72 73 20 69 6e 2d 70 6c 61 63 65 2e 20 20 54  urs in-place.  T
3ac0: 68 65 20 6f 75 74 70 75 74 20 6f 76 65 72 77 72  he output overwr
3ad0: 69 74 65 73 20 74 68 65 0a 2a 2a 20 69 6e 70 75  ites the.** inpu
3ae0: 74 2e 20 20 4e 20 62 79 74 65 73 20 61 72 65 20  t.  N bytes are 
3af0: 63 6f 6e 76 65 72 74 65 64 2e 20 20 49 66 20 4e  converted.  If N
3b00: 20 69 73 20 6e 65 67 61 74 69 76 65 20 65 76 65   is negative eve
3b10: 72 79 74 68 69 6e 67 20 69 73 20 63 6f 6e 76 65  rything is conve
3b20: 72 74 65 64 0a 2a 2a 20 75 70 20 74 6f 20 74 68  rted.** up to th
3b30: 65 20 66 69 72 73 74 20 5c 75 30 30 30 30 20 63  e first \u0000 c
3b40: 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  haracter..**.** 
3b50: 49 66 20 74 68 65 20 6e 61 74 69 76 65 20 62 79  If the native by
3b60: 74 65 20 6f 72 64 65 72 20 69 73 20 6c 69 74 74  te order is litt
3b70: 6c 65 2d 65 6e 64 69 61 6e 20 61 6e 64 20 74 68  le-endian and th
3b80: 65 72 65 20 69 73 20 6e 6f 20 42 4f 4d 2c 20 74  ere is no BOM, t
3b90: 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
3ba0: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ine is a no-op. 
3bb0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 42   If there is a B
3bc0: 4f 4d 20 61 74 20 74 68 65 20 73 74 61 72 74 20  OM at the start 
3bd0: 6f 66 20 74 68 65 20 73 74 72 69 6e 67 2c 0a 2a  of the string,.*
3be0: 2a 20 69 74 20 69 73 20 72 65 6d 6f 76 65 64 2e  * it is removed.
3bf0: 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 69  .**.** Translati
3c00: 6f 6e 20 66 72 6f 6d 20 55 54 46 2d 31 36 4c 45  on from UTF-16LE
3c10: 20 74 6f 20 55 54 46 2d 31 36 42 45 20 61 6e 64   to UTF-16BE and
3c20: 20 62 61 63 6b 20 61 67 61 69 6e 20 69 73 20 61   back again is a
3c30: 63 63 6f 6d 70 6c 69 73 68 65 64 0a 2a 2a 20 75  ccomplished.** u
3c40: 73 69 6e 67 20 74 68 65 20 6c 69 62 72 61 72 79  sing the library
3c50: 20 66 75 6e 63 74 69 6f 6e 20 73 77 61 62 28 29   function swab()
3c60: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3c70: 33 75 74 66 31 36 74 6f 31 36 6c 65 28 76 6f 69  3utf16to16le(voi
3c80: 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 4e 29  d *pData, int N)
3c90: 7b 0a 20 20 75 74 66 31 36 74 6f 31 36 28 70 44  {.  utf16to16(pD
3ca0: 61 74 61 2c 20 4e 2c 20 30 29 3b 0a 7d 0a 0a 2f  ata, N, 0);.}../
3cb0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73  *.** Convert a s
3cc0: 74 72 69 6e 67 20 69 6e 20 55 54 46 2d 31 36 20  tring in UTF-16 
3cd0: 6e 61 74 69 76 65 20 62 79 74 65 20 6f 72 20 77  native byte or w
3ce0: 69 74 68 20 61 20 42 4f 4d 20 69 6e 74 6f 20 61  ith a BOM into a
3cf0: 20 55 54 46 2d 31 36 42 45 0a 2a 2a 20 73 74 72   UTF-16BE.** str
3d00: 69 6e 67 2e 20 20 54 68 65 20 63 6f 6e 76 65 72  ing.  The conver
3d10: 73 69 6f 6e 20 6f 63 63 75 72 73 20 69 6e 2d 70  sion occurs in-p
3d20: 6c 61 63 65 2e 20 20 54 68 65 20 6f 75 74 70 75  lace.  The outpu
3d30: 74 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65  t overwrites the
3d40: 0a 2a 2a 20 69 6e 70 75 74 2e 20 20 4e 20 62 79  .** input.  N by
3d50: 74 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65  tes are converte
3d60: 64 2e 20 20 49 66 20 4e 20 69 73 20 6e 65 67 61  d.  If N is nega
3d70: 74 69 76 65 20 65 76 65 72 79 74 68 69 6e 67 20  tive everything 
3d80: 69 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  is converted.** 
3d90: 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  up to the first 
3da0: 5c 75 30 30 30 30 20 63 68 61 72 61 63 74 65 72  \u0000 character
3db0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
3dc0: 61 74 69 76 65 20 62 79 74 65 20 6f 72 64 65 72  ative byte order
3dd0: 20 69 73 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61   is little-endia
3de0: 6e 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  n and there is n
3df0: 6f 20 42 4f 4d 2c 20 74 68 65 6e 0a 2a 2a 20 74  o BOM, then.** t
3e00: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
3e10: 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 72   no-op.  If ther
3e20: 65 20 69 73 20 61 20 42 4f 4d 20 61 74 20 74 68  e is a BOM at th
3e30: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 73  e start of the s
3e40: 74 72 69 6e 67 2c 0a 2a 2a 20 69 74 20 69 73 20  tring,.** it is 
3e50: 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  removed..**.** T
3e60: 72 61 6e 73 6c 61 74 69 6f 6e 20 66 72 6f 6d 20  ranslation from 
3e70: 55 54 46 2d 31 36 4c 45 20 74 6f 20 55 54 46 2d  UTF-16LE to UTF-
3e80: 31 36 42 45 20 61 6e 64 20 62 61 63 6b 20 61 67  16BE and back ag
3e90: 61 69 6e 20 69 73 20 61 63 63 6f 6d 70 6c 69 73  ain is accomplis
3ea0: 68 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  hed.** using the
3eb0: 20 6c 69 62 72 61 72 79 20 66 75 6e 63 74 69 6f   library functio
3ec0: 6e 20 73 77 61 62 28 29 2e 0a 2a 2f 0a 76 6f 69  n swab()..*/.voi
3ed0: 64 20 73 71 6c 69 74 65 33 75 74 66 31 36 74 6f  d sqlite3utf16to
3ee0: 31 36 62 65 28 76 6f 69 64 20 2a 70 44 61 74 61  16be(void *pData
3ef0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 75 74 66 31  , int N){.  utf1
3f00: 36 74 6f 31 36 28 70 44 61 74 61 2c 20 4e 2c 20  6to16(pData, N, 
3f10: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  1);.}../*.** Thi
3f20: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
3f30: 65 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20  ed to translate 
3f40: 62 65 74 77 65 65 6e 20 55 54 46 2d 38 20 61 6e  between UTF-8 an
3f50: 64 20 55 54 46 2d 31 36 2e 20 54 68 65 0a 2a 2a  d UTF-16. The.**
3f60: 20 72 65 73 75 6c 74 20 69 73 20 72 65 74 75 72   result is retur
3f70: 6e 65 64 20 69 6e 20 64 79 6e 61 6d 69 63 61 6c  ned in dynamical
3f80: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d  ly allocated mem
3f90: 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ory..*/.int sqli
3fa0: 74 65 33 75 74 66 54 72 61 6e 73 6c 61 74 65 28  te3utfTranslate(
3fb0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
3fc0: 44 61 74 61 2c 0a 20 20 69 6e 74 20 6e 44 61 74  Data,.  int nDat
3fd0: 61 2c 0a 20 20 75 38 20 65 6e 63 31 2c 0a 20 20  a,.  u8 enc1,.  
3fe0: 76 6f 69 64 20 2a 2a 7a 4f 75 74 2c 0a 20 20 69  void **zOut,.  i
3ff0: 6e 74 20 2a 6e 4f 75 74 2c 0a 20 20 75 38 20 65  nt *nOut,.  u8 e
4000: 6e 63 32 0a 29 7b 0a 20 20 61 73 73 65 72 74 28  nc2.){.  assert(
4010: 20 65 6e 63 31 3d 3d 54 45 58 54 5f 55 74 66 38   enc1==TEXT_Utf8
4020: 20 7c 7c 20 65 6e 63 31 3d 3d 54 45 58 54 5f 55   || enc1==TEXT_U
4030: 74 66 31 36 6c 65 20 7c 7c 20 65 6e 63 31 3d 3d  tf16le || enc1==
4040: 54 45 58 54 5f 55 74 66 31 36 62 65 20 29 3b 0a  TEXT_Utf16be );.
4050: 20 20 61 73 73 65 72 74 28 20 65 6e 63 32 3d 3d    assert( enc2==
4060: 54 45 58 54 5f 55 74 66 38 20 7c 7c 20 65 6e 63  TEXT_Utf8 || enc
4070: 32 3d 3d 54 45 58 54 5f 55 74 66 31 36 6c 65 20  2==TEXT_Utf16le 
4080: 7c 7c 20 65 6e 63 32 3d 3d 54 45 58 54 5f 55 74  || enc2==TEXT_Ut
4090: 66 31 36 62 65 20 29 3b 0a 20 20 61 73 73 65 72  f16be );.  asser
40a0: 74 28 20 0a 20 20 20 20 28 65 6e 63 31 3d 3d 54  t( .    (enc1==T
40b0: 45 58 54 5f 55 74 66 38 20 26 26 20 28 65 6e 63  EXT_Utf8 && (enc
40c0: 32 3d 3d 54 45 58 54 5f 55 74 66 31 36 6c 65 20  2==TEXT_Utf16le 
40d0: 7c 7c 20 65 6e 63 32 3d 3d 54 45 58 54 5f 55 74  || enc2==TEXT_Ut
40e0: 66 31 36 62 65 29 29 20 7c 7c 0a 20 20 20 20 28  f16be)) ||.    (
40f0: 65 6e 63 32 3d 3d 54 45 58 54 5f 55 74 66 38 20  enc2==TEXT_Utf8 
4100: 26 26 20 28 65 6e 63 31 3d 3d 54 45 58 54 5f 55  && (enc1==TEXT_U
4110: 74 66 31 36 6c 65 20 7c 7c 20 65 6e 63 31 3d 3d  tf16le || enc1==
4120: 54 45 58 54 5f 55 74 66 31 36 62 65 29 29 0a 20  TEXT_Utf16be)). 
4130: 20 29 3b 0a 0a 20 20 69 66 28 20 65 6e 63 31 3d   );..  if( enc1=
4140: 3d 54 45 58 54 5f 55 74 66 38 20 29 7b 0a 20 20  =TEXT_Utf8 ){.  
4150: 20 20 69 66 28 20 65 6e 63 32 3d 3d 54 45 58 54    if( enc2==TEXT
4160: 5f 55 74 66 31 36 6c 65 20 29 7b 0a 20 20 20 20  _Utf16le ){.    
4170: 20 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65    *zOut = sqlite
4180: 33 75 74 66 38 74 6f 31 36 6c 65 28 7a 44 61 74  3utf8to16le(zDat
4190: 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20 20 7d  a, nData);.    }
41a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 7a 4f 75  else{.      *zOu
41b0: 74 20 3d 20 73 71 6c 69 74 65 33 75 74 66 38 74  t = sqlite3utf8t
41c0: 6f 31 36 62 65 28 7a 44 61 74 61 2c 20 6e 44 61  o16be(zData, nDa
41d0: 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ta);.    }.    i
41e0: 66 28 20 21 28 2a 7a 4f 75 74 29 20 29 20 72 65  f( !(*zOut) ) re
41f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
4200: 4d 3b 0a 20 20 20 20 2a 6e 4f 75 74 20 3d 20 73  M;.    *nOut = s
4210: 71 6c 69 74 65 33 75 74 66 31 36 42 79 74 65 4c  qlite3utf16ByteL
4220: 65 6e 28 2a 7a 4f 75 74 2c 20 2d 31 29 2b 32 3b  en(*zOut, -1)+2;
4230: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 7a  .  }else{.    *z
4240: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 75 74 66  Out = sqlite3utf
4250: 31 36 74 6f 38 28 7a 44 61 74 61 2c 20 6e 44 61  16to8(zData, nDa
4260: 74 61 2c 20 65 6e 63 31 3d 3d 54 45 58 54 5f 55  ta, enc1==TEXT_U
4270: 74 66 31 36 62 65 29 3b 0a 20 20 20 20 69 66 28  tf16be);.    if(
4280: 20 21 28 2a 7a 4f 75 74 29 20 29 20 72 65 74 75   !(*zOut) ) retu
4290: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
42a0: 0a 20 20 20 20 2a 6e 4f 75 74 20 3d 20 73 74 72  .    *nOut = str
42b0: 6c 65 6e 28 2a 7a 4f 75 74 29 2b 31 3b 0a 20 20  len(*zOut)+1;.  
42c0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
42d0: 45 5f 4f 4b 3b 0a 7d 0a                          E_OK;.}.