/ Hex Artifact Content
Login

Artifact c2c8e445bfea724f3502609d6389fe66651f02ab:


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 31 38 20 32  : utf.c,v 1.18 2
01f0: 30 30 34 2f 30 36 2f 30 36 20 31 32 3a 34 31 3a  004/06/06 12:41:
0200: 35 30 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  50 danielk1977 E
0210: 78 70 20 24 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73  xp $.**.** Notes
0220: 20 6f 6e 20 55 54 46 2d 38 3a 0a 2a 2a 0a 2a 2a   on UTF-8:.**.**
0230: 20 20 20 42 79 74 65 2d 30 20 20 20 20 42 79 74     Byte-0    Byt
0240: 65 2d 31 20 20 20 20 42 79 74 65 2d 32 20 20 20  e-1    Byte-2   
0250: 20 42 79 74 65 2d 33 20 20 20 20 56 61 6c 75 65   Byte-3    Value
0260: 0a 2a 2a 20 20 30 78 78 78 78 78 78 78 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 20 30 30                00
0290: 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20  000000 00000000 
02a0: 30 78 78 78 78 78 78 78 0a 2a 2a 20 20 31 31 30  0xxxxxxx.**  110
02b0: 79 79 79 79 79 20 20 31 30 78 78 78 78 78 78 20  yyyyy  10xxxxxx 
02c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02d0: 20 20 20 20 20 20 30 30 30 30 30 30 30 30 20 30        00000000 0
02e0: 30 30 30 30 79 79 79 20 79 79 78 78 78 78 78 78  0000yyy yyxxxxxx
02f0: 0a 2a 2a 20 20 31 31 31 30 7a 7a 7a 7a 20 20 31  .**  1110zzzz  1
0300: 30 79 79 79 79 79 79 20 20 31 30 78 78 78 78 78  0yyyyyy  10xxxxx
0310: 78 20 20 20 20 20 20 20 20 20 20 20 20 20 30 30  x             00
0320: 30 30 30 30 30 30 20 7a 7a 7a 7a 79 79 79 79 20  000000 zzzzyyyy 
0330: 79 79 78 78 78 78 78 78 0a 2a 2a 20 20 31 31 31  yyxxxxxx.**  111
0340: 31 30 75 75 75 20 20 31 30 75 75 7a 7a 7a 7a 20  10uuu  10uuzzzz 
0350: 20 31 30 79 79 79 79 79 79 20 20 31 30 78 78 78   10yyyyyy  10xxx
0360: 78 78 78 20 20 20 30 30 30 75 75 75 75 75 20 7a  xxx   000uuuuu z
0370: 7a 7a 7a 79 79 79 79 20 79 79 78 78 78 78 78 78  zzzyyyy yyxxxxxx
0380: 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73 20  .**.**.** Notes 
0390: 6f 6e 20 55 54 46 2d 31 36 3a 20 20 28 77 69 74  on UTF-16:  (wit
03a0: 68 20 77 77 77 77 2b 31 3d 3d 75 75 75 75 75 29  h wwww+1==uuuuu)
03b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 57 6f 72 64  .**.**      Word
03c0: 2d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  -0              
03d0: 20 57 6f 72 64 2d 31 20 20 20 20 20 20 20 20 20   Word-1         
03e0: 20 56 61 6c 75 65 0a 2a 2a 20 20 31 31 30 31 31   Value.**  11011
03f0: 30 77 77 20 77 77 7a 7a 7a 7a 79 79 20 20 20 31  0ww wwzzzzyy   1
0400: 31 30 31 31 31 79 79 20 79 79 78 78 78 78 78 78  10111yy yyxxxxxx
0410: 20 20 20 20 30 30 30 75 75 75 75 75 20 7a 7a 7a      000uuuuu zzz
0420: 7a 79 79 79 79 20 79 79 78 78 78 78 78 78 0a 2a  zyyyy yyxxxxxx.*
0430: 2a 20 20 7a 7a 7a 7a 79 79 79 79 20 79 79 78 78  *  zzzzyyyy yyxx
0440: 78 78 78 78 20 20 20 20 20 20 20 20 20 20 20 20  xxxx            
0450: 20 20 20 20 20 20 20 20 20 20 20 20 30 30 30 30              0000
0460: 30 30 30 30 20 7a 7a 7a 7a 79 79 79 79 20 79 79  0000 zzzzyyyy yy
0470: 78 78 78 78 78 78 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  xxxxxx.**.**.** 
0480: 42 4f 4d 20 6f 72 20 42 79 74 65 20 4f 72 64 65  BOM or Byte Orde
0490: 72 20 4d 61 72 6b 3a 0a 2a 2a 20 20 20 20 20 30  r Mark:.**     0
04a0: 78 66 66 20 30 78 66 65 20 20 20 6c 69 74 74 6c  xff 0xfe   littl
04b0: 65 2d 65 6e 64 69 61 6e 20 75 74 66 2d 31 36 20  e-endian utf-16 
04c0: 66 6f 6c 6c 6f 77 73 0a 2a 2a 20 20 20 20 20 30  follows.**     0
04d0: 78 66 65 20 30 78 66 66 20 20 20 62 69 67 2d 65  xfe 0xff   big-e
04e0: 6e 64 69 61 6e 20 75 74 66 2d 31 36 20 66 6f 6c  ndian utf-16 fol
04f0: 6c 6f 77 73 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 61  lows.**.**.** Ha
0500: 6e 64 6c 69 6e 67 20 6f 66 20 6d 61 6c 66 6f 72  ndling of malfor
0510: 6d 65 64 20 73 74 72 69 6e 67 73 3a 0a 2a 2a 0a  med strings:.**.
0520: 2a 2a 20 53 51 4c 69 74 65 20 61 63 63 65 70 74  ** SQLite accept
0530: 73 20 61 6e 64 20 70 72 6f 63 65 73 73 65 73 20  s and processes 
0540: 6d 61 6c 66 6f 72 6d 65 64 20 73 74 72 69 6e 67  malformed string
0550: 73 20 77 69 74 68 6f 75 74 20 61 6e 20 65 72 72  s without an err
0560: 6f 72 20 77 68 65 72 65 76 65 72 0a 2a 2a 20 70  or wherever.** p
0570: 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72  ossible. However
0580: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 70 6f 73   this is not pos
0590: 73 69 62 6c 65 20 77 68 65 6e 20 63 6f 6e 76 65  sible when conve
05a0: 72 74 69 6e 67 20 62 65 74 77 65 65 6e 20 55 54  rting between UT
05b0: 46 2d 38 20 61 6e 64 0a 2a 2a 20 55 54 46 2d 31  F-8 and.** UTF-1
05c0: 36 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f  6..**.** When co
05d0: 6e 76 65 72 74 69 6e 67 20 6d 61 6c 66 6f 72 6d  nverting malform
05e0: 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67 73  ed UTF-8 strings
05f0: 20 74 6f 20 55 54 46 2d 31 36 2c 20 6f 6e 65 20   to UTF-16, one 
0600: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 0a  instance of the.
0610: 2a 2a 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 63  ** replacement c
0620: 68 61 72 61 63 74 65 72 20 55 2b 46 46 46 44 20  haracter U+FFFD 
0630: 66 6f 72 20 65 61 63 68 20 62 79 74 65 20 74 68  for each byte th
0640: 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 69 6e 74  at cannot be int
0650: 65 72 70 65 74 65 64 20 61 73 0a 2a 2a 20 70 61  erpeted as.** pa
0660: 72 74 20 6f 66 20 61 20 76 61 6c 69 64 20 75 6e  rt of a valid un
0670: 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 2e  icode character.
0680: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6e 76  .**.** When conv
0690: 65 72 74 69 6e 67 20 6d 61 6c 66 6f 72 6d 65 64  erting malformed
06a0: 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67 73 20   UTF-16 strings 
06b0: 74 6f 20 55 54 46 2d 38 2c 20 6f 6e 65 20 69 6e  to UTF-8, one in
06c0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 0a 2a 2a  stance of the.**
06d0: 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 63 68 61   replacement cha
06e0: 72 61 63 74 65 72 20 55 2b 46 46 46 44 20 66 6f  racter U+FFFD fo
06f0: 72 20 65 61 63 68 20 70 61 69 72 20 6f 66 20 62  r each pair of b
0700: 79 74 65 73 20 74 68 61 74 20 63 61 6e 6e 6f 74  ytes that cannot
0710: 20 62 65 0a 2a 2a 20 69 6e 74 65 72 70 65 74 65   be.** interpete
0720: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 76  d as part of a v
0730: 61 6c 69 64 20 75 6e 69 63 6f 64 65 20 63 68 61  alid unicode cha
0740: 72 61 63 74 65 72 2e 0a 2a 2f 0a 23 69 6e 63 6c  racter..*/.#incl
0750: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
0760: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0770: 6e 74 2e 68 22 0a 0a 74 79 70 65 64 65 66 20 73  nt.h"..typedef s
0780: 74 72 75 63 74 20 55 74 66 53 74 72 69 6e 67 20  truct UtfString 
0790: 55 74 66 53 74 72 69 6e 67 3b 0a 73 74 72 75 63  UtfString;.struc
07a0: 74 20 55 74 66 53 74 72 69 6e 67 20 7b 0a 20 20  t UtfString {.  
07b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
07c0: 5a 3b 20 20 20 20 2f 2a 20 52 61 77 20 73 74 72  Z;    /* Raw str
07d0: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  ing data */.  in
07e0: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
07f0: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
0800: 20 6c 65 6e 67 74 68 20 6f 66 20 70 5a 20 69 6e   length of pZ in
0810: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
0820: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
0830: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
0840: 5a 20 62 79 74 65 73 20 61 6c 72 65 61 64 79 20  Z bytes already 
0850: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
0860: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
0870: 73 65 20 74 77 6f 20 6d 61 63 72 6f 73 20 61 72  se two macros ar
0880: 65 20 75 73 65 64 20 74 6f 20 69 6e 74 65 72 70  e used to interp
0890: 72 65 74 20 74 68 65 20 66 69 72 73 74 20 74 77  ret the first tw
08a0: 6f 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 0a  o bytes of the .
08b0: 2a 2a 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ** unsigned char
08c0: 20 61 72 72 61 79 20 70 5a 20 61 73 20 61 20 31   array pZ as a 1
08d0: 36 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69  6-bit unsigned i
08e0: 6e 74 2e 20 42 45 31 36 28 29 20 66 6f 72 20 61  nt. BE16() for a
08f0: 20 62 69 67 2d 65 6e 64 69 61 6e 0a 2a 2a 20 69   big-endian.** i
0900: 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 2c 20 4c  nterpretation, L
0910: 45 31 36 28 29 20 66 6f 72 20 6c 69 74 74 6c 65  E16() for little
0920: 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 23 64 65 66  -endian..*/.#def
0930: 69 6e 65 20 42 45 31 36 28 70 5a 29 20 28 28 28  ine BE16(pZ) (((
0940: 75 31 36 29 28 28 70 5a 29 5b 30 5d 29 3c 3c 38  u16)((pZ)[0])<<8
0950: 29 20 2b 20 28 75 31 36 29 28 28 70 5a 29 5b 31  ) + (u16)((pZ)[1
0960: 5d 29 29 0a 23 64 65 66 69 6e 65 20 4c 45 31 36  ])).#define LE16
0970: 28 70 5a 29 20 28 28 28 75 31 36 29 28 28 70 5a  (pZ) (((u16)((pZ
0980: 29 5b 31 5d 29 3c 3c 38 29 20 2b 20 28 75 31 36  )[1])<<8) + (u16
0990: 29 28 28 70 5a 29 5b 30 5d 29 29 0a 0a 2f 2a 0a  )((pZ)[0]))../*.
09a0: 2a 2a 20 52 45 41 44 5f 31 36 20 69 6e 74 65 72  ** READ_16 inter
09b0: 70 72 65 74 73 20 74 68 65 20 66 69 72 73 74 20  prets the first 
09c0: 74 77 6f 20 62 79 74 65 73 20 6f 66 20 74 68 65  two bytes of the
09d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
09e0: 72 72 61 79 20 70 5a 20 0a 2a 2a 20 61 73 20 61  rray pZ .** as a
09f0: 20 31 36 2d 62 69 74 20 75 6e 73 69 67 6e 65 64   16-bit unsigned
0a00: 20 69 6e 74 2e 20 49 66 20 62 69 67 5f 65 6e 64   int. If big_end
0a10: 69 61 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ian is non-zero 
0a20: 74 68 65 20 69 6e 74 65 70 72 65 74 61 74 69 6f  the intepretatio
0a30: 6e 0a 2a 2a 20 69 73 20 62 69 67 2d 65 6e 64 69  n.** is big-endi
0a40: 61 6e 2c 20 6f 74 68 65 72 77 69 73 65 20 6c 69  an, otherwise li
0a50: 74 74 6c 65 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a  ttle-endian..*/.
0a60: 23 64 65 66 69 6e 65 20 52 45 41 44 5f 31 36 28  #define READ_16(
0a70: 70 5a 2c 62 69 67 5f 65 6e 64 69 61 6e 29 20 28  pZ,big_endian) (
0a80: 62 69 67 5f 65 6e 64 69 61 6e 3f 42 45 31 36 28  big_endian?BE16(
0a90: 70 5a 29 3a 4c 45 31 36 28 70 5a 29 29 0a 0a 2f  pZ):LE16(pZ))../
0aa0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
0ab0: 6e 67 20 6d 61 63 72 6f 2c 20 4c 4f 57 45 52 43  ng macro, LOWERC
0ac0: 41 53 45 28 78 29 2c 20 74 61 6b 65 73 20 61 6e  ASE(x), takes an
0ad0: 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73 65   integer represe
0ae0: 6e 74 69 6e 67 20 61 0a 2a 2a 20 75 6e 69 63 6f  nting a.** unico
0af0: 64 65 20 63 6f 64 65 20 70 6f 69 6e 74 2e 20 54  de code point. T
0b00: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
0b10: 64 20 69 73 20 74 68 65 20 73 61 6d 65 20 63 6f  d is the same co
0b20: 64 65 20 70 6f 69 6e 74 20 66 6f 6c 64 65 64 20  de point folded 
0b30: 74 6f 0a 2a 2a 20 6c 6f 77 65 72 20 63 61 73 65  to.** lower case
0b40: 2c 20 69 66 20 61 70 70 6c 69 63 61 62 6c 65 2e  , if applicable.
0b50: 20 53 51 4c 69 74 65 20 63 75 72 72 65 6e 74 6c   SQLite currentl
0b60: 79 20 75 6e 64 65 72 73 74 61 6e 64 73 20 74 68  y understands th
0b70: 65 20 75 70 70 65 72 2f 6c 6f 77 65 72 0a 2a 2a  e upper/lower.**
0b80: 20 63 61 73 65 20 72 65 6c 61 74 69 6f 6e 73 68   case relationsh
0b90: 69 70 20 62 65 74 77 65 65 6e 20 74 68 65 20 32  ip between the 2
0ba0: 36 20 63 68 61 72 61 63 74 65 72 73 20 75 73 65  6 characters use
0bb0: 64 20 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68  d in the English
0bc0: 0a 2a 2a 20 6c 61 6e 67 75 61 67 65 20 6f 6e 6c  .** language onl
0bd0: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65  y..**.** This me
0be0: 61 6e 73 20 74 68 61 74 20 63 68 61 72 61 63 74  ans that charact
0bf0: 65 72 73 20 77 69 74 68 20 75 6d 6c 61 75 74 73  ers with umlauts
0c00: 20 65 74 63 2e 20 77 69 6c 6c 20 6e 6f 74 20 62   etc. will not b
0c10: 65 20 66 6f 6c 64 65 64 0a 2a 2a 20 63 6f 72 72  e folded.** corr
0c20: 65 63 74 6c 79 20 28 75 6e 6c 65 73 73 20 74 68  ectly (unless th
0c30: 65 79 20 61 72 65 20 65 6e 63 6f 64 65 64 20 61  ey are encoded a
0c40: 73 20 63 6f 6d 70 6f 73 69 74 65 20 63 68 61 72  s composite char
0c50: 61 63 74 65 72 73 2c 20 77 68 69 63 68 20 77 6f  acters, which wo
0c60: 75 6c 64 0a 2a 2a 20 64 6f 75 62 74 6c 65 73 73  uld.** doubtless
0c70: 20 63 61 75 73 65 20 6d 75 63 68 20 74 72 6f 75   cause much trou
0c80: 62 6c 65 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ble)..*/.#define
0c90: 20 4c 4f 57 45 52 43 41 53 45 28 78 29 20 28 78   LOWERCASE(x) (x
0ca0: 3c 39 31 3f 28 69 6e 74 29 28 55 70 70 65 72 54  <91?(int)(UpperT
0cb0: 6f 4c 6f 77 65 72 5b 78 5d 29 3a 78 29 3b 0a 73  oLower[x]):x);.s
0cc0: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63  tatic unsigned c
0cd0: 68 61 72 20 55 70 70 65 72 54 6f 4c 6f 77 65 72  har UpperToLower
0ce0: 5b 39 31 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30  [91] = {.      0
0cf0: 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34  ,  1,  2,  3,  4
0d00: 2c 20 20 35 2c 20 20 36 2c 20 20 37 2c 20 20 38  ,  5,  6,  7,  8
0d10: 2c 20 20 39 2c 20 31 30 2c 20 31 31 2c 20 31 32  ,  9, 10, 11, 12
0d20: 2c 20 31 33 2c 20 31 34 2c 20 31 35 2c 20 31 36  , 13, 14, 15, 16
0d30: 2c 20 31 37 2c 0a 20 20 20 20 20 31 38 2c 20 31  , 17,.     18, 1
0d40: 39 2c 20 32 30 2c 20 32 31 2c 20 32 32 2c 20 32  9, 20, 21, 22, 2
0d50: 33 2c 20 32 34 2c 20 32 35 2c 20 32 36 2c 20 32  3, 24, 25, 26, 2
0d60: 37 2c 20 32 38 2c 20 32 39 2c 20 33 30 2c 20 33  7, 28, 29, 30, 3
0d70: 31 2c 20 33 32 2c 20 33 33 2c 20 33 34 2c 20 33  1, 32, 33, 34, 3
0d80: 35 2c 0a 20 20 20 20 20 33 36 2c 20 33 37 2c 20  5,.     36, 37, 
0d90: 33 38 2c 20 33 39 2c 20 34 30 2c 20 34 31 2c 20  38, 39, 40, 41, 
0da0: 34 32 2c 20 34 33 2c 20 34 34 2c 20 34 35 2c 20  42, 43, 44, 45, 
0db0: 34 36 2c 20 34 37 2c 20 34 38 2c 20 34 39 2c 20  46, 47, 48, 49, 
0dc0: 35 30 2c 20 35 31 2c 20 35 32 2c 20 35 33 2c 0a  50, 51, 52, 53,.
0dd0: 20 20 20 20 20 35 34 2c 20 35 35 2c 20 35 36 2c       54, 55, 56,
0de0: 20 35 37 2c 20 35 38 2c 20 35 39 2c 20 36 30 2c   57, 58, 59, 60,
0df0: 20 36 31 2c 20 36 32 2c 20 36 33 2c 20 36 34 2c   61, 62, 63, 64,
0e00: 20 39 37 2c 20 39 38 2c 20 39 39 2c 31 30 30 2c   97, 98, 99,100,
0e10: 31 30 31 2c 31 30 32 2c 31 30 33 2c 0a 20 20 20  101,102,103,.   
0e20: 20 31 30 34 2c 31 30 35 2c 31 30 36 2c 31 30 37   104,105,106,107
0e30: 2c 31 30 38 2c 31 30 39 2c 31 31 30 2c 31 31 31  ,108,109,110,111
0e40: 2c 31 31 32 2c 31 31 33 2c 31 31 34 2c 31 31 35  ,112,113,114,115
0e50: 2c 31 31 36 2c 31 31 37 2c 31 31 38 2c 31 31 39  ,116,117,118,119
0e60: 2c 31 32 30 2c 31 32 31 2c 0a 20 20 20 20 31 32  ,120,121,.    12
0e70: 32 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  2,.};../*.** The
0e80: 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72   first parameter
0e90: 2c 20 7a 53 74 72 2c 20 70 6f 69 6e 74 73 20 61  , zStr, points a
0ea0: 74 20 61 20 75 6e 69 63 6f 64 65 20 73 74 72 69  t a unicode stri
0eb0: 6e 67 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ng. This routine
0ec0: 0a 2a 2a 20 72 65 61 64 73 20 61 20 73 69 6e 67  .** reads a sing
0ed0: 6c 65 20 63 68 61 72 61 63 74 65 72 20 66 72 6f  le character fro
0ee0: 6d 20 74 68 65 20 73 74 72 69 6e 67 20 61 6e 64  m the string and
0ef0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 64   returns the cod
0f00: 65 70 6f 69 6e 74 20 76 61 6c 75 65 0a 2a 2a 20  epoint value.** 
0f10: 6f 66 20 74 68 65 20 63 68 61 72 61 63 74 65 72  of the character
0f20: 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   read..**.** The
0f30: 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 6e 63 20   value of *pEnc 
0f40: 69 73 20 74 68 65 20 73 74 72 69 6e 67 20 65 6e  is the string en
0f50: 63 6f 64 69 6e 67 2e 20 49 66 20 2a 70 45 6e 63  coding. If *pEnc
0f60: 20 69 73 20 54 45 58 54 5f 55 74 66 31 36 6c 65   is TEXT_Utf16le
0f70: 20 6f 72 0a 2a 2a 20 54 45 58 54 5f 55 74 66 31   or.** TEXT_Utf1
0f80: 36 62 65 2c 20 61 6e 64 20 74 68 65 20 66 69 72  6be, and the fir
0f90: 73 74 20 63 68 61 72 61 63 74 65 72 20 72 65 61  st character rea
0fa0: 64 20 69 73 20 61 20 62 79 74 65 2d 6f 72 64 65  d is a byte-orde
0fb0: 72 2d 6d 61 72 6b 2c 20 74 68 65 6e 0a 2a 2a 20  r-mark, then.** 
0fc0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45  the value of *pE
0fd0: 6e 63 20 69 73 20 6d 6f 64 69 66 69 65 64 20 69  nc is modified i
0fe0: 66 20 6e 65 63 65 73 73 61 72 79 2e 20 49 6e 20  f necessary. In 
0ff0: 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6e 65  this case the ne
1000: 78 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 20  xt.** character 
1010: 69 73 20 72 65 61 64 20 61 6e 64 20 69 74 27 73  is read and it's
1020: 20 63 6f 64 65 2d 70 6f 69 6e 74 20 76 61 6c 75   code-point valu
1030: 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  e returned..**.*
1040: 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 2a  * The value of *
1050: 70 4f 66 66 73 65 74 20 69 73 20 74 68 65 20 62  pOffset is the b
1060: 79 74 65 2d 6f 66 66 73 65 74 20 69 6e 20 7a 53  yte-offset in zS
1070: 74 72 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  tr from which to
1080: 20 62 65 67 69 6e 0a 2a 2a 20 72 65 61 64 69 6e   begin.** readin
1090: 67 2e 20 49 74 20 69 73 20 69 6e 63 72 65 6d 65  g. It is increme
10a0: 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  nted by the numb
10b0: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
10c0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
10d0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
10e0: 66 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65 72  fourth parameter
10f0: 2c 20 66 6f 6c 64 2c 20 69 73 20 6e 6f 6e 2d 7a  , fold, is non-z
1100: 65 72 6f 2c 20 74 68 65 6e 20 63 6f 64 65 70 6f  ero, then codepo
1110: 69 6e 74 20 76 61 6c 75 65 73 20 61 72 65 0a 2a  int values are.*
1120: 2a 20 66 6f 6c 64 65 64 20 74 6f 20 6c 6f 77 65  * folded to lowe
1130: 72 2d 63 61 73 65 20 62 65 66 6f 72 65 20 62 65  r-case before be
1140: 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 20 53 65  ing returned. Se
1150: 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 6d  e comments for m
1160: 61 63 72 6f 0a 2a 2a 20 4c 4f 57 45 52 43 41 53  acro.** LOWERCAS
1170: 45 28 78 29 20 66 6f 72 20 64 65 74 61 69 6c 73  E(x) for details
1180: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1190: 52 65 61 64 55 6e 69 43 68 61 72 28 63 6f 6e 73  ReadUniChar(cons
11a0: 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 69 6e  t char *zStr, in
11b0: 74 20 2a 70 4f 66 66 73 65 74 2c 20 75 38 20 2a  t *pOffset, u8 *
11c0: 70 45 6e 63 2c 20 69 6e 74 20 66 6f 6c 64 29 7b  pEnc, int fold){
11d0: 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a  .  int ret = 0;.
11e0: 0a 20 20 73 77 69 74 63 68 28 20 2a 70 45 6e 63  .  switch( *pEnc
11f0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 45 58   ){.    case TEX
1200: 54 5f 55 74 66 38 3a 20 7b 0a 0a 23 69 66 20 30  T_Utf8: {..#if 0
1210: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1220: 69 6e 74 20 69 6e 69 74 56 61 6c 5b 5d 20 3d 20  int initVal[] = 
1230: 7b 0a 20 20 20 20 20 20 30 2c 20 20 20 31 2c 20  {.      0,   1, 
1240: 20 20 32 2c 20 20 20 33 2c 20 20 20 34 2c 20 20    2,   3,   4,  
1250: 20 35 2c 20 20 20 36 2c 20 20 20 37 2c 20 20 20   5,   6,   7,   
1260: 38 2c 20 20 20 39 2c 20 20 31 30 2c 20 20 31 31  8,   9,  10,  11
1270: 2c 20 20 31 32 2c 20 20 31 33 2c 20 20 31 34 2c  ,  12,  13,  14,
1280: 0a 20 20 20 20 20 31 35 2c 20 20 31 36 2c 20 20  .     15,  16,  
1290: 31 37 2c 20 20 31 38 2c 20 20 31 39 2c 20 20 32  17,  18,  19,  2
12a0: 30 2c 20 20 32 31 2c 20 20 32 32 2c 20 20 32 33  0,  21,  22,  23
12b0: 2c 20 20 32 34 2c 20 20 32 35 2c 20 20 32 36 2c  ,  24,  25,  26,
12c0: 20 20 32 37 2c 20 20 32 38 2c 20 20 32 39 2c 0a    27,  28,  29,.
12d0: 20 20 20 20 20 33 30 2c 20 20 33 31 2c 20 20 33       30,  31,  3
12e0: 32 2c 20 20 33 33 2c 20 20 33 34 2c 20 20 33 35  2,  33,  34,  35
12f0: 2c 20 20 33 36 2c 20 20 33 37 2c 20 20 33 38 2c  ,  36,  37,  38,
1300: 20 20 33 39 2c 20 20 34 30 2c 20 20 34 31 2c 20    39,  40,  41, 
1310: 20 34 32 2c 20 20 34 33 2c 20 20 34 34 2c 0a 20   42,  43,  44,. 
1320: 20 20 20 20 34 35 2c 20 20 34 36 2c 20 20 34 37      45,  46,  47
1330: 2c 20 20 34 38 2c 20 20 34 39 2c 20 20 35 30 2c  ,  48,  49,  50,
1340: 20 20 35 31 2c 20 20 35 32 2c 20 20 35 33 2c 20    51,  52,  53, 
1350: 20 35 34 2c 20 20 35 35 2c 20 20 35 36 2c 20 20   54,  55,  56,  
1360: 35 37 2c 20 20 35 38 2c 20 20 35 39 2c 0a 20 20  57,  58,  59,.  
1370: 20 20 20 36 30 2c 20 20 36 31 2c 20 20 36 32 2c     60,  61,  62,
1380: 20 20 36 33 2c 20 20 36 34 2c 20 20 36 35 2c 20    63,  64,  65, 
1390: 20 36 36 2c 20 20 36 37 2c 20 20 36 38 2c 20 20   66,  67,  68,  
13a0: 36 39 2c 20 20 37 30 2c 20 20 37 31 2c 20 20 37  69,  70,  71,  7
13b0: 32 2c 20 20 37 33 2c 20 20 37 34 2c 0a 20 20 20  2,  73,  74,.   
13c0: 20 20 37 35 2c 20 20 37 36 2c 20 20 37 37 2c 20    75,  76,  77, 
13d0: 20 37 38 2c 20 20 37 39 2c 20 20 38 30 2c 20 20   78,  79,  80,  
13e0: 38 31 2c 20 20 38 32 2c 20 20 38 33 2c 20 20 38  81,  82,  83,  8
13f0: 34 2c 20 20 38 35 2c 20 20 38 36 2c 20 20 38 37  4,  85,  86,  87
1400: 2c 20 20 38 38 2c 20 20 38 39 2c 0a 20 20 20 20  ,  88,  89,.    
1410: 20 39 30 2c 20 20 39 31 2c 20 20 39 32 2c 20 20   90,  91,  92,  
1420: 39 33 2c 20 20 39 34 2c 20 20 39 35 2c 20 20 39  93,  94,  95,  9
1430: 36 2c 20 20 39 37 2c 20 20 39 38 2c 20 20 39 39  6,  97,  98,  99
1440: 2c 20 31 30 30 2c 20 31 30 31 2c 20 31 30 32 2c  , 100, 101, 102,
1450: 20 31 30 33 2c 20 31 30 34 2c 0a 20 20 20 20 31   103, 104,.    1
1460: 30 35 2c 20 31 30 36 2c 20 31 30 37 2c 20 31 30  05, 106, 107, 10
1470: 38 2c 20 31 30 39 2c 20 31 31 30 2c 20 31 31 31  8, 109, 110, 111
1480: 2c 20 31 31 32 2c 20 31 31 33 2c 20 31 31 34 2c  , 112, 113, 114,
1490: 20 31 31 35 2c 20 31 31 36 2c 20 31 31 37 2c 20   115, 116, 117, 
14a0: 31 31 38 2c 20 31 31 39 2c 0a 20 20 20 20 31 32  118, 119,.    12
14b0: 30 2c 20 31 32 31 2c 20 31 32 32 2c 20 31 32 33  0, 121, 122, 123
14c0: 2c 20 31 32 34 2c 20 31 32 35 2c 20 31 32 36 2c  , 124, 125, 126,
14d0: 20 31 32 37 2c 20 31 32 38 2c 20 31 32 39 2c 20   127, 128, 129, 
14e0: 31 33 30 2c 20 31 33 31 2c 20 31 33 32 2c 20 31  130, 131, 132, 1
14f0: 33 33 2c 20 31 33 34 2c 0a 20 20 20 20 31 33 35  33, 134,.    135
1500: 2c 20 31 33 36 2c 20 31 33 37 2c 20 31 33 38 2c  , 136, 137, 138,
1510: 20 31 33 39 2c 20 31 34 30 2c 20 31 34 31 2c 20   139, 140, 141, 
1520: 31 34 32 2c 20 31 34 33 2c 20 31 34 34 2c 20 31  142, 143, 144, 1
1530: 34 35 2c 20 31 34 36 2c 20 31 34 37 2c 20 31 34  45, 146, 147, 14
1540: 38 2c 20 31 34 39 2c 0a 20 20 20 20 31 35 30 2c  8, 149,.    150,
1550: 20 31 35 31 2c 20 31 35 32 2c 20 31 35 33 2c 20   151, 152, 153, 
1560: 31 35 34 2c 20 31 35 35 2c 20 31 35 36 2c 20 31  154, 155, 156, 1
1570: 35 37 2c 20 31 35 38 2c 20 31 35 39 2c 20 31 36  57, 158, 159, 16
1580: 30 2c 20 31 36 31 2c 20 31 36 32 2c 20 31 36 33  0, 161, 162, 163
1590: 2c 20 31 36 34 2c 0a 20 20 20 20 31 36 35 2c 20  , 164,.    165, 
15a0: 31 36 36 2c 20 31 36 37 2c 20 31 36 38 2c 20 31  166, 167, 168, 1
15b0: 36 39 2c 20 31 37 30 2c 20 31 37 31 2c 20 31 37  69, 170, 171, 17
15c0: 32 2c 20 31 37 33 2c 20 31 37 34 2c 20 31 37 35  2, 173, 174, 175
15d0: 2c 20 31 37 36 2c 20 31 37 37 2c 20 31 37 38 2c  , 176, 177, 178,
15e0: 20 31 37 39 2c 0a 20 20 20 20 31 38 30 2c 20 31   179,.    180, 1
15f0: 38 31 2c 20 31 38 32 2c 20 31 38 33 2c 20 31 38  81, 182, 183, 18
1600: 34 2c 20 31 38 35 2c 20 31 38 36 2c 20 31 38 37  4, 185, 186, 187
1610: 2c 20 31 38 38 2c 20 31 38 39 2c 20 31 39 30 2c  , 188, 189, 190,
1620: 20 31 39 31 2c 20 20 20 30 2c 20 20 20 31 2c 20   191,   0,   1, 
1630: 20 20 32 2c 0a 20 20 20 20 20 20 33 2c 20 20 20    2,.      3,   
1640: 34 2c 20 20 20 35 2c 20 20 20 36 2c 20 20 20 37  4,   5,   6,   7
1650: 2c 20 20 20 38 2c 20 20 20 39 2c 20 20 31 30 2c  ,   8,   9,  10,
1660: 20 20 31 31 2c 20 20 31 32 2c 20 20 31 33 2c 20    11,  12,  13, 
1670: 20 31 34 2c 20 20 31 35 2c 20 20 31 36 2c 20 20   14,  15,  16,  
1680: 31 37 2c 0a 20 20 20 20 20 31 38 2c 20 20 31 39  17,.     18,  19
1690: 2c 20 20 32 30 2c 20 20 32 31 2c 20 20 32 32 2c  ,  20,  21,  22,
16a0: 20 20 32 33 2c 20 20 32 34 2c 20 20 32 35 2c 20    23,  24,  25, 
16b0: 20 32 36 2c 20 20 32 37 2c 20 20 32 38 2c 20 20   26,  27,  28,  
16c0: 32 39 2c 20 20 33 30 2c 20 20 33 31 2c 20 20 20  29,  30,  31,   
16d0: 30 2c 0a 20 20 20 20 20 20 31 2c 20 20 20 32 2c  0,.      1,   2,
16e0: 20 20 20 33 2c 20 20 20 34 2c 20 20 20 35 2c 20     3,   4,   5, 
16f0: 20 20 36 2c 20 20 20 37 2c 20 20 20 38 2c 20 20    6,   7,   8,  
1700: 20 39 2c 20 20 31 30 2c 20 20 31 31 2c 20 20 31   9,  10,  11,  1
1710: 32 2c 20 20 31 33 2c 20 20 31 34 2c 20 20 31 35  2,  13,  14,  15
1720: 2c 0a 20 20 20 20 20 20 30 2c 20 20 20 31 2c 20  ,.      0,   1, 
1730: 20 20 32 2c 20 20 20 33 2c 20 20 20 34 2c 20 20    2,   3,   4,  
1740: 20 35 2c 20 20 20 36 2c 20 20 20 37 2c 20 20 20   5,   6,   7,   
1750: 30 2c 20 20 20 31 2c 20 20 20 32 2c 20 20 20 33  0,   1,   2,   3
1760: 2c 20 20 20 30 2c 20 20 20 31 2c 20 32 35 34 2c  ,   0,   1, 254,
1770: 0a 20 20 20 20 32 35 35 2c 0a 20 20 7d 3b 0a 20  .    255,.  };. 
1780: 20 72 65 74 20 3d 20 69 6e 69 74 56 61 6c 5b 28   ret = initVal[(
1790: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 53  unsigned char)zS
17a0: 74 72 5b 28 2a 70 4f 66 66 73 65 74 29 2b 2b 5d  tr[(*pOffset)++]
17b0: 5d 3b 0a 20 20 77 68 69 6c 65 28 20 28 30 78 63  ];.  while( (0xc
17c0: 30 26 7a 53 74 72 5b 2a 70 4f 66 66 73 65 74 5d  0&zStr[*pOffset]
17d0: 29 3d 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 72  )==0x80 ){.    r
17e0: 65 74 20 3d 20 28 72 65 74 3c 3c 36 29 20 7c 20  et = (ret<<6) | 
17f0: 28 30 78 33 66 26 28 7a 53 74 72 5b 28 2a 70 4f  (0x3f&(zStr[(*pO
1800: 66 66 73 65 74 29 2b 2b 5d 29 29 3b 0a 20 20 7d  ffset)++]));.  }
1810: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 73  .#endif..      s
1820: 74 72 75 63 74 20 55 74 66 38 54 62 6c 52 6f 77  truct Utf8TblRow
1830: 20 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62 31   {.        u8 b1
1840: 5f 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 75  _mask;.        u
1850: 38 20 62 31 5f 6d 61 73 6b 65 64 5f 76 61 6c 3b  8 b1_masked_val;
1860: 0a 20 20 20 20 20 20 20 20 75 38 20 62 31 5f 76  .        u8 b1_v
1870: 61 6c 75 65 5f 6d 61 73 6b 3b 0a 20 20 20 20 20  alue_mask;.     
1880: 20 20 20 69 6e 74 20 74 72 61 69 6c 69 6e 67 5f     int trailing_
1890: 62 79 74 65 73 3b 0a 20 20 20 20 20 20 7d 3b 0a  bytes;.      };.
18a0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
18b0: 73 74 20 73 74 72 75 63 74 20 55 74 66 38 54 62  st struct Utf8Tb
18c0: 6c 52 6f 77 20 75 74 66 38 74 62 6c 5b 5d 20 3d  lRow utf8tbl[] =
18d0: 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 30 78 38   {.        { 0x8
18e0: 30 2c 20 30 78 30 30 2c 20 30 78 37 46 2c 20 30  0, 0x00, 0x7F, 0
18f0: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 30 78   },.        { 0x
1900: 45 30 2c 20 30 78 43 30 2c 20 30 78 31 46 2c 20  E0, 0xC0, 0x1F, 
1910: 31 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 30  1 },.        { 0
1920: 78 46 30 2c 20 30 78 45 30 2c 20 30 78 30 46 2c  xF0, 0xE0, 0x0F,
1930: 20 32 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20   2 },.        { 
1940: 30 78 46 38 2c 20 30 78 46 30 2c 20 30 78 30 45  0xF8, 0xF0, 0x0E
1950: 2c 20 33 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b  , 3 },.        {
1960: 20 30 2c 20 30 2c 20 30 2c 20 30 7d 0a 20 20 20   0, 0, 0, 0}.   
1970: 20 20 20 7d 3b 0a 20 20 20 20 0a 20 20 20 20 20     };.    .     
1980: 20 75 38 20 62 31 3b 20 20 20 2f 2a 20 46 69 72   u8 b1;   /* Fir
1990: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 70  st byte of the p
19a0: 6f 74 65 6e 74 69 61 6c 6c 79 20 6d 75 6c 74 69  otentially multi
19b0: 2d 62 79 74 65 20 75 74 66 2d 38 20 63 68 61 72  -byte utf-8 char
19c0: 61 63 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  acter */.      i
19d0: 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 73 74 72  nt ii;.      str
19e0: 75 63 74 20 55 74 66 38 54 62 6c 52 6f 77 20 63  uct Utf8TblRow c
19f0: 6f 6e 73 74 20 2a 70 52 6f 77 3b 0a 20 20 20 20  onst *pRow;.    
1a00: 0a 20 20 20 20 20 20 70 52 6f 77 20 3d 20 26 28  .      pRow = &(
1a10: 75 74 66 38 74 62 6c 5b 30 5d 29 3b 0a 20 20 20  utf8tbl[0]);.   
1a20: 20 0a 20 20 20 20 20 20 62 31 20 3d 20 7a 53 74   .      b1 = zSt
1a30: 72 5b 28 2a 70 4f 66 66 73 65 74 29 2b 2b 5d 3b  r[(*pOffset)++];
1a40: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 52  .      while( pR
1a50: 6f 77 2d 3e 62 31 5f 6d 61 73 6b 20 26 26 20 28  ow->b1_mask && (
1a60: 62 31 26 70 52 6f 77 2d 3e 62 31 5f 6d 61 73 6b  b1&pRow->b1_mask
1a70: 29 21 3d 70 52 6f 77 2d 3e 62 31 5f 6d 61 73 6b  )!=pRow->b1_mask
1a80: 65 64 5f 76 61 6c 20 29 7b 0a 20 20 20 20 20 20  ed_val ){.      
1a90: 20 20 70 52 6f 77 2b 2b 3b 0a 20 20 20 20 20 20    pRow++;.      
1aa0: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 52 6f  }.      if( !pRo
1ab0: 77 2d 3e 62 31 5f 6d 61 73 6b 20 29 7b 0a 20 20  w->b1_mask ){.  
1ac0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e        return (in
1ad0: 74 29 30 78 46 46 46 44 3b 0a 20 20 20 20 20 20  t)0xFFFD;.      
1ae0: 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72  }.      .      r
1af0: 65 74 20 3d 20 28 75 33 32 29 28 62 31 26 70 52  et = (u32)(b1&pR
1b00: 6f 77 2d 3e 62 31 5f 76 61 6c 75 65 5f 6d 61 73  ow->b1_value_mas
1b10: 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 69  k);.      for( i
1b20: 69 3d 30 3b 20 69 69 3c 70 52 6f 77 2d 3e 74 72  i=0; ii<pRow->tr
1b30: 61 69 6c 69 6e 67 5f 62 79 74 65 73 3b 20 69 69  ailing_bytes; ii
1b40: 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  ++ ){.        u8
1b50: 20 62 20 3d 20 7a 53 74 72 5b 28 2a 70 4f 66 66   b = zStr[(*pOff
1b60: 73 65 74 29 2b 2b 5d 3b 0a 20 20 20 20 20 20 20  set)++];.       
1b70: 20 69 66 28 20 28 62 26 30 78 43 30 29 21 3d 30   if( (b&0xC0)!=0
1b80: 78 38 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  x80 ){.         
1b90: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 30 78 46   return (int)0xF
1ba0: 46 46 44 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  FFD;.        }. 
1bb0: 20 20 20 20 20 20 20 72 65 74 20 3d 20 28 72 65         ret = (re
1bc0: 74 3c 3c 36 29 20 2b 20 28 75 33 32 29 28 62 26  t<<6) + (u32)(b&
1bd0: 30 78 33 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0x3F);.      }. 
1be0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bf0: 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 45 58 54  }..    case TEXT
1c00: 5f 55 74 66 31 36 6c 65 3a 0a 20 20 20 20 63 61  _Utf16le:.    ca
1c10: 73 65 20 54 45 58 54 5f 55 74 66 31 36 62 65 3a  se TEXT_Utf16be:
1c20: 20 7b 0a 20 20 20 20 20 20 75 33 32 20 63 6f 64   {.      u32 cod
1c30: 65 5f 70 6f 69 6e 74 3b 20 20 20 2f 2a 20 74 68  e_point;   /* th
1c40: 65 20 66 69 72 73 74 20 63 6f 64 65 2d 70 6f 69  e first code-poi
1c50: 6e 74 20 69 6e 20 74 68 65 20 63 68 61 72 61 63  nt in the charac
1c60: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 33 32  ter */.      u32
1c70: 20 63 6f 64 65 5f 70 6f 69 6e 74 32 3b 20 20 2f   code_point2;  /
1c80: 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 63 6f 64  * the second cod
1c90: 65 2d 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63  e-point in the c
1ca0: 68 61 72 61 63 74 65 72 2c 20 69 66 20 61 6e 79  haracter, if any
1cb0: 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 20 20 63   */.    .      c
1cc0: 6f 64 65 5f 70 6f 69 6e 74 20 3d 20 52 45 41 44  ode_point = READ
1cd0: 5f 31 36 28 26 7a 53 74 72 5b 2a 70 4f 66 66 73  _16(&zStr[*pOffs
1ce0: 65 74 5d 2c 20 28 2a 70 45 6e 63 3d 3d 54 45 58  et], (*pEnc==TEX
1cf0: 54 5f 55 74 66 31 36 62 65 29 29 3b 0a 20 20 20  T_Utf16be));.   
1d00: 20 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 32     *pOffset += 2
1d10: 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20  ;.    .      /* 
1d20: 49 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e  If this is a non
1d30: 2d 73 75 72 72 6f 67 61 74 65 20 63 6f 64 65 2d  -surrogate code-
1d40: 70 6f 69 6e 74 2c 20 6a 75 73 74 20 63 61 73 74  point, just cast
1d50: 20 69 74 20 74 6f 20 61 6e 20 69 6e 74 20 61 6e   it to an int an
1d60: 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  d.      ** this 
1d70: 69 73 20 74 68 65 20 63 6f 64 65 2d 70 6f 69 6e  is the code-poin
1d80: 74 20 76 61 6c 75 65 2e 0a 20 20 20 20 20 20 2a  t value..      *
1d90: 2f 0a 20 20 20 20 20 20 69 66 28 20 63 6f 64 65  /.      if( code
1da0: 5f 70 6f 69 6e 74 3c 30 78 44 38 30 30 20 7c 7c  _point<0xD800 ||
1db0: 20 63 6f 64 65 5f 70 6f 69 6e 74 3e 30 78 45 30   code_point>0xE0
1dc0: 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  00 ){.        re
1dd0: 74 20 3d 20 63 6f 64 65 5f 70 6f 69 6e 74 3b 0a  t = code_point;.
1de0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1df0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1e00: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 74 72   If this is a tr
1e10: 61 69 6c 69 6e 67 20 73 75 72 72 6f 67 61 74 65  ailing surrogate
1e20: 20 63 6f 64 65 2d 70 6f 69 6e 74 2c 20 74 68 65   code-point, the
1e30: 6e 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 0a  n the string is.
1e40: 20 20 20 20 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d        ** malform
1e50: 65 64 3b 20 72 65 74 75 72 6e 20 74 68 65 20 72  ed; return the r
1e60: 65 70 6c 61 63 65 6d 65 6e 74 20 63 68 61 72 61  eplacement chara
1e70: 63 74 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cter..      */. 
1e80: 20 20 20 20 20 69 66 28 20 63 6f 64 65 5f 70 6f       if( code_po
1e90: 69 6e 74 3e 30 78 44 42 46 46 20 29 7b 0a 20 20  int>0xDBFF ){.  
1ea0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e        return (in
1eb0: 74 29 30 78 46 46 46 44 3b 0a 20 20 20 20 20 20  t)0xFFFD;.      
1ec0: 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20  }.    .      /* 
1ed0: 54 68 65 20 63 6f 64 65 2d 70 6f 69 6e 74 20 6a  The code-point j
1ee0: 75 73 74 20 72 65 61 64 20 69 73 20 61 20 6c 65  ust read is a le
1ef0: 61 64 69 6e 67 20 73 75 72 72 6f 67 61 74 65 20  ading surrogate 
1f00: 63 6f 64 65 2d 70 6f 69 6e 74 2e 20 49 66 20 74  code-point. If t
1f10: 68 65 69 72 0a 20 20 20 20 20 20 2a 2a 20 69 73  heir.      ** is
1f20: 20 6e 6f 74 20 65 6e 6f 75 67 68 20 64 61 74 61   not enough data
1f30: 20 6c 65 66 74 20 6f 72 20 74 68 65 20 6e 65 78   left or the nex
1f40: 74 20 63 6f 64 65 2d 70 6f 69 6e 74 20 69 73 20  t code-point is 
1f50: 6e 6f 74 20 61 20 74 72 61 69 6c 69 6e 67 0a 20  not a trailing. 
1f60: 20 20 20 20 20 2a 2a 20 73 75 72 72 6f 67 61 74       ** surrogat
1f70: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  e, return the re
1f80: 70 6c 61 63 65 6d 65 6e 74 20 63 68 61 72 61 63  placement charac
1f90: 74 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ter..      */.  
1fa0: 20 20 20 20 63 6f 64 65 5f 70 6f 69 6e 74 32 20      code_point2 
1fb0: 3d 20 52 45 41 44 5f 31 36 28 26 7a 53 74 72 5b  = READ_16(&zStr[
1fc0: 2a 70 4f 66 66 73 65 74 5d 2c 20 28 2a 70 45 6e  *pOffset], (*pEn
1fd0: 63 3d 3d 54 45 58 54 5f 55 74 66 31 36 62 65 29  c==TEXT_Utf16be)
1fe0: 29 3b 0a 20 20 20 20 20 20 2a 70 4f 66 66 73 65  );.      *pOffse
1ff0: 74 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 69 66  t += 2;.      if
2000: 28 20 63 6f 64 65 5f 70 6f 69 6e 74 32 3c 30 78  ( code_point2<0x
2010: 44 43 30 30 20 7c 7c 20 63 6f 64 65 5f 70 6f 69  DC00 || code_poi
2020: 6e 74 3e 30 78 44 46 46 46 20 29 7b 0a 20 20 20  nt>0xDFFF ){.   
2030: 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74       return (int
2040: 29 30 78 46 46 46 44 3b 0a 20 20 20 20 20 20 7d  )0xFFFD;.      }
2050: 0a 20 20 20 0a 20 20 20 20 20 20 72 65 74 20 3d  .   .      ret =
2060: 20 28 20 0a 20 20 20 20 20 20 20 20 20 20 28 28   ( .          ((
2070: 28 63 6f 64 65 5f 70 6f 69 6e 74 26 30 78 30 33  (code_point&0x03
2080: 43 30 29 2b 30 78 30 30 34 30 29 3c 3c 31 36 29  C0)+0x0040)<<16)
2090: 20 2b 20 20 20 2f 2a 20 75 75 75 75 75 20 2a 2f   +   /* uuuuu */
20a0: 0a 20 20 20 20 20 20 20 20 20 20 28 28 63 6f 64  .          ((cod
20b0: 65 5f 70 6f 69 6e 74 26 30 78 30 30 33 46 29 3c  e_point&0x003F)<
20c0: 3c 31 30 29 20 2b 20 20 20 20 20 20 20 20 20 20  <10) +          
20d0: 20 20 2f 2a 20 78 78 78 78 78 78 20 2a 2f 0a 20    /* xxxxxx */. 
20e0: 20 20 20 20 20 20 20 20 20 28 63 6f 64 65 5f 70           (code_p
20f0: 6f 69 6e 74 32 26 30 78 30 33 46 46 29 20 20 20  oint2&0x03FF)   
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2110: 2f 2a 20 79 79 20 79 79 79 79 79 79 79 79 20 2a  /* yy yyyyyyyy *
2120: 2f 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  /.      );.    }
2130: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
2140: 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
2150: 20 7d 0a 0a 20 20 69 66 28 20 66 6f 6c 64 20 29   }..  if( fold )
2160: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4c 4f 57  {.    return LOW
2170: 45 52 43 41 53 45 28 72 65 74 29 3b 0a 20 20 7d  ERCASE(ret);.  }
2180: 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
2190: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
21a0: 20 42 4f 4d 20 66 72 6f 6d 20 74 68 65 20 73 74   BOM from the st
21b0: 61 72 74 20 6f 66 20 2a 70 53 74 72 2c 20 69 66  art of *pStr, if
21c0: 20 6f 6e 65 20 69 73 20 70 72 65 73 65 6e 74 2e   one is present.
21d0: 20 52 65 74 75 72 6e 20 7a 65 72 6f 0a 2a 2a 20   Return zero.** 
21e0: 66 6f 72 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61  for little-endia
21f0: 6e 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20  n, non-zero for 
2200: 62 69 67 2d 65 6e 64 69 61 6e 2e 20 49 66 20 6e  big-endian. If n
2210: 6f 20 42 4f 4d 20 69 73 20 70 72 65 73 65 6e 74  o BOM is present
2220: 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20  , return.** the 
2230: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 70 61 72  value of the par
2240: 61 6d 65 74 65 72 20 22 62 69 67 5f 65 6e 64 69  ameter "big_endi
2250: 61 6e 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  an"..**.** Retur
2260: 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a 20 20 20 20  n values:.**    
2270: 20 31 20 2d 3e 20 62 69 67 2d 65 6e 64 69 61 6e   1 -> big-endian
2280: 20 73 74 72 69 6e 67 0a 2a 2a 20 20 20 20 20 30   string.**     0
2290: 20 2d 3e 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61   -> little-endia
22a0: 6e 20 73 74 72 69 6e 67 0a 2a 2f 0a 73 74 61 74  n string.*/.stat
22b0: 69 63 20 69 6e 74 20 72 65 61 64 55 74 66 31 36  ic int readUtf16
22c0: 42 6f 6d 28 55 74 66 53 74 72 69 6e 67 20 2a 70  Bom(UtfString *p
22d0: 53 74 72 2c 20 69 6e 74 20 62 69 67 5f 65 6e 64  Str, int big_end
22e0: 69 61 6e 29 7b 0a 20 20 2f 2a 20 54 68 65 20 42  ian){.  /* The B
22f0: 4f 4d 20 6d 75 73 74 20 62 65 20 74 68 65 20 66  OM must be the f
2300: 69 72 73 74 20 74 68 69 6e 67 20 72 65 61 64 20  irst thing read 
2310: 66 72 6f 6d 20 74 68 65 20 73 74 72 69 6e 67 20  from the string 
2320: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 53 74  */.  assert( pSt
2330: 72 2d 3e 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  r->c==0 );..  /*
2340: 20 49 66 20 74 68 65 20 73 74 72 69 6e 67 20 64   If the string d
2350: 61 74 61 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ata consists of 
2360: 31 20 62 79 74 65 20 6f 72 20 6c 65 73 73 2c 20  1 byte or less, 
2370: 74 68 65 20 42 4f 4d 20 77 69 6c 6c 20 6d 61 6b  the BOM will mak
2380: 65 20 6e 6f 0a 20 20 2a 2a 20 64 69 66 66 65 72  e no.  ** differ
2390: 65 6e 63 65 20 61 6e 79 77 61 79 2e 20 49 6e 20  ence anyway. In 
23a0: 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 66  this case just f
23b0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
23c0: 68 65 20 64 65 66 61 75 6c 74 20 63 61 73 65 0a  he default case.
23d0: 20 20 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20    ** and return 
23e0: 74 68 65 20 6e 61 74 69 76 65 20 62 79 74 65 2d  the native byte-
23f0: 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 6d  order for this m
2400: 61 63 68 69 6e 65 2e 0a 20 20 2a 2a 0a 20 20 2a  achine..  **.  *
2410: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 63 68 65  * Otherwise, che
2420: 63 6b 20 74 68 65 20 66 69 72 73 74 20 32 20 62  ck the first 2 b
2430: 79 74 65 73 20 6f 66 20 74 68 65 20 73 74 72 69  ytes of the stri
2440: 6e 67 20 74 6f 20 73 65 65 20 69 66 20 61 20 42  ng to see if a B
2450: 4f 4d 20 69 73 0a 20 20 2a 2a 20 70 72 65 73 65  OM is.  ** prese
2460: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  nt..  */.  if( p
2470: 53 74 72 2d 3e 6e 3e 31 20 29 7b 0a 20 20 20 20  Str->n>1 ){.    
2480: 75 38 20 62 6f 6d 20 3d 20 73 71 6c 69 74 65 33  u8 bom = sqlite3
2490: 55 74 66 52 65 61 64 42 6f 6d 28 70 53 74 72 2d  UtfReadBom(pStr-
24a0: 3e 70 5a 2c 20 32 29 3b 0a 20 20 20 20 69 66 28  >pZ, 2);.    if(
24b0: 20 62 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 53   bom ){.      pS
24c0: 74 72 2d 3e 63 20 2b 3d 20 32 3b 0a 20 20 20 20  tr->c += 2;.    
24d0: 20 20 72 65 74 75 72 6e 20 28 62 6f 6d 3d 3d 54    return (bom==T
24e0: 45 58 54 5f 55 74 66 31 36 6c 65 29 3f 30 3a 31  EXT_Utf16le)?0:1
24f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
2500: 65 74 75 72 6e 20 62 69 67 5f 65 6e 64 69 61 6e  eturn big_endian
2510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 7a 44 61 74 61  ;.}../*.** zData
2520: 20 69 73 20 61 20 55 54 46 2d 31 36 20 65 6e 63   is a UTF-16 enc
2530: 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 6e 44 61  oded string, nDa
2540: 74 61 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  ta bytes in leng
2550: 74 68 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  th. This routine
2560: 0a 2a 2a 20 63 68 65 63 6b 73 20 69 66 20 74 68  .** checks if th
2570: 65 72 65 20 69 73 20 61 20 62 79 74 65 2d 6f 72  ere is a byte-or
2580: 64 65 72 20 6d 61 72 6b 20 61 74 20 74 68 65 20  der mark at the 
2590: 73 74 61 72 74 20 6f 66 20 7a 44 61 74 61 2e 20  start of zData. 
25a0: 49 66 20 6e 6f 0a 2a 2a 20 62 79 74 65 20 6f 72  If no.** byte or
25b0: 64 65 72 20 6d 61 72 6b 20 69 73 20 66 6f 75 6e  der mark is foun
25c0: 64 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 0 is returned.
25d0: 20 4f 74 68 65 72 77 69 73 65 20 54 45 58 54 5f   Otherwise TEXT_
25e0: 55 74 66 31 36 62 65 20 6f 72 0a 2a 2a 20 54 45  Utf16be or.** TE
25f0: 58 54 5f 55 74 66 31 36 6c 65 20 69 73 20 72 65  XT_Utf16le is re
2600: 74 75 72 6e 65 64 2c 20 64 65 70 65 6e 64 69 6e  turned, dependin
2610: 67 20 6f 6e 20 77 68 65 74 68 65 72 20 54 68 65  g on whether The
2620: 20 42 4f 4d 20 69 6e 64 69 63 61 74 65 73 20 74   BOM indicates t
2630: 68 61 74 0a 2a 2a 20 74 68 65 20 74 65 78 74 20  hat.** the text 
2640: 69 73 20 62 69 67 2d 65 6e 64 69 61 6e 20 6f 72  is big-endian or
2650: 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2e 0a   little-endian..
2660: 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 55 74 66  */.u8 sqlite3Utf
2670: 52 65 61 64 42 6f 6d 28 63 6f 6e 73 74 20 76 6f  ReadBom(const vo
2680: 69 64 20 2a 7a 44 61 74 61 2c 20 69 6e 74 20 6e  id *zData, int n
2690: 44 61 74 61 29 7b 0a 20 20 69 66 28 20 6e 44 61  Data){.  if( nDa
26a0: 74 61 3c 30 20 7c 7c 20 6e 44 61 74 61 3e 31 20  ta<0 || nData>1 
26b0: 29 7b 0a 20 20 20 20 75 38 20 62 31 20 3d 20 2a  ){.    u8 b1 = *
26c0: 28 75 38 20 2a 29 7a 44 61 74 61 3b 0a 20 20 20  (u8 *)zData;.   
26d0: 20 75 38 20 62 32 20 3d 20 2a 28 28 28 75 38 20   u8 b2 = *(((u8 
26e0: 2a 29 7a 44 61 74 61 29 20 2b 20 31 29 3b 0a 20  *)zData) + 1);. 
26f0: 20 20 20 69 66 28 20 62 31 3d 3d 30 78 46 45 20     if( b1==0xFE 
2700: 26 26 20 62 32 3d 3d 30 78 46 46 20 29 7b 0a 20  && b2==0xFF ){. 
2710: 20 20 20 20 20 72 65 74 75 72 6e 20 54 45 58 54       return TEXT
2720: 5f 55 74 66 31 36 62 65 3b 0a 20 20 20 20 7d 0a  _Utf16be;.    }.
2730: 20 20 20 20 69 66 28 20 62 31 3d 3d 30 78 46 46      if( b1==0xFF
2740: 20 26 26 20 62 32 3d 3d 30 78 46 45 20 29 7b 0a   && b2==0xFE ){.
2750: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 45 58        return TEX
2760: 54 5f 55 74 66 31 36 6c 65 3b 0a 20 20 20 20 7d  T_Utf16le;.    }
2770: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2780: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
2790: 61 20 73 69 6e 67 6c 65 20 75 6e 69 63 6f 64 65  a single unicode
27a0: 20 63 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20   character from 
27b0: 74 68 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  the UTF-8 encode
27c0: 64 20 73 74 72 69 6e 67 20 2a 70 53 74 72 2e 20  d string *pStr. 
27d0: 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74  The.** value ret
27e0: 75 72 6e 65 64 20 69 73 20 61 20 75 6e 69 63 6f  urned is a unico
27f0: 64 65 20 73 63 61 6c 61 72 20 76 61 6c 75 65 2e  de scalar value.
2800: 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20   In the case of 
2810: 6d 61 6c 66 6f 72 6d 65 64 0a 2a 2a 20 73 74 72  malformed.** str
2820: 69 6e 67 73 2c 20 74 68 65 20 75 6e 69 63 6f 64  ings, the unicod
2830: 65 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 63 68  e replacement ch
2840: 61 72 61 63 74 65 72 20 55 2b 46 46 46 44 20 6d  aracter U+FFFD m
2850: 61 79 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0a  ay be returned..
2860: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72 65  */.static u32 re
2870: 61 64 55 74 66 38 28 55 74 66 53 74 72 69 6e 67  adUtf8(UtfString
2880: 20 2a 70 53 74 72 29 7b 0a 20 20 75 38 20 65 6e   *pStr){.  u8 en
2890: 63 20 3d 20 54 45 58 54 5f 55 74 66 38 3b 0a 20  c = TEXT_Utf8;. 
28a0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52   return sqlite3R
28b0: 65 61 64 55 6e 69 43 68 61 72 28 70 53 74 72 2d  eadUniChar(pStr-
28c0: 3e 70 5a 2c 20 26 70 53 74 72 2d 3e 63 2c 20 26  >pZ, &pStr->c, &
28d0: 65 6e 63 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  enc, 0);.}../*.*
28e0: 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 69 63  * Write the unic
28f0: 6f 64 65 20 63 68 61 72 61 63 74 65 72 20 27 63  ode character 'c
2900: 6f 64 65 27 20 74 6f 20 74 68 65 20 73 74 72 69  ode' to the stri
2910: 6e 67 20 70 53 74 72 20 75 73 69 6e 67 20 55 54  ng pStr using UT
2920: 46 2d 38 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 2e  F-8.** encoding.
2930: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61   SQLITE_NOMEM ma
2940: 79 20 62 65 20 72 65 74 75 72 6e 65 64 20 69 66  y be returned if
2950: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29   sqlite3Malloc()
2960: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2970: 63 20 69 6e 74 20 77 72 69 74 65 55 74 66 38 28  c int writeUtf8(
2980: 55 74 66 53 74 72 69 6e 67 20 2a 70 53 74 72 2c  UtfString *pStr,
2990: 20 75 33 32 20 63 6f 64 65 29 7b 0a 20 20 73 74   u32 code){.  st
29a0: 72 75 63 74 20 55 74 66 38 57 72 69 74 65 54 62  ruct Utf8WriteTb
29b0: 6c 52 6f 77 20 7b 0a 20 20 20 20 75 33 32 20 6d  lRow {.    u32 m
29c0: 61 78 5f 63 6f 64 65 3b 0a 20 20 20 20 69 6e 74  ax_code;.    int
29d0: 20 74 72 61 69 6c 69 6e 67 5f 62 79 74 65 73 3b   trailing_bytes;
29e0: 0a 20 20 20 20 75 38 20 62 31 5f 61 6e 64 5f 6d  .    u8 b1_and_m
29f0: 61 73 6b 3b 0a 20 20 20 20 75 38 20 62 31 5f 6f  ask;.    u8 b1_o
2a00: 72 5f 6d 61 73 6b 3b 0a 20 20 7d 3b 0a 20 20 73  r_mask;.  };.  s
2a10: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
2a20: 63 74 20 55 74 66 38 57 72 69 74 65 54 62 6c 52  ct Utf8WriteTblR
2a30: 6f 77 20 75 74 66 38 74 62 6c 5b 5d 20 3d 20 7b  ow utf8tbl[] = {
2a40: 0a 20 20 20 20 7b 30 78 30 30 30 30 30 30 37 46  .    {0x0000007F
2a50: 2c 20 30 2c 20 30 78 37 46 2c 20 30 78 30 30 7d  , 0, 0x7F, 0x00}
2a60: 2c 0a 20 20 20 20 7b 30 78 30 30 30 30 30 37 46  ,.    {0x000007F
2a70: 46 2c 20 31 2c 20 30 78 44 46 2c 20 30 78 43 30  F, 1, 0xDF, 0xC0
2a80: 7d 2c 0a 20 20 20 20 7b 30 78 30 30 30 30 46 46  },.    {0x0000FF
2a90: 46 46 2c 20 32 2c 20 30 78 45 46 2c 20 30 78 45  FF, 2, 0xEF, 0xE
2aa0: 30 7d 2c 0a 20 20 20 20 7b 30 78 30 30 31 30 46  0},.    {0x0010F
2ab0: 46 46 46 2c 20 33 2c 20 30 78 46 37 2c 20 30 78  FFF, 3, 0xF7, 0x
2ac0: 46 30 7d 2c 0a 20 20 20 20 7b 30 78 30 30 30 30  F0},.    {0x0000
2ad0: 30 30 30 30 2c 20 30 2c 20 30 78 30 30 2c 20 30  0000, 0, 0x00, 0
2ae0: 78 30 30 7d 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73  x00}.  };.  cons
2af0: 74 20 73 74 72 75 63 74 20 55 74 66 38 57 72 69  t struct Utf8Wri
2b00: 74 65 54 62 6c 52 6f 77 20 2a 70 52 6f 77 20 3d  teTblRow *pRow =
2b10: 20 26 75 74 66 38 74 62 6c 5b 30 5d 3b 0a 0a 20   &utf8tbl[0];.. 
2b20: 20 77 68 69 6c 65 28 20 63 6f 64 65 3e 70 52 6f   while( code>pRo
2b30: 77 2d 3e 6d 61 78 5f 63 6f 64 65 20 29 7b 0a 20  w->max_code ){. 
2b40: 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 77 2d     assert( pRow-
2b50: 3e 6d 61 78 5f 63 6f 64 65 20 29 3b 0a 20 20 20  >max_code );.   
2b60: 20 70 52 6f 77 2b 2b 3b 0a 20 20 7d 0a 0a 20 20   pRow++;.  }..  
2b70: 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 72 65 20  /* Ensure there 
2b80: 69 73 20 65 6e 6f 75 67 68 20 72 6f 6f 6d 20 6c  is enough room l
2b90: 65 66 74 20 69 6e 20 74 68 65 20 6f 75 74 70 75  eft in the outpu
2ba0: 74 20 62 75 66 66 65 72 20 74 6f 20 77 72 69 74  t buffer to writ
2bb0: 65 0a 20 20 2a 2a 20 74 68 69 73 20 55 54 46 2d  e.  ** this UTF-
2bc0: 38 20 63 68 61 72 61 63 74 65 72 2e 20 0a 20 20  8 character. .  
2bd0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 53  */.  assert( (pS
2be0: 74 72 2d 3e 6e 2d 70 53 74 72 2d 3e 63 29 3e 3d  tr->n-pStr->c)>=
2bf0: 28 70 52 6f 77 2d 3e 74 72 61 69 6c 69 6e 67 5f  (pRow->trailing_
2c00: 62 79 74 65 73 2b 31 29 20 29 3b 0a 0a 20 20 2f  bytes+1) );..  /
2c10: 2a 20 57 72 69 74 65 20 74 68 65 20 55 54 46 2d  * Write the UTF-
2c20: 38 20 65 6e 63 6f 64 65 64 20 63 68 61 72 61 63  8 encoded charac
2c30: 74 65 72 20 74 6f 20 70 53 74 72 2e 20 41 6c 6c  ter to pStr. All
2c40: 20 63 61 73 65 73 20 62 65 6c 6f 77 20 61 72 65   cases below are
2c50: 0a 20 20 2a 2a 20 69 6e 74 65 6e 74 69 6f 6e 61  .  ** intentiona
2c60: 6c 6c 79 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68  lly fall-through
2c70: 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  ..  */.  switch(
2c80: 20 70 52 6f 77 2d 3e 74 72 61 69 6c 69 6e 67 5f   pRow->trailing_
2c90: 62 79 74 65 73 20 29 7b 0a 20 20 20 20 63 61 73  bytes ){.    cas
2ca0: 65 20 33 3a 0a 20 20 20 20 20 20 70 53 74 72 2d  e 3:.      pStr-
2cb0: 3e 70 5a 5b 70 53 74 72 2d 3e 63 2b 33 5d 20 3d  >pZ[pStr->c+3] =
2cc0: 20 28 28 28 75 38 29 63 6f 64 65 29 26 30 78 33   (((u8)code)&0x3
2cd0: 46 29 7c 30 78 38 30 3b 0a 20 20 20 20 20 20 63  F)|0x80;.      c
2ce0: 6f 64 65 20 3d 20 63 6f 64 65 3e 3e 36 3b 0a 20  ode = code>>6;. 
2cf0: 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20     case 2:.     
2d00: 20 70 53 74 72 2d 3e 70 5a 5b 70 53 74 72 2d 3e   pStr->pZ[pStr->
2d10: 63 2b 32 5d 20 3d 20 28 28 28 75 38 29 63 6f 64  c+2] = (((u8)cod
2d20: 65 29 26 30 78 33 46 29 7c 30 78 38 30 3b 0a 20  e)&0x3F)|0x80;. 
2d30: 20 20 20 20 20 63 6f 64 65 20 3d 20 63 6f 64 65       code = code
2d40: 3e 3e 36 3b 0a 20 20 20 20 63 61 73 65 20 31 3a  >>6;.    case 1:
2d50: 0a 20 20 20 20 20 20 70 53 74 72 2d 3e 70 5a 5b  .      pStr->pZ[
2d60: 70 53 74 72 2d 3e 63 2b 31 5d 20 3d 20 28 28 28  pStr->c+1] = (((
2d70: 75 38 29 63 6f 64 65 29 26 30 78 33 46 29 7c 30  u8)code)&0x3F)|0
2d80: 78 38 30 3b 0a 20 20 20 20 20 20 63 6f 64 65 20  x80;.      code 
2d90: 3d 20 63 6f 64 65 3e 3e 36 3b 0a 20 20 20 20 63  = code>>6;.    c
2da0: 61 73 65 20 30 3a 0a 20 20 20 20 20 20 70 53 74  ase 0:.      pSt
2db0: 72 2d 3e 70 5a 5b 70 53 74 72 2d 3e 63 5d 20 3d  r->pZ[pStr->c] =
2dc0: 20 28 28 28 75 38 29 63 6f 64 65 29 26 28 70 52   (((u8)code)&(pR
2dd0: 6f 77 2d 3e 62 31 5f 61 6e 64 5f 6d 61 73 6b 29  ow->b1_and_mask)
2de0: 29 7c 28 70 52 6f 77 2d 3e 62 31 5f 6f 72 5f 6d  )|(pRow->b1_or_m
2df0: 61 73 6b 29 3b 0a 20 20 7d 0a 20 20 70 53 74 72  ask);.  }.  pStr
2e00: 2d 3e 63 20 2b 3d 20 28 70 52 6f 77 2d 3e 74 72  ->c += (pRow->tr
2e10: 61 69 6c 69 6e 67 5f 62 79 74 65 73 20 2b 20 31  ailing_bytes + 1
2e20: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  );..  return 0;.
2e30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
2e40: 73 69 6e 67 6c 65 20 75 6e 69 63 6f 64 65 20 63  single unicode c
2e50: 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20 74 68  haracter from th
2e60: 65 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64  e UTF-16 encoded
2e70: 20 73 74 72 69 6e 67 20 2a 70 53 74 72 2e 20 54   string *pStr. T
2e80: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75  he.** value retu
2e90: 72 6e 65 64 20 69 73 20 61 20 75 6e 69 63 6f 64  rned is a unicod
2ea0: 65 20 73 63 61 6c 61 72 20 76 61 6c 75 65 2e 20  e scalar value. 
2eb0: 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 6d  In the case of m
2ec0: 61 6c 66 6f 72 6d 65 64 0a 2a 2a 20 73 74 72 69  alformed.** stri
2ed0: 6e 67 73 2c 20 74 68 65 20 75 6e 69 63 6f 64 65  ngs, the unicode
2ee0: 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 63 68 61   replacement cha
2ef0: 72 61 63 74 65 72 20 55 2b 46 46 46 44 20 6d 61  racter U+FFFD ma
2f00: 79 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a  y be returned..*
2f10: 2a 0a 2a 2a 20 49 66 20 62 69 67 5f 65 6e 64 69  *.** If big_endi
2f20: 61 6e 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  an is true, the 
2f30: 73 74 72 69 6e 67 20 69 73 20 61 73 73 75 6d 65  string is assume
2f40: 64 20 74 6f 20 62 65 20 55 54 46 2d 31 36 42 45  d to be UTF-16BE
2f50: 20 65 6e 63 6f 64 65 64 2e 0a 2a 2a 20 4f 74 68   encoded..** Oth
2f60: 65 72 77 69 73 65 2c 20 69 74 20 69 73 20 55 54  erwise, it is UT
2f70: 46 2d 31 36 4c 45 20 65 6e 63 6f 64 65 64 2e 0a  F-16LE encoded..
2f80: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72 65  */.static u32 re
2f90: 61 64 55 74 66 31 36 28 55 74 66 53 74 72 69 6e  adUtf16(UtfStrin
2fa0: 67 20 2a 70 53 74 72 2c 20 69 6e 74 20 62 69 67  g *pStr, int big
2fb0: 5f 65 6e 64 69 61 6e 29 7b 0a 20 20 75 33 32 20  _endian){.  u32 
2fc0: 63 6f 64 65 5f 70 6f 69 6e 74 3b 20 20 20 2f 2a  code_point;   /*
2fd0: 20 74 68 65 20 66 69 72 73 74 20 63 6f 64 65 2d   the first code-
2fe0: 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 68 61  point in the cha
2ff0: 72 61 63 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20  racter */..  /* 
3000: 49 66 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79  If there is only
3010: 20 6f 6e 65 20 62 79 74 65 20 6f 66 20 64 61 74   one byte of dat
3020: 61 20 6c 65 66 74 20 69 6e 20 74 68 65 20 73 74  a left in the st
3030: 72 69 6e 67 2c 20 72 65 74 75 72 6e 20 74 68 65  ring, return the
3040: 20 0a 20 20 2a 2a 20 72 65 70 6c 61 63 65 6d 65   .  ** replaceme
3050: 6e 74 20 63 68 61 72 61 63 74 65 72 2e 0a 20 20  nt character..  
3060: 2a 2f 0a 20 20 69 66 28 20 28 70 53 74 72 2d 3e  */.  if( (pStr->
3070: 6e 2d 70 53 74 72 2d 3e 63 29 3d 3d 31 20 29 7b  n-pStr->c)==1 ){
3080: 0a 20 20 20 20 70 53 74 72 2d 3e 63 2b 2b 3b 0a  .    pStr->c++;.
3090: 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29      return (int)
30a0: 30 78 46 46 46 44 3b 0a 20 20 7d 0a 0a 20 20 63  0xFFFD;.  }..  c
30b0: 6f 64 65 5f 70 6f 69 6e 74 20 3d 20 52 45 41 44  ode_point = READ
30c0: 5f 31 36 28 26 28 70 53 74 72 2d 3e 70 5a 5b 70  _16(&(pStr->pZ[p
30d0: 53 74 72 2d 3e 63 5d 29 2c 20 62 69 67 5f 65 6e  Str->c]), big_en
30e0: 64 69 61 6e 29 3b 0a 20 20 70 53 74 72 2d 3e 63  dian);.  pStr->c
30f0: 20 2b 3d 20 32 3b 0a 0a 20 20 2f 2a 20 49 66 20   += 2;..  /* If 
3100: 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 73 75  this is a non-su
3110: 72 72 6f 67 61 74 65 20 63 6f 64 65 2d 70 6f 69  rrogate code-poi
3120: 6e 74 2c 20 6a 75 73 74 20 63 61 73 74 20 69 74  nt, just cast it
3130: 20 74 6f 20 61 6e 20 69 6e 74 20 61 6e 64 0a 20   to an int and. 
3140: 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 63   ** return the c
3150: 6f 64 65 2d 70 6f 69 6e 74 20 76 61 6c 75 65 2e  ode-point value.
3160: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 64 65  .  */.  if( code
3170: 5f 70 6f 69 6e 74 3c 30 78 44 38 30 30 20 7c 7c  _point<0xD800 ||
3180: 20 63 6f 64 65 5f 70 6f 69 6e 74 3e 30 78 45 30   code_point>0xE0
3190: 30 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  00 ){.    return
31a0: 20 63 6f 64 65 5f 70 6f 69 6e 74 3b 0a 20 20 7d   code_point;.  }
31b0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
31c0: 73 20 61 20 74 72 61 69 6c 69 6e 67 20 73 75 72  s a trailing sur
31d0: 72 6f 67 61 74 65 20 63 6f 64 65 2d 70 6f 69 6e  rogate code-poin
31e0: 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 69  t, then the stri
31f0: 6e 67 20 69 73 0a 20 20 2a 2a 20 6d 61 6c 66 6f  ng is.  ** malfo
3200: 72 6d 65 64 3b 20 72 65 74 75 72 6e 20 74 68 65  rmed; return the
3210: 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 63 68 61   replacement cha
3220: 72 61 63 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  racter..  */.  i
3230: 66 28 20 63 6f 64 65 5f 70 6f 69 6e 74 3e 30 78  f( code_point>0x
3240: 44 42 46 46 20 29 7b 0a 20 20 20 20 72 65 74 75  DBFF ){.    retu
3250: 72 6e 20 30 78 46 46 46 44 3b 0a 20 20 7d 0a 0a  rn 0xFFFD;.  }..
3260: 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 2d 70 6f    /* The code-po
3270: 69 6e 74 20 6a 75 73 74 20 72 65 61 64 20 69 73  int just read is
3280: 20 61 20 6c 65 61 64 69 6e 67 20 73 75 72 72 6f   a leading surro
3290: 67 61 74 65 20 63 6f 64 65 2d 70 6f 69 6e 74 2e  gate code-point.
32a0: 20 49 66 20 74 68 65 69 72 0a 20 20 2a 2a 20 69   If their.  ** i
32b0: 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20 64 61 74  s not enough dat
32c0: 61 20 6c 65 66 74 20 6f 72 20 74 68 65 20 6e 65  a left or the ne
32d0: 78 74 20 63 6f 64 65 2d 70 6f 69 6e 74 20 69 73  xt code-point is
32e0: 20 6e 6f 74 20 61 20 74 72 61 69 6c 69 6e 67 0a   not a trailing.
32f0: 20 20 2a 2a 20 73 75 72 72 6f 67 61 74 65 2c 20    ** surrogate, 
3300: 72 65 74 75 72 6e 20 74 68 65 20 72 65 70 6c 61  return the repla
3310: 63 65 6d 65 6e 74 20 63 68 61 72 61 63 74 65 72  cement character
3320: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  ..  */.  if( (pS
3330: 74 72 2d 3e 6e 2d 70 53 74 72 2d 3e 63 29 3e 31  tr->n-pStr->c)>1
3340: 20 29 7b 0a 20 20 20 20 75 33 32 20 63 6f 64 65   ){.    u32 code
3350: 5f 70 6f 69 6e 74 32 20 3d 20 52 45 41 44 5f 31  _point2 = READ_1
3360: 36 28 26 70 53 74 72 2d 3e 70 5a 5b 70 53 74 72  6(&pStr->pZ[pStr
3370: 2d 3e 63 5d 2c 20 62 69 67 5f 65 6e 64 69 61 6e  ->c], big_endian
3380: 29 3b 0a 20 20 20 20 69 66 28 20 63 6f 64 65 5f  );.    if( code_
3390: 70 6f 69 6e 74 32 3c 30 78 44 43 30 30 20 7c 7c  point2<0xDC00 ||
33a0: 20 63 6f 64 65 5f 70 6f 69 6e 74 3e 30 78 44 46   code_point>0xDF
33b0: 46 46 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  FF ){.      retu
33c0: 72 6e 20 30 78 46 46 46 44 3b 0a 20 20 20 20 7d  rn 0xFFFD;.    }
33d0: 0a 20 20 20 20 70 53 74 72 2d 3e 63 20 2b 3d 20  .    pStr->c += 
33e0: 32 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 28  2;..    return (
33f0: 20 0a 20 20 20 20 20 20 20 20 28 28 28 63 6f 64   .        (((cod
3400: 65 5f 70 6f 69 6e 74 26 30 78 30 33 43 30 29 2b  e_point&0x03C0)+
3410: 30 78 30 30 34 30 29 3c 3c 31 36 29 20 2b 20 20  0x0040)<<16) +  
3420: 20 2f 2a 20 75 75 75 75 75 20 2a 2f 0a 20 20 20   /* uuuuu */.   
3430: 20 20 20 20 20 28 28 63 6f 64 65 5f 70 6f 69 6e       ((code_poin
3440: 74 26 30 78 30 30 33 46 29 3c 3c 31 30 29 20 2b  t&0x003F)<<10) +
3450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
3460: 78 78 78 78 78 20 2a 2f 0a 20 20 20 20 20 20 20  xxxxx */.       
3470: 20 28 63 6f 64 65 5f 70 6f 69 6e 74 32 26 30 78   (code_point2&0x
3480: 30 33 46 46 29 20 20 20 20 20 20 20 20 20 20 20  03FF)           
3490: 20 20 20 20 20 20 20 20 2f 2a 20 79 79 20 79 79          /* yy yy
34a0: 79 79 79 79 79 79 20 2a 2f 0a 20 20 20 20 29 3b  yyyyyy */.    );
34b0: 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ..  }else{.    r
34c0: 65 74 75 72 6e 20 28 69 6e 74 29 30 78 46 46 46  eturn (int)0xFFF
34d0: 44 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e  D;.  }.  .  /* n
34e0: 6f 74 20 72 65 61 63 68 65 64 20 2a 2f 0a 7d 0a  ot reached */.}.
34f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
3500: 65 55 74 66 31 36 28 55 74 66 53 74 72 69 6e 67  eUtf16(UtfString
3510: 20 2a 70 53 74 72 2c 20 69 6e 74 20 63 6f 64 65   *pStr, int code
3520: 2c 20 69 6e 74 20 62 69 67 5f 65 6e 64 69 61 6e  , int big_endian
3530: 29 7b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a  ){.  int bytes;.
3540: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3550: 2a 68 69 5f 62 79 74 65 3b 0a 20 20 75 6e 73 69  *hi_byte;.  unsi
3560: 67 6e 65 64 20 63 68 61 72 20 2a 6c 6f 5f 62 79  gned char *lo_by
3570: 74 65 3b 0a 0a 20 20 62 79 74 65 73 20 3d 20 28  te;..  bytes = (
3580: 63 6f 64 65 3e 30 78 30 30 30 30 46 46 46 46 3f  code>0x0000FFFF?
3590: 34 3a 32 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75  4:2);..  /* Ensu
35a0: 72 65 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  re there is enou
35b0: 67 68 20 72 6f 6f 6d 20 6c 65 66 74 20 69 6e 20  gh room left in 
35c0: 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
35d0: 72 20 74 6f 20 77 72 69 74 65 0a 20 20 2a 2a 20  r to write.  ** 
35e0: 74 68 69 73 20 55 54 46 2d 38 20 63 68 61 72 61  this UTF-8 chara
35f0: 63 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  cter..  */.  ass
3600: 65 72 74 28 20 28 70 53 74 72 2d 3e 6e 2d 70 53  ert( (pStr->n-pS
3610: 74 72 2d 3e 63 29 3e 3d 62 79 74 65 73 20 29 3b  tr->c)>=bytes );
3620: 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  .  .  /* Initial
3630: 69 73 65 20 68 69 5f 62 79 74 65 20 61 6e 64 20  ise hi_byte and 
3640: 6c 6f 5f 62 79 74 65 20 74 6f 20 70 6f 69 6e 74  lo_byte to point
3650: 20 61 74 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e   at the location
3660: 73 20 69 6e 74 6f 20 77 68 69 63 68 0a 20 20 2a  s into which.  *
3670: 2a 20 74 68 65 20 4d 53 42 20 61 6e 64 20 4c 53  * the MSB and LS
3680: 42 20 6f 66 20 74 68 65 20 28 66 69 72 73 74 29  B of the (first)
3690: 20 31 36 2d 62 69 74 20 75 6e 69 63 6f 64 65 20   16-bit unicode 
36a0: 63 6f 64 65 2d 70 6f 69 6e 74 20 77 72 69 74 74  code-point writt
36b0: 65 6e 20 66 6f 72 0a 20 20 2a 2a 20 74 68 69 73  en for.  ** this
36c0: 20 63 68 61 72 61 63 74 65 72 2e 0a 20 20 2a 2f   character..  */
36d0: 0a 20 20 68 69 5f 62 79 74 65 20 3d 20 28 62 69  .  hi_byte = (bi
36e0: 67 5f 65 6e 64 69 61 6e 3f 26 70 53 74 72 2d 3e  g_endian?&pStr->
36f0: 70 5a 5b 70 53 74 72 2d 3e 63 5d 3a 26 70 53 74  pZ[pStr->c]:&pSt
3700: 72 2d 3e 70 5a 5b 70 53 74 72 2d 3e 63 2b 31 5d  r->pZ[pStr->c+1]
3710: 29 3b 0a 20 20 6c 6f 5f 62 79 74 65 20 3d 20 28  );.  lo_byte = (
3720: 62 69 67 5f 65 6e 64 69 61 6e 3f 26 70 53 74 72  big_endian?&pStr
3730: 2d 3e 70 5a 5b 70 53 74 72 2d 3e 63 2b 31 5d 3a  ->pZ[pStr->c+1]:
3740: 26 70 53 74 72 2d 3e 70 5a 5b 70 53 74 72 2d 3e  &pStr->pZ[pStr->
3750: 63 5d 29 3b 0a 0a 20 20 69 66 28 20 62 79 74 65  c]);..  if( byte
3760: 73 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 68 69 5f  s==2 ){.    *hi_
3770: 62 79 74 65 20 3d 20 28 75 38 29 28 28 63 6f 64  byte = (u8)((cod
3780: 65 26 30 78 30 30 30 30 46 46 30 30 29 3e 3e 38  e&0x0000FF00)>>8
3790: 29 3b 0a 20 20 20 20 2a 6c 6f 5f 62 79 74 65 20  );.    *lo_byte 
37a0: 3d 20 28 75 38 29 28 63 6f 64 65 26 30 78 30 30  = (u8)(code&0x00
37b0: 30 30 30 30 46 46 29 3b 0a 20 20 7d 65 6c 73 65  0000FF);.  }else
37c0: 7b 0a 20 20 20 20 75 33 32 20 77 72 64 3b 0a 20  {.    u32 wrd;. 
37d0: 20 20 20 77 72 64 20 3d 20 28 28 28 28 63 6f 64     wrd = ((((cod
37e0: 65 26 30 78 30 30 31 46 30 30 30 30 29 2d 30 78  e&0x001F0000)-0x
37f0: 30 30 30 31 30 30 30 30 29 2b 28 63 6f 64 65 26  00010000)+(code&
3800: 30 78 30 30 30 30 46 43 30 30 29 29 3e 3e 31 30  0x0000FC00))>>10
3810: 29 7c 30 78 30 30 30 30 44 38 30 30 3b 0a 20 20  )|0x0000D800;.  
3820: 20 20 2a 68 69 5f 62 79 74 65 20 3d 20 28 75 38    *hi_byte = (u8
3830: 29 28 28 77 72 64 26 30 78 30 30 30 30 46 46 30  )((wrd&0x0000FF0
3840: 30 29 3e 3e 38 29 3b 0a 20 20 20 20 2a 6c 6f 5f  0)>>8);.    *lo_
3850: 62 79 74 65 20 3d 20 28 75 38 29 28 77 72 64 26  byte = (u8)(wrd&
3860: 30 78 30 30 30 30 30 30 46 46 29 3b 0a 0a 20 20  0x000000FF);..  
3870: 20 20 77 72 64 20 3d 20 28 63 6f 64 65 26 30 78    wrd = (code&0x
3880: 30 30 30 30 30 33 46 46 29 7c 30 78 30 30 30 30  000003FF)|0x0000
3890: 44 43 30 30 3b 0a 20 20 20 20 2a 28 68 69 5f 62  DC00;.    *(hi_b
38a0: 79 74 65 2b 32 29 20 3d 20 28 75 38 29 28 28 77  yte+2) = (u8)((w
38b0: 72 64 26 30 78 30 30 30 30 46 46 30 30 29 3e 3e  rd&0x0000FF00)>>
38c0: 38 29 3b 0a 20 20 20 20 2a 28 6c 6f 5f 62 79 74  8);.    *(lo_byt
38d0: 65 2b 32 29 20 3d 20 28 75 38 29 28 77 72 64 26  e+2) = (u8)(wrd&
38e0: 30 78 30 30 30 30 30 30 46 46 29 3b 0a 20 20 7d  0x000000FF);.  }
38f0: 0a 0a 20 20 70 53 74 72 2d 3e 63 20 2b 3d 20 62  ..  pStr->c += b
3900: 79 74 65 73 3b 0a 20 20 0a 20 20 72 65 74 75 72  ytes;.  .  retur
3910: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 5a  n 0;.}../*.** pZ
3920: 20 69 73 20 61 20 55 54 46 2d 38 20 65 6e 63 6f   is a UTF-8 enco
3930: 64 65 64 20 75 6e 69 63 6f 64 65 20 73 74 72 69  ded unicode stri
3940: 6e 67 2e 20 49 66 20 6e 42 79 74 65 20 69 73 20  ng. If nByte is 
3950: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 0a  less than zero,.
3960: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  ** return the nu
3970: 6d 62 65 72 20 6f 66 20 75 6e 69 63 6f 64 65 20  mber of unicode 
3980: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 70 5a  characters in pZ
3990: 20 75 70 20 74 6f 20 28 62 75 74 20 6e 6f 74 20   up to (but not 
39a0: 69 6e 63 6c 75 64 69 6e 67 29 0a 2a 2a 20 74 68  including).** th
39b0: 65 20 66 69 72 73 74 20 30 78 30 30 20 62 79 74  e first 0x00 byt
39c0: 65 2e 20 49 66 20 6e 42 79 74 65 20 69 73 20 6e  e. If nByte is n
39d0: 6f 74 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  ot less than zer
39e0: 6f 2c 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a  o, return the.**
39f0: 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 63 6f   number of unico
3a00: 64 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  de characters in
3a10: 20 74 68 65 20 66 69 72 73 74 20 6e 42 79 74 65   the first nByte
3a20: 20 6f 66 20 70 5a 20 28 6f 72 20 75 70 20 74 6f   of pZ (or up to
3a30: 20 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 30   .** the first 0
3a40: 78 30 30 2c 20 77 68 69 63 68 65 76 65 72 20 63  x00, whichever c
3a50: 6f 6d 65 73 20 66 69 72 73 74 29 2e 0a 2a 2f 0a  omes first)..*/.
3a60: 69 6e 74 20 73 71 6c 69 74 65 33 75 74 66 38 43  int sqlite3utf8C
3a70: 68 61 72 4c 65 6e 28 63 6f 6e 73 74 20 63 68 61  harLen(const cha
3a80: 72 20 2a 70 5a 2c 20 69 6e 74 20 6e 42 79 74 65  r *pZ, int nByte
3a90: 29 7b 0a 20 20 55 74 66 53 74 72 69 6e 67 20 73  ){.  UtfString s
3aa0: 74 72 3b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20  tr;.  int ret = 
3ab0: 30 3b 0a 20 20 75 33 32 20 63 6f 64 65 20 3d 20  0;.  u32 code = 
3ac0: 31 3b 0a 0a 20 20 73 74 72 2e 70 5a 20 3d 20 28  1;..  str.pZ = (
3ad0: 63 68 61 72 20 2a 29 70 5a 3b 0a 20 20 73 74 72  char *)pZ;.  str
3ae0: 2e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 73 74  .n = nByte;.  st
3af0: 72 2e 63 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c  r.c = 0;..  whil
3b00: 65 28 20 28 6e 42 79 74 65 3c 30 20 7c 7c 20 73  e( (nByte<0 || s
3b10: 74 72 2e 63 3c 73 74 72 2e 6e 29 20 26 26 20 63  tr.c<str.n) && c
3b20: 6f 64 65 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f  ode!=0 ){.    co
3b30: 64 65 20 3d 20 72 65 61 64 55 74 66 38 28 26 73  de = readUtf8(&s
3b40: 74 72 29 3b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a  tr);.    ret++;.
3b50: 20 20 7d 0a 20 20 69 66 28 20 63 6f 64 65 3d 3d    }.  if( code==
3b60: 30 20 29 20 72 65 74 2d 2d 3b 0a 0a 20 20 72 65  0 ) ret--;..  re
3b70: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
3b80: 2a 2a 20 70 5a 20 69 73 20 61 20 55 54 46 2d 31  ** pZ is a UTF-1
3b90: 36 20 65 6e 63 6f 64 65 64 20 75 6e 69 63 6f 64  6 encoded unicod
3ba0: 65 20 73 74 72 69 6e 67 2e 20 49 66 20 6e 43 68  e string. If nCh
3bb0: 61 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ar is less than 
3bc0: 7a 65 72 6f 2c 0a 2a 2a 20 72 65 74 75 72 6e 20  zero,.** return 
3bd0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
3be0: 74 65 73 20 75 70 20 74 6f 20 28 62 75 74 20 6e  tes up to (but n
3bf0: 6f 74 20 69 6e 63 6c 75 64 69 6e 67 29 2c 20 74  ot including), t
3c00: 68 65 20 66 69 72 73 74 20 70 61 69 72 0a 2a 2a  he first pair.**
3c10: 20 6f 66 20 63 6f 6e 73 65 63 75 74 69 76 65 20   of consecutive 
3c20: 30 78 30 30 20 62 79 74 65 73 20 69 6e 20 70 5a  0x00 bytes in pZ
3c30: 2e 20 49 66 20 6e 43 68 61 72 20 69 73 20 6e 6f  . If nChar is no
3c40: 74 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  t less than zero
3c50: 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e  ,.** then return
3c60: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
3c70: 79 74 65 73 20 69 6e 20 74 68 65 20 66 69 72 73  ytes in the firs
3c80: 74 20 6e 43 68 61 72 20 75 6e 69 63 6f 64 65 20  t nChar unicode 
3c90: 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 69 6e  characters.** in
3ca0: 20 70 5a 20 28 6f 72 20 75 70 20 75 6e 74 69 6c   pZ (or up until
3cb0: 20 74 68 65 20 66 69 72 73 74 20 70 61 69 72 20   the first pair 
3cc0: 6f 66 20 30 78 30 30 20 62 79 74 65 73 2c 20 77  of 0x00 bytes, w
3cd0: 68 69 63 68 65 76 65 72 20 63 6f 6d 65 73 20 66  hichever comes f
3ce0: 69 72 73 74 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  irst)..*/.int sq
3cf0: 6c 69 74 65 33 75 74 66 31 36 42 79 74 65 4c 65  lite3utf16ByteLe
3d00: 6e 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 5a  n(const void *pZ
3d10: 2c 20 69 6e 74 20 6e 43 68 61 72 29 7b 0a 20 20  , int nChar){.  
3d20: 69 66 28 20 6e 43 68 61 72 3c 30 20 29 7b 0a 20  if( nChar<0 ){. 
3d30: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
3d40: 64 20 63 68 61 72 20 2a 70 43 31 20 3d 20 28 75  d char *pC1 = (u
3d50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
3d60: 5a 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  Z;.    const uns
3d70: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 32 20  igned char *pC2 
3d80: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
3d90: 20 2a 29 70 5a 2b 31 3b 0a 20 20 20 20 77 68 69   *)pZ+1;.    whi
3da0: 6c 65 28 20 2a 70 43 31 20 7c 7c 20 2a 70 43 32  le( *pC1 || *pC2
3db0: 20 29 7b 0a 20 20 20 20 20 20 70 43 31 20 2b 3d   ){.      pC1 +=
3dc0: 20 32 3b 0a 20 20 20 20 20 20 70 43 32 20 2b 3d   2;.      pC2 +=
3dd0: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   2;.    }.    re
3de0: 74 75 72 6e 20 70 43 31 2d 28 75 6e 73 69 67 6e  turn pC1-(unsign
3df0: 65 64 20 63 68 61 72 20 2a 29 70 5a 3b 0a 20 20  ed char *)pZ;.  
3e00: 7d 65 6c 73 65 7b 0a 20 20 20 20 55 74 66 53 74  }else{.    UtfSt
3e10: 72 69 6e 67 20 73 74 72 3b 0a 20 20 20 20 75 33  ring str;.    u3
3e20: 32 20 63 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  2 code = 1;.    
3e30: 69 6e 74 20 62 69 67 5f 65 6e 64 69 61 6e 3b 0a  int big_endian;.
3e40: 20 20 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20      int nRead = 
3e50: 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a  0;.    int ret;.
3e60: 0a 20 20 20 20 73 74 72 2e 70 5a 20 3d 20 28 63  .    str.pZ = (c
3e70: 68 61 72 20 2a 29 70 5a 3b 0a 20 20 20 20 73 74  har *)pZ;.    st
3e80: 72 2e 63 20 3d 20 30 3b 0a 20 20 20 20 73 74 72  r.c = 0;.    str
3e90: 2e 6e 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 2f 2a  .n = -1;..    /*
3ea0: 20 43 68 65 63 6b 20 66 6f 72 20 61 20 42 4f 4d   Check for a BOM
3eb0: 2e 20 57 65 20 6a 75 73 74 20 69 67 6e 6f 72 65  . We just ignore
3ec0: 20 69 74 20 69 66 20 74 68 65 72 65 20 69 73 20   it if there is 
3ed0: 6f 6e 65 2c 20 69 74 27 73 20 6f 6e 6c 79 20 72  one, it's only r
3ee0: 65 61 64 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68  ead.    ** so th
3ef0: 61 74 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 75  at it is not cou
3f00: 6e 74 65 64 20 61 73 20 61 20 63 68 61 72 61 63  nted as a charac
3f10: 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ter. .    */.   
3f20: 20 62 69 67 5f 65 6e 64 69 61 6e 20 3d 20 72 65   big_endian = re
3f30: 61 64 55 74 66 31 36 42 6f 6d 28 26 73 74 72 2c  adUtf16Bom(&str,
3f40: 20 30 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 30   0);.    ret = 0
3f50: 2d 73 74 72 2e 63 3b 0a 0a 20 20 20 20 77 68 69  -str.c;..    whi
3f60: 6c 65 28 20 63 6f 64 65 21 3d 30 20 26 26 20 6e  le( code!=0 && n
3f70: 52 65 61 64 3c 6e 43 68 61 72 20 29 7b 0a 20 20  Read<nChar ){.  
3f80: 20 20 20 20 63 6f 64 65 20 3d 20 72 65 61 64 55      code = readU
3f90: 74 66 31 36 28 26 73 74 72 2c 20 62 69 67 5f 65  tf16(&str, big_e
3fa0: 6e 64 69 61 6e 29 3b 0a 20 20 20 20 20 20 6e 52  ndian);.      nR
3fb0: 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ead++;.    }.   
3fc0: 20 69 66 28 20 63 6f 64 65 3d 3d 30 20 29 7b 0a   if( code==0 ){.
3fd0: 20 20 20 20 20 20 72 65 74 20 2d 3d 20 32 3b 0a        ret -= 2;.
3fe0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
3ff0: 20 73 74 72 2e 63 20 2b 20 72 65 74 3b 0a 20 20   str.c + ret;.  
4000: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  }.}../*.** Conve
4010: 72 74 20 61 20 73 74 72 69 6e 67 20 69 6e 20 55  rt a string in U
4020: 54 46 2d 31 36 20 6e 61 74 69 76 65 20 62 79 74  TF-16 native byt
4030: 65 20 28 6f 72 20 77 69 74 68 20 61 20 42 79 74  e (or with a Byt
4040: 65 2d 6f 72 64 65 72 2d 6d 61 72 6b 20 6f 72 0a  e-order-mark or.
4050: 2a 2a 20 22 42 4f 4d 22 29 20 69 6e 74 6f 20 61  ** "BOM") into a
4060: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e 20 20   UTF-8 string.  
4070: 54 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67  The UTF-8 string
4080: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
4090: 20 73 70 61 63 65 20 0a 2a 2a 20 6f 62 74 61 69   space .** obtai
40a0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
40b0: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
40c0: 74 20 62 65 20 72 65 6c 65 61 73 65 64 20 62 79  t be released by
40d0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
40e0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
40f0: 20 70 61 72 61 6d 65 74 65 72 20 4e 20 69 73 20   parameter N is 
4100: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
4110: 74 65 73 20 69 6e 20 74 68 65 20 55 54 46 2d 31  tes in the UTF-1
4120: 36 20 73 74 72 69 6e 67 2e 20 20 49 66 20 4e 20  6 string.  If N 
4130: 69 73 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20  is.** negative, 
4140: 74 68 65 20 65 6e 74 69 72 65 20 73 74 72 69 6e  the entire strin
4150: 67 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  g up to the firs
4160: 74 20 5c 75 30 30 30 30 20 63 68 61 72 61 63 74  t \u0000 charact
4170: 65 72 20 69 73 20 74 72 61 6e 73 6c 61 74 65 64  er is translated
4180: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
4190: 72 6e 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e  rned UTF-8 strin
41a0: 67 20 69 73 20 61 6c 77 61 79 73 20 5c 30 30 30  g is always \000
41b0: 20 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a   terminated..*/.
41c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73  unsigned char *s
41d0: 71 6c 69 74 65 33 75 74 66 31 36 74 6f 38 28 63  qlite3utf16to8(c
41e0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
41f0: 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 62 69 67  , int N, int big
4200: 5f 65 6e 64 69 61 6e 29 7b 0a 20 20 55 74 66 53  _endian){.  UtfS
4210: 74 72 69 6e 67 20 69 6e 3b 0a 20 20 55 74 66 53  tring in;.  UtfS
4220: 74 72 69 6e 67 20 6f 75 74 3b 0a 0a 20 20 6f 75  tring out;..  ou
4230: 74 2e 70 5a 20 3d 20 30 3b 0a 0a 20 20 69 6e 2e  t.pZ = 0;..  in.
4240: 70 5a 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  pZ = (unsigned c
4250: 68 61 72 20 2a 29 70 44 61 74 61 3b 0a 20 20 69  har *)pData;.  i
4260: 6e 2e 6e 20 3d 20 4e 3b 0a 20 20 69 6e 2e 63 20  n.n = N;.  in.c 
4270: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 6e 2e 6e  = 0;..  if( in.n
4280: 3c 30 20 29 7b 0a 20 20 20 20 69 6e 2e 6e 20 3d  <0 ){.    in.n =
4290: 20 73 71 6c 69 74 65 33 75 74 66 31 36 42 79 74   sqlite3utf16Byt
42a0: 65 4c 65 6e 28 69 6e 2e 70 5a 2c 20 2d 31 29 3b  eLen(in.pZ, -1);
42b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 20 55 54 46  .  }..  /* A UTF
42c0: 2d 38 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61  -8 encoding of a
42d0: 20 75 6e 69 63 6f 64 65 20 73 74 72 69 6e 67 20   unicode string 
42e0: 63 61 6e 20 72 65 71 75 69 72 65 20 61 74 20 6d  can require at m
42f0: 6f 73 74 20 31 2e 35 20 74 69 6d 65 73 20 61 73  ost 1.5 times as
4300: 0a 20 20 2a 2a 20 6d 75 63 68 20 73 70 61 63 65  .  ** much space
4310: 20 74 6f 20 73 74 6f 72 65 20 61 73 20 74 68 65   to store as the
4320: 20 73 61 6d 65 20 73 74 72 69 6e 67 20 65 6e 63   same string enc
4330: 6f 64 65 64 20 75 73 69 6e 67 20 55 54 46 2d 31  oded using UTF-1
4340: 36 2e 20 41 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a  6. Allocate.  **
4350: 20 74 68 69 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a   this now..  */.
4360: 20 20 6f 75 74 2e 6e 20 3d 20 28 69 6e 2e 6e 2a    out.n = (in.n*
4370: 31 2e 35 29 20 2b 20 31 3b 0a 20 20 6f 75 74 2e  1.5) + 1;.  out.
4380: 70 5a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  pZ = sqliteMallo
4390: 63 28 6f 75 74 2e 6e 29 3b 0a 20 20 69 66 28 20  c(out.n);.  if( 
43a0: 21 6f 75 74 2e 70 5a 20 29 7b 0a 20 20 20 20 72  !out.pZ ){.    r
43b0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6f  eturn 0;.  }.  o
43c0: 75 74 2e 63 20 3d 20 30 3b 0a 0a 20 20 62 69 67  ut.c = 0;..  big
43d0: 5f 65 6e 64 69 61 6e 20 3d 20 72 65 61 64 55 74  _endian = readUt
43e0: 66 31 36 42 6f 6d 28 26 69 6e 2c 20 62 69 67 5f  f16Bom(&in, big_
43f0: 65 6e 64 69 61 6e 29 3b 0a 20 20 77 68 69 6c 65  endian);.  while
4400: 28 20 69 6e 2e 63 3c 69 6e 2e 6e 20 29 7b 0a 20  ( in.c<in.n ){. 
4410: 20 20 20 77 72 69 74 65 55 74 66 38 28 26 6f 75     writeUtf8(&ou
4420: 74 2c 20 72 65 61 64 55 74 66 31 36 28 26 69 6e  t, readUtf16(&in
4430: 2c 20 62 69 67 5f 65 6e 64 69 61 6e 29 29 3b 0a  , big_endian));.
4440: 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68    }..  /* Add th
4450: 65 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 6f  e NULL-terminato
4460: 72 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20  r character */. 
4470: 20 61 73 73 65 72 74 28 20 6f 75 74 2e 63 3c 6f   assert( out.c<o
4480: 75 74 2e 6e 20 29 3b 0a 20 20 6f 75 74 2e 70 5a  ut.n );.  out.pZ
4490: 5b 6f 75 74 2e 63 5d 20 3d 20 30 78 30 30 3b 0a  [out.c] = 0x00;.
44a0: 0a 20 20 72 65 74 75 72 6e 20 6f 75 74 2e 70 5a  .  return out.pZ
44b0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
44c0: 20 2a 75 74 66 38 74 6f 55 74 66 31 36 28 63 6f   *utf8toUtf16(co
44d0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
44e0: 72 20 2a 70 49 6e 2c 20 69 6e 74 20 4e 2c 20 69  r *pIn, int N, i
44f0: 6e 74 20 62 69 67 5f 65 6e 64 69 61 6e 29 7b 0a  nt big_endian){.
4500: 20 20 55 74 66 53 74 72 69 6e 67 20 69 6e 3b 0a    UtfString in;.
4510: 20 20 55 74 66 53 74 72 69 6e 67 20 6f 75 74 3b    UtfString out;
4520: 0a 0a 20 20 69 6e 2e 70 5a 20 3d 20 28 75 6e 73  ..  in.pZ = (uns
4530: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 49 6e  igned char *)pIn
4540: 3b 0a 20 20 69 6e 2e 6e 20 3d 20 4e 3b 0a 20 20  ;.  in.n = N;.  
4550: 69 6e 2e 63 20 3d 20 30 3b 0a 0a 20 20 69 66 28  in.c = 0;..  if(
4560: 20 69 6e 2e 6e 3c 30 20 29 7b 0a 20 20 20 20 69   in.n<0 ){.    i
4570: 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 69 6e 2e  n.n = strlen(in.
4580: 70 5a 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  pZ);.  }..  /* A
4590: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67   UTF-16 encoding
45a0: 20 6f 66 20 61 20 75 6e 69 63 6f 64 65 20 73 74   of a unicode st
45b0: 72 69 6e 67 20 63 61 6e 20 72 65 71 75 69 72 65  ring can require
45c0: 20 61 74 20 6d 6f 73 74 20 74 77 69 63 65 20 61   at most twice a
45d0: 73 0a 20 20 2a 2a 20 6d 75 63 68 20 73 70 61 63  s.  ** much spac
45e0: 65 20 74 6f 20 73 74 6f 72 65 20 61 73 20 74 68  e to store as th
45f0: 65 20 73 61 6d 65 20 73 74 72 69 6e 67 20 65 6e  e same string en
4600: 63 6f 64 65 64 20 75 73 69 6e 67 20 55 54 46 2d  coded using UTF-
4610: 38 2e 20 41 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a  8. Allocate.  **
4620: 20 74 68 69 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a   this now..  */.
4630: 20 20 6f 75 74 2e 6e 20 3d 20 28 69 6e 2e 6e 2a    out.n = (in.n*
4640: 32 29 20 2b 20 32 3b 0a 20 20 6f 75 74 2e 70 5a  2) + 2;.  out.pZ
4650: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
4660: 6f 75 74 2e 6e 29 3b 0a 20 20 69 66 28 20 21 6f  out.n);.  if( !o
4670: 75 74 2e 70 5a 20 29 7b 0a 20 20 20 20 72 65 74  ut.pZ ){.    ret
4680: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6f 75 74  urn 0;.  }.  out
4690: 2e 63 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  .c = 0;..  while
46a0: 28 20 69 6e 2e 63 3c 69 6e 2e 6e 20 29 7b 0a 20  ( in.c<in.n ){. 
46b0: 20 20 20 77 72 69 74 65 55 74 66 31 36 28 26 6f     writeUtf16(&o
46c0: 75 74 2c 20 72 65 61 64 55 74 66 38 28 26 69 6e  ut, readUtf8(&in
46d0: 29 2c 20 62 69 67 5f 65 6e 64 69 61 6e 29 3b 0a  ), big_endian);.
46e0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68    }..  /* Add th
46f0: 65 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 6f  e NULL-terminato
4700: 72 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20  r character */. 
4710: 20 61 73 73 65 72 74 28 20 28 6f 75 74 2e 63 2b   assert( (out.c+
4720: 31 29 3c 6f 75 74 2e 6e 20 29 3b 0a 20 20 6f 75  1)<out.n );.  ou
4730: 74 2e 70 5a 5b 6f 75 74 2e 63 5d 20 3d 20 30 78  t.pZ[out.c] = 0x
4740: 30 30 3b 0a 20 20 6f 75 74 2e 70 5a 5b 6f 75 74  00;.  out.pZ[out
4750: 2e 63 2b 31 5d 20 3d 20 30 78 30 30 3b 0a 0a 20  .c+1] = 0x00;.. 
4760: 20 72 65 74 75 72 6e 20 6f 75 74 2e 70 5a 3b 0a   return out.pZ;.
4770: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  }../*.** Transla
4780: 74 65 20 55 54 46 2d 38 20 74 6f 20 55 54 46 2d  te UTF-8 to UTF-
4790: 31 36 42 45 20 6f 72 20 55 54 46 2d 31 36 4c 45  16BE or UTF-16LE
47a0: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
47b0: 33 75 74 66 38 74 6f 31 36 62 65 28 63 6f 6e 73  3utf8to16be(cons
47c0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
47d0: 2a 70 49 6e 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  *pIn, int N){.  
47e0: 72 65 74 75 72 6e 20 75 74 66 38 74 6f 55 74 66  return utf8toUtf
47f0: 31 36 28 70 49 6e 2c 20 4e 2c 20 31 29 3b 0a 7d  16(pIn, N, 1);.}
4800: 0a 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 75  ..void *sqlite3u
4810: 74 66 38 74 6f 31 36 6c 65 28 63 6f 6e 73 74 20  tf8to16le(const 
4820: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
4830: 49 6e 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65  In, int N){.  re
4840: 74 75 72 6e 20 75 74 66 38 74 6f 55 74 66 31 36  turn utf8toUtf16
4850: 28 70 49 6e 2c 20 4e 2c 20 30 29 3b 0a 7d 0a 0a  (pIn, N, 0);.}..
4860: 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  /* .** This rout
4870: 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f 72  ine does the wor
4880: 6b 20 66 6f 72 20 73 71 6c 69 74 65 33 75 74 66  k for sqlite3utf
4890: 31 36 74 6f 31 36 6c 65 28 29 20 61 6e 64 0a 2a  16to16le() and.*
48a0: 2a 20 73 71 6c 69 74 65 33 75 74 66 31 36 74 6f  * sqlite3utf16to
48b0: 31 36 62 65 28 29 2e 20 49 66 20 62 69 67 5f 65  16be(). If big_e
48c0: 6e 64 69 61 6e 20 69 73 20 31 20 74 68 65 20 69  ndian is 1 the i
48d0: 6e 70 75 74 20 73 74 72 69 6e 67 20 69 73 0a 2a  nput string is.*
48e0: 2a 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  * transformed in
48f0: 20 70 6c 61 63 65 20 74 6f 20 55 54 46 2d 31 36   place to UTF-16
4900: 42 45 20 65 6e 63 6f 64 69 6e 67 2e 20 49 66 20  BE encoding. If 
4910: 62 69 67 5f 65 6e 64 69 61 6e 20 69 73 20 30 20  big_endian is 0 
4920: 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 70 75  then.** the inpu
4930: 74 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64  t is transformed
4940: 20 74 6f 20 55 54 46 2d 31 36 4c 45 2e 0a 2a 2a   to UTF-16LE..**
4950: 0a 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 66  .** Unless the f
4960: 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 6f  irst two bytes o
4970: 66 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  f the input stri
4980: 6e 67 20 69 73 20 61 20 42 4f 4d 2c 20 74 68 65  ng is a BOM, the
4990: 20 69 6e 70 75 74 20 69 73 0a 2a 2a 20 61 73 73   input is.** ass
49a0: 75 6d 65 64 20 74 6f 20 62 65 20 55 54 46 2d 31  umed to be UTF-1
49b0: 36 20 65 6e 63 6f 64 65 64 20 75 73 69 6e 67 20  6 encoded using 
49c0: 74 68 65 20 6d 61 63 68 69 6e 65 73 20 6e 61 74  the machines nat
49d0: 69 76 65 20 62 79 74 65 20 6f 72 64 65 72 69 6e  ive byte orderin
49e0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
49f0: 64 20 75 74 66 31 36 74 6f 31 36 28 76 6f 69 64  d utf16to16(void
4a00: 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 4e 2c 20   *pData, int N, 
4a10: 69 6e 74 20 62 69 67 5f 65 6e 64 69 61 6e 29 7b  int big_endian){
4a20: 0a 20 20 55 74 66 53 74 72 69 6e 67 20 69 6e 6f  .  UtfString ino
4a30: 75 74 3b 0a 20 20 69 6e 6f 75 74 2e 70 5a 20 3d  ut;.  inout.pZ =
4a40: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
4a50: 2a 29 70 44 61 74 61 3b 0a 20 20 69 6e 6f 75 74  *)pData;.  inout
4a60: 2e 63 20 3d 20 30 3b 0a 20 20 69 6e 6f 75 74 2e  .c = 0;.  inout.
4a70: 6e 20 3d 20 4e 3b 0a 0a 20 20 69 66 28 20 69 6e  n = N;..  if( in
4a80: 6f 75 74 2e 6e 3c 30 20 29 7b 0a 20 20 20 20 69  out.n<0 ){.    i
4a90: 6e 6f 75 74 2e 6e 20 3d 20 73 71 6c 69 74 65 33  nout.n = sqlite3
4aa0: 75 74 66 31 36 42 79 74 65 4c 65 6e 28 69 6e 6f  utf16ByteLen(ino
4ab0: 75 74 2e 70 5a 2c 20 2d 31 29 3b 0a 20 20 7d 0a  ut.pZ, -1);.  }.
4ac0: 0a 20 20 69 66 28 20 72 65 61 64 55 74 66 31 36  .  if( readUtf16
4ad0: 42 6f 6d 28 26 69 6e 6f 75 74 2c 20 53 51 4c 49  Bom(&inout, SQLI
4ae0: 54 45 5f 42 49 47 45 4e 44 49 41 4e 29 21 3d 62  TE_BIGENDIAN)!=b
4af0: 69 67 5f 65 6e 64 69 61 6e 20 29 7b 0a 20 20 20  ig_endian ){.   
4b00: 20 2f 2a 20 73 77 61 62 28 26 69 6e 6f 75 74 2e   /* swab(&inout.
4b10: 70 5a 5b 69 6e 6f 75 74 2e 63 5d 2c 20 69 6e 6f  pZ[inout.c], ino
4b20: 75 74 2e 70 5a 2c 20 69 6e 6f 75 74 2e 6e 2d 69  ut.pZ, inout.n-i
4b30: 6e 6f 75 74 2e 63 29 3b 20 2a 2f 0a 20 20 20 20  nout.c); */.    
4b40: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
4b50: 3d 30 3b 20 69 3c 28 69 6e 6f 75 74 2e 6e 2d 69  =0; i<(inout.n-i
4b60: 6e 6f 75 74 2e 63 29 3b 20 69 20 2b 3d 20 32 29  nout.c); i += 2)
4b70: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 63 31 20  {.      char c1 
4b80: 3d 20 69 6e 6f 75 74 2e 70 5a 5b 69 2b 69 6e 6f  = inout.pZ[i+ino
4b90: 75 74 2e 63 5d 3b 0a 20 20 20 20 20 20 63 68 61  ut.c];.      cha
4ba0: 72 20 63 32 20 3d 20 69 6e 6f 75 74 2e 70 5a 5b  r c2 = inout.pZ[
4bb0: 69 2b 69 6e 6f 75 74 2e 63 2b 31 5d 3b 0a 20 20  i+inout.c+1];.  
4bc0: 20 20 20 20 69 6e 6f 75 74 2e 70 5a 5b 69 5d 20      inout.pZ[i] 
4bd0: 3d 20 63 32 3b 0a 20 20 20 20 20 20 69 6e 6f 75  = c2;.      inou
4be0: 74 2e 70 5a 5b 69 2b 31 5d 20 3d 20 63 31 3b 0a  t.pZ[i+1] = c1;.
4bf0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
4c00: 28 20 69 6e 6f 75 74 2e 63 20 29 7b 0a 20 20 20  ( inout.c ){.   
4c10: 20 6d 65 6d 6d 6f 76 65 28 69 6e 6f 75 74 2e 70   memmove(inout.p
4c20: 5a 2c 20 26 69 6e 6f 75 74 2e 70 5a 5b 69 6e 6f  Z, &inout.pZ[ino
4c30: 75 74 2e 63 5d 2c 20 69 6e 6f 75 74 2e 6e 2d 69  ut.c], inout.n-i
4c40: 6e 6f 75 74 2e 63 29 3b 0a 20 20 7d 0a 0a 20 20  nout.c);.  }..  
4c50: 69 6e 6f 75 74 2e 70 5a 5b 69 6e 6f 75 74 2e 6e  inout.pZ[inout.n
4c60: 2d 69 6e 6f 75 74 2e 63 5d 20 3d 20 30 78 30 30  -inout.c] = 0x00
4c70: 3b 0a 20 20 69 6e 6f 75 74 2e 70 5a 5b 69 6e 6f  ;.  inout.pZ[ino
4c80: 75 74 2e 6e 2d 69 6e 6f 75 74 2e 63 2b 31 5d 20  ut.n-inout.c+1] 
4c90: 3d 20 30 78 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  = 0x00;.}../*.**
4ca0: 20 43 6f 6e 76 65 72 74 20 61 20 73 74 72 69 6e   Convert a strin
4cb0: 67 20 69 6e 20 55 54 46 2d 31 36 20 6e 61 74 69  g in UTF-16 nati
4cc0: 76 65 20 62 79 74 65 20 6f 72 20 77 69 74 68 20  ve byte or with 
4cd0: 61 20 42 4f 4d 20 69 6e 74 6f 20 61 20 55 54 46  a BOM into a UTF
4ce0: 2d 31 36 4c 45 0a 2a 2a 20 73 74 72 69 6e 67 2e  -16LE.** string.
4cf0: 20 20 54 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e    The conversion
4d00: 20 6f 63 63 75 72 73 20 69 6e 2d 70 6c 61 63 65   occurs in-place
4d10: 2e 20 20 54 68 65 20 6f 75 74 70 75 74 20 6f 76  .  The output ov
4d20: 65 72 77 72 69 74 65 73 20 74 68 65 0a 2a 2a 20  erwrites the.** 
4d30: 69 6e 70 75 74 2e 20 20 4e 20 62 79 74 65 73 20  input.  N bytes 
4d40: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 2e 20 20  are converted.  
4d50: 49 66 20 4e 20 69 73 20 6e 65 67 61 74 69 76 65  If N is negative
4d60: 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 63   everything is c
4d70: 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 75 70 20 74  onverted.** up t
4d80: 6f 20 74 68 65 20 66 69 72 73 74 20 5c 75 30 30  o the first \u00
4d90: 30 30 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a  00 character..**
4da0: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 61 74 69 76  .** If the nativ
4db0: 65 20 62 79 74 65 20 6f 72 64 65 72 20 69 73 20  e byte order is 
4dc0: 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 61 6e  little-endian an
4dd0: 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 42 4f  d there is no BO
4de0: 4d 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  M, then.** this 
4df0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
4e00: 6f 70 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  op.  If there is
4e10: 20 61 20 42 4f 4d 20 61 74 20 74 68 65 20 73 74   a BOM at the st
4e20: 61 72 74 20 6f 66 20 74 68 65 20 73 74 72 69 6e  art of the strin
4e30: 67 2c 0a 2a 2a 20 69 74 20 69 73 20 72 65 6d 6f  g,.** it is remo
4e40: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73  ved..**.** Trans
4e50: 6c 61 74 69 6f 6e 20 66 72 6f 6d 20 55 54 46 2d  lation from UTF-
4e60: 31 36 4c 45 20 74 6f 20 55 54 46 2d 31 36 42 45  16LE to UTF-16BE
4e70: 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 20   and back again 
4e80: 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 0a  is accomplished.
4e90: 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6c 69 62  ** using the lib
4ea0: 72 61 72 79 20 66 75 6e 63 74 69 6f 6e 20 73 77  rary function sw
4eb0: 61 62 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ab()..*/.void sq
4ec0: 6c 69 74 65 33 75 74 66 31 36 74 6f 31 36 6c 65  lite3utf16to16le
4ed0: 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e  (void *pData, in
4ee0: 74 20 4e 29 7b 0a 20 20 75 74 66 31 36 74 6f 31  t N){.  utf16to1
4ef0: 36 28 70 44 61 74 61 2c 20 4e 2c 20 30 29 3b 0a  6(pData, N, 0);.
4f00: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
4f10: 20 61 20 73 74 72 69 6e 67 20 69 6e 20 55 54 46   a string in UTF
4f20: 2d 31 36 20 6e 61 74 69 76 65 20 62 79 74 65 20  -16 native byte 
4f30: 6f 72 20 77 69 74 68 20 61 20 42 4f 4d 20 69 6e  or with a BOM in
4f40: 74 6f 20 61 20 55 54 46 2d 31 36 42 45 0a 2a 2a  to a UTF-16BE.**
4f50: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 63 6f   string.  The co
4f60: 6e 76 65 72 73 69 6f 6e 20 6f 63 63 75 72 73 20  nversion occurs 
4f70: 69 6e 2d 70 6c 61 63 65 2e 20 20 54 68 65 20 6f  in-place.  The o
4f80: 75 74 70 75 74 20 6f 76 65 72 77 72 69 74 65 73  utput overwrites
4f90: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 2e 20 20   the.** input.  
4fa0: 4e 20 62 79 74 65 73 20 61 72 65 20 63 6f 6e 76  N bytes are conv
4fb0: 65 72 74 65 64 2e 20 20 49 66 20 4e 20 69 73 20  erted.  If N is 
4fc0: 6e 65 67 61 74 69 76 65 20 65 76 65 72 79 74 68  negative everyth
4fd0: 69 6e 67 20 69 73 20 63 6f 6e 76 65 72 74 65 64  ing is converted
4fe0: 0a 2a 2a 20 75 70 20 74 6f 20 74 68 65 20 66 69  .** up to the fi
4ff0: 72 73 74 20 5c 75 30 30 30 30 20 63 68 61 72 61  rst \u0000 chara
5000: 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cter..**.** If t
5010: 68 65 20 6e 61 74 69 76 65 20 62 79 74 65 20 6f  he native byte o
5020: 72 64 65 72 20 69 73 20 6c 69 74 74 6c 65 2d 65  rder is little-e
5030: 6e 64 69 61 6e 20 61 6e 64 20 74 68 65 72 65 20  ndian and there 
5040: 69 73 20 6e 6f 20 42 4f 4d 2c 20 74 68 65 6e 0a  is no BOM, then.
5050: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
5060: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20  is a no-op.  If 
5070: 74 68 65 72 65 20 69 73 20 61 20 42 4f 4d 20 61  there is a BOM a
5080: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
5090: 68 65 20 73 74 72 69 6e 67 2c 0a 2a 2a 20 69 74  he string,.** it
50a0: 20 69 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a   is removed..**.
50b0: 2a 2a 20 54 72 61 6e 73 6c 61 74 69 6f 6e 20 66  ** Translation f
50c0: 72 6f 6d 20 55 54 46 2d 31 36 4c 45 20 74 6f 20  rom UTF-16LE to 
50d0: 55 54 46 2d 31 36 42 45 20 61 6e 64 20 62 61 63  UTF-16BE and bac
50e0: 6b 20 61 67 61 69 6e 20 69 73 20 61 63 63 6f 6d  k again is accom
50f0: 70 6c 69 73 68 65 64 0a 2a 2a 20 75 73 69 6e 67  plished.** using
5100: 20 74 68 65 20 6c 69 62 72 61 72 79 20 66 75 6e   the library fun
5110: 63 74 69 6f 6e 20 73 77 61 62 28 29 2e 0a 2a 2f  ction swab()..*/
5120: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 75 74 66  .void sqlite3utf
5130: 31 36 74 6f 31 36 62 65 28 76 6f 69 64 20 2a 70  16to16be(void *p
5140: 44 61 74 61 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  Data, int N){.  
5150: 75 74 66 31 36 74 6f 31 36 28 70 44 61 74 61 2c  utf16to16(pData,
5160: 20 4e 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   N, 1);.}../*.**
5170: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
5180: 73 20 75 73 65 64 20 74 6f 20 74 72 61 6e 73 6c  s used to transl
5190: 61 74 65 20 62 65 74 77 65 65 6e 20 55 54 46 2d  ate between UTF-
51a0: 38 20 61 6e 64 20 55 54 46 2d 31 36 2e 20 54 68  8 and UTF-16. Th
51b0: 65 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 72  e.** result is r
51c0: 65 74 75 72 6e 65 64 20 69 6e 20 64 79 6e 61 6d  eturned in dynam
51d0: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
51e0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20   memory..*/.int 
51f0: 73 71 6c 69 74 65 33 75 74 66 54 72 61 6e 73 6c  sqlite3utfTransl
5200: 61 74 65 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69  ate(.  const voi
5210: 64 20 2a 7a 44 61 74 61 2c 20 69 6e 74 20 6e 44  d *zData, int nD
5220: 61 74 61 2c 20 20 2f 2a 20 49 6e 70 75 74 20 73  ata,  /* Input s
5230: 74 72 69 6e 67 20 2a 2f 0a 20 20 75 38 20 65 6e  tring */.  u8 en
5240: 63 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  c1,             
5250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 63            /* Enc
5260: 6f 64 69 6e 67 20 6f 66 20 7a 44 61 74 61 20 2a  oding of zData *
5270: 2f 0a 20 20 76 6f 69 64 20 2a 2a 7a 4f 75 74 2c  /.  void **zOut,
5280: 20 69 6e 74 20 2a 6e 4f 75 74 2c 20 20 20 20 20   int *nOut,     
5290: 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 73 74 72     /* Output str
52a0: 69 6e 67 20 2a 2f 0a 20 20 75 38 20 65 6e 63 32  ing */.  u8 enc2
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72          /* Desir
52d0: 65 64 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 6f  ed encoding of o
52e0: 75 74 70 75 74 20 2a 2f 0a 29 7b 0a 20 20 61 73  utput */.){.  as
52f0: 73 65 72 74 28 20 65 6e 63 31 3d 3d 54 45 58 54  sert( enc1==TEXT
5300: 5f 55 74 66 38 20 7c 7c 20 65 6e 63 31 3d 3d 54  _Utf8 || enc1==T
5310: 45 58 54 5f 55 74 66 31 36 6c 65 20 7c 7c 20 65  EXT_Utf16le || e
5320: 6e 63 31 3d 3d 54 45 58 54 5f 55 74 66 31 36 62  nc1==TEXT_Utf16b
5330: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  e );.  assert( e
5340: 6e 63 32 3d 3d 54 45 58 54 5f 55 74 66 38 20 7c  nc2==TEXT_Utf8 |
5350: 7c 20 65 6e 63 32 3d 3d 54 45 58 54 5f 55 74 66  | enc2==TEXT_Utf
5360: 31 36 6c 65 20 7c 7c 20 65 6e 63 32 3d 3d 54 45  16le || enc2==TE
5370: 58 54 5f 55 74 66 31 36 62 65 20 29 3b 0a 20 20  XT_Utf16be );.  
5380: 61 73 73 65 72 74 28 20 0a 20 20 20 20 28 65 6e  assert( .    (en
5390: 63 31 3d 3d 54 45 58 54 5f 55 74 66 38 20 26 26  c1==TEXT_Utf8 &&
53a0: 20 28 65 6e 63 32 3d 3d 54 45 58 54 5f 55 74 66   (enc2==TEXT_Utf
53b0: 31 36 6c 65 20 7c 7c 20 65 6e 63 32 3d 3d 54 45  16le || enc2==TE
53c0: 58 54 5f 55 74 66 31 36 62 65 29 29 20 7c 7c 0a  XT_Utf16be)) ||.
53d0: 20 20 20 20 28 65 6e 63 32 3d 3d 54 45 58 54 5f      (enc2==TEXT_
53e0: 55 74 66 38 20 26 26 20 28 65 6e 63 31 3d 3d 54  Utf8 && (enc1==T
53f0: 45 58 54 5f 55 74 66 31 36 6c 65 20 7c 7c 20 65  EXT_Utf16le || e
5400: 6e 63 31 3d 3d 54 45 58 54 5f 55 74 66 31 36 62  nc1==TEXT_Utf16b
5410: 65 29 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  e)).  );..  if( 
5420: 65 6e 63 31 3d 3d 54 45 58 54 5f 55 74 66 38 20  enc1==TEXT_Utf8 
5430: 29 7b 0a 20 20 20 20 69 66 28 20 65 6e 63 32 3d  ){.    if( enc2=
5440: 3d 54 45 58 54 5f 55 74 66 31 36 6c 65 20 29 7b  =TEXT_Utf16le ){
5450: 0a 20 20 20 20 20 20 2a 7a 4f 75 74 20 3d 20 73  .      *zOut = s
5460: 71 6c 69 74 65 33 75 74 66 38 74 6f 31 36 6c 65  qlite3utf8to16le
5470: 28 7a 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a  (zData, nData);.
5480: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5490: 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33   *zOut = sqlite3
54a0: 75 74 66 38 74 6f 31 36 62 65 28 7a 44 61 74 61  utf8to16be(zData
54b0: 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  , nData);.    }.
54c0: 20 20 20 20 69 66 28 20 21 28 2a 7a 4f 75 74 29      if( !(*zOut)
54d0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
54e0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 2a 6e 4f 75  _NOMEM;.    *nOu
54f0: 74 20 3d 20 73 71 6c 69 74 65 33 75 74 66 31 36  t = sqlite3utf16
5500: 42 79 74 65 4c 65 6e 28 2a 7a 4f 75 74 2c 20 2d  ByteLen(*zOut, -
5510: 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
5520: 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33   *zOut = sqlite3
5530: 75 74 66 31 36 74 6f 38 28 7a 44 61 74 61 2c 20  utf16to8(zData, 
5540: 6e 44 61 74 61 2c 20 65 6e 63 31 3d 3d 54 45 58  nData, enc1==TEX
5550: 54 5f 55 74 66 31 36 62 65 29 3b 0a 20 20 20 20  T_Utf16be);.    
5560: 69 66 28 20 21 28 2a 7a 4f 75 74 29 20 29 20 72  if( !(*zOut) ) r
5570: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
5580: 45 4d 3b 0a 20 20 20 20 2a 6e 4f 75 74 20 3d 20  EM;.    *nOut = 
5590: 73 74 72 6c 65 6e 28 2a 7a 4f 75 74 29 3b 0a 20  strlen(*zOut);. 
55a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
55b0: 54 45 5f 4f 4b 3b 0a 7d 0a                       TE_OK;.}.