| Index: third_party/sqlite/src/src/utf.c
|
| diff --git a/third_party/sqlite/src/src/utf.c b/third_party/sqlite/src/src/utf.c
|
| index 95182694d39d46a37f57e5ba2e9730240194d49e..25f4dadf0c7eb912bbcbe7c01ef4605c327575cd 100644
|
| --- a/third_party/sqlite/src/src/utf.c
|
| +++ b/third_party/sqlite/src/src/utf.c
|
| @@ -148,8 +148,8 @@ static const unsigned char sqlite3Utf8Trans1[] = {
|
| ** and rendered as themselves even though they are technically
|
| ** invalid characters.
|
| **
|
| -** * This routine accepts an infinite number of different UTF8 encodings
|
| -** for unicode values 0x80 and greater. It do not change over-length
|
| +** * This routine accepts over-length UTF8 encodings
|
| +** for unicode values 0x80 and greater. It does not change over-length
|
| ** encodings to 0xfffd as some systems recommend.
|
| */
|
| #define READ_UTF8(zIn, zTerm, c) \
|
| @@ -163,26 +163,24 @@ static const unsigned char sqlite3Utf8Trans1[] = {
|
| || (c&0xFFFFF800)==0xD800 \
|
| || (c&0xFFFFFFFE)==0xFFFE ){ c = 0xFFFD; } \
|
| }
|
| -int sqlite3Utf8Read(
|
| - const unsigned char *zIn, /* First byte of UTF-8 character */
|
| - const unsigned char **pzNext /* Write first byte past UTF-8 char here */
|
| +u32 sqlite3Utf8Read(
|
| + const unsigned char **pz /* Pointer to string from which to read char */
|
| ){
|
| unsigned int c;
|
|
|
| /* Same as READ_UTF8() above but without the zTerm parameter.
|
| ** For this routine, we assume the UTF8 string is always zero-terminated.
|
| */
|
| - c = *(zIn++);
|
| + c = *((*pz)++);
|
| if( c>=0xc0 ){
|
| c = sqlite3Utf8Trans1[c-0xc0];
|
| - while( (*zIn & 0xc0)==0x80 ){
|
| - c = (c<<6) + (0x3f & *(zIn++));
|
| + while( (*(*pz) & 0xc0)==0x80 ){
|
| + c = (c<<6) + (0x3f & *((*pz)++));
|
| }
|
| if( c<0x80
|
| || (c&0xFFFFF800)==0xD800
|
| || (c&0xFFFFFFFE)==0xFFFE ){ c = 0xFFFD; }
|
| }
|
| - *pzNext = zIn;
|
| return c;
|
| }
|
|
|
| @@ -201,7 +199,7 @@ int sqlite3Utf8Read(
|
| ** desiredEnc. It is an error if the string is already of the desired
|
| ** encoding, or if *pMem does not contain a string value.
|
| */
|
| -int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){
|
| +SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){
|
| int len; /* Maximum length of output string in bytes */
|
| unsigned char *zOut; /* Output buffer */
|
| unsigned char *zIn; /* Input iterator */
|
| @@ -283,7 +281,6 @@ int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){
|
| if( desiredEnc==SQLITE_UTF16LE ){
|
| /* UTF-8 -> UTF-16 Little-endian */
|
| while( zIn<zTerm ){
|
| - /* c = sqlite3Utf8Read(zIn, zTerm, (const u8**)&zIn); */
|
| READ_UTF8(zIn, zTerm, c);
|
| WRITE_UTF16LE(z, c);
|
| }
|
| @@ -291,7 +288,6 @@ int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){
|
| assert( desiredEnc==SQLITE_UTF16BE );
|
| /* UTF-8 -> UTF-16 Big-endian */
|
| while( zIn<zTerm ){
|
| - /* c = sqlite3Utf8Read(zIn, zTerm, (const u8**)&zIn); */
|
| READ_UTF8(zIn, zTerm, c);
|
| WRITE_UTF16BE(z, c);
|
| }
|
| @@ -318,12 +314,13 @@ int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){
|
| *z = 0;
|
| assert( (pMem->n+(desiredEnc==SQLITE_UTF8?1:2))<=len );
|
|
|
| + c = pMem->flags;
|
| sqlite3VdbeMemRelease(pMem);
|
| - pMem->flags &= ~(MEM_Static|MEM_Dyn|MEM_Ephem);
|
| + pMem->flags = MEM_Str|MEM_Term|(c&MEM_AffMask);
|
| pMem->enc = desiredEnc;
|
| - pMem->flags |= (MEM_Term|MEM_Dyn);
|
| pMem->z = (char*)zOut;
|
| pMem->zMalloc = pMem->z;
|
| + pMem->szMalloc = sqlite3DbMallocSize(pMem->db, pMem->z);
|
|
|
| translate_out:
|
| #if defined(TRANSLATE_TRACE) && defined(SQLITE_DEBUG)
|
| @@ -419,7 +416,7 @@ int sqlite3Utf8To8(unsigned char *zIn){
|
| u32 c;
|
|
|
| while( zIn[0] && zOut<=zIn ){
|
| - c = sqlite3Utf8Read(zIn, (const u8**)&zIn);
|
| + c = sqlite3Utf8Read((const u8**)&zIn);
|
| if( c!=0xfffd ){
|
| WRITE_UTF8(zOut, c);
|
| }
|
| @@ -449,38 +446,11 @@ char *sqlite3Utf16to8(sqlite3 *db, const void *z, int nByte, u8 enc){
|
| }
|
| assert( (m.flags & MEM_Term)!=0 || db->mallocFailed );
|
| assert( (m.flags & MEM_Str)!=0 || db->mallocFailed );
|
| - assert( (m.flags & MEM_Dyn)!=0 || db->mallocFailed );
|
| assert( m.z || db->mallocFailed );
|
| return m.z;
|
| }
|
|
|
| /*
|
| -** Convert a UTF-8 string to the UTF-16 encoding specified by parameter
|
| -** enc. A pointer to the new string is returned, and the value of *pnOut
|
| -** is set to the length of the returned string in bytes. The call should
|
| -** arrange to call sqlite3DbFree() on the returned pointer when it is
|
| -** no longer required.
|
| -**
|
| -** If a malloc failure occurs, NULL is returned and the db.mallocFailed
|
| -** flag set.
|
| -*/
|
| -#ifdef SQLITE_ENABLE_STAT2
|
| -char *sqlite3Utf8to16(sqlite3 *db, u8 enc, char *z, int n, int *pnOut){
|
| - Mem m;
|
| - memset(&m, 0, sizeof(m));
|
| - m.db = db;
|
| - sqlite3VdbeMemSetStr(&m, z, n, SQLITE_UTF8, SQLITE_STATIC);
|
| - if( sqlite3VdbeMemTranslate(&m, enc) ){
|
| - assert( db->mallocFailed );
|
| - return 0;
|
| - }
|
| - assert( m.z==m.zMalloc );
|
| - *pnOut = m.n;
|
| - return m.z;
|
| -}
|
| -#endif
|
| -
|
| -/*
|
| ** zIn is a UTF-16 encoded unicode string at least nChar characters long.
|
| ** Return the number of bytes in the first nChar unicode characters
|
| ** in pZ. nChar must be non-negative.
|
| @@ -524,7 +494,7 @@ void sqlite3UtfSelfTest(void){
|
| assert( n>0 && n<=4 );
|
| z[0] = 0;
|
| z = zBuf;
|
| - c = sqlite3Utf8Read(z, (const u8**)&z);
|
| + c = sqlite3Utf8Read((const u8**)&z);
|
| t = i;
|
| if( i>=0xD800 && i<=0xDFFF ) t = 0xFFFD;
|
| if( (i&0xFFFFFFFE)==0xFFFE ) t = 0xFFFD;
|
|
|