/ Hex Artifact Content
Login

Artifact 9ac9672b3552455ff910954a2dbe626d9442819e:


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 34 39 20 32  : utf.c,v 1.49 2
01f0: 30 30 37 2f 30 35 2f 31 36 20 31 38 3a 31 31 3a  007/05/16 18:11:
0200: 34 31 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  41 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 63 6f 6e 73 74 20 75 6e 73 69 67 6e  .*/.const unsign
0630: 65 64 20 63 68 61 72 20 73 71 6c 69 74 65 33 55  ed char sqlite3U
0640: 74 66 54 72 61 6e 73 31 5b 5d 20 3d 20 7b 0a 20  tfTrans1[] = {. 
0650: 20 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30   0x00, 0x01, 0x0
0660: 32 2c 20 30 78 30 33 2c 20 30 78 30 34 2c 20 30  2, 0x03, 0x04, 0
0670: 78 30 35 2c 20 30 78 30 36 2c 20 30 78 30 37 2c  x05, 0x06, 0x07,
0680: 0a 20 20 30 78 30 38 2c 20 30 78 30 39 2c 20 30  .  0x08, 0x09, 0
0690: 78 30 61 2c 20 30 78 30 62 2c 20 30 78 30 63 2c  x0a, 0x0b, 0x0c,
06a0: 20 30 78 30 64 2c 20 30 78 30 65 2c 20 30 78 30   0x0d, 0x0e, 0x0
06b0: 66 2c 0a 20 20 30 78 31 30 2c 20 30 78 31 31 2c  f,.  0x10, 0x11,
06c0: 20 30 78 31 32 2c 20 30 78 31 33 2c 20 30 78 31   0x12, 0x13, 0x1
06d0: 34 2c 20 30 78 31 35 2c 20 30 78 31 36 2c 20 30  4, 0x15, 0x16, 0
06e0: 78 31 37 2c 0a 20 20 30 78 31 38 2c 20 30 78 31  x17,.  0x18, 0x1
06f0: 39 2c 20 30 78 31 61 2c 20 30 78 31 62 2c 20 30  9, 0x1a, 0x1b, 0
0700: 78 31 63 2c 20 30 78 31 64 2c 20 30 78 31 65 2c  x1c, 0x1d, 0x1e,
0710: 20 30 78 31 66 2c 0a 20 20 30 78 30 30 2c 20 30   0x1f,.  0x00, 0
0720: 78 30 31 2c 20 30 78 30 32 2c 20 30 78 30 33 2c  x01, 0x02, 0x03,
0730: 20 30 78 30 34 2c 20 30 78 30 35 2c 20 30 78 30   0x04, 0x05, 0x0
0740: 36 2c 20 30 78 30 37 2c 0a 20 20 30 78 30 38 2c  6, 0x07,.  0x08,
0750: 20 30 78 30 39 2c 20 30 78 30 61 2c 20 30 78 30   0x09, 0x0a, 0x0
0760: 62 2c 20 30 78 30 63 2c 20 30 78 30 64 2c 20 30  b, 0x0c, 0x0d, 0
0770: 78 30 65 2c 20 30 78 30 66 2c 0a 20 20 30 78 30  x0e, 0x0f,.  0x0
0780: 30 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20 30  0, 0x01, 0x02, 0
0790: 78 30 33 2c 20 30 78 30 34 2c 20 30 78 30 35 2c  x03, 0x04, 0x05,
07a0: 20 30 78 30 36 2c 20 30 78 30 37 2c 0a 20 20 30   0x06, 0x07,.  0
07b0: 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32 2c  x00, 0x01, 0x02,
07c0: 20 30 78 30 33 2c 20 30 78 30 30 2c 20 30 78 30   0x03, 0x00, 0x0
07d0: 31 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 0a 7d  1, 0x00, 0x00,.}
07e0: 3b 0a 0a 23 64 65 66 69 6e 65 20 57 52 49 54 45  ;..#define WRITE
07f0: 5f 55 54 46 38 28 7a 4f 75 74 2c 20 63 29 20 7b  _UTF8(zOut, c) {
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66            \.  if
0820: 28 20 63 3c 30 78 30 30 30 38 30 20 29 7b 20 20  ( c<0x00080 ){  
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b     \.    *zOut++
0860: 20 3d 20 28 63 26 30 78 46 46 29 3b 20 20 20 20   = (c&0xFF);    
0870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0880: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
0890: 7d 20 20 20 20 20 20 20 20 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 5c 0a 20 20 65 6c 73 65 20 69 66       \.  else if
08d0: 28 20 63 3c 30 78 30 30 38 30 30 20 29 7b 20 20  ( c<0x00800 ){  
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
0900: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78      *zOut++ = 0x
0910: 43 30 20 2b 20 28 28 63 3e 3e 36 29 26 30 78 31  C0 + ((c>>6)&0x1
0920: 46 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  F);             
0930: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f         \.    *zO
0940: 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 63  ut++ = 0x80 + (c
0950: 20 26 20 30 78 33 46 29 3b 20 20 20 20 20 20 20   & 0x3F);       
0960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0970: 5c 0a 20 20 7d 20 20 20 20 20 20 20 20 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 5c 0a 20 20 65 6c 73           \.  els
09b0: 65 20 69 66 28 20 63 3c 30 78 31 30 30 30 30 20  e if( c<0x10000 
09c0: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20    \.    *zOut++ 
09f0: 3d 20 30 78 45 30 20 2b 20 28 28 63 3e 3e 31 32  = 0xE0 + ((c>>12
0a00: 29 26 30 78 30 46 29 3b 20 20 20 20 20 20 20 20  )&0x0F);        
0a10: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
0a20: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20   *zOut++ = 0x80 
0a30: 2b 20 28 28 63 3e 3e 36 29 20 26 20 30 78 33 46  + ((c>>6) & 0x3F
0a40: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
0a50: 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b      \.    *zOut+
0a60: 2b 20 3d 20 30 78 38 30 20 2b 20 28 63 20 26 20  + = 0x80 + (c & 
0a70: 30 78 33 46 29 3b 20 20 20 20 20 20 20 20 20 20  0x3F);          
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
0a90: 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 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 5c 0a 20 20 20 20 2a 7a 4f 75        \.    *zOu
0ad0: 74 2b 2b 20 3d 20 30 78 46 30 20 2b 20 28 28 63  t++ = 0xF0 + ((c
0ae0: 3e 3e 31 38 29 20 26 20 30 78 30 37 29 3b 20 20  >>18) & 0x07);  
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
0b00: 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30  .    *zOut++ = 0
0b10: 78 38 30 20 2b 20 28 28 63 3e 3e 31 32 29 20 26  x80 + ((c>>12) &
0b20: 20 30 78 33 46 29 3b 20 20 20 20 20 20 20 20 20   0x3F);         
0b30: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a          \.    *z
0b40: 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28  Out++ = 0x80 + (
0b50: 28 63 3e 3e 36 29 20 26 20 30 78 33 46 29 3b 20  (c>>6) & 0x3F); 
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d   \.    *zOut++ =
0b80: 20 30 78 38 30 20 2b 20 28 63 20 26 20 30 78 33   0x80 + (c & 0x3
0b90: 46 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  F);             
0ba0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 20            \.  } 
0bb0: 20 20 20 20 20 20 20 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 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20     \.}..#define 
0bf0: 57 52 49 54 45 5f 55 54 46 31 36 4c 45 28 7a 4f  WRITE_UTF16LE(zO
0c00: 75 74 2c 20 63 29 20 7b 20 20 20 20 20 20 20 20  ut, 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 5c 0a 20 20 69 66 28 20          \.  if( 
0c30: 63 3c 3d 30 78 46 46 46 46 20 29 7b 20 20 20 20  c<=0xFFFF ){    
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 20 20            \.    
0c70: 2a 7a 4f 75 74 2b 2b 20 3d 20 28 63 26 30 78 30  *zOut++ = (c&0x0
0c80: 30 46 46 29 3b 20 20 20 20 20 20 20 20 20 20 20  0FF);           
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 5c 0a 20 20              \.  
0cb0: 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 28 63 3e    *zOut++ = ((c>
0cc0: 3e 38 29 26 30 78 30 30 46 46 29 3b 20 20 20 20  >8)&0x00FF);    
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
0cf0: 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20    }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: 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20  \.    *zOut++ = 
0d40: 28 28 28 63 3e 3e 31 30 29 26 30 78 30 30 33 46  (((c>>10)&0x003F
0d50: 29 20 2b 20 28 28 28 63 2d 30 78 31 30 30 30 30  ) + (((c-0x10000
0d60: 29 3e 3e 31 30 29 26 30 78 30 30 43 30 29 29 3b  )>>10)&0x00C0));
0d70: 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20    \.    *zOut++ 
0d80: 3d 20 28 30 78 30 30 44 38 20 2b 20 28 28 28 63  = (0x00D8 + (((c
0d90: 2d 30 78 31 30 30 30 30 29 3e 3e 31 38 29 26 30  -0x10000)>>18)&0
0da0: 78 30 33 29 29 3b 20 20 20 20 20 20 20 20 20 20  x03));          
0db0: 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b      \.    *zOut+
0dc0: 2b 20 3d 20 28 63 26 30 78 30 30 46 46 29 3b 20  + = (c&0x00FF); 
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0df0: 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75        \.    *zOu
0e00: 74 2b 2b 20 3d 20 28 30 78 30 30 44 43 20 2b 20  t++ = (0x00DC + 
0e10: 28 28 63 3e 3e 38 29 26 30 78 30 33 29 29 3b 20  ((c>>8)&0x03)); 
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e30: 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 20 20 20          \.  }   
0e40: 20 20 20 20 20 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 5c 0a 7d 0a 0a 23            \.}..#
0e80: 64 65 66 69 6e 65 20 57 52 49 54 45 5f 55 54 46  define WRITE_UTF
0e90: 31 36 42 45 28 7a 4f 75 74 2c 20 63 29 20 7b 20  16BE(zOut, c) { 
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
0ec0: 0a 20 20 69 66 28 20 63 3c 3d 30 78 46 46 46 46  .  if( c<=0xFFFF
0ed0: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
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 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d   \.    *zOut++ =
0f10: 20 28 28 63 3e 3e 38 29 26 30 78 30 30 46 46 29   ((c>>8)&0x00FF)
0f20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f40: 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b     \.    *zOut++
0f50: 20 3d 20 28 63 26 30 78 30 30 46 46 29 3b 20 20   = (c&0x00FF);  
0f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f80: 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20       \.  }else{ 
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 20 20 2a 7a 4f         \.    *zO
0fd0: 75 74 2b 2b 20 3d 20 28 30 78 30 30 44 38 20 2b  ut++ = (0x00D8 +
0fe0: 20 28 28 28 63 2d 30 78 31 30 30 30 30 29 3e 3e   (((c-0x10000)>>
0ff0: 31 38 29 26 30 78 30 33 29 29 3b 20 20 20 20 20  18)&0x03));     
1000: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a           \.    *
1010: 7a 4f 75 74 2b 2b 20 3d 20 28 28 28 63 3e 3e 31  zOut++ = (((c>>1
1020: 30 29 26 30 78 30 30 33 46 29 20 2b 20 28 28 28  0)&0x003F) + (((
1030: 63 2d 30 78 31 30 30 30 30 29 3e 3e 31 30 29 26  c-0x10000)>>10)&
1040: 30 78 30 30 43 30 29 29 3b 20 20 5c 0a 20 20 20  0x00C0));  \.   
1050: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 30 78 30 30   *zOut++ = (0x00
1060: 44 43 20 2b 20 28 28 63 3e 3e 38 29 26 30 78 30  DC + ((c>>8)&0x0
1070: 33 29 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  3));            
1080: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1090: 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 63 26     *zOut++ = (c&
10a0: 30 78 30 30 46 46 29 3b 20 20 20 20 20 20 20 20  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 5c                 \
10d0: 0a 20 20 7d 20 20 20 20 20 20 20 20 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 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 52 45   \.}..#define RE
1120: 41 44 5f 55 54 46 31 36 4c 45 28 7a 49 6e 2c 20  AD_UTF16LE(zIn, 
1130: 63 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  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 5c 0a 20 20              \.  
1160: 63 20 3d 20 28 2a 7a 49 6e 2b 2b 29 3b 20 20 20  c = (*zIn++);   
1170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 63 20 2b 3d 20 28 28 2a      \.  c += ((*
11b0: 7a 49 6e 2b 2b 29 3c 3c 38 29 3b 20 20 20 20 20  zIn++)<<8);     
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20              \.  
11f0: 69 66 28 20 63 3e 3d 30 78 44 38 30 30 20 26 26  if( c>=0xD800 &&
1200: 20 63 3c 30 78 45 30 30 30 20 29 7b 20 20 20 20   c<0xE000 ){    
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1230: 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 63 32 20     \.    int c2 
1240: 3d 20 28 2a 7a 49 6e 2b 2b 29 3b 20 20 20 20 20  = (*zIn++);     
1250: 20 20 20 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 5c 0a 20 20 20             \.   
1280: 20 63 32 20 2b 3d 20 28 28 2a 7a 49 6e 2b 2b 29   c2 += ((*zIn++)
1290: 3c 3c 38 29 3b 20 20 20 20 20 20 20 20 20 20 20  <<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 5c 0a 20 20 20 20 63 20 3d 20 28 63 32     \.    c = (c2
12d0: 26 30 78 30 33 46 46 29 20 2b 20 28 28 63 26 30  &0x03FF) + ((c&0
12e0: 78 30 30 33 46 29 3c 3c 31 30 29 20 2b 20 28 28  x003F)<<10) + ((
12f0: 28 63 26 30 78 30 33 43 30 29 2b 30 78 30 30 34  (c&0x03C0)+0x004
1300: 30 29 3c 3c 31 30 29 3b 20 20 20 5c 0a 20 20 20  0)<<10);   \.   
1310: 20 69 66 28 20 28 63 20 26 20 30 78 46 46 46 46   if( (c & 0xFFFF
1320: 30 30 30 30 29 3d 3d 30 20 29 20 63 20 3d 20 30  0000)==0 ) c = 0
1330: 78 46 46 46 44 3b 20 20 20 20 20 20 20 20 20 20  xFFFD;          
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 20 20 20 5c 0a 20 20 7d 20 20 20 20 20 20 20 20     \.  }        
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 5c 0a 7d 0a 0a             \.}..
13a0: 23 64 65 66 69 6e 65 20 52 45 41 44 5f 55 54 46  #define READ_UTF
13b0: 31 36 42 45 28 7a 49 6e 2c 20 63 29 7b 20 20 20  16BE(zIn, c){   
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 5c 0a 20 20 63 20 3d 20 28 28        \.  c = ((
13f0: 2a 7a 49 6e 2b 2b 29 3c 3c 38 29 3b 20 20 20 20  *zIn++)<<8);    
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a                \.
1430: 20 20 63 20 2b 3d 20 28 2a 7a 49 6e 2b 2b 29 3b    c += (*zIn++);
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 69 66 28 20 63 3e        \.  if( c>
1480: 3d 30 78 44 38 30 30 20 26 26 20 63 3c 30 78 45  =0xD800 && c<0xE
1490: 30 30 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  000 ){          
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 5c 0a 20               \. 
14c0: 20 20 20 69 6e 74 20 63 32 20 3d 20 28 28 2a 7a     int c2 = ((*z
14d0: 49 6e 2b 2b 29 3c 3c 38 29 3b 20 20 20 20 20 20  In++)<<8);      
14e0: 20 20 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 5c 0a 20 20 20 20 63 32 20 2b 3d       \.    c2 +=
1510: 20 28 2a 7a 49 6e 2b 2b 29 3b 20 20 20 20 20 20   (*zIn++);      
1520: 20 20 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 5c 0a 20               \. 
1550: 20 20 20 63 20 3d 20 28 63 32 26 30 78 30 33 46     c = (c2&0x03F
1560: 46 29 20 2b 20 28 28 63 26 30 78 30 30 33 46 29  F) + ((c&0x003F)
1570: 3c 3c 31 30 29 20 2b 20 28 28 28 63 26 30 78 30  <<10) + (((c&0x0
1580: 33 43 30 29 2b 30 78 30 30 34 30 29 3c 3c 31 30  3C0)+0x0040)<<10
1590: 29 3b 20 20 20 5c 0a 20 20 20 20 69 66 28 20 28  );   \.    if( (
15a0: 63 20 26 20 30 78 46 46 46 46 30 30 30 30 29 3d  c & 0xFFFF0000)=
15b0: 3d 30 20 29 20 63 20 3d 20 30 78 46 46 46 44 3b  =0 ) c = 0xFFFD;
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
15e0: 20 7d 20 20 20 20 20 20 20 20 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 5c 0a 7d 0a 0a 23 64 65 66 69 6e       \.}..#defin
1630: 65 20 53 4b 49 50 5f 55 54 46 31 36 42 45 28 7a  e SKIP_UTF16BE(z
1640: 49 6e 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  In){            
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1670: 5c 0a 20 20 69 66 28 20 2a 7a 49 6e 3e 3d 30 78  \.  if( *zIn>=0x
1680: 44 38 20 26 26 20 28 2a 7a 49 6e 3c 30 78 45 30  D8 && (*zIn<0xE0
1690: 20 7c 7c 20 28 2a 7a 49 6e 3d 3d 30 78 45 30 20   || (*zIn==0xE0 
16a0: 26 26 20 2a 28 7a 49 6e 2b 31 29 3d 3d 30 78 30  && *(zIn+1)==0x0
16b0: 30 29 29 20 29 7b 20 20 5c 0a 20 20 20 20 7a 49  0)) ){  \.    zI
16c0: 6e 20 2b 3d 20 34 3b 20 20 20 20 20 20 20 20 20  n += 4;         
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1700: 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20  \.  }else{      
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1740: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 7a 49          \.    zI
1750: 6e 20 2b 3d 20 32 3b 20 20 20 20 20 20 20 20 20  n += 2;         
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1790: 5c 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20 20  \.  }           
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d0: 20 20 20 20 20 20 20 20 5c 0a 7d 0a 23 64 65 66          \.}.#def
17e0: 69 6e 65 20 53 4b 49 50 5f 55 54 46 31 36 4c 45  ine SKIP_UTF16LE
17f0: 28 7a 49 6e 29 7b 20 20 20 20 20 20 20 20 20 20  (zIn){          
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 5c 0a 20 20 7a 49 6e 2b 2b 3b 20 20 20 20    \.  zIn++;    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1860: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66            \.  if
1870: 28 20 2a 7a 49 6e 3e 3d 30 78 44 38 20 26 26 20  ( *zIn>=0xD8 && 
1880: 28 2a 7a 49 6e 3c 30 78 45 30 20 7c 7c 20 28 2a  (*zIn<0xE0 || (*
1890: 7a 49 6e 3d 3d 30 78 45 30 20 26 26 20 2a 28 7a  zIn==0xE0 && *(z
18a0: 49 6e 2d 31 29 3d 3d 30 78 30 30 29 29 20 29 7b  In-1)==0x00)) ){
18b0: 20 20 5c 0a 20 20 20 20 7a 49 6e 20 2b 3d 20 33    \.    zIn += 3
18c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65            \.  }e
1900: 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20  lse{            
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1940: 20 20 5c 0a 20 20 20 20 7a 49 6e 20 2b 3d 20 31    \.    zIn += 1
1950: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1980: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 20            \.  } 
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 52    \.}..#define R
19e0: 53 4b 49 50 5f 55 54 46 31 36 4c 45 28 7a 49 6e  SKIP_UTF16LE(zIn
19f0: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1a20: 20 20 69 66 28 20 2a 7a 49 6e 3e 3d 30 78 44 38    if( *zIn>=0xD8
1a30: 20 26 26 20 28 2a 7a 49 6e 3c 30 78 45 30 20 7c   && (*zIn<0xE0 |
1a40: 7c 20 28 2a 7a 49 6e 3d 3d 30 78 45 30 20 26 26  | (*zIn==0xE0 &&
1a50: 20 2a 28 7a 49 6e 2d 31 29 3d 3d 30 78 30 30 29   *(zIn-1)==0x00)
1a60: 29 20 29 7b 20 20 5c 0a 20 20 20 20 7a 49 6e 20  ) ){  \.    zIn 
1a70: 2d 3d 20 34 3b 20 20 20 20 20 20 20 20 20 20 20  -= 4;           
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1ab0: 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20    }else{        
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 20 5c 0a 20 20 20 20 7a 49 6e 20        \.    zIn 
1b00: 2d 3d 20 32 3b 20 20 20 20 20 20 20 20 20 20 20  -= 2;           
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a                \.
1b40: 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20    }             
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b80: 20 20 20 20 20 20 5c 0a 7d 0a 23 64 65 66 69 6e        \.}.#defin
1b90: 65 20 52 53 4b 49 50 5f 55 54 46 31 36 42 45 28  e RSKIP_UTF16BE(
1ba0: 7a 49 6e 29 7b 20 20 20 20 20 20 20 20 20 20 20  zIn){           
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 5c 0a 20 20 7a 49 6e 2d 2d 3b 20 20 20 20 20   \.  zIn--;     
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c10: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28           \.  if(
1c20: 20 2a 7a 49 6e 3e 3d 30 78 44 38 20 26 26 20 28   *zIn>=0xD8 && (
1c30: 2a 7a 49 6e 3c 30 78 45 30 20 7c 7c 20 28 2a 7a  *zIn<0xE0 || (*z
1c40: 49 6e 3d 3d 30 78 45 30 20 26 26 20 2a 28 7a 49  In==0xE0 && *(zI
1c50: 6e 2b 31 29 3d 3d 30 78 30 30 29 29 20 29 7b 20  n+1)==0x00)) ){ 
1c60: 20 5c 0a 20 20 20 20 7a 49 6e 20 2d 3d 20 33 3b   \.    zIn -= 3;
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c           \.  }el
1cb0: 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 5c 0a 20 20 20 20 7a 49 6e 20 2d 3d 20 31 3b   \.    zIn -= 1;
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 20 20           \.  }  
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74   \.}../*.** If t
1d90: 68 65 20 54 52 41 4e 53 4c 41 54 45 5f 54 52 41  he TRANSLATE_TRA
1da0: 43 45 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69  CE macro is defi
1db0: 6e 65 64 2c 20 74 68 65 20 76 61 6c 75 65 20 6f  ned, the value o
1dc0: 66 20 65 61 63 68 20 4d 65 6d 20 69 73 0a 2a 2a  f each Mem is.**
1dd0: 20 70 72 69 6e 74 65 64 20 6f 6e 20 73 74 64 65   printed on stde
1de0: 72 72 20 6f 6e 20 74 68 65 20 77 61 79 20 69 6e  rr on the way in
1df0: 74 6f 20 61 6e 64 20 6f 75 74 20 6f 66 20 73 71  to and out of sq
1e00: 6c 69 74 65 33 56 64 62 65 4d 65 6d 54 72 61 6e  lite3VdbeMemTran
1e10: 73 6c 61 74 65 28 29 2e 0a 2a 2f 20 0a 2f 2a 20  slate()..*/ ./* 
1e20: 23 64 65 66 69 6e 65 20 54 52 41 4e 53 4c 41 54  #define TRANSLAT
1e30: 45 5f 54 52 41 43 45 20 31 20 2a 2f 0a 0a 23 69  E_TRACE 1 */..#i
1e40: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e50: 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 54 68  T_UTF16./*.** Th
1e60: 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e 73  is routine trans
1e70: 66 6f 72 6d 73 20 74 68 65 20 69 6e 74 65 72 6e  forms the intern
1e80: 61 6c 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  al text encoding
1e90: 20 75 73 65 64 20 62 79 20 70 4d 65 6d 20 74 6f   used by pMem to
1ea0: 0a 2a 2a 20 64 65 73 69 72 65 64 45 6e 63 2e 20  .** desiredEnc. 
1eb0: 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69  It is an error i
1ec0: 66 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  f the string is 
1ed0: 61 6c 72 65 61 64 79 20 6f 66 20 74 68 65 20 64  already of the d
1ee0: 65 73 69 72 65 64 0a 2a 2a 20 65 6e 63 6f 64 69  esired.** encodi
1ef0: 6e 67 2c 20 6f 72 20 69 66 20 2a 70 4d 65 6d 20  ng, or if *pMem 
1f00: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
1f10: 20 61 20 73 74 72 69 6e 67 20 76 61 6c 75 65 2e   a string value.
1f20: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1f30: 64 62 65 4d 65 6d 54 72 61 6e 73 6c 61 74 65 28  dbeMemTranslate(
1f40: 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 38 20 64 65  Mem *pMem, u8 de
1f50: 73 69 72 65 64 45 6e 63 29 7b 0a 20 20 75 6e 73  siredEnc){.  uns
1f60: 69 67 6e 65 64 20 63 68 61 72 20 7a 53 68 6f 72  igned char zShor
1f70: 74 5b 4e 42 46 53 5d 3b 20 2f 2a 20 54 65 6d 70  t[NBFS]; /* Temp
1f80: 6f 72 61 72 79 20 73 68 6f 72 74 20 6f 75 74 70  orary short outp
1f90: 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  ut buffer */.  i
1fa0: 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  nt len;         
1fb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1fc0: 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20  ximum length of 
1fd0: 6f 75 74 70 75 74 20 73 74 72 69 6e 67 20 69 6e  output string in
1fe0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69   bytes */.  unsi
1ff0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 4f 75 74 3b  gned char *zOut;
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2010: 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
2020: 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  er */.  unsigned
2030: 20 63 68 61 72 20 2a 7a 49 6e 3b 20 20 20 20 20   char *zIn;     
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2050: 20 49 6e 70 75 74 20 69 74 65 72 61 74 6f 72 20   Input iterator 
2060: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
2070: 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20  ar *zTerm;      
2080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
2090: 64 20 6f 66 20 69 6e 70 75 74 20 2a 2f 0a 20 20  d of input */.  
20a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
20b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20c0: 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
20d0: 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 6e  iterator */.  un
20e0: 73 69 67 6e 65 64 20 69 6e 74 20 63 3b 0a 0a 20  signed int c;.. 
20f0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66   assert( pMem->f
2100: 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 3b 0a  lags&MEM_Str );.
2110: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
2120: 65 6e 63 21 3d 64 65 73 69 72 65 64 45 6e 63 20  enc!=desiredEnc 
2130: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65  );.  assert( pMe
2140: 6d 2d 3e 65 6e 63 21 3d 30 20 29 3b 0a 20 20 61  m->enc!=0 );.  a
2150: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d  ssert( pMem->n>=
2160: 30 20 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  0 );..#if define
2170: 64 28 54 52 41 4e 53 4c 41 54 45 5f 54 52 41 43  d(TRANSLATE_TRAC
2180: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
2190: 4c 49 54 45 5f 44 45 42 55 47 29 0a 20 20 7b 0a  LITE_DEBUG).  {.
21a0: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30      char zBuf[10
21b0: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0];.    sqlite3V
21c0: 64 62 65 4d 65 6d 50 72 65 74 74 79 50 72 69 6e  dbeMemPrettyPrin
21d0: 74 28 70 4d 65 6d 2c 20 7a 42 75 66 29 3b 0a 20  t(pMem, zBuf);. 
21e0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
21f0: 72 2c 20 22 49 4e 50 55 54 3a 20 20 25 73 5c 6e  r, "INPUT:  %s\n
2200: 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65  ", zBuf);.  }.#e
2210: 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
2220: 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73  e translation is
2230: 20 62 65 74 77 65 65 6e 20 55 54 46 2d 31 36 20   between UTF-16 
2240: 6c 69 74 74 6c 65 20 61 6e 64 20 62 69 67 20 65  little and big e
2250: 6e 64 69 61 6e 2c 20 74 68 65 6e 20 0a 20 20 2a  ndian, then .  *
2260: 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65  * all that is re
2270: 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 77 61  quired is to swa
2280: 70 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  p the byte order
2290: 2e 20 54 68 69 73 20 63 61 73 65 20 69 73 20 68  . This case is h
22a0: 61 6e 64 6c 65 64 0a 20 20 2a 2a 20 64 69 66 66  andled.  ** diff
22b0: 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65  erently from the
22c0: 20 6f 74 68 65 72 73 2e 0a 20 20 2a 2f 0a 20 20   others..  */.  
22d0: 69 66 28 20 70 4d 65 6d 2d 3e 65 6e 63 21 3d 53  if( pMem->enc!=S
22e0: 51 4c 49 54 45 5f 55 54 46 38 20 26 26 20 64 65  QLITE_UTF8 && de
22f0: 73 69 72 65 64 45 6e 63 21 3d 53 51 4c 49 54 45  siredEnc!=SQLITE
2300: 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 75 38 20  _UTF8 ){.    u8 
2310: 74 65 6d 70 3b 0a 20 20 20 20 69 6e 74 20 72 63  temp;.    int rc
2320: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2330: 65 33 56 64 62 65 4d 65 6d 4d 61 6b 65 57 72 69  e3VdbeMemMakeWri
2340: 74 65 61 62 6c 65 28 70 4d 65 6d 29 3b 0a 20 20  teable(pMem);.  
2350: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2360: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
2370: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2380: 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 72  NOMEM );.      r
2390: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
23a0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49  EM;.    }.    zI
23b0: 6e 20 3d 20 28 75 38 2a 29 70 4d 65 6d 2d 3e 7a  n = (u8*)pMem->z
23c0: 3b 0a 20 20 20 20 7a 54 65 72 6d 20 3d 20 26 7a  ;.    zTerm = &z
23d0: 49 6e 5b 70 4d 65 6d 2d 3e 6e 5d 3b 0a 20 20 20  In[pMem->n];.   
23e0: 20 77 68 69 6c 65 28 20 7a 49 6e 3c 7a 54 65 72   while( zIn<zTer
23f0: 6d 20 29 7b 0a 20 20 20 20 20 20 74 65 6d 70 20  m ){.      temp 
2400: 3d 20 2a 7a 49 6e 3b 0a 20 20 20 20 20 20 2a 7a  = *zIn;.      *z
2410: 49 6e 20 3d 20 2a 28 7a 49 6e 2b 31 29 3b 0a 20  In = *(zIn+1);. 
2420: 20 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20       zIn++;.    
2430: 20 20 2a 7a 49 6e 2b 2b 20 3d 20 74 65 6d 70 3b    *zIn++ = temp;
2440: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d  .    }.    pMem-
2450: 3e 65 6e 63 20 3d 20 64 65 73 69 72 65 64 45 6e  >enc = desiredEn
2460: 63 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  c;.    goto tran
2470: 73 6c 61 74 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  slate_out;.  }..
2480: 20 20 2f 2a 20 53 65 74 20 6c 65 6e 20 74 6f 20    /* Set len to 
2490: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
24a0: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
24b0: 69 72 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70  ired in the outp
24c0: 75 74 20 62 75 66 66 65 72 2e 20 2a 2f 0a 20 20  ut buffer. */.  
24d0: 69 66 28 20 64 65 73 69 72 65 64 45 6e 63 3d 3d  if( desiredEnc==
24e0: 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20  SQLITE_UTF8 ){. 
24f0: 20 20 20 2f 2a 20 57 68 65 6e 20 63 6f 6e 76 65     /* When conve
2500: 72 74 69 6e 67 20 66 72 6f 6d 20 55 54 46 2d 31  rting from UTF-1
2510: 36 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 67  6, the maximum g
2520: 72 6f 77 74 68 20 72 65 73 75 6c 74 73 20 66 72  rowth results fr
2530: 6f 6d 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 6c  om.    ** transl
2540: 61 74 69 6e 67 20 61 20 32 2d 62 79 74 65 20 63  ating a 2-byte c
2550: 68 61 72 61 63 74 65 72 20 74 6f 20 61 20 34 2d  haracter to a 4-
2560: 62 79 74 65 20 55 54 46 2d 38 20 63 68 61 72 61  byte UTF-8 chara
2570: 63 74 65 72 2e 0a 20 20 20 20 2a 2a 20 41 20 73  cter..    ** A s
2580: 69 6e 67 6c 65 20 62 79 74 65 20 69 73 20 72 65  ingle byte is re
2590: 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 6f  quired for the o
25a0: 75 74 70 75 74 20 73 74 72 69 6e 67 0a 20 20 20  utput string.   
25b0: 20 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   ** nul-terminat
25c0: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c  or..    */.    l
25d0: 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 20 2a 20 32  en = pMem->n * 2
25e0: 20 2b 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   + 1;.  }else{. 
25f0: 20 20 20 2f 2a 20 57 68 65 6e 20 63 6f 6e 76 65     /* When conve
2600: 72 74 69 6e 67 20 66 72 6f 6d 20 55 54 46 2d 38  rting from UTF-8
2610: 20 74 6f 20 55 54 46 2d 31 36 20 74 68 65 20 6d   to UTF-16 the m
2620: 61 78 69 6d 75 6d 20 67 72 6f 77 74 68 20 69 73  aximum growth is
2630: 20 63 61 75 73 65 64 0a 20 20 20 20 2a 2a 20 77   caused.    ** w
2640: 68 65 6e 20 61 20 31 2d 62 79 74 65 20 55 54 46  hen a 1-byte UTF
2650: 2d 38 20 63 68 61 72 61 63 74 65 72 20 69 73 20  -8 character is 
2660: 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20  translated into 
2670: 61 20 32 2d 62 79 74 65 20 55 54 46 2d 31 36 0a  a 2-byte UTF-16.
2680: 20 20 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72      ** character
2690: 2e 20 54 77 6f 20 62 79 74 65 73 20 61 72 65 20  . Two bytes are 
26a0: 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65 20  required in the 
26b0: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 66 6f  output buffer fo
26c0: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6c  r the.    ** nul
26d0: 2d 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 20 20 20  -terminator..   
26e0: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d   */.    len = pM
26f0: 65 6d 2d 3e 6e 20 2a 20 32 20 2b 20 32 3b 0a 20  em->n * 2 + 2;. 
2700: 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 7a 49 6e   }..  /* Set zIn
2710: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
2720: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 6e   start of the in
2730: 70 75 74 20 62 75 66 66 65 72 20 61 6e 64 20 7a  put buffer and z
2740: 54 65 72 6d 20 74 6f 20 70 6f 69 6e 74 20 31 0a  Term to point 1.
2750: 20 20 2a 2a 20 62 79 74 65 20 70 61 73 74 20 74    ** byte past t
2760: 68 65 20 65 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a  he end..  **.  *
2770: 2a 20 56 61 72 69 61 62 6c 65 20 7a 4f 75 74 20  * Variable zOut 
2780: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
2790: 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  at the output bu
27a0: 66 66 65 72 2e 20 54 68 69 73 20 6d 61 79 20 62  ffer. This may b
27b0: 65 20 73 70 61 63 65 0a 20 20 2a 2a 20 6f 62 74  e space.  ** obt
27c0: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
27d0: 63 28 29 2c 20 6f 72 20 4d 65 6d 2e 7a 53 68 6f  c(), or Mem.zSho
27e0: 72 74 2c 20 69 66 20 69 74 20 6c 61 72 67 65 20  rt, if it large 
27f0: 65 6e 6f 75 67 68 20 61 6e 64 20 6e 6f 74 20 69  enough and not i
2800: 6e 0a 20 20 2a 2a 20 75 73 65 2c 20 6f 72 20 74  n.  ** use, or t
2810: 68 65 20 7a 53 68 6f 72 74 20 61 72 72 61 79 20  he zShort array 
2820: 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 28 73 65  on the stack (se
2830: 65 20 61 62 6f 76 65 29 2e 0a 20 20 2a 2f 0a 20  e above)..  */. 
2840: 20 7a 49 6e 20 3d 20 28 75 38 2a 29 70 4d 65 6d   zIn = (u8*)pMem
2850: 2d 3e 7a 3b 0a 20 20 7a 54 65 72 6d 20 3d 20 26  ->z;.  zTerm = &
2860: 7a 49 6e 5b 70 4d 65 6d 2d 3e 6e 5d 3b 0a 20 20  zIn[pMem->n];.  
2870: 69 66 28 20 6c 65 6e 3e 4e 42 46 53 20 29 7b 0a  if( len>NBFS ){.
2880: 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74      zOut = sqlit
2890: 65 4d 61 6c 6c 6f 63 52 61 77 28 6c 65 6e 29 3b  eMallocRaw(len);
28a0: 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74 20 29  .    if( !zOut )
28b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
28c0: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
28d0: 20 20 20 7a 4f 75 74 20 3d 20 7a 53 68 6f 72 74     zOut = zShort
28e0: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 7a 4f 75 74  ;.  }.  z = zOut
28f0: 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e 65  ;..  if( pMem->e
2900: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
2910: 29 7b 0a 20 20 20 20 69 66 28 20 64 65 73 69 72  ){.    if( desir
2920: 65 64 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  edEnc==SQLITE_UT
2930: 46 31 36 4c 45 20 29 7b 0a 20 20 20 20 20 20 2f  F16LE ){.      /
2940: 2a 20 55 54 46 2d 38 20 2d 3e 20 55 54 46 2d 31  * UTF-8 -> UTF-1
2950: 36 20 4c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20  6 Little-endian 
2960: 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
2970: 7a 49 6e 3c 7a 54 65 72 6d 20 29 7b 0a 20 20 20  zIn<zTerm ){.   
2980: 20 20 20 20 20 53 51 4c 49 54 45 5f 52 45 41 44       SQLITE_READ
2990: 5f 55 54 46 38 28 7a 49 6e 2c 20 63 29 3b 20 0a  _UTF8(zIn, c); .
29a0: 20 20 20 20 20 20 20 20 57 52 49 54 45 5f 55 54          WRITE_UT
29b0: 46 31 36 4c 45 28 7a 2c 20 63 29 3b 0a 20 20 20  F16LE(z, c);.   
29c0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
29d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65        assert( de
29e0: 73 69 72 65 64 45 6e 63 3d 3d 53 51 4c 49 54 45  siredEnc==SQLITE
29f0: 5f 55 54 46 31 36 42 45 20 29 3b 0a 20 20 20 20  _UTF16BE );.    
2a00: 20 20 2f 2a 20 55 54 46 2d 38 20 2d 3e 20 55 54    /* UTF-8 -> UT
2a10: 46 2d 31 36 20 42 69 67 2d 65 6e 64 69 61 6e 20  F-16 Big-endian 
2a20: 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
2a30: 7a 49 6e 3c 7a 54 65 72 6d 20 29 7b 0a 20 20 20  zIn<zTerm ){.   
2a40: 20 20 20 20 20 53 51 4c 49 54 45 5f 52 45 41 44       SQLITE_READ
2a50: 5f 55 54 46 38 28 7a 49 6e 2c 20 63 29 3b 20 0a  _UTF8(zIn, c); .
2a60: 20 20 20 20 20 20 20 20 57 52 49 54 45 5f 55 54          WRITE_UT
2a70: 46 31 36 42 45 28 7a 2c 20 63 29 3b 0a 20 20 20  F16BE(z, c);.   
2a80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
2a90: 4d 65 6d 2d 3e 6e 20 3d 20 7a 20 2d 20 7a 4f 75  Mem->n = z - zOu
2aa0: 74 3b 0a 20 20 20 20 2a 7a 2b 2b 20 3d 20 30 3b  t;.    *z++ = 0;
2ab0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2ac0: 73 65 72 74 28 20 64 65 73 69 72 65 64 45 6e 63  sert( desiredEnc
2ad0: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 3b  ==SQLITE_UTF8 );
2ae0: 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 65  .    if( pMem->e
2af0: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
2b00: 4c 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55  LE ){.      /* U
2b10: 54 46 2d 31 36 20 4c 69 74 74 6c 65 2d 65 6e 64  TF-16 Little-end
2b20: 69 61 6e 20 2d 3e 20 55 54 46 2d 38 20 2a 2f 0a  ian -> UTF-8 */.
2b30: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 49 6e        while( zIn
2b40: 3c 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20  <zTerm ){.      
2b50: 20 20 52 45 41 44 5f 55 54 46 31 36 4c 45 28 7a    READ_UTF16LE(z
2b60: 49 6e 2c 20 63 29 3b 20 0a 20 20 20 20 20 20 20  In, c); .       
2b70: 20 57 52 49 54 45 5f 55 54 46 38 28 7a 2c 20 63   WRITE_UTF8(z, c
2b80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2b90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 55  else{.      /* U
2ba0: 54 46 2d 31 36 20 4c 69 74 74 6c 65 2d 65 6e 64  TF-16 Little-end
2bb0: 69 61 6e 20 2d 3e 20 55 54 46 2d 38 20 2a 2f 0a  ian -> UTF-8 */.
2bc0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 49 6e        while( zIn
2bd0: 3c 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20  <zTerm ){.      
2be0: 20 20 52 45 41 44 5f 55 54 46 31 36 42 45 28 7a    READ_UTF16BE(z
2bf0: 49 6e 2c 20 63 29 3b 20 0a 20 20 20 20 20 20 20  In, c); .       
2c00: 20 57 52 49 54 45 5f 55 54 46 38 28 7a 2c 20 63   WRITE_UTF8(z, c
2c10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2c20: 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 7a  .    pMem->n = z
2c30: 20 2d 20 7a 4f 75 74 3b 0a 20 20 7d 0a 20 20 2a   - zOut;.  }.  *
2c40: 7a 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  z = 0;.  assert(
2c50: 20 28 70 4d 65 6d 2d 3e 6e 2b 28 64 65 73 69 72   (pMem->n+(desir
2c60: 65 64 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  edEnc==SQLITE_UT
2c70: 46 38 3f 31 3a 32 29 29 3c 3d 6c 65 6e 20 29 3b  F8?1:2))<=len );
2c80: 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ..  sqlite3VdbeM
2c90: 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b  emRelease(pMem);
2ca0: 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  .  pMem->flags &
2cb0: 3d 20 7e 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  = ~(MEM_Static|M
2cc0: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d  EM_Dyn|MEM_Ephem
2cd0: 7c 4d 45 4d 5f 53 68 6f 72 74 29 3b 0a 20 20 70  |MEM_Short);.  p
2ce0: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 64 65 73 69 72  Mem->enc = desir
2cf0: 65 64 45 6e 63 3b 0a 20 20 69 66 28 20 7a 4f 75  edEnc;.  if( zOu
2d00: 74 3d 3d 7a 53 68 6f 72 74 20 29 7b 0a 20 20 20  t==zShort ){.   
2d10: 20 6d 65 6d 63 70 79 28 70 4d 65 6d 2d 3e 7a 53   memcpy(pMem->zS
2d20: 68 6f 72 74 2c 20 7a 4f 75 74 2c 20 6c 65 6e 29  hort, zOut, len)
2d30: 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 28 75 38  ;.    zOut = (u8
2d40: 2a 29 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 3b 0a  *)pMem->zShort;.
2d50: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
2d60: 7c 3d 20 28 4d 45 4d 5f 54 65 72 6d 7c 4d 45 4d  |= (MEM_Term|MEM
2d70: 5f 53 68 6f 72 74 29 3b 0a 20 20 7d 65 6c 73 65  _Short);.  }else
2d80: 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  {.    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 7d 0a 20 20 70  EM_Dyn);.  }.  p
2db0: 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29  Mem->z = (char*)
2dc0: 7a 4f 75 74 3b 0a 0a 74 72 61 6e 73 6c 61 74 65  zOut;..translate
2dd0: 5f 6f 75 74 3a 0a 23 69 66 20 64 65 66 69 6e 65  _out:.#if define
2de0: 64 28 54 52 41 4e 53 4c 41 54 45 5f 54 52 41 43  d(TRANSLATE_TRAC
2df0: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
2e00: 4c 49 54 45 5f 44 45 42 55 47 29 0a 20 20 7b 0a  LITE_DEBUG).  {.
2e10: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30      char zBuf[10
2e20: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0];.    sqlite3V
2e30: 64 62 65 4d 65 6d 50 72 65 74 74 79 50 72 69 6e  dbeMemPrettyPrin
2e40: 74 28 70 4d 65 6d 2c 20 7a 42 75 66 29 3b 0a 20  t(pMem, zBuf);. 
2e50: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
2e60: 72 2c 20 22 4f 55 54 50 55 54 3a 20 25 73 5c 6e  r, "OUTPUT: %s\n
2e70: 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65  ", zBuf);.  }.#e
2e80: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
2e90: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2ea0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
2eb0: 68 65 63 6b 73 20 66 6f 72 20 61 20 62 79 74 65  hecks for a byte
2ec0: 2d 6f 72 64 65 72 20 6d 61 72 6b 20 61 74 20 74  -order mark at t
2ed0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
2ee0: 74 68 65 20 0a 2a 2a 20 55 54 46 2d 31 36 20 73  the .** UTF-16 s
2ef0: 74 72 69 6e 67 20 73 74 6f 72 65 64 20 69 6e 20  tring stored in 
2f00: 2a 70 4d 65 6d 2e 20 49 66 20 6f 6e 65 20 69 73  *pMem. If one is
2f10: 20 70 72 65 73 65 6e 74 2c 20 69 74 20 69 73 20   present, it is 
2f20: 72 65 6d 6f 76 65 64 20 61 6e 64 0a 2a 2a 20 74  removed and.** t
2f30: 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74  he encoding of t
2f40: 68 65 20 4d 65 6d 20 61 64 6a 75 73 74 65 64 2e  he Mem adjusted.
2f50: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
2f60: 65 73 20 6e 6f 74 20 64 6f 20 61 6e 79 0a 2a 2a  es not do any.**
2f70: 20 62 79 74 65 2d 73 77 61 70 70 69 6e 67 2c 20   byte-swapping, 
2f80: 69 74 20 6a 75 73 74 20 73 65 74 73 20 4d 65 6d  it just sets Mem
2f90: 2e 65 6e 63 20 61 70 70 72 6f 70 72 69 61 74 65  .enc appropriate
2fa0: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 6c  ly..**.** The al
2fb0: 6c 6f 63 61 74 69 6f 6e 20 28 73 74 61 74 69 63  location (static
2fc0: 2c 20 64 79 6e 61 6d 69 63 20 65 74 63 2e 29 20  , dynamic etc.) 
2fd0: 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  and encoding of 
2fe0: 74 68 65 20 4d 65 6d 20 6d 61 79 20 62 65 0a 2a  the Mem may be.*
2ff0: 2a 20 63 68 61 6e 67 65 64 20 62 79 20 74 68 69  * changed by thi
3000: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  s function..*/.i
3010: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  nt sqlite3VdbeMe
3020: 6d 48 61 6e 64 6c 65 42 6f 6d 28 4d 65 6d 20 2a  mHandleBom(Mem *
3030: 70 4d 65 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20  pMem){.  int rc 
3040: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
3050: 38 20 62 6f 6d 20 3d 20 30 3b 0a 0a 20 20 69 66  8 bom = 0;..  if
3060: 28 20 70 4d 65 6d 2d 3e 6e 3c 30 20 7c 7c 20 70  ( pMem->n<0 || p
3070: 4d 65 6d 2d 3e 6e 3e 31 20 29 7b 0a 20 20 20 20  Mem->n>1 ){.    
3080: 75 38 20 62 31 20 3d 20 2a 28 75 38 20 2a 29 70  u8 b1 = *(u8 *)p
3090: 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 75 38 20 62  Mem->z;.    u8 b
30a0: 32 20 3d 20 2a 28 28 28 75 38 20 2a 29 70 4d 65  2 = *(((u8 *)pMe
30b0: 6d 2d 3e 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20  m->z) + 1);.    
30c0: 69 66 28 20 62 31 3d 3d 30 78 46 45 20 26 26 20  if( b1==0xFE && 
30d0: 62 32 3d 3d 30 78 46 46 20 29 7b 0a 20 20 20 20  b2==0xFF ){.    
30e0: 20 20 62 6f 6d 20 3d 20 53 51 4c 49 54 45 5f 55    bom = SQLITE_U
30f0: 54 46 31 36 42 45 3b 0a 20 20 20 20 7d 0a 20 20  TF16BE;.    }.  
3100: 20 20 69 66 28 20 62 31 3d 3d 30 78 46 46 20 26    if( b1==0xFF &
3110: 26 20 62 32 3d 3d 30 78 46 45 20 29 7b 0a 20 20  & b2==0xFE ){.  
3120: 20 20 20 20 62 6f 6d 20 3d 20 53 51 4c 49 54 45      bom = SQLITE
3130: 5f 55 54 46 31 36 4c 45 3b 0a 20 20 20 20 7d 0a  _UTF16LE;.    }.
3140: 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 62 6f 6d    }.  .  if( bom
3150: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
3160: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
3170: 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20 61 20  ed as soon as a 
3180: 73 74 72 69 6e 67 20 69 73 20 73 74 6f 72 65 64  string is stored
3190: 20 69 6e 20 61 20 4d 65 6d 2a 2c 0a 20 20 20 20   in a Mem*,.    
31a0: 2a 2a 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 73  ** from within s
31b0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
31c0: 53 74 72 28 29 2e 20 41 74 20 74 68 61 74 20 70  Str(). At that p
31d0: 6f 69 6e 74 20 69 74 20 69 73 20 6e 6f 74 20 70  oint it is not p
31e0: 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 66  ossible.    ** f
31f0: 6f 72 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f  or the string to
3200: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65   be stored in Me
3210: 6d 2e 7a 53 68 6f 72 74 2c 20 6f 72 20 66 6f 72  m.zShort, or for
3220: 20 69 74 20 74 6f 20 62 65 20 73 74 6f 72 65 64   it to be stored
3230: 0a 20 20 20 20 2a 2a 20 69 6e 20 64 79 6e 61 6d  .    ** in dynam
3240: 69 63 20 6d 65 6d 6f 72 79 20 77 69 74 68 20 6e  ic memory with n
3250: 6f 20 64 65 73 74 72 75 63 74 6f 72 2e 0a 20 20  o destructor..  
3260: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
3270: 20 21 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d   !(pMem->flags&M
3280: 45 4d 5f 53 68 6f 72 74 29 20 29 3b 0a 20 20 20  EM_Short) );.   
3290: 20 61 73 73 65 72 74 28 20 21 28 70 4d 65 6d 2d   assert( !(pMem-
32a0: 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 29 20  >flags&MEM_Dyn) 
32b0: 7c 7c 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 29 3b  || pMem->xDel );
32c0: 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66  .    if( pMem->f
32d0: 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29  lags & MEM_Dyn )
32e0: 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 28 2a 78  {.      void (*x
32f0: 44 65 6c 29 28 76 6f 69 64 2a 29 20 3d 20 70 4d  Del)(void*) = pM
3300: 65 6d 2d 3e 78 44 65 6c 3b 0a 20 20 20 20 20 20  em->xDel;.      
3310: 63 68 61 72 20 2a 7a 20 3d 20 70 4d 65 6d 2d 3e  char *z = pMem->
3320: 7a 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  z;.      pMem->z
3330: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d 65 6d   = 0;.      pMem
3340: 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20  ->xDel = 0;.    
3350: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
3360: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d  beMemSetStr(pMem
3370: 2c 20 26 7a 5b 32 5d 2c 20 70 4d 65 6d 2d 3e 6e  , &z[2], pMem->n
3380: 2d 32 2c 20 62 6f 6d 2c 20 53 51 4c 49 54 45 5f  -2, bom, SQLITE_
3390: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
33a0: 20 20 78 44 65 6c 28 7a 29 3b 0a 20 20 20 20 7d    xDel(z);.    }
33b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
33c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
33d0: 65 74 53 74 72 28 70 4d 65 6d 2c 20 26 70 4d 65  etStr(pMem, &pMe
33e0: 6d 2d 3e 7a 5b 32 5d 2c 20 70 4d 65 6d 2d 3e 6e  m->z[2], pMem->n
33f0: 2d 32 2c 20 62 6f 6d 2c 20 0a 20 20 20 20 20 20  -2, bom, .      
3400: 20 20 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53      SQLITE_TRANS
3410: 49 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  IENT);.    }.  }
3420: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3430: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3440: 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
3450: 2f 2a 0a 2a 2a 20 70 5a 20 69 73 20 61 20 55 54  /*.** pZ is a UT
3460: 46 2d 38 20 65 6e 63 6f 64 65 64 20 75 6e 69 63  F-8 encoded unic
3470: 6f 64 65 20 73 74 72 69 6e 67 2e 20 49 66 20 6e  ode string. If n
3480: 42 79 74 65 20 69 73 20 6c 65 73 73 20 74 68 61  Byte is less tha
3490: 6e 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 74 75 72  n zero,.** retur
34a0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
34b0: 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65  unicode characte
34c0: 72 73 20 69 6e 20 70 5a 20 75 70 20 74 6f 20 28  rs in pZ up to (
34d0: 62 75 74 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e  but not includin
34e0: 67 29 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  g).** the first 
34f0: 30 78 30 30 20 62 79 74 65 2e 20 49 66 20 6e 42  0x00 byte. If nB
3500: 79 74 65 20 69 73 20 6e 6f 74 20 6c 65 73 73 20  yte is not less 
3510: 74 68 61 6e 20 7a 65 72 6f 2c 20 72 65 74 75 72  than zero, retur
3520: 6e 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  n the.** number 
3530: 6f 66 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61  of unicode chara
3540: 63 74 65 72 73 20 69 6e 20 74 68 65 20 66 69 72  cters in the fir
3550: 73 74 20 6e 42 79 74 65 20 6f 66 20 70 5a 20 28  st nByte of pZ (
3560: 6f 72 20 75 70 20 74 6f 20 0a 2a 2a 20 74 68 65  or up to .** the
3570: 20 66 69 72 73 74 20 30 78 30 30 2c 20 77 68 69   first 0x00, whi
3580: 63 68 65 76 65 72 20 63 6f 6d 65 73 20 66 69 72  chever comes fir
3590: 73 74 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  st)..*/.int sqli
35a0: 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28 63  te3Utf8CharLen(c
35b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20  onst char *zIn, 
35c0: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e  int nByte){.  in
35d0: 74 20 72 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  t r = 0;.  const
35e0: 20 75 38 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20   u8 *z = (const 
35f0: 75 38 2a 29 7a 49 6e 3b 0a 20 20 63 6f 6e 73 74  u8*)zIn;.  const
3600: 20 75 38 20 2a 7a 54 65 72 6d 3b 0a 20 20 69 66   u8 *zTerm;.  if
3610: 28 20 6e 42 79 74 65 3e 3d 30 20 29 7b 0a 20 20  ( nByte>=0 ){.  
3620: 20 20 7a 54 65 72 6d 20 3d 20 26 7a 5b 6e 42 79    zTerm = &z[nBy
3630: 74 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te];.  }else{.  
3640: 20 20 7a 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74    zTerm = (const
3650: 20 75 38 2a 29 28 2d 31 29 3b 0a 20 20 7d 0a 20   u8*)(-1);.  }. 
3660: 20 61 73 73 65 72 74 28 20 7a 3c 3d 7a 54 65 72   assert( z<=zTer
3670: 6d 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  m );.  while( *z
3680: 21 3d 30 20 26 26 20 7a 3c 7a 54 65 72 6d 20 29  !=0 && z<zTerm )
3690: 7b 0a 20 20 20 20 53 51 4c 49 54 45 5f 53 4b 49  {.    SQLITE_SKI
36a0: 50 5f 55 54 46 38 28 7a 29 3b 0a 20 20 20 20 72  P_UTF8(z);.    r
36b0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
36c0: 20 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   r;.}..#ifndef S
36d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
36e0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
36f0: 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67 20 69   UTF-16 string i
3700: 6e 20 74 68 65 20 6e 61 74 69 76 65 20 65 6e 63  n the native enc
3710: 6f 64 69 6e 67 20 69 6e 74 6f 20 61 20 55 54 46  oding into a UTF
3720: 2d 38 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 4d 65  -8 string..** Me
3730: 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  mory to hold the
3740: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 69 73   UTF-8 string is
3750: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
3760: 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62  alloc and must b
3770: 65 0a 2a 2a 20 66 72 65 65 64 20 62 79 20 74 68  e.** freed by th
3780: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
3790: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 55 4c 4c 20 69  on..**.** NULL i
37a0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
37b0: 65 72 65 20 69 73 20 61 6e 20 61 6c 6c 6f 63 61  ere is an alloca
37c0: 74 69 6f 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63  tion error..*/.c
37d0: 68 61 72 20 2a 73 71 6c 69 74 65 33 55 74 66 31  har *sqlite3Utf1
37e0: 36 74 6f 38 28 63 6f 6e 73 74 20 76 6f 69 64 20  6to8(const void 
37f0: 2a 7a 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a  *z, int nByte){.
3800: 20 20 4d 65 6d 20 6d 3b 0a 20 20 6d 65 6d 73 65    Mem m;.  memse
3810: 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&m, 0, sizeof(
3820: 6d 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  m));.  sqlite3Vd
3830: 62 65 4d 65 6d 53 65 74 53 74 72 28 26 6d 2c 20  beMemSetStr(&m, 
3840: 7a 2c 20 6e 42 79 74 65 2c 20 53 51 4c 49 54 45  z, nByte, SQLITE
3850: 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51  _UTF16NATIVE, SQ
3860: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
3870: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
3880: 65 45 6e 63 6f 64 69 6e 67 28 26 6d 2c 20 53 51  eEncoding(&m, SQ
3890: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 61 73  LITE_UTF8);.  as
38a0: 73 65 72 74 28 20 28 6d 2e 66 6c 61 67 73 20 26  sert( (m.flags &
38b0: 20 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 7c 7c   MEM_Term)!=0 ||
38c0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61   sqlite3MallocFa
38d0: 69 6c 65 64 28 29 20 29 3b 0a 20 20 61 73 73 65  iled() );.  asse
38e0: 72 74 28 20 28 6d 2e 66 6c 61 67 73 20 26 20 4d  rt( (m.flags & M
38f0: 45 4d 5f 53 74 72 29 21 3d 30 20 7c 7c 20 73 71  EM_Str)!=0 || sq
3900: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
3910: 64 28 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  d() );.  return 
3920: 28 6d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  (m.flags & MEM_D
3930: 79 6e 29 21 3d 30 20 3f 20 6d 2e 7a 20 3a 20 73  yn)!=0 ? m.z : s
3940: 71 6c 69 74 65 53 74 72 44 75 70 28 6d 2e 7a 29  qliteStrDup(m.z)
3950: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 5a 20 69 73  ;.}../*.** pZ is
3960: 20 61 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65   a UTF-16 encode
3970: 64 20 75 6e 69 63 6f 64 65 20 73 74 72 69 6e 67  d unicode string
3980: 2e 20 49 66 20 6e 43 68 61 72 20 69 73 20 6c 65  . If nChar is le
3990: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 0a 2a 2a  ss than zero,.**
39a0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
39b0: 65 72 20 6f 66 20 62 79 74 65 73 20 75 70 20 74  er of bytes up t
39c0: 6f 20 28 62 75 74 20 6e 6f 74 20 69 6e 63 6c 75  o (but not inclu
39d0: 64 69 6e 67 29 2c 20 74 68 65 20 66 69 72 73 74  ding), the first
39e0: 20 70 61 69 72 0a 2a 2a 20 6f 66 20 63 6f 6e 73   pair.** of cons
39f0: 65 63 75 74 69 76 65 20 30 78 30 30 20 62 79 74  ecutive 0x00 byt
3a00: 65 73 20 69 6e 20 70 5a 2e 20 49 66 20 6e 43 68  es in pZ. If nCh
3a10: 61 72 20 69 73 20 6e 6f 74 20 6c 65 73 73 20 74  ar is not less t
3a20: 68 61 6e 20 7a 65 72 6f 2c 0a 2a 2a 20 74 68 65  han zero,.** the
3a30: 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  n return the num
3a40: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
3a50: 74 68 65 20 66 69 72 73 74 20 6e 43 68 61 72 20  the first nChar 
3a60: 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65  unicode characte
3a70: 72 73 0a 2a 2a 20 69 6e 20 70 5a 20 28 6f 72 20  rs.** in pZ (or 
3a80: 75 70 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  up until the fir
3a90: 73 74 20 70 61 69 72 20 6f 66 20 30 78 30 30 20  st pair of 0x00 
3aa0: 62 79 74 65 73 2c 20 77 68 69 63 68 65 76 65 72  bytes, whichever
3ab0: 20 63 6f 6d 65 73 20 66 69 72 73 74 29 2e 0a 2a   comes first)..*
3ac0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 74 66  /.int sqlite3Utf
3ad0: 31 36 42 79 74 65 4c 65 6e 28 63 6f 6e 73 74 20  16ByteLen(const 
3ae0: 76 6f 69 64 20 2a 7a 49 6e 2c 20 69 6e 74 20 6e  void *zIn, int n
3af0: 43 68 61 72 29 7b 0a 20 20 75 6e 73 69 67 6e 65  Char){.  unsigne
3b00: 64 20 69 6e 74 20 63 20 3d 20 31 3b 0a 20 20 63  d int c = 1;.  c
3b10: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 20 3d 20 7a  har const *z = z
3b20: 49 6e 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  In;.  int n = 0;
3b30: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 55 54  .  if( SQLITE_UT
3b40: 46 31 36 4e 41 54 49 56 45 3d 3d 53 51 4c 49 54  F16NATIVE==SQLIT
3b50: 45 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20  E_UTF16BE ){.   
3b60: 20 2f 2a 20 55 73 69 6e 67 20 61 6e 20 22 69 66   /* Using an "if
3b70: 20 28 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41   (SQLITE_UTF16NA
3b80: 54 49 56 45 3d 3d 53 51 4c 49 54 45 5f 55 54 46  TIVE==SQLITE_UTF
3b90: 31 36 42 45 29 22 20 63 6f 6e 73 74 72 75 63 74  16BE)" construct
3ba0: 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 61 6e 64   here.    ** and
3bb0: 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74 73 20   in other parts 
3bc0: 6f 66 20 74 68 69 73 20 66 69 6c 65 20 6d 65 61  of this file mea
3bd0: 6e 73 20 74 68 61 74 20 61 74 20 6f 6e 65 20 62  ns that at one b
3be0: 72 61 6e 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a  ranch will.    *
3bf0: 2a 20 6e 6f 74 20 62 65 20 63 6f 76 65 72 65 64  * not be covered
3c00: 20 62 79 20 63 6f 76 65 72 61 67 65 20 74 65 73   by coverage tes
3c10: 74 69 6e 67 20 6f 6e 20 61 6e 79 20 73 69 6e 67  ting on any sing
3c20: 6c 65 20 68 6f 73 74 2e 20 42 75 74 20 63 6f 76  le host. But cov
3c30: 65 72 61 67 65 0a 20 20 20 20 2a 2a 20 77 69 6c  erage.    ** wil
3c40: 6c 20 62 65 20 63 6f 6d 70 6c 65 74 65 20 69 66  l be complete if
3c50: 20 74 68 65 20 74 65 73 74 73 20 61 72 65 20 72   the tests are r
3c60: 75 6e 20 6f 6e 20 62 6f 74 68 20 61 20 6c 69 74  un on both a lit
3c70: 74 6c 65 2d 65 6e 64 69 61 6e 20 61 6e 64 20 0a  tle-endian and .
3c80: 20 20 20 20 2a 2a 20 62 69 67 2d 65 6e 64 69 61      ** big-endia
3c90: 6e 20 68 6f 73 74 2e 20 42 65 63 61 75 73 65 20  n host. Because 
3ca0: 62 6f 74 68 20 74 68 65 20 55 54 46 31 36 4e 41  both the UTF16NA
3cb0: 54 49 56 45 20 61 6e 64 20 53 51 4c 49 54 45 5f  TIVE and SQLITE_
3cc0: 55 54 46 31 36 42 45 0a 20 20 20 20 2a 2a 20 6d  UTF16BE.    ** m
3cd0: 61 63 72 6f 73 20 61 72 65 20 63 6f 6e 73 74 61  acros are consta
3ce0: 6e 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  nt at compile ti
3cf0: 6d 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  me the compiler 
3d00: 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 0a 20 20  can determine.  
3d10: 20 20 2a 2a 20 77 68 69 63 68 20 62 72 61 6e 63    ** which branc
3d20: 68 20 77 69 6c 6c 20 62 65 20 66 6f 6c 6c 6f 77  h will be follow
3d30: 65 64 2e 20 49 74 20 69 73 20 74 68 65 72 65 66  ed. It is theref
3d40: 6f 72 65 20 61 73 73 75 6d 65 64 20 74 68 61 74  ore assumed that
3d50: 20 6e 6f 20 72 75 6e 74 69 6d 65 0a 20 20 20 20   no runtime.    
3d60: 2a 2a 20 70 65 6e 61 6c 74 79 20 69 73 20 70 61  ** penalty is pa
3d70: 69 64 20 66 6f 72 20 74 68 69 73 20 22 69 66 22  id for this "if"
3d80: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
3d90: 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 63 20  */.    while( c 
3da0: 26 26 20 28 28 6e 43 68 61 72 3c 30 29 20 7c 7c  && ((nChar<0) ||
3db0: 20 6e 3c 6e 43 68 61 72 29 20 29 7b 0a 20 20 20   n<nChar) ){.   
3dc0: 20 20 20 52 45 41 44 5f 55 54 46 31 36 42 45 28     READ_UTF16BE(
3dd0: 7a 2c 20 63 29 3b 0a 20 20 20 20 20 20 6e 2b 2b  z, c);.      n++
3de0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
3df0: 0a 20 20 20 20 77 68 69 6c 65 28 20 63 20 26 26  .    while( c &&
3e00: 20 28 28 6e 43 68 61 72 3c 30 29 20 7c 7c 20 6e   ((nChar<0) || n
3e10: 3c 6e 43 68 61 72 29 20 29 7b 0a 20 20 20 20 20  <nChar) ){.     
3e20: 20 52 45 41 44 5f 55 54 46 31 36 4c 45 28 7a 2c   READ_UTF16LE(z,
3e30: 20 63 29 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a   c);.      n++;.
3e40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3e50: 72 6e 20 28 7a 2d 28 63 68 61 72 20 63 6f 6e 73  rn (z-(char cons
3e60: 74 20 2a 29 7a 49 6e 29 2d 28 28 63 3d 3d 30 29  t *)zIn)-((c==0)
3e70: 3f 32 3a 30 29 3b 0a 7d 0a 0a 23 69 66 20 64 65  ?2:0);.}..#if de
3e80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
3e90: 54 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  T)./*.** Transla
3ea0: 74 65 20 55 54 46 2d 38 20 74 6f 20 55 54 46 2d  te UTF-8 to UTF-
3eb0: 38 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 68 61  8..**.** This ha
3ec0: 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
3ed0: 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68 61 74  making sure that
3ee0: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 77   the string is w
3ef0: 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 55 54  ell-formed.** UT
3f00: 46 2d 38 2e 20 20 4d 69 73 63 6f 64 65 64 20 63  F-8.  Miscoded c
3f10: 68 61 72 61 63 74 65 72 73 20 61 72 65 20 72 65  haracters are re
3f20: 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  moved..**.** The
3f30: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20   translation is 
3f40: 64 6f 6e 65 20 69 6e 2d 70 6c 61 63 65 20 28 73  done in-place (s
3f50: 69 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73  ince it is impos
3f60: 73 69 62 6c 65 20 66 6f 72 20 74 68 65 0a 2a 2a  sible for the.**
3f70: 20 63 6f 72 72 65 63 74 20 55 54 46 2d 38 20 65   correct UTF-8 e
3f80: 6e 63 6f 64 69 6e 67 20 74 6f 20 62 65 20 6c 6f  ncoding to be lo
3f90: 6e 67 65 72 20 74 68 61 6e 20 61 20 6d 61 6c 66  nger than a malf
3fa0: 6f 72 6d 65 64 20 65 6e 63 6f 64 69 6e 67 29 2e  ormed encoding).
3fb0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55  .*/.int sqlite3U
3fc0: 74 66 38 54 6f 38 28 75 6e 73 69 67 6e 65 64 20  tf8To8(unsigned 
3fd0: 63 68 61 72 20 2a 7a 49 6e 29 7b 0a 20 20 75 6e  char *zIn){.  un
3fe0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4f 75  signed char *zOu
3ff0: 74 20 3d 20 7a 49 6e 3b 0a 20 20 75 6e 73 69 67  t = zIn;.  unsig
4000: 6e 65 64 20 63 68 61 72 20 2a 7a 53 74 61 72 74  ned char *zStart
4010: 20 3d 20 7a 49 6e 3b 0a 20 20 69 6e 74 20 63 3b   = zIn;.  int c;
4020: 0a 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20  ..  while(1){.  
4030: 20 20 53 51 4c 49 54 45 5f 52 45 41 44 5f 55 54    SQLITE_READ_UT
4040: 46 38 28 7a 49 6e 2c 20 63 29 3b 0a 20 20 20 20  F8(zIn, c);.    
4050: 69 66 28 20 63 3d 3d 30 20 29 20 62 72 65 61 6b  if( c==0 ) break
4060: 3b 0a 20 20 20 20 69 66 28 20 63 21 3d 30 78 66  ;.    if( c!=0xf
4070: 66 66 64 20 29 7b 0a 20 20 20 20 20 20 57 52 49  ffd ){.      WRI
4080: 54 45 5f 55 54 46 38 28 7a 4f 75 74 2c 20 63 29  TE_UTF8(zOut, c)
4090: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 7a  ;.    }.  }.  *z
40a0: 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  Out = 0;.  retur
40b0: 6e 20 7a 4f 75 74 20 2d 20 7a 53 74 61 72 74 3b  n zOut - zStart;
40c0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .}.#endif..#if d
40d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
40e0: 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ST)./*.** This r
40f0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
4100: 20 66 72 6f 6d 20 74 68 65 20 54 43 4c 20 74 65   from the TCL te
4110: 73 74 20 66 75 6e 63 74 69 6f 6e 20 22 74 72 61  st function "tra
4120: 6e 73 6c 61 74 65 5f 73 65 6c 66 74 65 73 74 22  nslate_selftest"
4130: 2e 0a 2a 2a 20 49 74 20 63 68 65 63 6b 73 20 74  ..** It checks t
4140: 68 61 74 20 74 68 65 20 70 72 69 6d 69 74 69 76  hat the primitiv
4150: 65 73 20 66 6f 72 20 73 65 72 69 61 6c 69 7a 69  es for serializi
4160: 6e 67 20 61 6e 64 20 64 65 73 65 72 69 61 6c 69  ng and deseriali
4170: 7a 69 6e 67 0a 2a 2a 20 63 68 61 72 61 63 74 65  zing.** characte
4180: 72 73 20 69 6e 20 65 61 63 68 20 65 6e 63 6f 64  rs in each encod
4190: 69 6e 67 20 61 72 65 20 69 6e 76 65 72 73 65 73  ing are inverses
41a0: 20 6f 66 20 65 61 63 68 20 6f 74 68 65 72 2e 0a   of each other..
41b0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55  */.void sqlite3U
41c0: 74 66 53 65 6c 66 54 65 73 74 28 29 7b 0a 20 20  tfSelfTest(){.  
41d0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20  unsigned int i, 
41e0: 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
41f0: 61 72 20 7a 42 75 66 5b 32 30 5d 3b 0a 20 20 75  ar zBuf[20];.  u
4200: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b  nsigned char *z;
4210: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 75 6e 73 69  .  int n;.  unsi
4220: 67 6e 65 64 20 69 6e 74 20 63 3b 0a 0a 20 20 66  gned int c;..  f
4230: 6f 72 28 69 3d 30 3b 20 69 3c 30 78 30 30 31 31  or(i=0; i<0x0011
4240: 30 30 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  0000; i++){.    
4250: 7a 20 3d 20 7a 42 75 66 3b 0a 20 20 20 20 57 52  z = zBuf;.    WR
4260: 49 54 45 5f 55 54 46 38 28 7a 2c 20 69 29 3b 0a  ITE_UTF8(z, i);.
4270: 20 20 20 20 6e 20 3d 20 7a 2d 7a 42 75 66 3b 0a      n = z-zBuf;.
4280: 20 20 20 20 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20      z[0] = 0;.  
4290: 20 20 7a 20 3d 20 7a 42 75 66 3b 0a 20 20 20 20    z = zBuf;.    
42a0: 53 51 4c 49 54 45 5f 52 45 41 44 5f 55 54 46 38  SQLITE_READ_UTF8
42b0: 28 7a 2c 20 63 29 3b 0a 20 20 20 20 74 20 3d 20  (z, c);.    t = 
42c0: 69 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 30 78  i;.    if( i>=0x
42d0: 44 38 30 30 20 26 26 20 69 3c 3d 30 78 44 46 46  D800 && i<=0xDFF
42e0: 46 20 29 20 74 20 3d 20 30 78 46 46 46 44 3b 0a  F ) t = 0xFFFD;.
42f0: 20 20 20 20 69 66 28 20 28 69 26 30 78 46 46 46      if( (i&0xFFF
4300: 46 46 46 46 45 29 3d 3d 30 78 46 46 46 45 20 29  FFFFE)==0xFFFE )
4310: 20 74 20 3d 20 30 78 46 46 46 44 3b 0a 20 20 20   t = 0xFFFD;.   
4320: 20 61 73 73 65 72 74 28 20 63 3d 3d 74 20 29 3b   assert( c==t );
4330: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 7a 2d  .    assert( (z-
4340: 7a 42 75 66 29 3d 3d 6e 20 29 3b 0a 20 20 7d 0a  zBuf)==n );.  }.
4350: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 30 78 30    for(i=0; i<0x0
4360: 30 31 31 30 30 30 30 3b 20 69 2b 2b 29 7b 0a 20  0110000; i++){. 
4370: 20 20 20 69 66 28 20 69 3e 3d 30 78 44 38 30 30     if( i>=0xD800
4380: 20 26 26 20 69 3c 30 78 45 30 30 30 20 29 20 63   && i<0xE000 ) c
4390: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 20 3d  ontinue;.    z =
43a0: 20 7a 42 75 66 3b 0a 20 20 20 20 57 52 49 54 45   zBuf;.    WRITE
43b0: 5f 55 54 46 31 36 4c 45 28 7a 2c 20 69 29 3b 0a  _UTF16LE(z, i);.
43c0: 20 20 20 20 6e 20 3d 20 7a 2d 7a 42 75 66 3b 0a      n = z-zBuf;.
43d0: 20 20 20 20 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20      z[0] = 0;.  
43e0: 20 20 7a 20 3d 20 7a 42 75 66 3b 0a 20 20 20 20    z = zBuf;.    
43f0: 52 45 41 44 5f 55 54 46 31 36 4c 45 28 7a 2c 20  READ_UTF16LE(z, 
4400: 63 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  c);.    assert( 
4410: 63 3d 3d 69 20 29 3b 0a 20 20 20 20 61 73 73 65  c==i );.    asse
4420: 72 74 28 20 28 7a 2d 7a 42 75 66 29 3d 3d 6e 20  rt( (z-zBuf)==n 
4430: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
4440: 3b 20 69 3c 30 78 30 30 31 31 30 30 30 30 3b 20  ; i<0x00110000; 
4450: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3e  i++){.    if( i>
4460: 3d 30 78 44 38 30 30 20 26 26 20 69 3c 30 78 45  =0xD800 && i<0xE
4470: 30 30 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  000 ) continue;.
4480: 20 20 20 20 7a 20 3d 20 7a 42 75 66 3b 0a 20 20      z = zBuf;.  
4490: 20 20 57 52 49 54 45 5f 55 54 46 31 36 42 45 28    WRITE_UTF16BE(
44a0: 7a 2c 20 69 29 3b 0a 20 20 20 20 6e 20 3d 20 7a  z, i);.    n = z
44b0: 2d 7a 42 75 66 3b 0a 20 20 20 20 7a 5b 30 5d 20  -zBuf;.    z[0] 
44c0: 3d 20 30 3b 0a 20 20 20 20 7a 20 3d 20 7a 42 75  = 0;.    z = zBu
44d0: 66 3b 0a 20 20 20 20 52 45 41 44 5f 55 54 46 31  f;.    READ_UTF1
44e0: 36 42 45 28 7a 2c 20 63 29 3b 0a 20 20 20 20 61  6BE(z, c);.    a
44f0: 73 73 65 72 74 28 20 63 3d 3d 69 20 29 3b 0a 20  ssert( c==i );. 
4500: 20 20 20 61 73 73 65 72 74 28 20 28 7a 2d 7a 42     assert( (z-zB
4510: 75 66 29 3d 3d 6e 20 29 3b 0a 20 20 7d 0a 7d 0a  uf)==n );.  }.}.
4520: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4530: 5f 54 45 53 54 20 2a 2f 0a 23 65 6e 64 69 66 20  _TEST */.#endif 
4540: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
4550: 54 46 31 36 20 2a 2f 0a                          TF16 */.