/ Hex Artifact Content
Login

Artifact 0e83deb064da62c202c1765e6194e938ca16d20f:


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 37 20 32  : utf.c,v 1.17 2
01f0: 30 30 34 2f 30 36 2f 30 36 20 30 39 3a 34 34 3a  004/06/06 09:44:
0200: 30 35 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  05 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 20 20 20 20 20 20  T_Utf8: {.      
1210: 73 74 72 75 63 74 20 55 74 66 38 54 62 6c 52 6f  struct Utf8TblRo
1220: 77 20 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62  w {.        u8 b
1230: 31 5f 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  1_mask;.        
1240: 75 38 20 62 31 5f 6d 61 73 6b 65 64 5f 76 61 6c  u8 b1_masked_val
1250: 3b 0a 20 20 20 20 20 20 20 20 75 38 20 62 31 5f  ;.        u8 b1_
1260: 76 61 6c 75 65 5f 6d 61 73 6b 3b 0a 20 20 20 20  value_mask;.    
1270: 20 20 20 20 69 6e 74 20 74 72 61 69 6c 69 6e 67      int trailing
1280: 5f 62 79 74 65 73 3b 0a 20 20 20 20 20 20 7d 3b  _bytes;.      };
1290: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
12a0: 6e 73 74 20 73 74 72 75 63 74 20 55 74 66 38 54  nst struct Utf8T
12b0: 62 6c 52 6f 77 20 75 74 66 38 74 62 6c 5b 5d 20  blRow utf8tbl[] 
12c0: 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 30 78  = {.        { 0x
12d0: 38 30 2c 20 30 78 30 30 2c 20 30 78 37 46 2c 20  80, 0x00, 0x7F, 
12e0: 30 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 30  0 },.        { 0
12f0: 78 45 30 2c 20 30 78 43 30 2c 20 30 78 31 46 2c  xE0, 0xC0, 0x1F,
1300: 20 31 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20   1 },.        { 
1310: 30 78 46 30 2c 20 30 78 45 30 2c 20 30 78 30 46  0xF0, 0xE0, 0x0F
1320: 2c 20 32 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b  , 2 },.        {
1330: 20 30 78 46 38 2c 20 30 78 46 30 2c 20 30 78 30   0xF8, 0xF0, 0x0
1340: 45 2c 20 33 20 7d 2c 0a 20 20 20 20 20 20 20 20  E, 3 },.        
1350: 7b 20 30 2c 20 30 2c 20 30 2c 20 30 7d 0a 20 20  { 0, 0, 0, 0}.  
1360: 20 20 20 20 7d 3b 0a 20 20 20 20 0a 20 20 20 20      };.    .    
1370: 20 20 75 38 20 62 31 3b 20 20 20 2f 2a 20 46 69    u8 b1;   /* Fi
1380: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
1390: 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6d 75 6c 74  potentially mult
13a0: 69 2d 62 79 74 65 20 75 74 66 2d 38 20 63 68 61  i-byte utf-8 cha
13b0: 72 61 63 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  racter */.      
13c0: 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 73 74  int ii;.      st
13d0: 72 75 63 74 20 55 74 66 38 54 62 6c 52 6f 77 20  ruct Utf8TblRow 
13e0: 63 6f 6e 73 74 20 2a 70 52 6f 77 3b 0a 20 20 20  const *pRow;.   
13f0: 20 0a 20 20 20 20 20 20 70 52 6f 77 20 3d 20 26   .      pRow = &
1400: 28 75 74 66 38 74 62 6c 5b 30 5d 29 3b 0a 20 20  (utf8tbl[0]);.  
1410: 20 20 0a 20 20 20 20 20 20 62 31 20 3d 20 7a 53    .      b1 = zS
1420: 74 72 5b 28 2a 70 4f 66 66 73 65 74 29 2b 2b 5d  tr[(*pOffset)++]
1430: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
1440: 52 6f 77 2d 3e 62 31 5f 6d 61 73 6b 20 26 26 20  Row->b1_mask && 
1450: 28 62 31 26 70 52 6f 77 2d 3e 62 31 5f 6d 61 73  (b1&pRow->b1_mas
1460: 6b 29 21 3d 70 52 6f 77 2d 3e 62 31 5f 6d 61 73  k)!=pRow->b1_mas
1470: 6b 65 64 5f 76 61 6c 20 29 7b 0a 20 20 20 20 20  ked_val ){.     
1480: 20 20 20 70 52 6f 77 2b 2b 3b 0a 20 20 20 20 20     pRow++;.     
1490: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 52   }.      if( !pR
14a0: 6f 77 2d 3e 62 31 5f 6d 61 73 6b 20 29 7b 0a 20  ow->b1_mask ){. 
14b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69         return (i
14c0: 6e 74 29 30 78 46 46 46 44 3b 0a 20 20 20 20 20  nt)0xFFFD;.     
14d0: 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
14e0: 72 65 74 20 3d 20 28 75 33 32 29 28 62 31 26 70  ret = (u32)(b1&p
14f0: 52 6f 77 2d 3e 62 31 5f 76 61 6c 75 65 5f 6d 61  Row->b1_value_ma
1500: 73 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20  sk);.      for( 
1510: 69 69 3d 30 3b 20 69 69 3c 70 52 6f 77 2d 3e 74  ii=0; ii<pRow->t
1520: 72 61 69 6c 69 6e 67 5f 62 79 74 65 73 3b 20 69  railing_bytes; i
1530: 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 75  i++ ){.        u
1540: 38 20 62 20 3d 20 7a 53 74 72 5b 28 2a 70 4f 66  8 b = zStr[(*pOf
1550: 66 73 65 74 29 2b 2b 5d 3b 0a 20 20 20 20 20 20  fset)++];.      
1560: 20 20 69 66 28 20 28 62 26 30 78 43 30 29 21 3d    if( (b&0xC0)!=
1570: 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20 20 20  0x80 ){.        
1580: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 30 78    return (int)0x
1590: 46 46 46 44 3b 0a 20 20 20 20 20 20 20 20 7d 0a  FFFD;.        }.
15a0: 20 20 20 20 20 20 20 20 72 65 74 20 3d 20 28 72          ret = (r
15b0: 65 74 3c 3c 36 29 20 2b 20 28 75 33 32 29 28 62  et<<6) + (u32)(b
15c0: 26 30 78 33 46 29 3b 0a 20 20 20 20 20 20 7d 0a  &0x3F);.      }.
15d0: 20 20 20 20 20 20 0a 20 20 20 20 20 20 62 72 65        .      bre
15e0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
15f0: 61 73 65 20 54 45 58 54 5f 55 74 66 31 36 6c 65  ase TEXT_Utf16le
1600: 3a 0a 20 20 20 20 63 61 73 65 20 54 45 58 54 5f  :.    case TEXT_
1610: 55 74 66 31 36 62 65 3a 20 7b 0a 20 20 20 20 20  Utf16be: {.     
1620: 20 75 33 32 20 63 6f 64 65 5f 70 6f 69 6e 74 3b   u32 code_point;
1630: 20 20 20 2f 2a 20 74 68 65 20 66 69 72 73 74 20     /* the first 
1640: 63 6f 64 65 2d 70 6f 69 6e 74 20 69 6e 20 74 68  code-point in th
1650: 65 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20  e character */. 
1660: 20 20 20 20 20 75 33 32 20 63 6f 64 65 5f 70 6f       u32 code_po
1670: 69 6e 74 32 3b 20 20 2f 2a 20 74 68 65 20 73 65  int2;  /* the se
1680: 63 6f 6e 64 20 63 6f 64 65 2d 70 6f 69 6e 74 20  cond code-point 
1690: 69 6e 20 74 68 65 20 63 68 61 72 61 63 74 65 72  in the character
16a0: 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20 20  , if any */.    
16b0: 0a 20 20 20 20 20 20 63 6f 64 65 5f 70 6f 69 6e  .      code_poin
16c0: 74 20 3d 20 52 45 41 44 5f 31 36 28 26 7a 53 74  t = READ_16(&zSt
16d0: 72 5b 2a 70 4f 66 66 73 65 74 5d 2c 20 28 2a 70  r[*pOffset], (*p
16e0: 45 6e 63 3d 3d 54 45 58 54 5f 55 74 66 31 36 62  Enc==TEXT_Utf16b
16f0: 65 29 29 3b 0a 20 20 20 20 20 20 2a 70 4f 66 66  e));.      *pOff
1700: 73 65 74 20 2b 3d 20 32 3b 0a 20 20 20 20 0a 20  set += 2;.    . 
1710: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
1720: 69 73 20 61 20 6e 6f 6e 2d 73 75 72 72 6f 67 61  is a non-surroga
1730: 74 65 20 63 6f 64 65 2d 70 6f 69 6e 74 2c 20 6a  te code-point, j
1740: 75 73 74 20 63 61 73 74 20 69 74 20 74 6f 20 61  ust cast it to a
1750: 6e 20 69 6e 74 20 61 6e 64 0a 20 20 20 20 20 20  n int and.      
1760: 2a 2a 20 74 68 69 73 20 69 73 20 74 68 65 20 63  ** this is the c
1770: 6f 64 65 2d 70 6f 69 6e 74 20 76 61 6c 75 65 2e  ode-point value.
1780: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1790: 69 66 28 20 63 6f 64 65 5f 70 6f 69 6e 74 3c 30  if( code_point<0
17a0: 78 44 38 30 30 20 7c 7c 20 63 6f 64 65 5f 70 6f  xD800 || code_po
17b0: 69 6e 74 3e 30 78 45 30 30 30 20 29 7b 0a 20 20  int>0xE000 ){.  
17c0: 20 20 20 20 20 20 72 65 74 20 3d 20 63 6f 64 65        ret = code
17d0: 5f 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 20 20  _point;.        
17e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
17f0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
1800: 20 69 73 20 61 20 74 72 61 69 6c 69 6e 67 20 73   is a trailing s
1810: 75 72 72 6f 67 61 74 65 20 63 6f 64 65 2d 70 6f  urrogate code-po
1820: 69 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74  int, then the st
1830: 72 69 6e 67 20 69 73 0a 20 20 20 20 20 20 2a 2a  ring is.      **
1840: 20 6d 61 6c 66 6f 72 6d 65 64 3b 20 72 65 74 75   malformed; retu
1850: 72 6e 20 74 68 65 20 72 65 70 6c 61 63 65 6d 65  rn the replaceme
1860: 6e 74 20 63 68 61 72 61 63 74 65 72 2e 0a 20 20  nt character..  
1870: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1880: 20 63 6f 64 65 5f 70 6f 69 6e 74 3e 30 78 44 42   code_point>0xDB
1890: 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  FF ){.        re
18a0: 74 75 72 6e 20 28 69 6e 74 29 30 78 46 46 46 44  turn (int)0xFFFD
18b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20  ;.      }.    . 
18c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65       /* The code
18d0: 2d 70 6f 69 6e 74 20 6a 75 73 74 20 72 65 61 64  -point just read
18e0: 20 69 73 20 61 20 6c 65 61 64 69 6e 67 20 73 75   is a leading su
18f0: 72 72 6f 67 61 74 65 20 63 6f 64 65 2d 70 6f 69  rrogate code-poi
1900: 6e 74 2e 20 49 66 20 74 68 65 69 72 0a 20 20 20  nt. If their.   
1910: 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 65 6e 6f     ** is not eno
1920: 75 67 68 20 64 61 74 61 20 6c 65 66 74 20 6f 72  ugh data left or
1930: 20 74 68 65 20 6e 65 78 74 20 63 6f 64 65 2d 70   the next code-p
1940: 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61 20 74 72  oint is not a tr
1950: 61 69 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ailing.      ** 
1960: 73 75 72 72 6f 67 61 74 65 2c 20 72 65 74 75 72  surrogate, retur
1970: 6e 20 74 68 65 20 72 65 70 6c 61 63 65 6d 65 6e  n the replacemen
1980: 74 20 63 68 61 72 61 63 74 65 72 2e 0a 20 20 20  t character..   
1990: 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65     */.      code
19a0: 5f 70 6f 69 6e 74 32 20 3d 20 52 45 41 44 5f 31  _point2 = READ_1
19b0: 36 28 26 7a 53 74 72 5b 2a 70 4f 66 66 73 65 74  6(&zStr[*pOffset
19c0: 5d 2c 20 28 2a 70 45 6e 63 3d 3d 54 45 58 54 5f  ], (*pEnc==TEXT_
19d0: 55 74 66 31 36 62 65 29 29 3b 0a 20 20 20 20 20  Utf16be));.     
19e0: 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 32 3b 0a   *pOffset += 2;.
19f0: 20 20 20 20 20 20 69 66 28 20 63 6f 64 65 5f 70        if( code_p
1a00: 6f 69 6e 74 32 3c 30 78 44 43 30 30 20 7c 7c 20  oint2<0xDC00 || 
1a10: 63 6f 64 65 5f 70 6f 69 6e 74 3e 30 78 44 46 46  code_point>0xDFF
1a20: 46 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  F ){.        ret
1a30: 75 72 6e 20 28 69 6e 74 29 30 78 46 46 46 44 3b  urn (int)0xFFFD;
1a40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20  .      }.   .   
1a50: 20 20 20 72 65 74 20 3d 20 28 20 0a 20 20 20 20     ret = ( .    
1a60: 20 20 20 20 20 20 28 28 28 63 6f 64 65 5f 70 6f        (((code_po
1a70: 69 6e 74 26 30 78 30 33 43 30 29 2b 30 78 30 30  int&0x03C0)+0x00
1a80: 34 30 29 3c 3c 31 36 29 20 2b 20 20 20 2f 2a 20  40)<<16) +   /* 
1a90: 75 75 75 75 75 20 2a 2f 0a 20 20 20 20 20 20 20  uuuuu */.       
1aa0: 20 20 20 28 28 63 6f 64 65 5f 70 6f 69 6e 74 26     ((code_point&
1ab0: 30 78 30 30 33 46 29 3c 3c 31 30 29 20 2b 20 20  0x003F)<<10) +  
1ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 78 78            /* xxx
1ad0: 78 78 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  xxx */.         
1ae0: 20 28 63 6f 64 65 5f 70 6f 69 6e 74 32 26 30 78   (code_point2&0x
1af0: 30 33 46 46 29 20 20 20 20 20 20 20 20 20 20 20  03FF)           
1b00: 20 20 20 20 20 20 20 20 2f 2a 20 79 79 20 79 79          /* yy yy
1b10: 79 79 79 79 79 79 20 2a 2f 0a 20 20 20 20 20 20  yyyyyy */.      
1b20: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  );.    }.    def
1b30: 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
1b40: 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  rt(0);.  }..  if
1b50: 28 20 66 6f 6c 64 20 29 7b 0a 20 20 20 20 72 65  ( fold ){.    re
1b60: 74 75 72 6e 20 4c 4f 57 45 52 43 41 53 45 28 72  turn LOWERCASE(r
1b70: 65 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  et);.  }.  retur
1b80: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
1b90: 52 65 61 64 20 74 68 65 20 42 4f 4d 20 66 72 6f  Read the BOM fro
1ba0: 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 2a  m the start of *
1bb0: 70 53 74 72 2c 20 69 66 20 6f 6e 65 20 69 73 20  pStr, if one is 
1bc0: 70 72 65 73 65 6e 74 2e 20 52 65 74 75 72 6e 20  present. Return 
1bd0: 7a 65 72 6f 0a 2a 2a 20 66 6f 72 20 6c 69 74 74  zero.** for litt
1be0: 6c 65 2d 65 6e 64 69 61 6e 2c 20 6e 6f 6e 2d 7a  le-endian, non-z
1bf0: 65 72 6f 20 66 6f 72 20 62 69 67 2d 65 6e 64 69  ero for big-endi
1c00: 61 6e 2e 20 49 66 20 6e 6f 20 42 4f 4d 20 69 73  an. If no BOM is
1c10: 20 70 72 65 73 65 6e 74 2c 20 72 65 74 75 72 6e   present, return
1c20: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
1c30: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   the parameter "
1c40: 62 69 67 5f 65 6e 64 69 61 6e 22 2e 0a 2a 2a 0a  big_endian"..**.
1c50: 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 73  ** Return values
1c60: 3a 0a 2a 2a 20 20 20 20 20 31 20 2d 3e 20 62 69  :.**     1 -> bi
1c70: 67 2d 65 6e 64 69 61 6e 20 73 74 72 69 6e 67 0a  g-endian string.
1c80: 2a 2a 20 20 20 20 20 30 20 2d 3e 20 6c 69 74 74  **     0 -> litt
1c90: 6c 65 2d 65 6e 64 69 61 6e 20 73 74 72 69 6e 67  le-endian string
1ca0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1cb0: 65 61 64 55 74 66 31 36 42 6f 6d 28 55 74 66 53  eadUtf16Bom(UtfS
1cc0: 74 72 69 6e 67 20 2a 70 53 74 72 2c 20 69 6e 74  tring *pStr, int
1cd0: 20 62 69 67 5f 65 6e 64 69 61 6e 29 7b 0a 20 20   big_endian){.  
1ce0: 2f 2a 20 54 68 65 20 42 4f 4d 20 6d 75 73 74 20  /* The BOM must 
1cf0: 62 65 20 74 68 65 20 66 69 72 73 74 20 74 68 69  be the first thi
1d00: 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ng read from the
1d10: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 61 73 73   string */.  ass
1d20: 65 72 74 28 20 70 53 74 72 2d 3e 63 3d 3d 30 20  ert( pStr->c==0 
1d30: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1d40: 73 74 72 69 6e 67 20 64 61 74 61 20 63 6f 6e 73  string data cons
1d50: 69 73 74 73 20 6f 66 20 31 20 62 79 74 65 20 6f  ists of 1 byte o
1d60: 72 20 6c 65 73 73 2c 20 74 68 65 20 42 4f 4d 20  r less, the BOM 
1d70: 77 69 6c 6c 20 6d 61 6b 65 20 6e 6f 0a 20 20 2a  will make no.  *
1d80: 2a 20 64 69 66 66 65 72 65 6e 63 65 20 61 6e 79  * difference any
1d90: 77 61 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73  way. In this cas
1da0: 65 20 6a 75 73 74 20 66 61 6c 6c 20 74 68 72 6f  e just fall thro
1db0: 75 67 68 20 74 6f 20 74 68 65 20 64 65 66 61 75  ugh to the defau
1dc0: 6c 74 20 63 61 73 65 0a 20 20 2a 2a 20 61 6e 64  lt case.  ** and
1dd0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 74 69   return the nati
1de0: 76 65 20 62 79 74 65 2d 6f 72 64 65 72 20 66 6f  ve byte-order fo
1df0: 72 20 74 68 69 73 20 6d 61 63 68 69 6e 65 2e 0a  r this machine..
1e00: 20 20 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 77    **.  ** Otherw
1e10: 69 73 65 2c 20 63 68 65 63 6b 20 74 68 65 20 66  ise, check the f
1e20: 69 72 73 74 20 32 20 62 79 74 65 73 20 6f 66 20  irst 2 bytes of 
1e30: 74 68 65 20 73 74 72 69 6e 67 20 74 6f 20 73 65  the string to se
1e40: 65 20 69 66 20 61 20 42 4f 4d 20 69 73 0a 20 20  e if a BOM is.  
1e50: 2a 2a 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2f  ** present..  */
1e60: 0a 20 20 69 66 28 20 70 53 74 72 2d 3e 6e 3e 31  .  if( pStr->n>1
1e70: 20 29 7b 0a 20 20 20 20 75 38 20 62 6f 6d 20 3d   ){.    u8 bom =
1e80: 20 73 71 6c 69 74 65 33 55 74 66 52 65 61 64 42   sqlite3UtfReadB
1e90: 6f 6d 28 70 53 74 72 2d 3e 70 5a 2c 20 32 29 3b  om(pStr->pZ, 2);
1ea0: 0a 20 20 20 20 69 66 28 20 62 6f 6d 20 29 7b 0a  .    if( bom ){.
1eb0: 20 20 20 20 20 20 70 53 74 72 2d 3e 63 20 2b 3d        pStr->c +=
1ec0: 20 32 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   2;.      return
1ed0: 20 28 62 6f 6d 3d 3d 54 45 58 54 5f 55 74 66 31   (bom==TEXT_Utf1
1ee0: 36 6c 65 29 3f 30 3a 31 3b 0a 20 20 20 20 7d 0a  6le)?0:1;.    }.
1ef0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 62 69    }..  return bi
1f00: 67 5f 65 6e 64 69 61 6e 3b 0a 7d 0a 0a 2f 2a 0a  g_endian;.}../*.
1f10: 2a 2a 20 7a 44 61 74 61 20 69 73 20 61 20 55 54  ** zData is a UT
1f20: 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 73 74 72  F-16 encoded str
1f30: 69 6e 67 2c 20 6e 44 61 74 61 20 62 79 74 65 73  ing, nData bytes
1f40: 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73   in length. This
1f50: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 68 65 63   routine.** chec
1f60: 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
1f70: 20 62 79 74 65 2d 6f 72 64 65 72 20 6d 61 72 6b   byte-order mark
1f80: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
1f90: 20 7a 44 61 74 61 2e 20 49 66 20 6e 6f 0a 2a 2a   zData. If no.**
1fa0: 20 62 79 74 65 20 6f 72 64 65 72 20 6d 61 72 6b   byte order mark
1fb0: 20 69 73 20 66 6f 75 6e 64 20 30 20 69 73 20 72   is found 0 is r
1fc0: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1fd0: 73 65 20 54 45 58 54 5f 55 74 66 31 36 62 65 20  se TEXT_Utf16be 
1fe0: 6f 72 0a 2a 2a 20 54 45 58 54 5f 55 74 66 31 36  or.** TEXT_Utf16
1ff0: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  le is returned, 
2000: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
2010: 74 68 65 72 20 54 68 65 20 42 4f 4d 20 69 6e 64  ther The BOM ind
2020: 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 74  icates that.** t
2030: 68 65 20 74 65 78 74 20 69 73 20 62 69 67 2d 65  he text is big-e
2040: 6e 64 69 61 6e 20 6f 72 20 6c 69 74 74 6c 65 2d  ndian or little-
2050: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 75 38 20 73 71  endian..*/.u8 sq
2060: 6c 69 74 65 33 55 74 66 52 65 61 64 42 6f 6d 28  lite3UtfReadBom(
2070: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 44 61 74  const void *zDat
2080: 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20  a, int nData){. 
2090: 20 69 66 28 20 6e 44 61 74 61 3c 30 20 7c 7c 20   if( nData<0 || 
20a0: 6e 44 61 74 61 3e 31 20 29 7b 0a 20 20 20 20 75  nData>1 ){.    u
20b0: 38 20 62 31 20 3d 20 2a 28 75 38 20 2a 29 7a 44  8 b1 = *(u8 *)zD
20c0: 61 74 61 3b 0a 20 20 20 20 75 38 20 62 32 20 3d  ata;.    u8 b2 =
20d0: 20 2a 28 28 28 75 38 20 2a 29 7a 44 61 74 61 29   *(((u8 *)zData)
20e0: 20 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20 62   + 1);.    if( b
20f0: 31 3d 3d 30 78 46 45 20 26 26 20 62 32 3d 3d 30  1==0xFE && b2==0
2100: 78 46 46 20 29 7b 0a 20 20 20 20 20 20 72 65 74  xFF ){.      ret
2110: 75 72 6e 20 54 45 58 54 5f 55 74 66 31 36 62 65  urn TEXT_Utf16be
2120: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2130: 62 31 3d 3d 30 78 46 46 20 26 26 20 62 32 3d 3d  b1==0xFF && b2==
2140: 30 78 46 45 20 29 7b 0a 20 20 20 20 20 20 72 65  0xFE ){.      re
2150: 74 75 72 6e 20 54 45 58 54 5f 55 74 66 31 36 6c  turn TEXT_Utf16l
2160: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  e;.    }.  }.  r
2170: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
2180: 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
2190: 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74   unicode charact
21a0: 65 72 20 66 72 6f 6d 20 74 68 65 20 55 54 46 2d  er from the UTF-
21b0: 38 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67  8 encoded string
21c0: 20 2a 70 53 74 72 2e 20 54 68 65 0a 2a 2a 20 76   *pStr. The.** v
21d0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
21e0: 20 61 20 75 6e 69 63 6f 64 65 20 73 63 61 6c 61   a unicode scala
21f0: 72 20 76 61 6c 75 65 2e 20 49 6e 20 74 68 65 20  r value. In the 
2200: 63 61 73 65 20 6f 66 20 6d 61 6c 66 6f 72 6d 65  case of malforme
2210: 64 0a 2a 2a 20 73 74 72 69 6e 67 73 2c 20 74 68  d.** strings, th
2220: 65 20 75 6e 69 63 6f 64 65 20 72 65 70 6c 61 63  e unicode replac
2230: 65 6d 65 6e 74 20 63 68 61 72 61 63 74 65 72 20  ement character 
2240: 55 2b 46 46 46 44 20 6d 61 79 20 62 65 20 72 65  U+FFFD may be re
2250: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
2260: 63 20 75 33 32 20 72 65 61 64 55 74 66 38 28 55  c u32 readUtf8(U
2270: 74 66 53 74 72 69 6e 67 20 2a 70 53 74 72 29 7b  tfString *pStr){
2280: 0a 20 20 75 38 20 65 6e 63 20 3d 20 54 45 58 54  .  u8 enc = TEXT
2290: 5f 55 74 66 38 3b 0a 20 20 72 65 74 75 72 6e 20  _Utf8;.  return 
22a0: 73 71 6c 69 74 65 33 52 65 61 64 55 6e 69 43 68  sqlite3ReadUniCh
22b0: 61 72 28 70 53 74 72 2d 3e 70 5a 2c 20 26 70 53  ar(pStr->pZ, &pS
22c0: 74 72 2d 3e 63 2c 20 26 65 6e 63 2c 20 30 29 3b  tr->c, &enc, 0);
22d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
22e0: 74 68 65 20 75 6e 69 63 6f 64 65 20 63 68 61 72  the unicode char
22f0: 61 63 74 65 72 20 27 63 6f 64 65 27 20 74 6f 20  acter 'code' to 
2300: 74 68 65 20 73 74 72 69 6e 67 20 70 53 74 72 20  the string pStr 
2310: 75 73 69 6e 67 20 55 54 46 2d 38 0a 2a 2a 20 65  using UTF-8.** e
2320: 6e 63 6f 64 69 6e 67 2e 20 53 51 4c 49 54 45 5f  ncoding. SQLITE_
2330: 4e 4f 4d 45 4d 20 6d 61 79 20 62 65 20 72 65 74  NOMEM may be ret
2340: 75 72 6e 65 64 20 69 66 20 73 71 6c 69 74 65 33  urned if sqlite3
2350: 4d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  Malloc() fails..
2360: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
2370: 69 74 65 55 74 66 38 28 55 74 66 53 74 72 69 6e  iteUtf8(UtfStrin
2380: 67 20 2a 70 53 74 72 2c 20 75 33 32 20 63 6f 64  g *pStr, u32 cod
2390: 65 29 7b 0a 20 20 73 74 72 75 63 74 20 55 74 66  e){.  struct Utf
23a0: 38 57 72 69 74 65 54 62 6c 52 6f 77 20 7b 0a 20  8WriteTblRow {. 
23b0: 20 20 20 75 33 32 20 6d 61 78 5f 63 6f 64 65 3b     u32 max_code;
23c0: 0a 20 20 20 20 69 6e 74 20 74 72 61 69 6c 69 6e  .    int trailin
23d0: 67 5f 62 79 74 65 73 3b 0a 20 20 20 20 75 38 20  g_bytes;.    u8 
23e0: 62 31 5f 61 6e 64 5f 6d 61 73 6b 3b 0a 20 20 20  b1_and_mask;.   
23f0: 20 75 38 20 62 31 5f 6f 72 5f 6d 61 73 6b 3b 0a   u8 b1_or_mask;.
2400: 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f    };.  static co
2410: 6e 73 74 20 73 74 72 75 63 74 20 55 74 66 38 57  nst struct Utf8W
2420: 72 69 74 65 54 62 6c 52 6f 77 20 75 74 66 38 74  riteTblRow utf8t
2430: 62 6c 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 30 78  bl[] = {.    {0x
2440: 30 30 30 30 30 30 37 46 2c 20 30 2c 20 30 78 37  0000007F, 0, 0x7
2450: 46 2c 20 30 78 30 30 7d 2c 0a 20 20 20 20 7b 30  F, 0x00},.    {0
2460: 78 30 30 30 30 30 37 46 46 2c 20 31 2c 20 30 78  x000007FF, 1, 0x
2470: 44 46 2c 20 30 78 43 30 7d 2c 0a 20 20 20 20 7b  DF, 0xC0},.    {
2480: 30 78 30 30 30 30 46 46 46 46 2c 20 32 2c 20 30  0x0000FFFF, 2, 0
2490: 78 45 46 2c 20 30 78 45 30 7d 2c 0a 20 20 20 20  xEF, 0xE0},.    
24a0: 7b 30 78 30 30 31 30 46 46 46 46 2c 20 33 2c 20  {0x0010FFFF, 3, 
24b0: 30 78 46 37 2c 20 30 78 46 30 7d 2c 0a 20 20 20  0xF7, 0xF0},.   
24c0: 20 7b 30 78 30 30 30 30 30 30 30 30 2c 20 30 2c   {0x00000000, 0,
24d0: 20 30 78 30 30 2c 20 30 78 30 30 7d 0a 20 20 7d   0x00, 0x00}.  }
24e0: 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74  ;.  const struct
24f0: 20 55 74 66 38 57 72 69 74 65 54 62 6c 52 6f 77   Utf8WriteTblRow
2500: 20 2a 70 52 6f 77 20 3d 20 26 75 74 66 38 74 62   *pRow = &utf8tb
2510: 6c 5b 30 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20  l[0];..  while( 
2520: 63 6f 64 65 3e 70 52 6f 77 2d 3e 6d 61 78 5f 63  code>pRow->max_c
2530: 6f 64 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ode ){.    asser
2540: 74 28 20 70 52 6f 77 2d 3e 6d 61 78 5f 63 6f 64  t( pRow->max_cod
2550: 65 20 29 3b 0a 20 20 20 20 70 52 6f 77 2b 2b 3b  e );.    pRow++;
2560: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 73 75 72  .  }..  /* Ensur
2570: 65 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  e there is enoug
2580: 68 20 72 6f 6f 6d 20 6c 65 66 74 20 69 6e 20 74  h room left in t
2590: 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
25a0: 20 74 6f 20 77 72 69 74 65 0a 20 20 2a 2a 20 74   to write.  ** t
25b0: 68 69 73 20 55 54 46 2d 38 20 63 68 61 72 61 63  his UTF-8 charac
25c0: 74 65 72 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73  ter. .  */.  ass
25d0: 65 72 74 28 20 28 70 53 74 72 2d 3e 6e 2d 70 53  ert( (pStr->n-pS
25e0: 74 72 2d 3e 63 29 3e 3d 28 70 52 6f 77 2d 3e 74  tr->c)>=(pRow->t
25f0: 72 61 69 6c 69 6e 67 5f 62 79 74 65 73 2b 31 29  railing_bytes+1)
2600: 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
2610: 74 68 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  the UTF-8 encode
2620: 64 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 70  d character to p
2630: 53 74 72 2e 20 41 6c 6c 20 63 61 73 65 73 20 62  Str. All cases b
2640: 65 6c 6f 77 20 61 72 65 0a 20 20 2a 2a 20 69 6e  elow are.  ** in
2650: 74 65 6e 74 69 6f 6e 61 6c 6c 79 20 66 61 6c 6c  tentionally fall
2660: 2d 74 68 72 6f 75 67 68 2e 0a 20 20 2a 2f 0a 20  -through..  */. 
2670: 20 73 77 69 74 63 68 28 20 70 52 6f 77 2d 3e 74   switch( pRow->t
2680: 72 61 69 6c 69 6e 67 5f 62 79 74 65 73 20 29 7b  railing_bytes ){
2690: 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20  .    case 3:.   
26a0: 20 20 20 70 53 74 72 2d 3e 70 5a 5b 70 53 74 72     pStr->pZ[pStr
26b0: 2d 3e 63 2b 33 5d 20 3d 20 28 28 28 75 38 29 63  ->c+3] = (((u8)c
26c0: 6f 64 65 29 26 30 78 33 46 29 7c 30 78 38 30 3b  ode)&0x3F)|0x80;
26d0: 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20 63 6f  .      code = co
26e0: 64 65 3e 3e 36 3b 0a 20 20 20 20 63 61 73 65 20  de>>6;.    case 
26f0: 32 3a 0a 20 20 20 20 20 20 70 53 74 72 2d 3e 70  2:.      pStr->p
2700: 5a 5b 70 53 74 72 2d 3e 63 2b 32 5d 20 3d 20 28  Z[pStr->c+2] = (
2710: 28 28 75 38 29 63 6f 64 65 29 26 30 78 33 46 29  ((u8)code)&0x3F)
2720: 7c 30 78 38 30 3b 0a 20 20 20 20 20 20 63 6f 64  |0x80;.      cod
2730: 65 20 3d 20 63 6f 64 65 3e 3e 36 3b 0a 20 20 20  e = code>>6;.   
2740: 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20 70   case 1:.      p
2750: 53 74 72 2d 3e 70 5a 5b 70 53 74 72 2d 3e 63 2b  Str->pZ[pStr->c+
2760: 31 5d 20 3d 20 28 28 28 75 38 29 63 6f 64 65 29  1] = (((u8)code)
2770: 26 30 78 33 46 29 7c 30 78 38 30 3b 0a 20 20 20  &0x3F)|0x80;.   
2780: 20 20 20 63 6f 64 65 20 3d 20 63 6f 64 65 3e 3e     code = code>>
2790: 36 3b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20  6;.    case 0:. 
27a0: 20 20 20 20 20 70 53 74 72 2d 3e 70 5a 5b 70 53       pStr->pZ[pS
27b0: 74 72 2d 3e 63 5d 20 3d 20 28 28 28 75 38 29 63  tr->c] = (((u8)c
27c0: 6f 64 65 29 26 28 70 52 6f 77 2d 3e 62 31 5f 61  ode)&(pRow->b1_a
27d0: 6e 64 5f 6d 61 73 6b 29 29 7c 28 70 52 6f 77 2d  nd_mask))|(pRow-
27e0: 3e 62 31 5f 6f 72 5f 6d 61 73 6b 29 3b 0a 20 20  >b1_or_mask);.  
27f0: 7d 0a 20 20 70 53 74 72 2d 3e 63 20 2b 3d 20 28  }.  pStr->c += (
2800: 70 52 6f 77 2d 3e 74 72 61 69 6c 69 6e 67 5f 62  pRow->trailing_b
2810: 79 74 65 73 20 2b 20 31 29 3b 0a 0a 20 20 72 65  ytes + 1);..  re
2820: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2830: 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 75   Read a single u
2840: 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72  nicode character
2850: 20 66 72 6f 6d 20 74 68 65 20 55 54 46 2d 31 36   from the UTF-16
2860: 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 20   encoded string 
2870: 2a 70 53 74 72 2e 20 54 68 65 0a 2a 2a 20 76 61  *pStr. The.** va
2880: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
2890: 61 20 75 6e 69 63 6f 64 65 20 73 63 61 6c 61 72  a unicode scalar
28a0: 20 76 61 6c 75 65 2e 20 49 6e 20 74 68 65 20 63   value. In the c
28b0: 61 73 65 20 6f 66 20 6d 61 6c 66 6f 72 6d 65 64  ase of malformed
28c0: 0a 2a 2a 20 73 74 72 69 6e 67 73 2c 20 74 68 65  .** strings, the
28d0: 20 75 6e 69 63 6f 64 65 20 72 65 70 6c 61 63 65   unicode replace
28e0: 6d 65 6e 74 20 63 68 61 72 61 63 74 65 72 20 55  ment character U
28f0: 2b 46 46 46 44 20 6d 61 79 20 62 65 20 72 65 74  +FFFD may be ret
2900: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
2910: 62 69 67 5f 65 6e 64 69 61 6e 20 69 73 20 74 72  big_endian is tr
2920: 75 65 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69  ue, the string i
2930: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20  s assumed to be 
2940: 55 54 46 2d 31 36 42 45 20 65 6e 63 6f 64 65 64  UTF-16BE encoded
2950: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
2960: 69 74 20 69 73 20 55 54 46 2d 31 36 4c 45 20 65  it is UTF-16LE e
2970: 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ncoded..*/.stati
2980: 63 20 75 33 32 20 72 65 61 64 55 74 66 31 36 28  c u32 readUtf16(
2990: 55 74 66 53 74 72 69 6e 67 20 2a 70 53 74 72 2c  UtfString *pStr,
29a0: 20 69 6e 74 20 62 69 67 5f 65 6e 64 69 61 6e 29   int big_endian)
29b0: 7b 0a 20 20 75 33 32 20 63 6f 64 65 5f 70 6f 69  {.  u32 code_poi
29c0: 6e 74 3b 20 20 20 2f 2a 20 74 68 65 20 66 69 72  nt;   /* the fir
29d0: 73 74 20 63 6f 64 65 2d 70 6f 69 6e 74 20 69 6e  st code-point in
29e0: 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20 2a   the character *
29f0: 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  /..  /* If there
2a00: 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 62 79 74   is only one byt
2a10: 65 20 6f 66 20 64 61 74 61 20 6c 65 66 74 20 69  e of data left i
2a20: 6e 20 74 68 65 20 73 74 72 69 6e 67 2c 20 72 65  n the string, re
2a30: 74 75 72 6e 20 74 68 65 20 0a 20 20 2a 2a 20 72  turn the .  ** r
2a40: 65 70 6c 61 63 65 6d 65 6e 74 20 63 68 61 72 61  eplacement chara
2a50: 63 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  cter..  */.  if(
2a60: 20 28 70 53 74 72 2d 3e 6e 2d 70 53 74 72 2d 3e   (pStr->n-pStr->
2a70: 63 29 3d 3d 31 20 29 7b 0a 20 20 20 20 70 53 74  c)==1 ){.    pSt
2a80: 72 2d 3e 63 2b 2b 3b 0a 20 20 20 20 72 65 74 75  r->c++;.    retu
2a90: 72 6e 20 28 69 6e 74 29 30 78 46 46 46 44 3b 0a  rn (int)0xFFFD;.
2aa0: 20 20 7d 0a 0a 20 20 63 6f 64 65 5f 70 6f 69 6e    }..  code_poin
2ab0: 74 20 3d 20 52 45 41 44 5f 31 36 28 26 28 70 53  t = READ_16(&(pS
2ac0: 74 72 2d 3e 70 5a 5b 70 53 74 72 2d 3e 63 5d 29  tr->pZ[pStr->c])
2ad0: 2c 20 62 69 67 5f 65 6e 64 69 61 6e 29 3b 0a 20  , big_endian);. 
2ae0: 20 70 53 74 72 2d 3e 63 20 2b 3d 20 32 3b 0a 0a   pStr->c += 2;..
2af0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
2b00: 61 20 6e 6f 6e 2d 73 75 72 72 6f 67 61 74 65 20  a non-surrogate 
2b10: 63 6f 64 65 2d 70 6f 69 6e 74 2c 20 6a 75 73 74  code-point, just
2b20: 20 63 61 73 74 20 69 74 20 74 6f 20 61 6e 20 69   cast it to an i
2b30: 6e 74 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75  nt and.  ** retu
2b40: 72 6e 20 74 68 65 20 63 6f 64 65 2d 70 6f 69 6e  rn the code-poin
2b50: 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
2b60: 69 66 28 20 63 6f 64 65 5f 70 6f 69 6e 74 3c 30  if( code_point<0
2b70: 78 44 38 30 30 20 7c 7c 20 63 6f 64 65 5f 70 6f  xD800 || code_po
2b80: 69 6e 74 3e 30 78 45 30 30 30 20 29 7b 0a 20 20  int>0xE000 ){.  
2b90: 20 20 72 65 74 75 72 6e 20 63 6f 64 65 5f 70 6f    return code_po
2ba0: 69 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  int;.  }..  /* I
2bb0: 66 20 74 68 69 73 20 69 73 20 61 20 74 72 61 69  f this is a trai
2bc0: 6c 69 6e 67 20 73 75 72 72 6f 67 61 74 65 20 63  ling surrogate c
2bd0: 6f 64 65 2d 70 6f 69 6e 74 2c 20 74 68 65 6e 20  ode-point, then 
2be0: 74 68 65 20 73 74 72 69 6e 67 20 69 73 0a 20 20  the string is.  
2bf0: 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 3b 20 72 65  ** malformed; re
2c00: 74 75 72 6e 20 74 68 65 20 72 65 70 6c 61 63 65  turn the replace
2c10: 6d 65 6e 74 20 63 68 61 72 61 63 74 65 72 2e 0a  ment character..
2c20: 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 64 65 5f    */.  if( code_
2c30: 70 6f 69 6e 74 3e 30 78 44 42 46 46 20 29 7b 0a  point>0xDBFF ){.
2c40: 20 20 20 20 72 65 74 75 72 6e 20 30 78 46 46 46      return 0xFFF
2c50: 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  D;.  }..  /* The
2c60: 20 63 6f 64 65 2d 70 6f 69 6e 74 20 6a 75 73 74   code-point just
2c70: 20 72 65 61 64 20 69 73 20 61 20 6c 65 61 64 69   read is a leadi
2c80: 6e 67 20 73 75 72 72 6f 67 61 74 65 20 63 6f 64  ng surrogate cod
2c90: 65 2d 70 6f 69 6e 74 2e 20 49 66 20 74 68 65 69  e-point. If thei
2ca0: 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 65 6e  r.  ** is not en
2cb0: 6f 75 67 68 20 64 61 74 61 20 6c 65 66 74 20 6f  ough data left o
2cc0: 72 20 74 68 65 20 6e 65 78 74 20 63 6f 64 65 2d  r the next code-
2cd0: 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61 20 74  point is not a t
2ce0: 72 61 69 6c 69 6e 67 0a 20 20 2a 2a 20 73 75 72  railing.  ** sur
2cf0: 72 6f 67 61 74 65 2c 20 72 65 74 75 72 6e 20 74  rogate, return t
2d00: 68 65 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 63  he replacement c
2d10: 68 61 72 61 63 74 65 72 2e 0a 20 20 2a 2f 0a 20  haracter..  */. 
2d20: 20 69 66 28 20 28 70 53 74 72 2d 3e 6e 2d 70 53   if( (pStr->n-pS
2d30: 74 72 2d 3e 63 29 3e 31 20 29 7b 0a 20 20 20 20  tr->c)>1 ){.    
2d40: 75 33 32 20 63 6f 64 65 5f 70 6f 69 6e 74 32 20  u32 code_point2 
2d50: 3d 20 52 45 41 44 5f 31 36 28 26 70 53 74 72 2d  = READ_16(&pStr-
2d60: 3e 70 5a 5b 70 53 74 72 2d 3e 63 5d 2c 20 62 69  >pZ[pStr->c], bi
2d70: 67 5f 65 6e 64 69 61 6e 29 3b 0a 20 20 20 20 69  g_endian);.    i
2d80: 66 28 20 63 6f 64 65 5f 70 6f 69 6e 74 32 3c 30  f( code_point2<0
2d90: 78 44 43 30 30 20 7c 7c 20 63 6f 64 65 5f 70 6f  xDC00 || code_po
2da0: 69 6e 74 3e 30 78 44 46 46 46 20 29 7b 0a 20 20  int>0xDFFF ){.  
2db0: 20 20 20 20 72 65 74 75 72 6e 20 30 78 46 46 46      return 0xFFF
2dc0: 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 74  D;.    }.    pSt
2dd0: 72 2d 3e 63 20 2b 3d 20 32 3b 0a 0a 20 20 20 20  r->c += 2;..    
2de0: 72 65 74 75 72 6e 20 28 20 0a 20 20 20 20 20 20  return ( .      
2df0: 20 20 28 28 28 63 6f 64 65 5f 70 6f 69 6e 74 26    (((code_point&
2e00: 30 78 30 33 43 30 29 2b 30 78 30 30 34 30 29 3c  0x03C0)+0x0040)<
2e10: 3c 31 36 29 20 2b 20 20 20 2f 2a 20 75 75 75 75  <16) +   /* uuuu
2e20: 75 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 63  u */.        ((c
2e30: 6f 64 65 5f 70 6f 69 6e 74 26 30 78 30 30 33 46  ode_point&0x003F
2e40: 29 3c 3c 31 30 29 20 2b 20 20 20 20 20 20 20 20  )<<10) +        
2e50: 20 20 20 20 2f 2a 20 78 78 78 78 78 78 20 2a 2f      /* xxxxxx */
2e60: 0a 20 20 20 20 20 20 20 20 28 63 6f 64 65 5f 70  .        (code_p
2e70: 6f 69 6e 74 32 26 30 78 30 33 46 46 29 20 20 20  oint2&0x03FF)   
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 2f 2a 20 79 79 20 79 79 79 79 79 79 79 79 20 2a  /* yy yyyyyyyy *
2ea0: 2f 0a 20 20 20 20 29 3b 0a 0a 20 20 7d 65 6c 73  /.    );..  }els
2eb0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 69  e{.    return (i
2ec0: 6e 74 29 30 78 46 46 46 44 3b 0a 20 20 7d 0a 20  nt)0xFFFD;.  }. 
2ed0: 20 0a 20 20 2f 2a 20 6e 6f 74 20 72 65 61 63 68   .  /* not reach
2ee0: 65 64 20 2a 2f 0a 7d 0a 0a 73 74 61 74 69 63 20  ed */.}..static 
2ef0: 69 6e 74 20 77 72 69 74 65 55 74 66 31 36 28 55  int writeUtf16(U
2f00: 74 66 53 74 72 69 6e 67 20 2a 70 53 74 72 2c 20  tfString *pStr, 
2f10: 69 6e 74 20 63 6f 64 65 2c 20 69 6e 74 20 62 69  int code, int bi
2f20: 67 5f 65 6e 64 69 61 6e 29 7b 0a 20 20 69 6e 74  g_endian){.  int
2f30: 20 62 79 74 65 73 3b 0a 20 20 75 6e 73 69 67 6e   bytes;.  unsign
2f40: 65 64 20 63 68 61 72 20 2a 68 69 5f 62 79 74 65  ed char *hi_byte
2f50: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2f60: 72 20 2a 6c 6f 5f 62 79 74 65 3b 0a 0a 20 20 62  r *lo_byte;..  b
2f70: 79 74 65 73 20 3d 20 28 63 6f 64 65 3e 30 78 30  ytes = (code>0x0
2f80: 30 30 30 46 46 46 46 3f 34 3a 32 29 3b 0a 0a 20  000FFFF?4:2);.. 
2f90: 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 72 65   /* Ensure there
2fa0: 20 69 73 20 65 6e 6f 75 67 68 20 72 6f 6f 6d 20   is enough room 
2fb0: 6c 65 66 74 20 69 6e 20 74 68 65 20 6f 75 74 70  left in the outp
2fc0: 75 74 20 62 75 66 66 65 72 20 74 6f 20 77 72 69  ut buffer to wri
2fd0: 74 65 0a 20 20 2a 2a 20 74 68 69 73 20 55 54 46  te.  ** this UTF
2fe0: 2d 38 20 63 68 61 72 61 63 74 65 72 2e 0a 20 20  -8 character..  
2ff0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 53  */.  assert( (pS
3000: 74 72 2d 3e 6e 2d 70 53 74 72 2d 3e 63 29 3e 3d  tr->n-pStr->c)>=
3010: 62 79 74 65 73 20 29 3b 0a 20 20 0a 20 20 2f 2a  bytes );.  .  /*
3020: 20 49 6e 69 74 69 61 6c 69 73 65 20 68 69 5f 62   Initialise hi_b
3030: 79 74 65 20 61 6e 64 20 6c 6f 5f 62 79 74 65 20  yte and lo_byte 
3040: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
3050: 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 74 6f 20 77  locations into w
3060: 68 69 63 68 0a 20 20 2a 2a 20 74 68 65 20 4d 53  hich.  ** the MS
3070: 42 20 61 6e 64 20 4c 53 42 20 6f 66 20 74 68 65  B and LSB of the
3080: 20 28 66 69 72 73 74 29 20 31 36 2d 62 69 74 20   (first) 16-bit 
3090: 75 6e 69 63 6f 64 65 20 63 6f 64 65 2d 70 6f 69  unicode code-poi
30a0: 6e 74 20 77 72 69 74 74 65 6e 20 66 6f 72 0a 20  nt written for. 
30b0: 20 2a 2a 20 74 68 69 73 20 63 68 61 72 61 63 74   ** this charact
30c0: 65 72 2e 0a 20 20 2a 2f 0a 20 20 68 69 5f 62 79  er..  */.  hi_by
30d0: 74 65 20 3d 20 28 62 69 67 5f 65 6e 64 69 61 6e  te = (big_endian
30e0: 3f 26 70 53 74 72 2d 3e 70 5a 5b 70 53 74 72 2d  ?&pStr->pZ[pStr-
30f0: 3e 63 5d 3a 26 70 53 74 72 2d 3e 70 5a 5b 70 53  >c]:&pStr->pZ[pS
3100: 74 72 2d 3e 63 2b 31 5d 29 3b 0a 20 20 6c 6f 5f  tr->c+1]);.  lo_
3110: 62 79 74 65 20 3d 20 28 62 69 67 5f 65 6e 64 69  byte = (big_endi
3120: 61 6e 3f 26 70 53 74 72 2d 3e 70 5a 5b 70 53 74  an?&pStr->pZ[pSt
3130: 72 2d 3e 63 2b 31 5d 3a 26 70 53 74 72 2d 3e 70  r->c+1]:&pStr->p
3140: 5a 5b 70 53 74 72 2d 3e 63 5d 29 3b 0a 0a 20 20  Z[pStr->c]);..  
3150: 69 66 28 20 62 79 74 65 73 3d 3d 32 20 29 7b 0a  if( bytes==2 ){.
3160: 20 20 20 20 2a 68 69 5f 62 79 74 65 20 3d 20 28      *hi_byte = (
3170: 75 38 29 28 28 63 6f 64 65 26 30 78 30 30 30 30  u8)((code&0x0000
3180: 46 46 30 30 29 3e 3e 38 29 3b 0a 20 20 20 20 2a  FF00)>>8);.    *
3190: 6c 6f 5f 62 79 74 65 20 3d 20 28 75 38 29 28 63  lo_byte = (u8)(c
31a0: 6f 64 65 26 30 78 30 30 30 30 30 30 46 46 29 3b  ode&0x000000FF);
31b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 33  .  }else{.    u3
31c0: 32 20 77 72 64 3b 0a 20 20 20 20 77 72 64 20 3d  2 wrd;.    wrd =
31d0: 20 28 28 28 28 63 6f 64 65 26 30 78 30 30 31 46   ((((code&0x001F
31e0: 30 30 30 30 29 2d 30 78 30 30 30 31 30 30 30 30  0000)-0x00010000
31f0: 29 2b 28 63 6f 64 65 26 30 78 30 30 30 30 46 43  )+(code&0x0000FC
3200: 30 30 29 29 3e 3e 31 30 29 7c 30 78 30 30 30 30  00))>>10)|0x0000
3210: 44 38 30 30 3b 0a 20 20 20 20 2a 68 69 5f 62 79  D800;.    *hi_by
3220: 74 65 20 3d 20 28 75 38 29 28 28 77 72 64 26 30  te = (u8)((wrd&0
3230: 78 30 30 30 30 46 46 30 30 29 3e 3e 38 29 3b 0a  x0000FF00)>>8);.
3240: 20 20 20 20 2a 6c 6f 5f 62 79 74 65 20 3d 20 28      *lo_byte = (
3250: 75 38 29 28 77 72 64 26 30 78 30 30 30 30 30 30  u8)(wrd&0x000000
3260: 46 46 29 3b 0a 0a 20 20 20 20 77 72 64 20 3d 20  FF);..    wrd = 
3270: 28 63 6f 64 65 26 30 78 30 30 30 30 30 33 46 46  (code&0x000003FF
3280: 29 7c 30 78 30 30 30 30 44 43 30 30 3b 0a 20 20  )|0x0000DC00;.  
3290: 20 20 2a 28 68 69 5f 62 79 74 65 2b 32 29 20 3d    *(hi_byte+2) =
32a0: 20 28 75 38 29 28 28 77 72 64 26 30 78 30 30 30   (u8)((wrd&0x000
32b0: 30 46 46 30 30 29 3e 3e 38 29 3b 0a 20 20 20 20  0FF00)>>8);.    
32c0: 2a 28 6c 6f 5f 62 79 74 65 2b 32 29 20 3d 20 28  *(lo_byte+2) = (
32d0: 75 38 29 28 77 72 64 26 30 78 30 30 30 30 30 30  u8)(wrd&0x000000
32e0: 46 46 29 3b 0a 20 20 7d 0a 0a 20 20 70 53 74 72  FF);.  }..  pStr
32f0: 2d 3e 63 20 2b 3d 20 62 79 74 65 73 3b 0a 20 20  ->c += bytes;.  
3300: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
3310: 2f 2a 0a 2a 2a 20 70 5a 20 69 73 20 61 20 55 54  /*.** pZ is a UT
3320: 46 2d 38 20 65 6e 63 6f 64 65 64 20 75 6e 69 63  F-8 encoded unic
3330: 6f 64 65 20 73 74 72 69 6e 67 2e 20 49 66 20 6e  ode string. If n
3340: 42 79 74 65 20 69 73 20 6c 65 73 73 20 74 68 61  Byte is less tha
3350: 6e 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 74 75 72  n zero,.** retur
3360: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
3370: 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65  unicode characte
3380: 72 73 20 69 6e 20 70 5a 20 75 70 20 74 6f 20 28  rs in pZ up to (
3390: 62 75 74 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e  but not includin
33a0: 67 29 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  g).** the first 
33b0: 30 78 30 30 20 62 79 74 65 2e 20 49 66 20 6e 42  0x00 byte. If nB
33c0: 79 74 65 20 69 73 20 6e 6f 74 20 6c 65 73 73 20  yte is not less 
33d0: 74 68 61 6e 20 7a 65 72 6f 2c 20 72 65 74 75 72  than zero, retur
33e0: 6e 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  n the.** number 
33f0: 6f 66 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61  of unicode chara
3400: 63 74 65 72 73 20 69 6e 20 74 68 65 20 66 69 72  cters in the fir
3410: 73 74 20 6e 42 79 74 65 20 6f 66 20 70 5a 20 28  st nByte of pZ (
3420: 6f 72 20 75 70 20 74 6f 20 0a 2a 2a 20 74 68 65  or up to .** the
3430: 20 66 69 72 73 74 20 30 78 30 30 2c 20 77 68 69   first 0x00, whi
3440: 63 68 65 76 65 72 20 63 6f 6d 65 73 20 66 69 72  chever comes fir
3450: 73 74 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  st)..*/.int sqli
3460: 74 65 33 75 74 66 38 43 68 61 72 4c 65 6e 28 63  te3utf8CharLen(c
3470: 6f 6e 73 74 20 63 68 61 72 20 2a 70 5a 2c 20 69  onst char *pZ, i
3480: 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 55 74 66  nt nByte){.  Utf
3490: 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e  String str;.  in
34a0: 74 20 72 65 74 20 3d 20 30 3b 0a 20 20 75 33 32  t ret = 0;.  u32
34b0: 20 63 6f 64 65 20 3d 20 31 3b 0a 0a 20 20 73 74   code = 1;..  st
34c0: 72 2e 70 5a 20 3d 20 28 63 68 61 72 20 2a 29 70  r.pZ = (char *)p
34d0: 5a 3b 0a 20 20 73 74 72 2e 6e 20 3d 20 6e 42 79  Z;.  str.n = nBy
34e0: 74 65 3b 0a 20 20 73 74 72 2e 63 20 3d 20 30 3b  te;.  str.c = 0;
34f0: 0a 0a 20 20 77 68 69 6c 65 28 20 28 6e 42 79 74  ..  while( (nByt
3500: 65 3c 30 20 7c 7c 20 73 74 72 2e 63 3c 73 74 72  e<0 || str.c<str
3510: 2e 6e 29 20 26 26 20 63 6f 64 65 21 3d 30 20 29  .n) && code!=0 )
3520: 7b 0a 20 20 20 20 63 6f 64 65 20 3d 20 72 65 61  {.    code = rea
3530: 64 55 74 66 38 28 26 73 74 72 29 3b 0a 20 20 20  dUtf8(&str);.   
3540: 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66   ret++;.  }.  if
3550: 28 20 63 6f 64 65 3d 3d 30 20 29 20 72 65 74 2d  ( code==0 ) ret-
3560: 2d 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74  -;..  return ret
3570: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 5a 20 69 73  ;.}../*.** pZ is
3580: 20 61 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65   a UTF-16 encode
3590: 64 20 75 6e 69 63 6f 64 65 20 73 74 72 69 6e 67  d unicode string
35a0: 2e 20 49 66 20 6e 43 68 61 72 20 69 73 20 6c 65  . If nChar is le
35b0: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 0a 2a 2a  ss than zero,.**
35c0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
35d0: 65 72 20 6f 66 20 62 79 74 65 73 20 75 70 20 74  er of bytes up t
35e0: 6f 20 28 62 75 74 20 6e 6f 74 20 69 6e 63 6c 75  o (but not inclu
35f0: 64 69 6e 67 29 2c 20 74 68 65 20 66 69 72 73 74  ding), the first
3600: 20 70 61 69 72 0a 2a 2a 20 6f 66 20 63 6f 6e 73   pair.** of cons
3610: 65 63 75 74 69 76 65 20 30 78 30 30 20 62 79 74  ecutive 0x00 byt
3620: 65 73 20 69 6e 20 70 5a 2e 20 49 66 20 6e 43 68  es in pZ. If nCh
3630: 61 72 20 69 73 20 6e 6f 74 20 6c 65 73 73 20 74  ar is not less t
3640: 68 61 6e 20 7a 65 72 6f 2c 0a 2a 2a 20 74 68 65  han zero,.** the
3650: 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  n return the num
3660: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
3670: 74 68 65 20 66 69 72 73 74 20 6e 43 68 61 72 20  the first nChar 
3680: 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65  unicode characte
3690: 72 73 0a 2a 2a 20 69 6e 20 70 5a 20 28 6f 72 20  rs.** in pZ (or 
36a0: 75 70 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  up until the fir
36b0: 73 74 20 70 61 69 72 20 6f 66 20 30 78 30 30 20  st pair of 0x00 
36c0: 62 79 74 65 73 2c 20 77 68 69 63 68 65 76 65 72  bytes, whichever
36d0: 20 63 6f 6d 65 73 20 66 69 72 73 74 29 2e 0a 2a   comes first)..*
36e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 75 74 66  /.int sqlite3utf
36f0: 31 36 42 79 74 65 4c 65 6e 28 63 6f 6e 73 74 20  16ByteLen(const 
3700: 76 6f 69 64 20 2a 70 5a 2c 20 69 6e 74 20 6e 43  void *pZ, int nC
3710: 68 61 72 29 7b 0a 20 20 69 66 28 20 6e 43 68 61  har){.  if( nCha
3720: 72 3c 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  r<0 ){.    const
3730: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
3740: 70 43 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  pC1 = (unsigned 
3750: 63 68 61 72 20 2a 29 70 5a 3b 0a 20 20 20 20 63  char *)pZ;.    c
3760: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
3770: 61 72 20 2a 70 43 32 20 3d 20 28 75 6e 73 69 67  ar *pC2 = (unsig
3780: 6e 65 64 20 63 68 61 72 20 2a 29 70 5a 2b 31 3b  ned char *)pZ+1;
3790: 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 43 31  .    while( *pC1
37a0: 20 7c 7c 20 2a 70 43 32 20 29 7b 0a 20 20 20 20   || *pC2 ){.    
37b0: 20 20 70 43 31 20 2b 3d 20 32 3b 0a 20 20 20 20    pC1 += 2;.    
37c0: 20 20 70 43 32 20 2b 3d 20 32 3b 0a 20 20 20 20    pC2 += 2;.    
37d0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 31  }.    return pC1
37e0: 2d 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  -(unsigned char 
37f0: 2a 29 70 5a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  *)pZ;.  }else{. 
3800: 20 20 20 55 74 66 53 74 72 69 6e 67 20 73 74 72     UtfString str
3810: 3b 0a 20 20 20 20 75 33 32 20 63 6f 64 65 20 3d  ;.    u32 code =
3820: 20 31 3b 0a 20 20 20 20 69 6e 74 20 62 69 67 5f   1;.    int big_
3830: 65 6e 64 69 61 6e 3b 0a 20 20 20 20 69 6e 74 20  endian;.    int 
3840: 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 69  nRead = 0;.    i
3850: 6e 74 20 72 65 74 3b 0a 0a 20 20 20 20 73 74 72  nt ret;..    str
3860: 2e 70 5a 20 3d 20 28 63 68 61 72 20 2a 29 70 5a  .pZ = (char *)pZ
3870: 3b 0a 20 20 20 20 73 74 72 2e 63 20 3d 20 30 3b  ;.    str.c = 0;
3880: 0a 20 20 20 20 73 74 72 2e 6e 20 3d 20 2d 31 3b  .    str.n = -1;
3890: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
38a0: 6f 72 20 61 20 42 4f 4d 2e 20 57 65 20 6a 75 73  or a BOM. We jus
38b0: 74 20 69 67 6e 6f 72 65 20 69 74 20 69 66 20 74  t ignore it if t
38c0: 68 65 72 65 20 69 73 20 6f 6e 65 2c 20 69 74 27  here is one, it'
38d0: 73 20 6f 6e 6c 79 20 72 65 61 64 0a 20 20 20 20  s only read.    
38e0: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  ** so that it is
38f0: 20 6e 6f 74 20 63 6f 75 6e 74 65 64 20 61 73 20   not counted as 
3900: 61 20 63 68 61 72 61 63 74 65 72 2e 20 0a 20 20  a character. .  
3910: 20 20 2a 2f 0a 20 20 20 20 62 69 67 5f 65 6e 64    */.    big_end
3920: 69 61 6e 20 3d 20 72 65 61 64 55 74 66 31 36 42  ian = readUtf16B
3930: 6f 6d 28 26 73 74 72 2c 20 30 29 3b 0a 20 20 20  om(&str, 0);.   
3940: 20 72 65 74 20 3d 20 30 2d 73 74 72 2e 63 3b 0a   ret = 0-str.c;.
3950: 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6f 64 65  .    while( code
3960: 21 3d 30 20 26 26 20 6e 52 65 61 64 3c 6e 43 68  !=0 && nRead<nCh
3970: 61 72 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65  ar ){.      code
3980: 20 3d 20 72 65 61 64 55 74 66 31 36 28 26 73 74   = readUtf16(&st
3990: 72 2c 20 62 69 67 5f 65 6e 64 69 61 6e 29 3b 0a  r, big_endian);.
39a0: 20 20 20 20 20 20 6e 52 65 61 64 2b 2b 3b 0a 20        nRead++;. 
39b0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6f 64     }.    if( cod
39c0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
39d0: 74 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  t -= 2;.    }.  
39e0: 20 20 72 65 74 75 72 6e 20 73 74 72 2e 63 20 2b    return str.c +
39f0: 20 72 65 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   ret;.  }.}../*.
3a00: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 74 72  ** Convert a str
3a10: 69 6e 67 20 69 6e 20 55 54 46 2d 31 36 20 6e 61  ing in UTF-16 na
3a20: 74 69 76 65 20 62 79 74 65 20 28 6f 72 20 77 69  tive byte (or wi
3a30: 74 68 20 61 20 42 79 74 65 2d 6f 72 64 65 72 2d  th a Byte-order-
3a40: 6d 61 72 6b 20 6f 72 0a 2a 2a 20 22 42 4f 4d 22  mark or.** "BOM"
3a50: 29 20 69 6e 74 6f 20 61 20 55 54 46 2d 38 20 73  ) into a UTF-8 s
3a60: 74 72 69 6e 67 2e 20 20 54 68 65 20 55 54 46 2d  tring.  The UTF-
3a70: 38 20 73 74 72 69 6e 67 20 69 73 20 77 72 69 74  8 string is writ
3a80: 74 65 6e 20 69 6e 74 6f 20 73 70 61 63 65 20 0a  ten into space .
3a90: 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ** obtained from
3aa0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29   sqlite3Malloc()
3ab0: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72 65 6c   and must be rel
3ac0: 65 61 73 65 64 20 62 79 20 74 68 65 20 63 61 6c  eased by the cal
3ad0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
3ae0: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74  *.** The paramet
3af0: 65 72 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  er N is the numb
3b00: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
3b10: 68 65 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67  he UTF-16 string
3b20: 2e 20 20 49 66 20 4e 20 69 73 0a 2a 2a 20 6e 65  .  If N is.** ne
3b30: 67 61 74 69 76 65 2c 20 74 68 65 20 65 6e 74 69  gative, the enti
3b40: 72 65 20 73 74 72 69 6e 67 20 75 70 20 74 6f 20  re string up to 
3b50: 74 68 65 20 66 69 72 73 74 20 5c 75 30 30 30 30  the first \u0000
3b60: 20 63 68 61 72 61 63 74 65 72 20 69 73 20 74 72   character is tr
3b70: 61 6e 73 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  anslated..**.** 
3b80: 54 68 65 20 72 65 74 75 72 6e 65 64 20 55 54 46  The returned UTF
3b90: 2d 38 20 73 74 72 69 6e 67 20 69 73 20 61 6c 77  -8 string is alw
3ba0: 61 79 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61  ays \000 termina
3bb0: 74 65 64 2e 0a 2a 2f 0a 75 6e 73 69 67 6e 65 64  ted..*/.unsigned
3bc0: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 75 74   char *sqlite3ut
3bd0: 66 31 36 74 6f 38 28 63 6f 6e 73 74 20 76 6f 69  f16to8(const voi
3be0: 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 4e 2c  d *pData, int N,
3bf0: 20 69 6e 74 20 62 69 67 5f 65 6e 64 69 61 6e 29   int big_endian)
3c00: 7b 0a 20 20 55 74 66 53 74 72 69 6e 67 20 69 6e  {.  UtfString in
3c10: 3b 0a 20 20 55 74 66 53 74 72 69 6e 67 20 6f 75  ;.  UtfString ou
3c20: 74 3b 0a 0a 20 20 6f 75 74 2e 70 5a 20 3d 20 30  t;..  out.pZ = 0
3c30: 3b 0a 0a 20 20 69 6e 2e 70 5a 20 3d 20 28 75 6e  ;..  in.pZ = (un
3c40: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 44  signed char *)pD
3c50: 61 74 61 3b 0a 20 20 69 6e 2e 6e 20 3d 20 4e 3b  ata;.  in.n = N;
3c60: 0a 20 20 69 6e 2e 63 20 3d 20 30 3b 0a 0a 20 20  .  in.c = 0;..  
3c70: 69 66 28 20 69 6e 2e 6e 3c 30 20 29 7b 0a 20 20  if( in.n<0 ){.  
3c80: 20 20 69 6e 2e 6e 20 3d 20 73 71 6c 69 74 65 33    in.n = sqlite3
3c90: 75 74 66 31 36 42 79 74 65 4c 65 6e 28 69 6e 2e  utf16ByteLen(in.
3ca0: 70 5a 2c 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20  pZ, -1);.  }..  
3cb0: 2f 2a 20 41 20 55 54 46 2d 38 20 65 6e 63 6f 64  /* A UTF-8 encod
3cc0: 69 6e 67 20 6f 66 20 61 20 75 6e 69 63 6f 64 65  ing of a unicode
3cd0: 20 73 74 72 69 6e 67 20 63 61 6e 20 72 65 71 75   string can requ
3ce0: 69 72 65 20 61 74 20 6d 6f 73 74 20 31 2e 35 20  ire at most 1.5 
3cf0: 74 69 6d 65 73 20 61 73 0a 20 20 2a 2a 20 6d 75  times as.  ** mu
3d00: 63 68 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72  ch space to stor
3d10: 65 20 61 73 20 74 68 65 20 73 61 6d 65 20 73 74  e as the same st
3d20: 72 69 6e 67 20 65 6e 63 6f 64 65 64 20 75 73 69  ring encoded usi
3d30: 6e 67 20 55 54 46 2d 31 36 2e 20 41 6c 6c 6f 63  ng UTF-16. Alloc
3d40: 61 74 65 0a 20 20 2a 2a 20 74 68 69 73 20 6e 6f  ate.  ** this no
3d50: 77 2e 0a 20 20 2a 2f 0a 20 20 6f 75 74 2e 6e 20  w..  */.  out.n 
3d60: 3d 20 28 69 6e 2e 6e 2a 31 2e 35 29 20 2b 20 31  = (in.n*1.5) + 1
3d70: 3b 0a 20 20 6f 75 74 2e 70 5a 20 3d 20 73 71 6c  ;.  out.pZ = sql
3d80: 69 74 65 4d 61 6c 6c 6f 63 28 6f 75 74 2e 6e 29  iteMalloc(out.n)
3d90: 3b 0a 20 20 69 66 28 20 21 6f 75 74 2e 70 5a 20  ;.  if( !out.pZ 
3da0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
3db0: 0a 20 20 7d 0a 20 20 6f 75 74 2e 63 20 3d 20 30  .  }.  out.c = 0
3dc0: 3b 0a 0a 20 20 62 69 67 5f 65 6e 64 69 61 6e 20  ;..  big_endian 
3dd0: 3d 20 72 65 61 64 55 74 66 31 36 42 6f 6d 28 26  = readUtf16Bom(&
3de0: 69 6e 2c 20 62 69 67 5f 65 6e 64 69 61 6e 29 3b  in, big_endian);
3df0: 0a 20 20 77 68 69 6c 65 28 20 69 6e 2e 63 3c 69  .  while( in.c<i
3e00: 6e 2e 6e 20 29 7b 0a 20 20 20 20 77 72 69 74 65  n.n ){.    write
3e10: 55 74 66 38 28 26 6f 75 74 2c 20 72 65 61 64 55  Utf8(&out, readU
3e20: 74 66 31 36 28 26 69 6e 2c 20 62 69 67 5f 65 6e  tf16(&in, big_en
3e30: 64 69 61 6e 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  dian));.  }..  /
3e40: 2a 20 41 64 64 20 74 68 65 20 4e 55 4c 4c 2d 74  * Add the NULL-t
3e50: 65 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63  erminator charac
3e60: 74 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ter */.  assert(
3e70: 20 6f 75 74 2e 63 3c 6f 75 74 2e 6e 20 29 3b 0a   out.c<out.n );.
3e80: 20 20 6f 75 74 2e 70 5a 5b 6f 75 74 2e 63 5d 20    out.pZ[out.c] 
3e90: 3d 20 30 78 30 30 3b 0a 0a 20 20 72 65 74 75 72  = 0x00;..  retur
3ea0: 6e 20 6f 75 74 2e 70 5a 3b 0a 7d 0a 0a 73 74 61  n out.pZ;.}..sta
3eb0: 74 69 63 20 76 6f 69 64 20 2a 75 74 66 38 74 6f  tic void *utf8to
3ec0: 55 74 66 31 36 28 63 6f 6e 73 74 20 75 6e 73 69  Utf16(const unsi
3ed0: 67 6e 65 64 20 63 68 61 72 20 2a 70 49 6e 2c 20  gned char *pIn, 
3ee0: 69 6e 74 20 4e 2c 20 69 6e 74 20 62 69 67 5f 65  int N, int big_e
3ef0: 6e 64 69 61 6e 29 7b 0a 20 20 55 74 66 53 74 72  ndian){.  UtfStr
3f00: 69 6e 67 20 69 6e 3b 0a 20 20 55 74 66 53 74 72  ing in;.  UtfStr
3f10: 69 6e 67 20 6f 75 74 3b 0a 0a 20 20 69 6e 2e 70  ing out;..  in.p
3f20: 5a 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  Z = (unsigned ch
3f30: 61 72 20 2a 29 70 49 6e 3b 0a 20 20 69 6e 2e 6e  ar *)pIn;.  in.n
3f40: 20 3d 20 4e 3b 0a 20 20 69 6e 2e 63 20 3d 20 30   = N;.  in.c = 0
3f50: 3b 0a 0a 20 20 69 66 28 20 69 6e 2e 6e 3c 30 20  ;..  if( in.n<0 
3f60: 29 7b 0a 20 20 20 20 69 6e 2e 6e 20 3d 20 73 74  ){.    in.n = st
3f70: 72 6c 65 6e 28 69 6e 2e 70 5a 29 3b 0a 20 20 7d  rlen(in.pZ);.  }
3f80: 0a 0a 20 20 2f 2a 20 41 20 55 54 46 2d 31 36 20  ..  /* A UTF-16 
3f90: 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 75 6e  encoding of a un
3fa0: 69 63 6f 64 65 20 73 74 72 69 6e 67 20 63 61 6e  icode string can
3fb0: 20 72 65 71 75 69 72 65 20 61 74 20 6d 6f 73 74   require at most
3fc0: 20 74 77 69 63 65 20 61 73 0a 20 20 2a 2a 20 6d   twice as.  ** m
3fd0: 75 63 68 20 73 70 61 63 65 20 74 6f 20 73 74 6f  uch space to sto
3fe0: 72 65 20 61 73 20 74 68 65 20 73 61 6d 65 20 73  re as the same s
3ff0: 74 72 69 6e 67 20 65 6e 63 6f 64 65 64 20 75 73  tring encoded us
4000: 69 6e 67 20 55 54 46 2d 38 2e 20 41 6c 6c 6f 63  ing UTF-8. Alloc
4010: 61 74 65 0a 20 20 2a 2a 20 74 68 69 73 20 6e 6f  ate.  ** this no
4020: 77 2e 0a 20 20 2a 2f 0a 20 20 6f 75 74 2e 6e 20  w..  */.  out.n 
4030: 3d 20 28 69 6e 2e 6e 2a 32 29 20 2b 20 32 3b 0a  = (in.n*2) + 2;.
4040: 20 20 6f 75 74 2e 70 5a 20 3d 20 73 71 6c 69 74    out.pZ = sqlit
4050: 65 4d 61 6c 6c 6f 63 28 6f 75 74 2e 6e 29 3b 0a  eMalloc(out.n);.
4060: 20 20 69 66 28 20 21 6f 75 74 2e 70 5a 20 29 7b    if( !out.pZ ){
4070: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4080: 20 7d 0a 20 20 6f 75 74 2e 63 20 3d 20 30 3b 0a   }.  out.c = 0;.
4090: 0a 20 20 77 68 69 6c 65 28 20 69 6e 2e 63 3c 69  .  while( in.c<i
40a0: 6e 2e 6e 20 29 7b 0a 20 20 20 20 77 72 69 74 65  n.n ){.    write
40b0: 55 74 66 31 36 28 26 6f 75 74 2c 20 72 65 61 64  Utf16(&out, read
40c0: 55 74 66 38 28 26 69 6e 29 2c 20 62 69 67 5f 65  Utf8(&in), big_e
40d0: 6e 64 69 61 6e 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ndian);.  }..  /
40e0: 2a 20 41 64 64 20 74 68 65 20 4e 55 4c 4c 2d 74  * Add the NULL-t
40f0: 65 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63  erminator charac
4100: 74 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ter */.  assert(
4110: 20 28 6f 75 74 2e 63 2b 31 29 3c 6f 75 74 2e 6e   (out.c+1)<out.n
4120: 20 29 3b 0a 20 20 6f 75 74 2e 70 5a 5b 6f 75 74   );.  out.pZ[out
4130: 2e 63 5d 20 3d 20 30 78 30 30 3b 0a 20 20 6f 75  .c] = 0x00;.  ou
4140: 74 2e 70 5a 5b 6f 75 74 2e 63 2b 31 5d 20 3d 20  t.pZ[out.c+1] = 
4150: 30 78 30 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20  0x00;..  return 
4160: 6f 75 74 2e 70 5a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  out.pZ;.}../*.**
4170: 20 54 72 61 6e 73 6c 61 74 65 20 55 54 46 2d 38   Translate UTF-8
4180: 20 74 6f 20 55 54 46 2d 31 36 42 45 20 6f 72 20   to UTF-16BE or 
4190: 55 54 46 2d 31 36 4c 45 0a 2a 2f 0a 76 6f 69 64  UTF-16LE.*/.void
41a0: 20 2a 73 71 6c 69 74 65 33 75 74 66 38 74 6f 31   *sqlite3utf8to1
41b0: 36 62 65 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  6be(const unsign
41c0: 65 64 20 63 68 61 72 20 2a 70 49 6e 2c 20 69 6e  ed char *pIn, in
41d0: 74 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 75  t N){.  return u
41e0: 74 66 38 74 6f 55 74 66 31 36 28 70 49 6e 2c 20  tf8toUtf16(pIn, 
41f0: 4e 2c 20 31 29 3b 0a 7d 0a 0a 76 6f 69 64 20 2a  N, 1);.}..void *
4200: 73 71 6c 69 74 65 33 75 74 66 38 74 6f 31 36 6c  sqlite3utf8to16l
4210: 65 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  e(const unsigned
4220: 20 63 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20   char *pIn, int 
4230: 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 75 74 66  N){.  return utf
4240: 38 74 6f 55 74 66 31 36 28 70 49 6e 2c 20 4e 2c  8toUtf16(pIn, N,
4250: 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54   0);.}../* .** T
4260: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
4270: 20 74 68 65 20 77 6f 72 6b 20 66 6f 72 20 73 71   the work for sq
4280: 6c 69 74 65 33 75 74 66 31 36 74 6f 31 36 6c 65  lite3utf16to16le
4290: 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65  () and.** sqlite
42a0: 33 75 74 66 31 36 74 6f 31 36 62 65 28 29 2e 20  3utf16to16be(). 
42b0: 49 66 20 62 69 67 5f 65 6e 64 69 61 6e 20 69 73  If big_endian is
42c0: 20 31 20 74 68 65 20 69 6e 70 75 74 20 73 74 72   1 the input str
42d0: 69 6e 67 20 69 73 0a 2a 2a 20 74 72 61 6e 73 66  ing is.** transf
42e0: 6f 72 6d 65 64 20 69 6e 20 70 6c 61 63 65 20 74  ormed in place t
42f0: 6f 20 55 54 46 2d 31 36 42 45 20 65 6e 63 6f 64  o UTF-16BE encod
4300: 69 6e 67 2e 20 49 66 20 62 69 67 5f 65 6e 64 69  ing. If big_endi
4310: 61 6e 20 69 73 20 30 20 74 68 65 6e 0a 2a 2a 20  an is 0 then.** 
4320: 74 68 65 20 69 6e 70 75 74 20 69 73 20 74 72 61  the input is tra
4330: 6e 73 66 6f 72 6d 65 64 20 74 6f 20 55 54 46 2d  nsformed to UTF-
4340: 31 36 4c 45 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  16LE..**.** Unle
4350: 73 73 20 74 68 65 20 66 69 72 73 74 20 74 77 6f  ss the first two
4360: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 69 6e   bytes of the in
4370: 70 75 74 20 73 74 72 69 6e 67 20 69 73 20 61 20  put string is a 
4380: 42 4f 4d 2c 20 74 68 65 20 69 6e 70 75 74 20 69  BOM, the input i
4390: 73 0a 2a 2a 20 61 73 73 75 6d 65 64 20 74 6f 20  s.** assumed to 
43a0: 62 65 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65  be UTF-16 encode
43b0: 64 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63 68  d using the mach
43c0: 69 6e 65 73 20 6e 61 74 69 76 65 20 62 79 74 65  ines native byte
43d0: 20 6f 72 64 65 72 69 6e 67 2e 0a 2a 2f 0a 73 74   ordering..*/.st
43e0: 61 74 69 63 20 76 6f 69 64 20 75 74 66 31 36 74  atic void utf16t
43f0: 6f 31 36 28 76 6f 69 64 20 2a 70 44 61 74 61 2c  o16(void *pData,
4400: 20 69 6e 74 20 4e 2c 20 69 6e 74 20 62 69 67 5f   int N, int big_
4410: 65 6e 64 69 61 6e 29 7b 0a 20 20 55 74 66 53 74  endian){.  UtfSt
4420: 72 69 6e 67 20 69 6e 6f 75 74 3b 0a 20 20 69 6e  ring inout;.  in
4430: 6f 75 74 2e 70 5a 20 3d 20 28 75 6e 73 69 67 6e  out.pZ = (unsign
4440: 65 64 20 63 68 61 72 20 2a 29 70 44 61 74 61 3b  ed char *)pData;
4450: 0a 20 20 69 6e 6f 75 74 2e 63 20 3d 20 30 3b 0a  .  inout.c = 0;.
4460: 20 20 69 6e 6f 75 74 2e 6e 20 3d 20 4e 3b 0a 0a    inout.n = N;..
4470: 20 20 69 66 28 20 69 6e 6f 75 74 2e 6e 3c 30 20    if( inout.n<0 
4480: 29 7b 0a 20 20 20 20 69 6e 6f 75 74 2e 6e 20 3d  ){.    inout.n =
4490: 20 73 71 6c 69 74 65 33 75 74 66 31 36 42 79 74   sqlite3utf16Byt
44a0: 65 4c 65 6e 28 69 6e 6f 75 74 2e 70 5a 2c 20 2d  eLen(inout.pZ, -
44b0: 31 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  1);.  }..  if( r
44c0: 65 61 64 55 74 66 31 36 42 6f 6d 28 26 69 6e 6f  eadUtf16Bom(&ino
44d0: 75 74 2c 20 53 51 4c 49 54 45 5f 42 49 47 45 4e  ut, SQLITE_BIGEN
44e0: 44 49 41 4e 29 21 3d 62 69 67 5f 65 6e 64 69 61  DIAN)!=big_endia
44f0: 6e 20 29 7b 0a 20 20 20 20 2f 2a 20 73 77 61 62  n ){.    /* swab
4500: 28 26 69 6e 6f 75 74 2e 70 5a 5b 69 6e 6f 75 74  (&inout.pZ[inout
4510: 2e 63 5d 2c 20 69 6e 6f 75 74 2e 70 5a 2c 20 69  .c], inout.pZ, i
4520: 6e 6f 75 74 2e 6e 2d 69 6e 6f 75 74 2e 63 29 3b  nout.n-inout.c);
4530: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   */.    int i;. 
4540: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 69     for(i=0; i<(i
4550: 6e 6f 75 74 2e 6e 2d 69 6e 6f 75 74 2e 63 29 3b  nout.n-inout.c);
4560: 20 69 20 2b 3d 20 32 29 7b 0a 20 20 20 20 20 20   i += 2){.      
4570: 63 68 61 72 20 63 31 20 3d 20 69 6e 6f 75 74 2e  char c1 = inout.
4580: 70 5a 5b 69 2b 69 6e 6f 75 74 2e 63 5d 3b 0a 20  pZ[i+inout.c];. 
4590: 20 20 20 20 20 63 68 61 72 20 63 32 20 3d 20 69       char c2 = i
45a0: 6e 6f 75 74 2e 70 5a 5b 69 2b 69 6e 6f 75 74 2e  nout.pZ[i+inout.
45b0: 63 2b 31 5d 3b 0a 20 20 20 20 20 20 69 6e 6f 75  c+1];.      inou
45c0: 74 2e 70 5a 5b 69 5d 20 3d 20 63 32 3b 0a 20 20  t.pZ[i] = c2;.  
45d0: 20 20 20 20 69 6e 6f 75 74 2e 70 5a 5b 69 2b 31      inout.pZ[i+1
45e0: 5d 20 3d 20 63 31 3b 0a 20 20 20 20 7d 0a 20 20  ] = c1;.    }.  
45f0: 7d 65 6c 73 65 20 69 66 28 20 69 6e 6f 75 74 2e  }else if( inout.
4600: 63 20 29 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65  c ){.    memmove
4610: 28 69 6e 6f 75 74 2e 70 5a 2c 20 26 69 6e 6f 75  (inout.pZ, &inou
4620: 74 2e 70 5a 5b 69 6e 6f 75 74 2e 63 5d 2c 20 69  t.pZ[inout.c], i
4630: 6e 6f 75 74 2e 6e 2d 69 6e 6f 75 74 2e 63 29 3b  nout.n-inout.c);
4640: 0a 20 20 7d 0a 0a 20 20 69 6e 6f 75 74 2e 70 5a  .  }..  inout.pZ
4650: 5b 69 6e 6f 75 74 2e 6e 2d 69 6e 6f 75 74 2e 63  [inout.n-inout.c
4660: 5d 20 3d 20 30 78 30 30 3b 0a 20 20 69 6e 6f 75  ] = 0x00;.  inou
4670: 74 2e 70 5a 5b 69 6e 6f 75 74 2e 6e 2d 69 6e 6f  t.pZ[inout.n-ino
4680: 75 74 2e 63 2b 31 5d 20 3d 20 30 78 30 30 3b 0a  ut.c+1] = 0x00;.
4690: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
46a0: 20 61 20 73 74 72 69 6e 67 20 69 6e 20 55 54 46   a string in UTF
46b0: 2d 31 36 20 6e 61 74 69 76 65 20 62 79 74 65 20  -16 native byte 
46c0: 6f 72 20 77 69 74 68 20 61 20 42 4f 4d 20 69 6e  or with a BOM in
46d0: 74 6f 20 61 20 55 54 46 2d 31 36 4c 45 0a 2a 2a  to a UTF-16LE.**
46e0: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 63 6f   string.  The co
46f0: 6e 76 65 72 73 69 6f 6e 20 6f 63 63 75 72 73 20  nversion occurs 
4700: 69 6e 2d 70 6c 61 63 65 2e 20 20 54 68 65 20 6f  in-place.  The o
4710: 75 74 70 75 74 20 6f 76 65 72 77 72 69 74 65 73  utput overwrites
4720: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 2e 20 20   the.** input.  
4730: 4e 20 62 79 74 65 73 20 61 72 65 20 63 6f 6e 76  N bytes are conv
4740: 65 72 74 65 64 2e 20 20 49 66 20 4e 20 69 73 20  erted.  If N is 
4750: 6e 65 67 61 74 69 76 65 20 65 76 65 72 79 74 68  negative everyth
4760: 69 6e 67 20 69 73 20 63 6f 6e 76 65 72 74 65 64  ing is converted
4770: 0a 2a 2a 20 75 70 20 74 6f 20 74 68 65 20 66 69  .** up to the fi
4780: 72 73 74 20 5c 75 30 30 30 30 20 63 68 61 72 61  rst \u0000 chara
4790: 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cter..**.** If t
47a0: 68 65 20 6e 61 74 69 76 65 20 62 79 74 65 20 6f  he native byte o
47b0: 72 64 65 72 20 69 73 20 6c 69 74 74 6c 65 2d 65  rder is little-e
47c0: 6e 64 69 61 6e 20 61 6e 64 20 74 68 65 72 65 20  ndian and there 
47d0: 69 73 20 6e 6f 20 42 4f 4d 2c 20 74 68 65 6e 0a  is no BOM, then.
47e0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
47f0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20  is a no-op.  If 
4800: 74 68 65 72 65 20 69 73 20 61 20 42 4f 4d 20 61  there is a BOM a
4810: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
4820: 68 65 20 73 74 72 69 6e 67 2c 0a 2a 2a 20 69 74  he string,.** it
4830: 20 69 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a   is removed..**.
4840: 2a 2a 20 54 72 61 6e 73 6c 61 74 69 6f 6e 20 66  ** Translation f
4850: 72 6f 6d 20 55 54 46 2d 31 36 4c 45 20 74 6f 20  rom UTF-16LE to 
4860: 55 54 46 2d 31 36 42 45 20 61 6e 64 20 62 61 63  UTF-16BE and bac
4870: 6b 20 61 67 61 69 6e 20 69 73 20 61 63 63 6f 6d  k again is accom
4880: 70 6c 69 73 68 65 64 0a 2a 2a 20 75 73 69 6e 67  plished.** using
4890: 20 74 68 65 20 6c 69 62 72 61 72 79 20 66 75 6e   the library fun
48a0: 63 74 69 6f 6e 20 73 77 61 62 28 29 2e 0a 2a 2f  ction swab()..*/
48b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 75 74 66  .void sqlite3utf
48c0: 31 36 74 6f 31 36 6c 65 28 76 6f 69 64 20 2a 70  16to16le(void *p
48d0: 44 61 74 61 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  Data, int N){.  
48e0: 75 74 66 31 36 74 6f 31 36 28 70 44 61 74 61 2c  utf16to16(pData,
48f0: 20 4e 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   N, 0);.}../*.**
4900: 20 43 6f 6e 76 65 72 74 20 61 20 73 74 72 69 6e   Convert a strin
4910: 67 20 69 6e 20 55 54 46 2d 31 36 20 6e 61 74 69  g in UTF-16 nati
4920: 76 65 20 62 79 74 65 20 6f 72 20 77 69 74 68 20  ve byte or with 
4930: 61 20 42 4f 4d 20 69 6e 74 6f 20 61 20 55 54 46  a BOM into a UTF
4940: 2d 31 36 42 45 0a 2a 2a 20 73 74 72 69 6e 67 2e  -16BE.** string.
4950: 20 20 54 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e    The conversion
4960: 20 6f 63 63 75 72 73 20 69 6e 2d 70 6c 61 63 65   occurs in-place
4970: 2e 20 20 54 68 65 20 6f 75 74 70 75 74 20 6f 76  .  The output ov
4980: 65 72 77 72 69 74 65 73 20 74 68 65 0a 2a 2a 20  erwrites the.** 
4990: 69 6e 70 75 74 2e 20 20 4e 20 62 79 74 65 73 20  input.  N bytes 
49a0: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 2e 20 20  are converted.  
49b0: 49 66 20 4e 20 69 73 20 6e 65 67 61 74 69 76 65  If N is negative
49c0: 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 63   everything is c
49d0: 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 75 70 20 74  onverted.** up t
49e0: 6f 20 74 68 65 20 66 69 72 73 74 20 5c 75 30 30  o the first \u00
49f0: 30 30 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a  00 character..**
4a00: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 61 74 69 76  .** If the nativ
4a10: 65 20 62 79 74 65 20 6f 72 64 65 72 20 69 73 20  e byte order is 
4a20: 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 61 6e  little-endian an
4a30: 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 42 4f  d there is no BO
4a40: 4d 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  M, then.** this 
4a50: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
4a60: 6f 70 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  op.  If there is
4a70: 20 61 20 42 4f 4d 20 61 74 20 74 68 65 20 73 74   a BOM at the st
4a80: 61 72 74 20 6f 66 20 74 68 65 20 73 74 72 69 6e  art of the strin
4a90: 67 2c 0a 2a 2a 20 69 74 20 69 73 20 72 65 6d 6f  g,.** it is remo
4aa0: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73  ved..**.** Trans
4ab0: 6c 61 74 69 6f 6e 20 66 72 6f 6d 20 55 54 46 2d  lation from UTF-
4ac0: 31 36 4c 45 20 74 6f 20 55 54 46 2d 31 36 42 45  16LE to UTF-16BE
4ad0: 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 20   and back again 
4ae0: 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 0a  is accomplished.
4af0: 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6c 69 62  ** using the lib
4b00: 72 61 72 79 20 66 75 6e 63 74 69 6f 6e 20 73 77  rary function sw
4b10: 61 62 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ab()..*/.void sq
4b20: 6c 69 74 65 33 75 74 66 31 36 74 6f 31 36 62 65  lite3utf16to16be
4b30: 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e  (void *pData, in
4b40: 74 20 4e 29 7b 0a 20 20 75 74 66 31 36 74 6f 31  t N){.  utf16to1
4b50: 36 28 70 44 61 74 61 2c 20 4e 2c 20 31 29 3b 0a  6(pData, N, 1);.
4b60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
4b70: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
4b80: 6f 20 74 72 61 6e 73 6c 61 74 65 20 62 65 74 77  o translate betw
4b90: 65 65 6e 20 55 54 46 2d 38 20 61 6e 64 20 55 54  een UTF-8 and UT
4ba0: 46 2d 31 36 2e 20 54 68 65 0a 2a 2a 20 72 65 73  F-16. The.** res
4bb0: 75 6c 74 20 69 73 20 72 65 74 75 72 6e 65 64 20  ult is returned 
4bc0: 69 6e 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61  in dynamically a
4bd0: 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e  llocated memory.
4be0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 75  .*/.int sqlite3u
4bf0: 74 66 54 72 61 6e 73 6c 61 74 65 28 0a 20 20 63  tfTranslate(.  c
4c00: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 44 61 74 61  onst void *zData
4c10: 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a  , int nData,  /*
4c20: 20 49 6e 70 75 74 20 73 74 72 69 6e 67 20 2a 2f   Input string */
4c30: 0a 20 20 75 38 20 65 6e 63 31 2c 20 20 20 20 20  .  u8 enc1,     
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c50: 20 20 2f 2a 20 45 6e 63 6f 64 69 6e 67 20 6f 66    /* Encoding of
4c60: 20 7a 44 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64   zData */.  void
4c70: 20 2a 2a 7a 4f 75 74 2c 20 69 6e 74 20 2a 6e 4f   **zOut, int *nO
4c80: 75 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 75  ut,        /* Ou
4c90: 74 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20  tput string */. 
4ca0: 20 75 38 20 65 6e 63 32 20 20 20 20 20 20 20 20   u8 enc2        
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cc0: 2f 2a 20 44 65 73 69 72 65 64 20 65 6e 63 6f 64  /* Desired encod
4cd0: 69 6e 67 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f  ing of output */
4ce0: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 6e  .){.  assert( en
4cf0: 63 31 3d 3d 54 45 58 54 5f 55 74 66 38 20 7c 7c  c1==TEXT_Utf8 ||
4d00: 20 65 6e 63 31 3d 3d 54 45 58 54 5f 55 74 66 31   enc1==TEXT_Utf1
4d10: 36 6c 65 20 7c 7c 20 65 6e 63 31 3d 3d 54 45 58  6le || enc1==TEX
4d20: 54 5f 55 74 66 31 36 62 65 20 29 3b 0a 20 20 61  T_Utf16be );.  a
4d30: 73 73 65 72 74 28 20 65 6e 63 32 3d 3d 54 45 58  ssert( enc2==TEX
4d40: 54 5f 55 74 66 38 20 7c 7c 20 65 6e 63 32 3d 3d  T_Utf8 || enc2==
4d50: 54 45 58 54 5f 55 74 66 31 36 6c 65 20 7c 7c 20  TEXT_Utf16le || 
4d60: 65 6e 63 32 3d 3d 54 45 58 54 5f 55 74 66 31 36  enc2==TEXT_Utf16
4d70: 62 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  be );.  assert( 
4d80: 0a 20 20 20 20 28 65 6e 63 31 3d 3d 54 45 58 54  .    (enc1==TEXT
4d90: 5f 55 74 66 38 20 26 26 20 28 65 6e 63 32 3d 3d  _Utf8 && (enc2==
4da0: 54 45 58 54 5f 55 74 66 31 36 6c 65 20 7c 7c 20  TEXT_Utf16le || 
4db0: 65 6e 63 32 3d 3d 54 45 58 54 5f 55 74 66 31 36  enc2==TEXT_Utf16
4dc0: 62 65 29 29 20 7c 7c 0a 20 20 20 20 28 65 6e 63  be)) ||.    (enc
4dd0: 32 3d 3d 54 45 58 54 5f 55 74 66 38 20 26 26 20  2==TEXT_Utf8 && 
4de0: 28 65 6e 63 31 3d 3d 54 45 58 54 5f 55 74 66 31  (enc1==TEXT_Utf1
4df0: 36 6c 65 20 7c 7c 20 65 6e 63 31 3d 3d 54 45 58  6le || enc1==TEX
4e00: 54 5f 55 74 66 31 36 62 65 29 29 0a 20 20 29 3b  T_Utf16be)).  );
4e10: 0a 0a 20 20 69 66 28 20 65 6e 63 31 3d 3d 54 45  ..  if( enc1==TE
4e20: 58 54 5f 55 74 66 38 20 29 7b 0a 20 20 20 20 69  XT_Utf8 ){.    i
4e30: 66 28 20 65 6e 63 32 3d 3d 54 45 58 54 5f 55 74  f( enc2==TEXT_Ut
4e40: 66 31 36 6c 65 20 29 7b 0a 20 20 20 20 20 20 2a  f16le ){.      *
4e50: 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 75 74  zOut = sqlite3ut
4e60: 66 38 74 6f 31 36 6c 65 28 7a 44 61 74 61 2c 20  f8to16le(zData, 
4e70: 6e 44 61 74 61 29 3b 0a 20 20 20 20 7d 65 6c 73  nData);.    }els
4e80: 65 7b 0a 20 20 20 20 20 20 2a 7a 4f 75 74 20 3d  e{.      *zOut =
4e90: 20 73 71 6c 69 74 65 33 75 74 66 38 74 6f 31 36   sqlite3utf8to16
4ea0: 62 65 28 7a 44 61 74 61 2c 20 6e 44 61 74 61 29  be(zData, nData)
4eb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4ec0: 21 28 2a 7a 4f 75 74 29 20 29 20 72 65 74 75 72  !(*zOut) ) retur
4ed0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
4ee0: 20 20 20 20 2a 6e 4f 75 74 20 3d 20 73 71 6c 69      *nOut = sqli
4ef0: 74 65 33 75 74 66 31 36 42 79 74 65 4c 65 6e 28  te3utf16ByteLen(
4f00: 2a 7a 4f 75 74 2c 20 2d 31 29 3b 0a 20 20 7d 65  *zOut, -1);.  }e
4f10: 6c 73 65 7b 0a 20 20 20 20 2a 7a 4f 75 74 20 3d  lse{.    *zOut =
4f20: 20 73 71 6c 69 74 65 33 75 74 66 31 36 74 6f 38   sqlite3utf16to8
4f30: 28 7a 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 65  (zData, nData, e
4f40: 6e 63 31 3d 3d 54 45 58 54 5f 55 74 66 31 36 62  nc1==TEXT_Utf16b
4f50: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 28 2a 7a  e);.    if( !(*z
4f60: 4f 75 74 29 20 29 20 72 65 74 75 72 6e 20 53 51  Out) ) return SQ
4f70: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
4f80: 2a 6e 4f 75 74 20 3d 20 73 74 72 6c 65 6e 28 2a  *nOut = strlen(*
4f90: 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  zOut);.  }.  ret
4fa0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
4fb0: 0a                                               .