/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact a7004436a6ef2aee012ace93de274dd0f3c7624e:


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 36 33 20 32  : utf.c,v 1.63 2
01f0: 30 30 38 2f 30 37 2f 32 39 20 31 31 3a 32 35 3a  008/07/29 11:25:
0200: 31 34 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  14 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 2f 0a 23 69 6e 63 6c  lows.**.*/.#incl
0500: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
0510: 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65  ".#include <asse
0520: 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22  rt.h>.#include "
0530: 76 64 62 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a  vdbeInt.h"../*.*
0540: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
0550: 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65 20 69  constant value i
0560: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 53 51  s used by the SQ
0570: 4c 49 54 45 5f 42 49 47 45 4e 44 49 41 4e 20 61  LITE_BIGENDIAN a
0580: 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 49 54  nd.** SQLITE_LIT
0590: 54 4c 45 45 4e 44 49 41 4e 20 6d 61 63 72 6f 73  TLEENDIAN macros
05a0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 69 6e 74 20 73  ..*/.const int s
05b0: 71 6c 69 74 65 33 6f 6e 65 20 3d 20 31 3b 0a 0a  qlite3one = 1;..
05c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 6f 6b 75  /*.** This looku
05d0: 70 20 74 61 62 6c 65 20 69 73 20 75 73 65 64 20  p table is used 
05e0: 74 6f 20 68 65 6c 70 20 64 65 63 6f 64 65 20 74  to help decode t
05f0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
0600: 0a 2a 2a 20 61 20 6d 75 6c 74 69 2d 62 79 74 65  .** a multi-byte
0610: 20 55 54 46 38 20 63 68 61 72 61 63 74 65 72 2e   UTF8 character.
0620: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
0630: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73   unsigned char s
0640: 71 6c 69 74 65 33 55 74 66 54 72 61 6e 73 31 5b  qlite3UtfTrans1[
0650: 5d 20 3d 20 7b 0a 20 20 30 78 30 30 2c 20 30 78  ] = {.  0x00, 0x
0660: 30 31 2c 20 30 78 30 32 2c 20 30 78 30 33 2c 20  01, 0x02, 0x03, 
0670: 30 78 30 34 2c 20 30 78 30 35 2c 20 30 78 30 36  0x04, 0x05, 0x06
0680: 2c 20 30 78 30 37 2c 0a 20 20 30 78 30 38 2c 20  , 0x07,.  0x08, 
0690: 30 78 30 39 2c 20 30 78 30 61 2c 20 30 78 30 62  0x09, 0x0a, 0x0b
06a0: 2c 20 30 78 30 63 2c 20 30 78 30 64 2c 20 30 78  , 0x0c, 0x0d, 0x
06b0: 30 65 2c 20 30 78 30 66 2c 0a 20 20 30 78 31 30  0e, 0x0f,.  0x10
06c0: 2c 20 30 78 31 31 2c 20 30 78 31 32 2c 20 30 78  , 0x11, 0x12, 0x
06d0: 31 33 2c 20 30 78 31 34 2c 20 30 78 31 35 2c 20  13, 0x14, 0x15, 
06e0: 30 78 31 36 2c 20 30 78 31 37 2c 0a 20 20 30 78  0x16, 0x17,.  0x
06f0: 31 38 2c 20 30 78 31 39 2c 20 30 78 31 61 2c 20  18, 0x19, 0x1a, 
0700: 30 78 31 62 2c 20 30 78 31 63 2c 20 30 78 31 64  0x1b, 0x1c, 0x1d
0710: 2c 20 30 78 31 65 2c 20 30 78 31 66 2c 0a 20 20  , 0x1e, 0x1f,.  
0720: 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32  0x00, 0x01, 0x02
0730: 2c 20 30 78 30 33 2c 20 30 78 30 34 2c 20 30 78  , 0x03, 0x04, 0x
0740: 30 35 2c 20 30 78 30 36 2c 20 30 78 30 37 2c 0a  05, 0x06, 0x07,.
0750: 20 20 30 78 30 38 2c 20 30 78 30 39 2c 20 30 78    0x08, 0x09, 0x
0760: 30 61 2c 20 30 78 30 62 2c 20 30 78 30 63 2c 20  0a, 0x0b, 0x0c, 
0770: 30 78 30 64 2c 20 30 78 30 65 2c 20 30 78 30 66  0x0d, 0x0e, 0x0f
0780: 2c 0a 20 20 30 78 30 30 2c 20 30 78 30 31 2c 20  ,.  0x00, 0x01, 
0790: 30 78 30 32 2c 20 30 78 30 33 2c 20 30 78 30 34  0x02, 0x03, 0x04
07a0: 2c 20 30 78 30 35 2c 20 30 78 30 36 2c 20 30 78  , 0x05, 0x06, 0x
07b0: 30 37 2c 0a 20 20 30 78 30 30 2c 20 30 78 30 31  07,.  0x00, 0x01
07c0: 2c 20 30 78 30 32 2c 20 30 78 30 33 2c 20 30 78  , 0x02, 0x03, 0x
07d0: 30 30 2c 20 30 78 30 31 2c 20 30 78 30 30 2c 20  00, 0x01, 0x00, 
07e0: 30 78 30 30 2c 0a 7d 3b 0a 0a 0a 23 64 65 66 69  0x00,.};...#defi
07f0: 6e 65 20 57 52 49 54 45 5f 55 54 46 38 28 7a 4f  ne WRITE_UTF8(zO
0800: 75 74 2c 20 63 29 20 7b 20 20 20 20 20 20 20 20  ut, c) {        
0810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0820: 20 20 5c 0a 20 20 69 66 28 20 63 3c 30 78 30 30    \.  if( c<0x00
0830: 30 38 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  080 ){          
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
0860: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 63 26 30 78   *zOut++ = (c&0x
0870: 46 46 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  FF);            
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0890: 20 20 20 20 5c 0a 20 20 7d 20 20 20 20 20 20 20      \.  }       
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
08d0: 20 65 6c 73 65 20 69 66 28 20 63 3c 30 78 30 30   else if( c<0x00
08e0: 38 30 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  800 ){          
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75        \.    *zOu
0910: 74 2b 2b 20 3d 20 30 78 43 30 20 2b 20 28 28 63  t++ = 0xC0 + ((c
0920: 3e 3e 36 29 26 30 78 31 46 29 3b 20 20 20 20 20  >>6)&0x1F);     
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
0940: 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30  .    *zOut++ = 0
0950: 78 38 30 20 2b 20 28 63 20 26 20 30 78 33 46 29  x80 + (c & 0x3F)
0960: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0970: 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 20 20 20          \.  }   
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09b0: 20 5c 0a 20 20 65 6c 73 65 20 69 66 28 20 63 3c   \.  else if( c<
09c0: 30 78 31 30 30 30 30 20 29 7b 20 20 20 20 20 20  0x10000 ){      
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
09f0: 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 45 30 20 2b  *zOut++ = 0xE0 +
0a00: 20 28 28 63 3e 3e 31 32 29 26 30 78 30 46 29 3b   ((c>>12)&0x0F);
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a20: 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b     \.    *zOut++
0a30: 20 3d 20 30 78 38 30 20 2b 20 28 28 63 3e 3e 36   = 0x80 + ((c>>6
0a40: 29 20 26 20 30 78 33 46 29 3b 20 20 20 20 20 20  ) & 0x3F);      
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
0a60: 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30    *zOut++ = 0x80
0a70: 20 2b 20 28 63 20 26 20 30 78 33 46 29 3b 20 20   + (c & 0x3F);  
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20       \.  }else{ 
0aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
0ad0: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78      *zOut++ = 0x
0ae0: 46 30 20 2b 20 28 28 63 3e 3e 31 38 29 20 26 20  F0 + ((c>>18) & 
0af0: 30 78 30 37 29 3b 20 20 20 20 20 20 20 20 20 20  0x07);          
0b00: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f         \.    *zO
0b10: 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 28  ut++ = 0x80 + ((
0b20: 63 3e 3e 31 32 29 20 26 20 30 78 33 46 29 3b 20  c>>12) & 0x3F); 
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b40: 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20  \.    *zOut++ = 
0b50: 30 78 38 30 20 2b 20 28 28 63 3e 3e 36 29 20 26  0x80 + ((c>>6) &
0b60: 20 30 78 33 46 29 3b 20 20 20 20 20 20 20 20 20   0x3F);         
0b70: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a           \.    *
0b80: 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20  zOut++ = 0x80 + 
0b90: 28 63 20 26 20 30 78 33 46 29 3b 20 20 20 20 20  (c & 0x3F);     
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 5c 0a 20 20 7d 20 20 20 20 20 20 20 20 20    \.  }         
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a             \.}..
0bf0: 23 64 65 66 69 6e 65 20 57 52 49 54 45 5f 55 54  #define WRITE_UT
0c00: 46 31 36 4c 45 28 7a 4f 75 74 2c 20 63 29 20 7b  F16LE(zOut, c) {
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c30: 5c 0a 20 20 69 66 28 20 63 3c 3d 30 78 46 46 46  \.  if( c<=0xFFF
0c40: 46 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  F ){            
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20    \.    *zOut++ 
0c80: 3d 20 28 63 26 30 78 30 30 46 46 29 3b 20 20 20  = (c&0x00FF);   
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cb0: 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b      \.    *zOut+
0cc0: 2b 20 3d 20 28 28 63 3e 3e 38 29 26 30 78 30 30  + = ((c>>8)&0x00
0cd0: 46 46 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  FF);            
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cf0: 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b        \.  }else{
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a          \.    *z
0d40: 4f 75 74 2b 2b 20 3d 20 28 28 28 63 3e 3e 31 30  Out++ = (((c>>10
0d50: 29 26 30 78 30 30 33 46 29 20 2b 20 28 28 28 63  )&0x003F) + (((c
0d60: 2d 30 78 31 30 30 30 30 29 3e 3e 31 30 29 26 30  -0x10000)>>10)&0
0d70: 78 30 30 43 30 29 29 3b 20 20 5c 0a 20 20 20 20  x00C0));  \.    
0d80: 2a 7a 4f 75 74 2b 2b 20 3d 20 28 30 78 30 30 44  *zOut++ = (0x00D
0d90: 38 20 2b 20 28 28 28 63 2d 30 78 31 30 30 30 30  8 + (((c-0x10000
0da0: 29 3e 3e 31 38 29 26 30 78 30 33 29 29 3b 20 20  )>>18)&0x03));  
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
0dc0: 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 63 26 30    *zOut++ = (c&0
0dd0: 78 30 30 46 46 29 3b 20 20 20 20 20 20 20 20 20  x00FF);         
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
0e00: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 30      *zOut++ = (0
0e10: 78 30 30 44 43 20 2b 20 28 28 63 3e 3e 38 29 26  x00DC + ((c>>8)&
0e20: 30 78 30 33 29 29 3b 20 20 20 20 20 20 20 20 20  0x03));         
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e40: 5c 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20 20  \.  }           
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e80: 20 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 57    \.}..#define W
0e90: 52 49 54 45 5f 55 54 46 31 36 42 45 28 7a 4f 75  RITE_UTF16BE(zOu
0ea0: 74 2c 20 63 29 20 7b 20 20 20 20 20 20 20 20 20  t, c) {         
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ec0: 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 63         \.  if( c
0ed0: 3c 3d 30 78 46 46 46 46 20 29 7b 20 20 20 20 20  <=0xFFFF ){     
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f00: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a           \.    *
0f10: 7a 4f 75 74 2b 2b 20 3d 20 28 28 63 3e 3e 38 29  zOut++ = ((c>>8)
0f20: 26 30 78 30 30 46 46 29 3b 20 20 20 20 20 20 20  &0x00FF);       
0f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f40: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
0f50: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 63 26 30 78   *zOut++ = (c&0x
0f60: 30 30 46 46 29 3b 20 20 20 20 20 20 20 20 20 20  00FF);          
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
0f90: 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20   }else{         
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
0fd0: 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28  .    *zOut++ = (
0fe0: 30 78 30 30 44 38 20 2b 20 28 28 28 63 2d 30 78  0x00D8 + (((c-0x
0ff0: 31 30 30 30 30 29 3e 3e 31 38 29 26 30 78 30 33  10000)>>18)&0x03
1000: 29 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ));             
1010: 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d   \.    *zOut++ =
1020: 20 28 28 28 63 3e 3e 31 30 29 26 30 78 30 30 33   (((c>>10)&0x003
1030: 46 29 20 2b 20 28 28 28 63 2d 30 78 31 30 30 30  F) + (((c-0x1000
1040: 30 29 3e 3e 31 30 29 26 30 78 30 30 43 30 29 29  0)>>10)&0x00C0))
1050: 3b 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b  ;  \.    *zOut++
1060: 20 3d 20 28 30 78 30 30 44 43 20 2b 20 28 28 63   = (0x00DC + ((c
1070: 3e 3e 38 29 26 30 78 30 33 29 29 3b 20 20 20 20  >>8)&0x03));    
1080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1090: 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74       \.    *zOut
10a0: 2b 2b 20 3d 20 28 63 26 30 78 30 30 46 46 29 3b  ++ = (c&0x00FF);
10b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d0: 20 20 20 20 20 20 20 5c 0a 20 20 7d 20 20 20 20         \.  }    
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1110: 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64           \.}..#d
1120: 65 66 69 6e 65 20 52 45 41 44 5f 55 54 46 31 36  efine READ_UTF16
1130: 4c 45 28 7a 49 6e 2c 20 63 29 7b 20 20 20 20 20  LE(zIn, c){     
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1160: 20 20 20 20 5c 0a 20 20 63 20 3d 20 28 2a 7a 49      \.  c = (*zI
1170: 6e 2b 2b 29 3b 20 20 20 20 20 20 20 20 20 20 20  n++);           
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
11b0: 63 20 2b 3d 20 28 28 2a 7a 49 6e 2b 2b 29 3c 3c  c += ((*zIn++)<<
11c0: 38 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  8);             
11d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f0: 20 20 20 20 5c 0a 20 20 69 66 28 20 63 3e 3d 30      \.  if( c>=0
1200: 78 44 38 30 30 20 26 26 20 63 3c 30 78 45 30 30  xD800 && c<0xE00
1210: 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1230: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1240: 20 69 6e 74 20 63 32 20 3d 20 28 2a 7a 49 6e 2b   int c2 = (*zIn+
1250: 2b 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  +);             
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1280: 20 20 20 5c 0a 20 20 20 20 63 32 20 2b 3d 20 28     \.    c2 += (
1290: 28 2a 7a 49 6e 2b 2b 29 3c 3c 38 29 3b 20 20 20  (*zIn++)<<8);   
12a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
12d0: 20 63 20 3d 20 28 63 32 26 30 78 30 33 46 46 29   c = (c2&0x03FF)
12e0: 20 2b 20 28 28 63 26 30 78 30 30 33 46 29 3c 3c   + ((c&0x003F)<<
12f0: 31 30 29 20 2b 20 28 28 28 63 26 30 78 30 33 43  10) + (((c&0x03C
1300: 30 29 2b 30 78 30 30 34 30 29 3c 3c 31 30 29 3b  0)+0x0040)<<10);
1310: 20 20 20 5c 0a 20 20 20 20 69 66 28 20 28 63 20     \.    if( (c 
1320: 26 20 30 78 46 46 46 46 30 30 30 30 29 3d 3d 30  & 0xFFFF0000)==0
1330: 20 29 20 63 20 3d 20 30 78 46 46 46 44 3b 20 20   ) c = 0xFFFD;  
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
1360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a0: 20 20 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20     \.}..#define 
13b0: 52 45 41 44 5f 55 54 46 31 36 42 45 28 7a 49 6e  READ_UTF16BE(zIn
13c0: 2c 20 63 29 7b 20 20 20 20 20 20 20 20 20 20 20  , c){           
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
13f0: 20 20 63 20 3d 20 28 28 2a 7a 49 6e 2b 2b 29 3c    c = ((*zIn++)<
1400: 3c 38 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  <8);            
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 20 20 20 20 5c 0a 20 20 63 20 2b 3d 20 28        \.  c += (
1440: 2a 7a 49 6e 2b 2b 29 3b 20 20 20 20 20 20 20 20  *zIn++);        
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1480: 20 20 69 66 28 20 63 3e 3d 30 78 44 38 30 30 20    if( c>=0xD800 
1490: 26 26 20 63 3c 30 78 45 30 30 30 20 29 7b 20 20  && c<0xE000 ){  
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c0: 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 63       \.    int c
14d0: 32 20 3d 20 28 28 2a 7a 49 6e 2b 2b 29 3c 3c 38  2 = ((*zIn++)<<8
14e0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1510: 20 20 20 63 32 20 2b 3d 20 28 2a 7a 49 6e 2b 2b     c2 += (*zIn++
1520: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1550: 20 20 20 20 20 5c 0a 20 20 20 20 63 20 3d 20 28       \.    c = (
1560: 63 32 26 30 78 30 33 46 46 29 20 2b 20 28 28 63  c2&0x03FF) + ((c
1570: 26 30 78 30 30 33 46 29 3c 3c 31 30 29 20 2b 20  &0x003F)<<10) + 
1580: 28 28 28 63 26 30 78 30 33 43 30 29 2b 30 78 30  (((c&0x03C0)+0x0
1590: 30 34 30 29 3c 3c 31 30 29 3b 20 20 20 5c 0a 20  040)<<10);   \. 
15a0: 20 20 20 69 66 28 20 28 63 20 26 20 30 78 46 46     if( (c & 0xFF
15b0: 46 46 30 30 30 30 29 3d 3d 30 20 29 20 63 20 3d  FF0000)==0 ) c =
15c0: 20 30 78 46 46 46 44 3b 20 20 20 20 20 20 20 20   0xFFFD;        
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e0: 20 20 20 20 20 5c 0a 20 20 7d 20 20 20 20 20 20       \.  }      
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
1630: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74  ../*.** Translat
1640: 65 20 61 20 73 69 6e 67 6c 65 20 55 54 46 2d 38  e a single UTF-8
1650: 20 63 68 61 72 61 63 74 65 72 2e 20 20 52 65 74   character.  Ret
1660: 75 72 6e 20 74 68 65 20 75 6e 69 63 6f 64 65 20  urn the unicode 
1670: 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 44 75 72  value..**.** Dur
1680: 69 6e 67 20 74 72 61 6e 73 6c 61 74 69 6f 6e 2c  ing translation,
1690: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
16a0: 20 62 79 74 65 20 74 68 61 74 20 7a 54 65 72 6d   byte that zTerm
16b0: 20 70 6f 69 6e 74 73 0a 2a 2a 20 69 73 20 61 20   points.** is a 
16c0: 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  0x00..**.** Writ
16d0: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
16e0: 68 65 20 6e 65 78 74 20 75 6e 72 65 61 64 20 62  he next unread b
16f0: 79 74 65 20 62 61 63 6b 20 69 6e 74 6f 20 2a 70  yte back into *p
1700: 7a 4e 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  zNext..**.** Not
1710: 65 73 20 4f 6e 20 49 6e 76 61 6c 69 64 20 55 54  es On Invalid UT
1720: 46 2d 38 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 20 54  F-8:.**.**  *  T
1730: 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 76 65  his routine neve
1740: 72 20 61 6c 6c 6f 77 73 20 61 20 37 2d 62 69 74  r allows a 7-bit
1750: 20 63 68 61 72 61 63 74 65 72 20 28 30 78 30 30   character (0x00
1760: 20 74 68 72 6f 75 67 68 20 30 78 37 66 29 20 74   through 0x7f) t
1770: 6f 0a 2a 2a 20 20 20 20 20 62 65 20 65 6e 63 6f  o.**     be enco
1780: 64 65 64 20 61 73 20 61 20 6d 75 6c 74 69 2d 62  ded as a multi-b
1790: 79 74 65 20 63 68 61 72 61 63 74 65 72 2e 20 20  yte character.  
17a0: 41 6e 79 20 6d 75 6c 74 69 2d 62 79 74 65 20 63  Any multi-byte c
17b0: 68 61 72 61 63 74 65 72 20 74 68 61 74 0a 2a 2a  haracter that.**
17c0: 20 20 20 20 20 61 74 74 65 6d 70 74 73 20 74 6f       attempts to
17d0: 20 65 6e 63 6f 64 65 20 61 20 76 61 6c 75 65 20   encode a value 
17e0: 62 65 74 77 65 65 6e 20 30 78 30 30 20 61 6e 64  between 0x00 and
17f0: 20 30 78 37 66 20 69 73 20 72 65 6e 64 65 72 65   0x7f is rendere
1800: 64 20 61 73 20 30 78 66 66 66 64 2e 0a 2a 2a 0a  d as 0xfffd..**.
1810: 2a 2a 20 20 2a 20 20 54 68 69 73 20 72 6f 75 74  **  *  This rout
1820: 69 6e 65 20 6e 65 76 65 72 20 61 6c 6c 6f 77 73  ine never allows
1830: 20 61 20 55 54 46 31 36 20 73 75 72 72 6f 67 61   a UTF16 surroga
1840: 74 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 65  te value to be e
1850: 6e 63 6f 64 65 64 2e 0a 2a 2a 20 20 20 20 20 49  ncoded..**     I
1860: 66 20 61 20 6d 75 6c 74 69 2d 62 79 74 65 20 63  f a multi-byte c
1870: 68 61 72 61 63 74 65 72 20 61 74 74 65 6d 70 74  haracter attempt
1880: 73 20 74 6f 20 65 6e 63 6f 64 65 20 61 20 76 61  s to encode a va
1890: 6c 75 65 20 62 65 74 77 65 65 6e 0a 2a 2a 20 20  lue between.**  
18a0: 20 20 20 30 78 64 38 30 30 20 61 6e 64 20 30 78     0xd800 and 0x
18b0: 65 30 30 30 20 74 68 65 6e 20 69 74 20 69 73 20  e000 then it is 
18c0: 72 65 6e 64 65 72 65 64 20 61 73 20 30 78 66 66  rendered as 0xff
18d0: 66 64 2e 0a 2a 2a 0a 2a 2a 20 20 2a 20 20 42 79  fd..**.**  *  By
18e0: 74 65 73 20 69 6e 20 74 68 65 20 72 61 6e 67 65  tes in the range
18f0: 20 6f 66 20 30 78 38 30 20 74 68 72 6f 75 67 68   of 0x80 through
1900: 20 30 78 62 66 20 77 68 69 63 68 20 6f 63 63 75   0xbf which occu
1910: 72 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a  r as the first.*
1920: 2a 20 20 20 20 20 62 79 74 65 20 6f 66 20 61 20  *     byte of a 
1930: 63 68 61 72 61 63 74 65 72 20 61 72 65 20 69 6e  character are in
1940: 74 65 72 70 72 65 74 65 64 20 61 73 20 73 69 6e  terpreted as sin
1950: 67 6c 65 2d 62 79 74 65 20 63 68 61 72 61 63 74  gle-byte charact
1960: 65 72 73 0a 2a 2a 20 20 20 20 20 61 6e 64 20 72  ers.**     and r
1970: 65 6e 64 65 72 65 64 20 61 73 20 74 68 65 6d 73  endered as thems
1980: 65 6c 76 65 73 20 65 76 65 6e 20 74 68 6f 75 67  elves even thoug
1990: 68 20 74 68 65 79 20 61 72 65 20 74 65 63 68 6e  h they are techn
19a0: 69 63 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 69 6e  ically.**     in
19b0: 76 61 6c 69 64 20 63 68 61 72 61 63 74 65 72 73  valid characters
19c0: 2e 0a 2a 2a 0a 2a 2a 20 20 2a 20 20 54 68 69 73  ..**.**  *  This
19d0: 20 72 6f 75 74 69 6e 65 20 61 63 63 65 70 74 73   routine accepts
19e0: 20 61 6e 20 69 6e 66 69 6e 69 74 65 20 6e 75 6d   an infinite num
19f0: 62 65 72 20 6f 66 20 64 69 66 66 65 72 65 6e 74  ber of different
1a00: 20 55 54 46 38 20 65 6e 63 6f 64 69 6e 67 73 0a   UTF8 encodings.
1a10: 2a 2a 20 20 20 20 20 66 6f 72 20 75 6e 69 63 6f  **     for unico
1a20: 64 65 20 76 61 6c 75 65 73 20 30 78 38 30 20 61  de values 0x80 a
1a30: 6e 64 20 67 72 65 61 74 65 72 2e 20 20 49 74 20  nd greater.  It 
1a40: 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 6f 76  do not change ov
1a50: 65 72 2d 6c 65 6e 67 74 68 0a 2a 2a 20 20 20 20  er-length.**    
1a60: 20 65 6e 63 6f 64 69 6e 67 73 20 74 6f 20 30 78   encodings to 0x
1a70: 66 66 66 64 20 61 73 20 73 6f 6d 65 20 73 79 73  fffd as some sys
1a80: 74 65 6d 73 20 72 65 63 6f 6d 6d 65 6e 64 2e 0a  tems recommend..
1a90: 2a 2f 0a 23 64 65 66 69 6e 65 20 52 45 41 44 5f  */.#define READ_
1aa0: 55 54 46 38 28 7a 49 6e 2c 20 7a 54 65 72 6d 2c  UTF8(zIn, zTerm,
1ab0: 20 63 29 20 20 20 20 20 20 20 20 20 20 20 20 20   c)             
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1ad0: 20 20 63 20 3d 20 2a 28 7a 49 6e 2b 2b 29 3b 20    c = *(zIn++); 
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
1b10: 66 28 20 63 3e 3d 30 78 63 30 20 29 7b 20 20 20  f( c>=0xc0 ){   
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b40: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 63 20          \.    c 
1b50: 3d 20 73 71 6c 69 74 65 33 55 74 66 54 72 61 6e  = sqlite3UtfTran
1b60: 73 31 5b 63 2d 30 78 63 30 5d 3b 20 20 20 20 20  s1[c-0xc0];     
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b80: 20 20 20 20 20 5c 0a 20 20 20 20 77 68 69 6c 65       \.    while
1b90: 28 20 7a 49 6e 21 3d 7a 54 65 72 6d 20 26 26 20  ( zIn!=zTerm && 
1ba0: 28 2a 7a 49 6e 20 26 20 30 78 63 30 29 3d 3d 30  (*zIn & 0xc0)==0
1bb0: 78 38 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  x80 ){          
1bc0: 20 20 5c 0a 20 20 20 20 20 20 63 20 3d 20 28 63    \.      c = (c
1bd0: 3c 3c 36 29 20 2b 20 28 30 78 33 66 20 26 20 2a  <<6) + (0x3f & *
1be0: 28 7a 49 6e 2b 2b 29 29 3b 20 20 20 20 20 20 20  (zIn++));       
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1c00: 0a 20 20 20 20 7d 20 20 20 20 20 20 20 20 20 20  .    }          
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1c40: 20 20 69 66 28 20 63 3c 30 78 38 30 20 20 20 20    if( c<0x80    
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20           \.     
1c80: 20 20 20 7c 7c 20 28 63 26 30 78 46 46 46 46 46     || (c&0xFFFFF
1c90: 38 30 30 29 3d 3d 30 78 44 38 30 30 20 20 20 20  800)==0xD800    
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20 20        \.        
1cc0: 7c 7c 20 28 63 26 30 78 46 46 46 46 46 46 46 45  || (c&0xFFFFFFFE
1cd0: 29 3d 3d 30 78 46 46 46 45 20 29 7b 20 20 63 20  )==0xFFFE ){  c 
1ce0: 3d 20 30 78 46 46 46 44 3b 20 7d 20 20 20 20 20  = 0xFFFD; }     
1cf0: 20 20 20 5c 0a 20 20 7d 0a 69 6e 74 20 73 71 6c     \.  }.int sql
1d00: 69 74 65 33 55 74 66 38 52 65 61 64 28 0a 20 20  ite3Utf8Read(.  
1d10: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1d20: 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20  har *z,         
1d30: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
1d40: 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72   UTF-8 character
1d50: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   */.  const unsi
1d60: 67 6e 65 64 20 63 68 61 72 20 2a 7a 54 65 72 6d  gned char *zTerm
1d70: 2c 20 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64  ,     /* Pretend
1d80: 20 74 68 69 73 20 62 79 74 65 20 69 73 20 30 78   this byte is 0x
1d90: 30 30 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 6e  00 */.  const un
1da0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 70 7a  signed char **pz
1db0: 4e 65 78 74 20 20 20 20 2f 2a 20 57 72 69 74 65  Next    /* Write
1dc0: 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
1dd0: 20 55 54 46 2d 38 20 63 68 61 72 20 68 65 72 65   UTF-8 char here
1de0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 3b 0a   */.){.  int c;.
1df0: 20 20 52 45 41 44 5f 55 54 46 38 28 7a 2c 20 7a    READ_UTF8(z, z
1e00: 54 65 72 6d 2c 20 63 29 3b 0a 20 20 2a 70 7a 4e  Term, c);.  *pzN
1e10: 65 78 74 20 3d 20 7a 3b 0a 20 20 72 65 74 75 72  ext = z;.  retur
1e20: 6e 20 63 3b 0a 7d 0a 0a 0a 0a 0a 2f 2a 0a 2a 2a  n c;.}...../*.**
1e30: 20 49 66 20 74 68 65 20 54 52 41 4e 53 4c 41 54   If the TRANSLAT
1e40: 45 5f 54 52 41 43 45 20 6d 61 63 72 6f 20 69 73  E_TRACE macro is
1e50: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20 76 61   defined, the va
1e60: 6c 75 65 20 6f 66 20 65 61 63 68 20 4d 65 6d 20  lue of each Mem 
1e70: 69 73 0a 2a 2a 20 70 72 69 6e 74 65 64 20 6f 6e  is.** printed on
1e80: 20 73 74 64 65 72 72 20 6f 6e 20 74 68 65 20 77   stderr on the w
1e90: 61 79 20 69 6e 74 6f 20 61 6e 64 20 6f 75 74 20  ay into and out 
1ea0: 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  of sqlite3VdbeMe
1eb0: 6d 54 72 61 6e 73 6c 61 74 65 28 29 2e 0a 2a 2f  mTranslate()..*/
1ec0: 20 0a 2f 2a 20 23 64 65 66 69 6e 65 20 54 52 41   ./* #define TRA
1ed0: 4e 53 4c 41 54 45 5f 54 52 41 43 45 20 31 20 2a  NSLATE_TRACE 1 *
1ee0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
1ef0: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
1f00: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f10: 74 72 61 6e 73 66 6f 72 6d 73 20 74 68 65 20 69  transforms the i
1f20: 6e 74 65 72 6e 61 6c 20 74 65 78 74 20 65 6e 63  nternal text enc
1f30: 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 70 4d  oding used by pM
1f40: 65 6d 20 74 6f 0a 2a 2a 20 64 65 73 69 72 65 64  em to.** desired
1f50: 45 6e 63 2e 20 49 74 20 69 73 20 61 6e 20 65 72  Enc. It is an er
1f60: 72 6f 72 20 69 66 20 74 68 65 20 73 74 72 69 6e  ror if the strin
1f70: 67 20 69 73 20 61 6c 72 65 61 64 79 20 6f 66 20  g is already of 
1f80: 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 65  the desired.** e
1f90: 6e 63 6f 64 69 6e 67 2c 20 6f 72 20 69 66 20 2a  ncoding, or if *
1fa0: 70 4d 65 6d 20 64 6f 65 73 20 6e 6f 74 20 63 6f  pMem does not co
1fb0: 6e 74 61 69 6e 20 61 20 73 74 72 69 6e 67 20 76  ntain a string v
1fc0: 61 6c 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  alue..*/.int sql
1fd0: 69 74 65 33 56 64 62 65 4d 65 6d 54 72 61 6e 73  ite3VdbeMemTrans
1fe0: 6c 61 74 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20  late(Mem *pMem, 
1ff0: 75 38 20 64 65 73 69 72 65 64 45 6e 63 29 7b 0a  u8 desiredEnc){.
2000: 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20    int len;      
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2020: 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20   Maximum length 
2030: 6f 66 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67  of output string
2040: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
2050: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4f  nsigned char *zO
2060: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
2070: 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62       /* Output b
2080: 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  uffer */.  unsig
2090: 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 3b 20 20  ned char *zIn;  
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b0: 20 2f 2a 20 49 6e 70 75 74 20 69 74 65 72 61 74   /* Input iterat
20c0: 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  or */.  unsigned
20d0: 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20   char *zTerm;   
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20f0: 20 45 6e 64 20 6f 66 20 69 6e 70 75 74 20 2a 2f   End of input */
2100: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2110: 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
2120: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
2130: 75 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  ut iterator */. 
2140: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 3b   unsigned int c;
2150: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  ..  assert( pMem
2160: 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ->db==0 || sqlit
2170: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d  e3_mutex_held(pM
2180: 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  em->db->mutex) )
2190: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  ;.  assert( pMem
21a0: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20  ->flags&MEM_Str 
21b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65  );.  assert( pMe
21c0: 6d 2d 3e 65 6e 63 21 3d 64 65 73 69 72 65 64 45  m->enc!=desiredE
21d0: 6e 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nc );.  assert( 
21e0: 70 4d 65 6d 2d 3e 65 6e 63 21 3d 30 20 29 3b 0a  pMem->enc!=0 );.
21f0: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
2200: 6e 3e 3d 30 20 29 3b 0a 0a 23 69 66 20 64 65 66  n>=0 );..#if def
2210: 69 6e 65 64 28 54 52 41 4e 53 4c 41 54 45 5f 54  ined(TRANSLATE_T
2220: 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64  RACE) && defined
2230: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 20  (SQLITE_DEBUG). 
2240: 20 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66   {.    char zBuf
2250: 5b 31 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  [100];.    sqlit
2260: 65 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79 50  e3VdbeMemPrettyP
2270: 72 69 6e 74 28 70 4d 65 6d 2c 20 7a 42 75 66 29  rint(pMem, zBuf)
2280: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  ;.    fprintf(st
2290: 64 65 72 72 2c 20 22 49 4e 50 55 54 3a 20 20 25  derr, "INPUT:  %
22a0: 73 5c 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d  s\n", zBuf);.  }
22b0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
22c0: 20 74 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e   the translation
22d0: 20 69 73 20 62 65 74 77 65 65 6e 20 55 54 46 2d   is between UTF-
22e0: 31 36 20 6c 69 74 74 6c 65 20 61 6e 64 20 62 69  16 little and bi
22f0: 67 20 65 6e 64 69 61 6e 2c 20 74 68 65 6e 20 0a  g endian, then .
2300: 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73    ** all that is
2310: 20 72 65 71 75 69 72 65 64 20 69 73 20 74 6f 20   required is to 
2320: 73 77 61 70 20 74 68 65 20 62 79 74 65 20 6f 72  swap the byte or
2330: 64 65 72 2e 20 54 68 69 73 20 63 61 73 65 20 69  der. This case i
2340: 73 20 68 61 6e 64 6c 65 64 0a 20 20 2a 2a 20 64  s handled.  ** d
2350: 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20  ifferently from 
2360: 74 68 65 20 6f 74 68 65 72 73 2e 0a 20 20 2a 2f  the others..  */
2370: 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e 65 6e 63  .  if( pMem->enc
2380: 21 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 26 26  !=SQLITE_UTF8 &&
2390: 20 64 65 73 69 72 65 64 45 6e 63 21 3d 53 51 4c   desiredEnc!=SQL
23a0: 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20  ITE_UTF8 ){.    
23b0: 75 38 20 74 65 6d 70 3b 0a 20 20 20 20 69 6e 74  u8 temp;.    int
23c0: 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
23d0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 61 6b 65  lite3VdbeMemMake
23e0: 57 72 69 74 65 61 62 6c 65 28 70 4d 65 6d 29 3b  Writeable(pMem);
23f0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2400: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2410: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
2420: 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
2430: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2440: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
2450: 20 7a 49 6e 20 3d 20 28 75 38 2a 29 70 4d 65 6d   zIn = (u8*)pMem
2460: 2d 3e 7a 3b 0a 20 20 20 20 7a 54 65 72 6d 20 3d  ->z;.    zTerm =
2470: 20 26 7a 49 6e 5b 70 4d 65 6d 2d 3e 6e 5d 3b 0a   &zIn[pMem->n];.
2480: 20 20 20 20 77 68 69 6c 65 28 20 7a 49 6e 3c 7a      while( zIn<z
2490: 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 74 65  Term ){.      te
24a0: 6d 70 20 3d 20 2a 7a 49 6e 3b 0a 20 20 20 20 20  mp = *zIn;.     
24b0: 20 2a 7a 49 6e 20 3d 20 2a 28 7a 49 6e 2b 31 29   *zIn = *(zIn+1)
24c0: 3b 0a 20 20 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20  ;.      zIn++;. 
24d0: 20 20 20 20 20 2a 7a 49 6e 2b 2b 20 3d 20 74 65       *zIn++ = te
24e0: 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  mp;.    }.    pM
24f0: 65 6d 2d 3e 65 6e 63 20 3d 20 64 65 73 69 72 65  em->enc = desire
2500: 64 45 6e 63 3b 0a 20 20 20 20 67 6f 74 6f 20 74  dEnc;.    goto t
2510: 72 61 6e 73 6c 61 74 65 5f 6f 75 74 3b 0a 20 20  ranslate_out;.  
2520: 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 6c 65 6e 20  }..  /* Set len 
2530: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  to the maximum n
2540: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
2550: 65 71 75 69 72 65 64 20 69 6e 20 74 68 65 20 6f  equired in the o
2560: 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 2a 2f  utput buffer. */
2570: 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 45 6e  .  if( desiredEn
2580: 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29  c==SQLITE_UTF8 )
2590: 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 63 6f  {.    /* When co
25a0: 6e 76 65 72 74 69 6e 67 20 66 72 6f 6d 20 55 54  nverting from UT
25b0: 46 2d 31 36 2c 20 74 68 65 20 6d 61 78 69 6d 75  F-16, the maximu
25c0: 6d 20 67 72 6f 77 74 68 20 72 65 73 75 6c 74 73  m growth results
25d0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 72 61   from.    ** tra
25e0: 6e 73 6c 61 74 69 6e 67 20 61 20 32 2d 62 79 74  nslating a 2-byt
25f0: 65 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 61  e character to a
2600: 20 34 2d 62 79 74 65 20 55 54 46 2d 38 20 63 68   4-byte UTF-8 ch
2610: 61 72 61 63 74 65 72 2e 0a 20 20 20 20 2a 2a 20  aracter..    ** 
2620: 41 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 73  A single byte is
2630: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68   required for th
2640: 65 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67 0a  e output string.
2650: 20 20 20 20 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69      ** nul-termi
2660: 6e 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  nator..    */.  
2670: 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 20    len = pMem->n 
2680: 2a 20 32 20 2b 20 31 3b 0a 20 20 7d 65 6c 73 65  * 2 + 1;.  }else
2690: 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 63 6f  {.    /* When co
26a0: 6e 76 65 72 74 69 6e 67 20 66 72 6f 6d 20 55 54  nverting from UT
26b0: 46 2d 38 20 74 6f 20 55 54 46 2d 31 36 20 74 68  F-8 to UTF-16 th
26c0: 65 20 6d 61 78 69 6d 75 6d 20 67 72 6f 77 74 68  e maximum growth
26d0: 20 69 73 20 63 61 75 73 65 64 0a 20 20 20 20 2a   is caused.    *
26e0: 2a 20 77 68 65 6e 20 61 20 31 2d 62 79 74 65 20  * when a 1-byte 
26f0: 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 20  UTF-8 character 
2700: 69 73 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e  is translated in
2710: 74 6f 20 61 20 32 2d 62 79 74 65 20 55 54 46 2d  to a 2-byte UTF-
2720: 31 36 0a 20 20 20 20 2a 2a 20 63 68 61 72 61 63  16.    ** charac
2730: 74 65 72 2e 20 54 77 6f 20 62 79 74 65 73 20 61  ter. Two bytes a
2740: 72 65 20 72 65 71 75 69 72 65 64 20 69 6e 20 74  re required in t
2750: 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
2760: 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20   for the.    ** 
2770: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  nul-terminator..
2780: 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d      */.    len =
2790: 20 70 4d 65 6d 2d 3e 6e 20 2a 20 32 20 2b 20 32   pMem->n * 2 + 2
27a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
27b0: 7a 49 6e 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  zIn to point at 
27c0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
27d0: 20 69 6e 70 75 74 20 62 75 66 66 65 72 20 61 6e   input buffer an
27e0: 64 20 7a 54 65 72 6d 20 74 6f 20 70 6f 69 6e 74  d zTerm to point
27f0: 20 31 0a 20 20 2a 2a 20 62 79 74 65 20 70 61 73   1.  ** byte pas
2800: 74 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2a 0a  t the end..  **.
2810: 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 7a 4f    ** Variable zO
2820: 75 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ut is set to poi
2830: 6e 74 20 61 74 20 74 68 65 20 6f 75 74 70 75 74  nt at the output
2840: 20 62 75 66 66 65 72 2c 20 73 70 61 63 65 20 6f   buffer, space o
2850: 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 66 72 6f  btained.  ** fro
2860: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
2870: 28 29 2e 0a 20 20 2a 2f 0a 20 20 7a 49 6e 20 3d  ()..  */.  zIn =
2880: 20 28 75 38 2a 29 70 4d 65 6d 2d 3e 7a 3b 0a 20   (u8*)pMem->z;. 
2890: 20 7a 54 65 72 6d 20 3d 20 26 7a 49 6e 5b 70 4d   zTerm = &zIn[pM
28a0: 65 6d 2d 3e 6e 5d 3b 0a 20 20 7a 4f 75 74 20 3d  em->n];.  zOut =
28b0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
28c0: 52 61 77 28 70 4d 65 6d 2d 3e 64 62 2c 20 6c 65  Raw(pMem->db, le
28d0: 6e 29 3b 0a 20 20 69 66 28 20 21 7a 4f 75 74 20  n);.  if( !zOut 
28e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
28f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
2900: 20 20 7a 20 3d 20 7a 4f 75 74 3b 0a 0a 20 20 69    z = zOut;..  i
2910: 66 28 20 70 4d 65 6d 2d 3e 65 6e 63 3d 3d 53 51  f( pMem->enc==SQ
2920: 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20  LITE_UTF8 ){.   
2930: 20 69 66 28 20 64 65 73 69 72 65 64 45 6e 63 3d   if( desiredEnc=
2940: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20  =SQLITE_UTF16LE 
2950: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 54 46 2d  ){.      /* UTF-
2960: 38 20 2d 3e 20 55 54 46 2d 31 36 20 4c 69 74 74  8 -> UTF-16 Litt
2970: 6c 65 2d 65 6e 64 69 61 6e 20 2a 2f 0a 20 20 20  le-endian */.   
2980: 20 20 20 77 68 69 6c 65 28 20 7a 49 6e 3c 7a 54     while( zIn<zT
2990: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  erm ){.        /
29a0: 2a 20 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66  * c = sqlite3Utf
29b0: 38 52 65 61 64 28 7a 49 6e 2c 20 7a 54 65 72 6d  8Read(zIn, zTerm
29c0: 2c 20 28 63 6f 6e 73 74 20 75 38 2a 2a 29 26 7a  , (const u8**)&z
29d0: 49 6e 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20  In); */.        
29e0: 52 45 41 44 5f 55 54 46 38 28 7a 49 6e 2c 20 7a  READ_UTF8(zIn, z
29f0: 54 65 72 6d 2c 20 63 29 3b 0a 20 20 20 20 20 20  Term, c);.      
2a00: 20 20 57 52 49 54 45 5f 55 54 46 31 36 4c 45 28    WRITE_UTF16LE(
2a10: 7a 2c 20 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, c);.      }. 
2a20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a30: 61 73 73 65 72 74 28 20 64 65 73 69 72 65 64 45  assert( desiredE
2a40: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
2a50: 42 45 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 55  BE );.      /* U
2a60: 54 46 2d 38 20 2d 3e 20 55 54 46 2d 31 36 20 42  TF-8 -> UTF-16 B
2a70: 69 67 2d 65 6e 64 69 61 6e 20 2a 2f 0a 20 20 20  ig-endian */.   
2a80: 20 20 20 77 68 69 6c 65 28 20 7a 49 6e 3c 7a 54     while( zIn<zT
2a90: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  erm ){.        /
2aa0: 2a 20 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66  * c = sqlite3Utf
2ab0: 38 52 65 61 64 28 7a 49 6e 2c 20 7a 54 65 72 6d  8Read(zIn, zTerm
2ac0: 2c 20 28 63 6f 6e 73 74 20 75 38 2a 2a 29 26 7a  , (const u8**)&z
2ad0: 49 6e 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20  In); */.        
2ae0: 52 45 41 44 5f 55 54 46 38 28 7a 49 6e 2c 20 7a  READ_UTF8(zIn, z
2af0: 54 65 72 6d 2c 20 63 29 3b 0a 20 20 20 20 20 20  Term, c);.      
2b00: 20 20 57 52 49 54 45 5f 55 54 46 31 36 42 45 28    WRITE_UTF16BE(
2b10: 7a 2c 20 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, c);.      }. 
2b20: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e     }.    pMem->n
2b30: 20 3d 20 7a 20 2d 20 7a 4f 75 74 3b 0a 20 20 20   = z - zOut;.   
2b40: 20 2a 7a 2b 2b 20 3d 20 30 3b 0a 20 20 7d 65 6c   *z++ = 0;.  }el
2b50: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
2b60: 64 65 73 69 72 65 64 45 6e 63 3d 3d 53 51 4c 49  desiredEnc==SQLI
2b70: 54 45 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 69  TE_UTF8 );.    i
2b80: 66 28 20 70 4d 65 6d 2d 3e 65 6e 63 3d 3d 53 51  f( pMem->enc==SQ
2b90: 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 29 7b 0a  LITE_UTF16LE ){.
2ba0: 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 31 36 20        /* UTF-16 
2bb0: 4c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 2d 3e  Little-endian ->
2bc0: 20 55 54 46 2d 38 20 2a 2f 0a 20 20 20 20 20 20   UTF-8 */.      
2bd0: 77 68 69 6c 65 28 20 7a 49 6e 3c 7a 54 65 72 6d  while( zIn<zTerm
2be0: 20 29 7b 0a 20 20 20 20 20 20 20 20 52 45 41 44   ){.        READ
2bf0: 5f 55 54 46 31 36 4c 45 28 7a 49 6e 2c 20 63 29  _UTF16LE(zIn, c)
2c00: 3b 20 0a 20 20 20 20 20 20 20 20 57 52 49 54 45  ; .        WRITE
2c10: 5f 55 54 46 38 28 7a 2c 20 63 29 3b 0a 20 20 20  _UTF8(z, c);.   
2c20: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2c30: 20 20 20 20 20 20 2f 2a 20 55 54 46 2d 31 36 20        /* UTF-16 
2c40: 42 69 67 2d 65 6e 64 69 61 6e 20 2d 3e 20 55 54  Big-endian -> UT
2c50: 46 2d 38 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  F-8 */.      whi
2c60: 6c 65 28 20 7a 49 6e 3c 7a 54 65 72 6d 20 29 7b  le( zIn<zTerm ){
2c70: 0a 20 20 20 20 20 20 20 20 52 45 41 44 5f 55 54  .        READ_UT
2c80: 46 31 36 42 45 28 7a 49 6e 2c 20 63 29 3b 20 0a  F16BE(zIn, c); .
2c90: 20 20 20 20 20 20 20 20 57 52 49 54 45 5f 55 54          WRITE_UT
2ca0: 46 38 28 7a 2c 20 63 29 3b 0a 20 20 20 20 20 20  F8(z, c);.      
2cb0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  }.    }.    pMem
2cc0: 2d 3e 6e 20 3d 20 7a 20 2d 20 7a 4f 75 74 3b 0a  ->n = z - zOut;.
2cd0: 20 20 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 20 20    }.  *z = 0;.  
2ce0: 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 6e  assert( (pMem->n
2cf0: 2b 28 64 65 73 69 72 65 64 45 6e 63 3d 3d 53 51  +(desiredEnc==SQ
2d00: 4c 49 54 45 5f 55 54 46 38 3f 31 3a 32 29 29 3c  LITE_UTF8?1:2))<
2d10: 3d 6c 65 6e 20 29 3b 0a 0a 20 20 73 71 6c 69 74  =len );..  sqlit
2d20: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
2d30: 28 70 4d 65 6d 29 3b 0a 20 20 70 4d 65 6d 2d 3e  (pMem);.  pMem->
2d40: 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 53  flags &= ~(MEM_S
2d50: 74 61 74 69 63 7c 4d 45 4d 5f 44 79 6e 7c 4d 45  tatic|MEM_Dyn|ME
2d60: 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 70 4d 65 6d  M_Ephem);.  pMem
2d70: 2d 3e 65 6e 63 20 3d 20 64 65 73 69 72 65 64 45  ->enc = desiredE
2d80: 6e 63 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  nc;.  pMem->flag
2d90: 73 20 7c 3d 20 28 4d 45 4d 5f 54 65 72 6d 7c 4d  s |= (MEM_Term|M
2da0: 45 4d 5f 44 79 6e 29 3b 0a 20 20 70 4d 65 6d 2d  EM_Dyn);.  pMem-
2db0: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 7a 4f 75 74  >z = (char*)zOut
2dc0: 3b 0a 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f  ;.  pMem->zMallo
2dd0: 63 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 0a 74 72  c = pMem->z;..tr
2de0: 61 6e 73 6c 61 74 65 5f 6f 75 74 3a 0a 23 69 66  anslate_out:.#if
2df0: 20 64 65 66 69 6e 65 64 28 54 52 41 4e 53 4c 41   defined(TRANSLA
2e00: 54 45 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  TE_TRACE) && def
2e10: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
2e20: 47 29 0a 20 20 7b 0a 20 20 20 20 63 68 61 72 20  G).  {.    char 
2e30: 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20 73  zBuf[100];.    s
2e40: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 50 72 65  qlite3VdbeMemPre
2e50: 74 74 79 50 72 69 6e 74 28 70 4d 65 6d 2c 20 7a  ttyPrint(pMem, z
2e60: 42 75 66 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  Buf);.    fprint
2e70: 66 28 73 74 64 65 72 72 2c 20 22 4f 55 54 50 55  f(stderr, "OUTPU
2e80: 54 3a 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29 3b  T: %s\n", zBuf);
2e90: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
2ea0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2eb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2ec0: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 66 6f 72  utine checks for
2ed0: 20 61 20 62 79 74 65 2d 6f 72 64 65 72 20 6d 61   a byte-order ma
2ee0: 72 6b 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  rk at the beginn
2ef0: 69 6e 67 20 6f 66 20 74 68 65 20 0a 2a 2a 20 55  ing of the .** U
2f00: 54 46 2d 31 36 20 73 74 72 69 6e 67 20 73 74 6f  TF-16 string sto
2f10: 72 65 64 20 69 6e 20 2a 70 4d 65 6d 2e 20 49 66  red in *pMem. If
2f20: 20 6f 6e 65 20 69 73 20 70 72 65 73 65 6e 74 2c   one is present,
2f30: 20 69 74 20 69 73 20 72 65 6d 6f 76 65 64 20 61   it is removed a
2f40: 6e 64 0a 2a 2a 20 74 68 65 20 65 6e 63 6f 64 69  nd.** the encodi
2f50: 6e 67 20 6f 66 20 74 68 65 20 4d 65 6d 20 61 64  ng of the Mem ad
2f60: 6a 75 73 74 65 64 2e 20 54 68 69 73 20 72 6f 75  justed. This rou
2f70: 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 64 6f  tine does not do
2f80: 20 61 6e 79 0a 2a 2a 20 62 79 74 65 2d 73 77 61   any.** byte-swa
2f90: 70 70 69 6e 67 2c 20 69 74 20 6a 75 73 74 20 73  pping, it just s
2fa0: 65 74 73 20 4d 65 6d 2e 65 6e 63 20 61 70 70 72  ets Mem.enc appr
2fb0: 6f 70 72 69 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  opriately..**.**
2fc0: 20 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   The allocation 
2fd0: 28 73 74 61 74 69 63 2c 20 64 79 6e 61 6d 69 63  (static, dynamic
2fe0: 20 65 74 63 2e 29 20 61 6e 64 20 65 6e 63 6f 64   etc.) and encod
2ff0: 69 6e 67 20 6f 66 20 74 68 65 20 4d 65 6d 20 6d  ing of the Mem m
3000: 61 79 20 62 65 0a 2a 2a 20 63 68 61 6e 67 65 64  ay be.** changed
3010: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
3020: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
3030: 33 56 64 62 65 4d 65 6d 48 61 6e 64 6c 65 42 6f  3VdbeMemHandleBo
3040: 6d 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20  m(Mem *pMem){.  
3050: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
3060: 4f 4b 3b 0a 20 20 75 38 20 62 6f 6d 20 3d 20 30  OK;.  u8 bom = 0
3070: 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e 6e  ;..  if( pMem->n
3080: 3c 30 20 7c 7c 20 70 4d 65 6d 2d 3e 6e 3e 31 20  <0 || pMem->n>1 
3090: 29 7b 0a 20 20 20 20 75 38 20 62 31 20 3d 20 2a  ){.    u8 b1 = *
30a0: 28 75 38 20 2a 29 70 4d 65 6d 2d 3e 7a 3b 0a 20  (u8 *)pMem->z;. 
30b0: 20 20 20 75 38 20 62 32 20 3d 20 2a 28 28 28 75     u8 b2 = *(((u
30c0: 38 20 2a 29 70 4d 65 6d 2d 3e 7a 29 20 2b 20 31  8 *)pMem->z) + 1
30d0: 29 3b 0a 20 20 20 20 69 66 28 20 62 31 3d 3d 30  );.    if( b1==0
30e0: 78 46 45 20 26 26 20 62 32 3d 3d 30 78 46 46 20  xFE && b2==0xFF 
30f0: 29 7b 0a 20 20 20 20 20 20 62 6f 6d 20 3d 20 53  ){.      bom = S
3100: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20  QLITE_UTF16BE;. 
3110: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 31 3d     }.    if( b1=
3120: 3d 30 78 46 46 20 26 26 20 62 32 3d 3d 30 78 46  =0xFF && b2==0xF
3130: 45 20 29 7b 0a 20 20 20 20 20 20 62 6f 6d 20 3d  E ){.      bom =
3140: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3b   SQLITE_UTF16LE;
3150: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
3160: 69 66 28 20 62 6f 6d 20 29 7b 0a 20 20 20 20 72  if( bom ){.    r
3170: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
3180: 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c 65 28  emMakeWriteable(
3190: 70 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  pMem);.    if( r
31a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
31b0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 2d 3d        pMem->n -=
31c0: 20 32 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76   2;.      memmov
31d0: 65 28 70 4d 65 6d 2d 3e 7a 2c 20 26 70 4d 65 6d  e(pMem->z, &pMem
31e0: 2d 3e 7a 5b 32 5d 2c 20 70 4d 65 6d 2d 3e 6e 29  ->z[2], pMem->n)
31f0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 5b  ;.      pMem->z[
3200: 70 4d 65 6d 2d 3e 6e 5d 20 3d 20 27 5c 30 27 3b  pMem->n] = '\0';
3210: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 5b 70  .      pMem->z[p
3220: 4d 65 6d 2d 3e 6e 2b 31 5d 20 3d 20 27 5c 30 27  Mem->n+1] = '\0'
3230: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
3240: 61 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d 3b  ags |= MEM_Term;
3250: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
3260: 20 3d 20 62 6f 6d 3b 0a 20 20 20 20 7d 0a 20 20   = bom;.    }.  
3270: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
3280: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
3290: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
32a0: 0a 2f 2a 0a 2a 2a 20 70 5a 20 69 73 20 61 20 55  ./*.** pZ is a U
32b0: 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 75 6e 69  TF-8 encoded uni
32c0: 63 6f 64 65 20 73 74 72 69 6e 67 2e 20 49 66 20  code string. If 
32d0: 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20 74 68  nByte is less th
32e0: 61 6e 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 74 75  an zero,.** retu
32f0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
3300: 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74   unicode charact
3310: 65 72 73 20 69 6e 20 70 5a 20 75 70 20 74 6f 20  ers in pZ up to 
3320: 28 62 75 74 20 6e 6f 74 20 69 6e 63 6c 75 64 69  (but not includi
3330: 6e 67 29 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ng).** the first
3340: 20 30 78 30 30 20 62 79 74 65 2e 20 49 66 20 6e   0x00 byte. If n
3350: 42 79 74 65 20 69 73 20 6e 6f 74 20 6c 65 73 73  Byte is not less
3360: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 72 65 74 75   than zero, retu
3370: 72 6e 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  rn the.** number
3380: 20 6f 66 20 75 6e 69 63 6f 64 65 20 63 68 61 72   of unicode char
3390: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 66 69  acters in the fi
33a0: 72 73 74 20 6e 42 79 74 65 20 6f 66 20 70 5a 20  rst nByte of pZ 
33b0: 28 6f 72 20 75 70 20 74 6f 20 0a 2a 2a 20 74 68  (or up to .** th
33c0: 65 20 66 69 72 73 74 20 30 78 30 30 2c 20 77 68  e first 0x00, wh
33d0: 69 63 68 65 76 65 72 20 63 6f 6d 65 73 20 66 69  ichever comes fi
33e0: 72 73 74 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rst)..*/.int sql
33f0: 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28  ite3Utf8CharLen(
3400: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c  const char *zIn,
3410: 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69   int nByte){.  i
3420: 6e 74 20 72 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  nt r = 0;.  cons
3430: 74 20 75 38 20 2a 7a 20 3d 20 28 63 6f 6e 73 74  t u8 *z = (const
3440: 20 75 38 2a 29 7a 49 6e 3b 0a 20 20 63 6f 6e 73   u8*)zIn;.  cons
3450: 74 20 75 38 20 2a 7a 54 65 72 6d 3b 0a 20 20 69  t u8 *zTerm;.  i
3460: 66 28 20 6e 42 79 74 65 3e 3d 30 20 29 7b 0a 20  f( nByte>=0 ){. 
3470: 20 20 20 7a 54 65 72 6d 20 3d 20 26 7a 5b 6e 42     zTerm = &z[nB
3480: 79 74 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte];.  }else{. 
3490: 20 20 20 7a 54 65 72 6d 20 3d 20 28 63 6f 6e 73     zTerm = (cons
34a0: 74 20 75 38 2a 29 28 2d 31 29 3b 0a 20 20 7d 0a  t u8*)(-1);.  }.
34b0: 20 20 61 73 73 65 72 74 28 20 7a 3c 3d 7a 54 65    assert( z<=zTe
34c0: 72 6d 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 2a  rm );.  while( *
34d0: 7a 21 3d 30 20 26 26 20 7a 3c 7a 54 65 72 6d 20  z!=0 && z<zTerm 
34e0: 29 7b 0a 20 20 20 20 53 51 4c 49 54 45 5f 53 4b  ){.    SQLITE_SK
34f0: 49 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20 20 20  IP_UTF8(z);.    
3500: 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  r++;.  }.  retur
3510: 6e 20 72 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20  n r;.}../* This 
3520: 74 65 73 74 20 66 75 6e 63 74 69 6f 6e 20 69 73  test function is
3530: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 75   not currently u
3540: 73 65 64 20 62 79 20 74 68 65 20 61 75 74 6f 6d  sed by the autom
3550: 61 74 65 64 20 74 65 73 74 2d 73 75 69 74 65 2e  ated test-suite.
3560: 20 0a 2a 2a 20 48 65 6e 63 65 20 69 74 20 69 73   .** Hence it is
3570: 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
3580: 69 6e 20 64 65 62 75 67 20 62 75 69 6c 64 73 2e  in debug builds.
3590: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
35a0: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
35b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
35c0: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  EBUG)./*.** Tran
35d0: 73 6c 61 74 65 20 55 54 46 2d 38 20 74 6f 20 55  slate UTF-8 to U
35e0: 54 46 2d 38 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  TF-8..**.** This
35f0: 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
3600: 6f 66 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74  of making sure t
3610: 68 61 74 20 74 68 65 20 73 74 72 69 6e 67 20 69  hat the string i
3620: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  s well-formed.**
3630: 20 55 54 46 2d 38 2e 20 20 4d 69 73 63 6f 64 65   UTF-8.  Miscode
3640: 64 20 63 68 61 72 61 63 74 65 72 73 20 61 72 65  d characters are
3650: 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20   removed..**.** 
3660: 54 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  The translation 
3670: 69 73 20 64 6f 6e 65 20 69 6e 2d 70 6c 61 63 65  is done in-place
3680: 20 28 73 69 6e 63 65 20 69 74 20 69 73 20 69 6d   (since it is im
3690: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
36a0: 0a 2a 2a 20 63 6f 72 72 65 63 74 20 55 54 46 2d  .** correct UTF-
36b0: 38 20 65 6e 63 6f 64 69 6e 67 20 74 6f 20 62 65  8 encoding to be
36c0: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 61 20 6d   longer than a m
36d0: 61 6c 66 6f 72 6d 65 64 20 65 6e 63 6f 64 69 6e  alformed encodin
36e0: 67 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  g)..*/.int sqlit
36f0: 65 33 55 74 66 38 54 6f 38 28 75 6e 73 69 67 6e  e3Utf8To8(unsign
3700: 65 64 20 63 68 61 72 20 2a 7a 49 6e 29 7b 0a 20  ed char *zIn){. 
3710: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
3720: 7a 4f 75 74 20 3d 20 7a 49 6e 3b 0a 20 20 75 6e  zOut = zIn;.  un
3730: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 74  signed char *zSt
3740: 61 72 74 20 3d 20 7a 49 6e 3b 0a 20 20 75 6e 73  art = zIn;.  uns
3750: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 54 65 72  igned char *zTer
3760: 6d 3b 0a 20 20 75 33 32 20 63 3b 0a 0a 20 20 77  m;.  u32 c;..  w
3770: 68 69 6c 65 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a  hile( zIn[0] ){.
3780: 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55      c = sqlite3U
3790: 74 66 38 52 65 61 64 28 7a 49 6e 2c 20 7a 54 65  tf8Read(zIn, zTe
37a0: 72 6d 2c 20 28 63 6f 6e 73 74 20 75 38 2a 2a 29  rm, (const u8**)
37b0: 26 7a 49 6e 29 3b 0a 20 20 20 20 69 66 28 20 63  &zIn);.    if( c
37c0: 21 3d 30 78 66 66 66 64 20 29 7b 0a 20 20 20 20  !=0xfffd ){.    
37d0: 20 20 57 52 49 54 45 5f 55 54 46 38 28 7a 4f 75    WRITE_UTF8(zOu
37e0: 74 2c 20 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t, c);.    }.  }
37f0: 0a 20 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 20 20  .  *zOut = 0;.  
3800: 72 65 74 75 72 6e 20 7a 4f 75 74 20 2d 20 7a 53  return zOut - zS
3810: 74 61 72 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  tart;.}.#endif..
3820: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3830: 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
3840: 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 31 36  Convert a UTF-16
3850: 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 6e   string in the n
3860: 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 20 69  ative encoding i
3870: 6e 74 6f 20 61 20 55 54 46 2d 38 20 73 74 72 69  nto a UTF-8 stri
3880: 6e 67 2e 0a 2a 2a 20 4d 65 6d 6f 72 79 20 74 6f  ng..** Memory to
3890: 20 68 6f 6c 64 20 74 68 65 20 55 54 46 2d 38 20   hold the UTF-8 
38a0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
38b0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
38c0: 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 0a  malloc and must.
38d0: 2a 2a 20 62 65 20 66 72 65 65 64 20 62 79 20 74  ** be freed by t
38e0: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
38f0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 55 4c 4c 20  ion..**.** NULL 
3900: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
3910: 68 65 72 65 20 69 73 20 61 6e 20 61 6c 6c 6f 63  here is an alloc
3920: 61 74 69 6f 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  ation error..*/.
3930: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 55 74 66  char *sqlite3Utf
3940: 31 36 74 6f 38 28 73 71 6c 69 74 65 33 20 2a 64  16to8(sqlite3 *d
3950: 62 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  b, const void *z
3960: 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20  , int nByte){.  
3970: 4d 65 6d 20 6d 3b 0a 20 20 6d 65 6d 73 65 74 28  Mem m;.  memset(
3980: 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29  &m, 0, sizeof(m)
3990: 29 3b 0a 20 20 6d 2e 64 62 20 3d 20 64 62 3b 0a  );.  m.db = db;.
39a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
39b0: 53 65 74 53 74 72 28 26 6d 2c 20 7a 2c 20 6e 42  SetStr(&m, z, nB
39c0: 79 74 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  yte, SQLITE_UTF1
39d0: 36 4e 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f  6NATIVE, SQLITE_
39e0: 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74  STATIC);.  sqlit
39f0: 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f  e3VdbeChangeEnco
3a00: 64 69 6e 67 28 26 6d 2c 20 53 51 4c 49 54 45 5f  ding(&m, SQLITE_
3a10: 55 54 46 38 29 3b 0a 20 20 69 66 28 20 64 62 2d  UTF8);.  if( db-
3a20: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
3a30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3a40: 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
3a50: 20 20 20 20 6d 2e 7a 20 3d 20 30 3b 0a 20 20 7d      m.z = 0;.  }
3a60: 0a 20 20 61 73 73 65 72 74 28 20 28 6d 2e 66 6c  .  assert( (m.fl
3a70: 61 67 73 20 26 20 4d 45 4d 5f 54 65 72 6d 29 21  ags & MEM_Term)!
3a80: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
3a90: 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73 65  Failed );.  asse
3aa0: 72 74 28 20 28 6d 2e 66 6c 61 67 73 20 26 20 4d  rt( (m.flags & M
3ab0: 45 4d 5f 53 74 72 29 21 3d 30 20 7c 7c 20 64 62  EM_Str)!=0 || db
3ac0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
3ad0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 6d 2e 66 6c  ;.  return (m.fl
3ae0: 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 29 21 3d  ags & MEM_Dyn)!=
3af0: 30 20 3f 20 6d 2e 7a 20 3a 20 73 71 6c 69 74 65  0 ? m.z : sqlite
3b00: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 6d 2e  3DbStrDup(db, m.
3b10: 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 5a 20  z);.}../*.** pZ 
3b20: 69 73 20 61 20 55 54 46 2d 31 36 20 65 6e 63 6f  is a UTF-16 enco
3b30: 64 65 64 20 75 6e 69 63 6f 64 65 20 73 74 72 69  ded unicode stri
3b40: 6e 67 2e 20 49 66 20 6e 43 68 61 72 20 69 73 20  ng. If nChar is 
3b50: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 0a  less than zero,.
3b60: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  ** return the nu
3b70: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 75 70  mber of bytes up
3b80: 20 74 6f 20 28 62 75 74 20 6e 6f 74 20 69 6e 63   to (but not inc
3b90: 6c 75 64 69 6e 67 29 2c 20 74 68 65 20 66 69 72  luding), the fir
3ba0: 73 74 20 70 61 69 72 0a 2a 2a 20 6f 66 20 63 6f  st pair.** of co
3bb0: 6e 73 65 63 75 74 69 76 65 20 30 78 30 30 20 62  nsecutive 0x00 b
3bc0: 79 74 65 73 20 69 6e 20 70 5a 2e 20 49 66 20 6e  ytes in pZ. If n
3bd0: 43 68 61 72 20 69 73 20 6e 6f 74 20 6c 65 73 73  Char is not less
3be0: 20 74 68 61 6e 20 7a 65 72 6f 2c 0a 2a 2a 20 74   than zero,.** t
3bf0: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
3c00: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
3c10: 6e 20 74 68 65 20 66 69 72 73 74 20 6e 43 68 61  n the first nCha
3c20: 72 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63  r unicode charac
3c30: 74 65 72 73 0a 2a 2a 20 69 6e 20 70 5a 20 28 6f  ters.** in pZ (o
3c40: 72 20 75 70 20 75 6e 74 69 6c 20 74 68 65 20 66  r up until the f
3c50: 69 72 73 74 20 70 61 69 72 20 6f 66 20 30 78 30  irst pair of 0x0
3c60: 30 20 62 79 74 65 73 2c 20 77 68 69 63 68 65 76  0 bytes, whichev
3c70: 65 72 20 63 6f 6d 65 73 20 66 69 72 73 74 29 2e  er comes first).
3c80: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55  .*/.int sqlite3U
3c90: 74 66 31 36 42 79 74 65 4c 65 6e 28 63 6f 6e 73  tf16ByteLen(cons
3ca0: 74 20 76 6f 69 64 20 2a 7a 49 6e 2c 20 69 6e 74  t void *zIn, int
3cb0: 20 6e 43 68 61 72 29 7b 0a 20 20 75 6e 73 69 67   nChar){.  unsig
3cc0: 6e 65 64 20 69 6e 74 20 63 20 3d 20 31 3b 0a 20  ned int c = 1;. 
3cd0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 20 3d   char const *z =
3ce0: 20 7a 49 6e 3b 0a 20 20 69 6e 74 20 6e 20 3d 20   zIn;.  int n = 
3cf0: 30 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  0;.  if( SQLITE_
3d00: 55 54 46 31 36 4e 41 54 49 56 45 3d 3d 53 51 4c  UTF16NATIVE==SQL
3d10: 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b 0a 20  ITE_UTF16BE ){. 
3d20: 20 20 20 2f 2a 20 55 73 69 6e 67 20 61 6e 20 22     /* Using an "
3d30: 69 66 20 28 53 51 4c 49 54 45 5f 55 54 46 31 36  if (SQLITE_UTF16
3d40: 4e 41 54 49 56 45 3d 3d 53 51 4c 49 54 45 5f 55  NATIVE==SQLITE_U
3d50: 54 46 31 36 42 45 29 22 20 63 6f 6e 73 74 72 75  TF16BE)" constru
3d60: 63 74 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 61  ct here.    ** a
3d70: 6e 64 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74  nd in other part
3d80: 73 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 6d  s of this file m
3d90: 65 61 6e 73 20 74 68 61 74 20 61 74 20 6f 6e 65  eans that at one
3da0: 20 62 72 61 6e 63 68 20 77 69 6c 6c 0a 20 20 20   branch will.   
3db0: 20 2a 2a 20 6e 6f 74 20 62 65 20 63 6f 76 65 72   ** not be cover
3dc0: 65 64 20 62 79 20 63 6f 76 65 72 61 67 65 20 74  ed by coverage t
3dd0: 65 73 74 69 6e 67 20 6f 6e 20 61 6e 79 20 73 69  esting on any si
3de0: 6e 67 6c 65 20 68 6f 73 74 2e 20 42 75 74 20 63  ngle host. But c
3df0: 6f 76 65 72 61 67 65 0a 20 20 20 20 2a 2a 20 77  overage.    ** w
3e00: 69 6c 6c 20 62 65 20 63 6f 6d 70 6c 65 74 65 20  ill be complete 
3e10: 69 66 20 74 68 65 20 74 65 73 74 73 20 61 72 65  if the tests are
3e20: 20 72 75 6e 20 6f 6e 20 62 6f 74 68 20 61 20 6c   run on both a l
3e30: 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 61 6e 64  ittle-endian and
3e40: 20 0a 20 20 20 20 2a 2a 20 62 69 67 2d 65 6e 64   .    ** big-end
3e50: 69 61 6e 20 68 6f 73 74 2e 20 42 65 63 61 75 73  ian host. Becaus
3e60: 65 20 62 6f 74 68 20 74 68 65 20 55 54 46 31 36  e both the UTF16
3e70: 4e 41 54 49 56 45 20 61 6e 64 20 53 51 4c 49 54  NATIVE and SQLIT
3e80: 45 5f 55 54 46 31 36 42 45 0a 20 20 20 20 2a 2a  E_UTF16BE.    **
3e90: 20 6d 61 63 72 6f 73 20 61 72 65 20 63 6f 6e 73   macros are cons
3ea0: 74 61 6e 74 20 61 74 20 63 6f 6d 70 69 6c 65 20  tant at compile 
3eb0: 74 69 6d 65 20 74 68 65 20 63 6f 6d 70 69 6c 65  time the compile
3ec0: 72 20 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 0a  r can determine.
3ed0: 20 20 20 20 2a 2a 20 77 68 69 63 68 20 62 72 61      ** which bra
3ee0: 6e 63 68 20 77 69 6c 6c 20 62 65 20 66 6f 6c 6c  nch will be foll
3ef0: 6f 77 65 64 2e 20 49 74 20 69 73 20 74 68 65 72  owed. It is ther
3f00: 65 66 6f 72 65 20 61 73 73 75 6d 65 64 20 74 68  efore assumed th
3f10: 61 74 20 6e 6f 20 72 75 6e 74 69 6d 65 0a 20 20  at no runtime.  
3f20: 20 20 2a 2a 20 70 65 6e 61 6c 74 79 20 69 73 20    ** penalty is 
3f30: 70 61 69 64 20 66 6f 72 20 74 68 69 73 20 22 69  paid for this "i
3f40: 66 22 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  f" statement..  
3f50: 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
3f60: 63 20 26 26 20 28 28 6e 43 68 61 72 3c 30 29 20  c && ((nChar<0) 
3f70: 7c 7c 20 6e 3c 6e 43 68 61 72 29 20 29 7b 0a 20  || n<nChar) ){. 
3f80: 20 20 20 20 20 52 45 41 44 5f 55 54 46 31 36 42       READ_UTF16B
3f90: 45 28 7a 2c 20 63 29 3b 0a 20 20 20 20 20 20 6e  E(z, c);.      n
3fa0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ++;.    }.  }els
3fb0: 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 20  e{.    while( c 
3fc0: 26 26 20 28 28 6e 43 68 61 72 3c 30 29 20 7c 7c  && ((nChar<0) ||
3fd0: 20 6e 3c 6e 43 68 61 72 29 20 29 7b 0a 20 20 20   n<nChar) ){.   
3fe0: 20 20 20 52 45 41 44 5f 55 54 46 31 36 4c 45 28     READ_UTF16LE(
3ff0: 7a 2c 20 63 29 3b 0a 20 20 20 20 20 20 6e 2b 2b  z, c);.      n++
4000: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
4010: 74 75 72 6e 20 28 7a 2d 28 63 68 61 72 20 63 6f  turn (z-(char co
4020: 6e 73 74 20 2a 29 7a 49 6e 29 2d 28 28 63 3d 3d  nst *)zIn)-((c==
4030: 30 29 3f 32 3a 30 29 3b 0a 7d 0a 0a 23 69 66 20  0)?2:0);.}..#if 
4040: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
4050: 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  EST)./*.** This 
4060: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4070: 64 20 66 72 6f 6d 20 74 68 65 20 54 43 4c 20 74  d from the TCL t
4080: 65 73 74 20 66 75 6e 63 74 69 6f 6e 20 22 74 72  est function "tr
4090: 61 6e 73 6c 61 74 65 5f 73 65 6c 66 74 65 73 74  anslate_selftest
40a0: 22 2e 0a 2a 2a 20 49 74 20 63 68 65 63 6b 73 20  "..** It checks 
40b0: 74 68 61 74 20 74 68 65 20 70 72 69 6d 69 74 69  that the primiti
40c0: 76 65 73 20 66 6f 72 20 73 65 72 69 61 6c 69 7a  ves for serializ
40d0: 69 6e 67 20 61 6e 64 20 64 65 73 65 72 69 61 6c  ing and deserial
40e0: 69 7a 69 6e 67 0a 2a 2a 20 63 68 61 72 61 63 74  izing.** charact
40f0: 65 72 73 20 69 6e 20 65 61 63 68 20 65 6e 63 6f  ers in each enco
4100: 64 69 6e 67 20 61 72 65 20 69 6e 76 65 72 73 65  ding are inverse
4110: 73 20 6f 66 20 65 61 63 68 20 6f 74 68 65 72 2e  s of each other.
4120: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4130: 55 74 66 53 65 6c 66 54 65 73 74 28 29 7b 0a 20  UtfSelfTest(){. 
4140: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c   unsigned int i,
4150: 20 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   t;.  unsigned c
4160: 68 61 72 20 7a 42 75 66 5b 32 30 5d 3b 0a 20 20  har zBuf[20];.  
4170: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
4180: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
4190: 72 20 2a 7a 54 65 72 6d 3b 0a 20 20 69 6e 74 20  r *zTerm;.  int 
41a0: 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  n;.  unsigned in
41b0: 74 20 63 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  t c;..  for(i=0;
41c0: 20 69 3c 30 78 30 30 31 31 30 30 30 30 3b 20 69   i<0x00110000; i
41d0: 2b 2b 29 7b 0a 20 20 20 20 7a 20 3d 20 7a 42 75  ++){.    z = zBu
41e0: 66 3b 0a 20 20 20 20 57 52 49 54 45 5f 55 54 46  f;.    WRITE_UTF
41f0: 38 28 7a 2c 20 69 29 3b 0a 20 20 20 20 6e 20 3d  8(z, i);.    n =
4200: 20 7a 2d 7a 42 75 66 3b 0a 20 20 20 20 7a 5b 30   z-zBuf;.    z[0
4210: 5d 20 3d 20 30 3b 0a 20 20 20 20 7a 54 65 72 6d  ] = 0;.    zTerm
4220: 20 3d 20 7a 3b 0a 20 20 20 20 7a 20 3d 20 7a 42   = z;.    z = zB
4230: 75 66 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69  uf;.    c = sqli
4240: 74 65 33 55 74 66 38 52 65 61 64 28 7a 2c 20 7a  te3Utf8Read(z, z
4250: 54 65 72 6d 2c 20 28 63 6f 6e 73 74 20 75 38 2a  Term, (const u8*
4260: 2a 29 26 7a 29 3b 0a 20 20 20 20 74 20 3d 20 69  *)&z);.    t = i
4270: 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 30 78 44  ;.    if( i>=0xD
4280: 38 30 30 20 26 26 20 69 3c 3d 30 78 44 46 46 46  800 && i<=0xDFFF
4290: 20 29 20 74 20 3d 20 30 78 46 46 46 44 3b 0a 20   ) t = 0xFFFD;. 
42a0: 20 20 20 69 66 28 20 28 69 26 30 78 46 46 46 46     if( (i&0xFFFF
42b0: 46 46 46 45 29 3d 3d 30 78 46 46 46 45 20 29 20  FFFE)==0xFFFE ) 
42c0: 74 20 3d 20 30 78 46 46 46 44 3b 0a 20 20 20 20  t = 0xFFFD;.    
42d0: 61 73 73 65 72 74 28 20 63 3d 3d 74 20 29 3b 0a  assert( c==t );.
42e0: 20 20 20 20 61 73 73 65 72 74 28 20 28 7a 2d 7a      assert( (z-z
42f0: 42 75 66 29 3d 3d 6e 20 29 3b 0a 20 20 7d 0a 20  Buf)==n );.  }. 
4300: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 30 78 30 30   for(i=0; i<0x00
4310: 31 31 30 30 30 30 3b 20 69 2b 2b 29 7b 0a 20 20  110000; i++){.  
4320: 20 20 69 66 28 20 69 3e 3d 30 78 44 38 30 30 20    if( i>=0xD800 
4330: 26 26 20 69 3c 30 78 45 30 30 30 20 29 20 63 6f  && i<0xE000 ) co
4340: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 20 3d 20  ntinue;.    z = 
4350: 7a 42 75 66 3b 0a 20 20 20 20 57 52 49 54 45 5f  zBuf;.    WRITE_
4360: 55 54 46 31 36 4c 45 28 7a 2c 20 69 29 3b 0a 20  UTF16LE(z, i);. 
4370: 20 20 20 6e 20 3d 20 7a 2d 7a 42 75 66 3b 0a 20     n = z-zBuf;. 
4380: 20 20 20 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 20     z[0] = 0;.   
4390: 20 7a 20 3d 20 7a 42 75 66 3b 0a 20 20 20 20 52   z = zBuf;.    R
43a0: 45 41 44 5f 55 54 46 31 36 4c 45 28 7a 2c 20 63  EAD_UTF16LE(z, c
43b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  );.    assert( c
43c0: 3d 3d 69 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==i );.    asser
43d0: 74 28 20 28 7a 2d 7a 42 75 66 29 3d 3d 6e 20 29  t( (z-zBuf)==n )
43e0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
43f0: 20 69 3c 30 78 30 30 31 31 30 30 30 30 3b 20 69   i<0x00110000; i
4400: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3e 3d  ++){.    if( i>=
4410: 30 78 44 38 30 30 20 26 26 20 69 3c 30 78 45 30  0xD800 && i<0xE0
4420: 30 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  00 ) continue;. 
4430: 20 20 20 7a 20 3d 20 7a 42 75 66 3b 0a 20 20 20     z = zBuf;.   
4440: 20 57 52 49 54 45 5f 55 54 46 31 36 42 45 28 7a   WRITE_UTF16BE(z
4450: 2c 20 69 29 3b 0a 20 20 20 20 6e 20 3d 20 7a 2d  , i);.    n = z-
4460: 7a 42 75 66 3b 0a 20 20 20 20 7a 5b 30 5d 20 3d  zBuf;.    z[0] =
4470: 20 30 3b 0a 20 20 20 20 7a 20 3d 20 7a 42 75 66   0;.    z = zBuf
4480: 3b 0a 20 20 20 20 52 45 41 44 5f 55 54 46 31 36  ;.    READ_UTF16
4490: 42 45 28 7a 2c 20 63 29 3b 0a 20 20 20 20 61 73  BE(z, c);.    as
44a0: 73 65 72 74 28 20 63 3d 3d 69 20 29 3b 0a 20 20  sert( c==i );.  
44b0: 20 20 61 73 73 65 72 74 28 20 28 7a 2d 7a 42 75    assert( (z-zBu
44c0: 66 29 3d 3d 6e 20 29 3b 0a 20 20 7d 0a 7d 0a 23  f)==n );.  }.}.#
44d0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
44e0: 54 45 53 54 20 2a 2f 0a 23 65 6e 64 69 66 20 2f  TEST */.#endif /
44f0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
4500: 46 31 36 20 2a 2f 0a                             F16 */.