diff options
author | danielk1977 <danielk1977@noemail.net> | 2004-06-23 13:46:32 +0000 |
---|---|---|
committer | danielk1977 <danielk1977@noemail.net> | 2004-06-23 13:46:32 +0000 |
commit | 1ba1b5511ce578095e1153f36ba820cd170866ef (patch) | |
tree | 1d2bfb9c04648997a51b41954fcb9851ff93c232 /src | |
parent | e12c17bab332adbb0ae5d9887d64562798ae38b9 (diff) | |
download | sqlite-1ba1b5511ce578095e1153f36ba820cd170866ef.tar.gz sqlite-1ba1b5511ce578095e1153f36ba820cd170866ef.zip |
Improve test coverage of utf.c. (CVS 1678)
FossilOrigin-Name: 53c553c760a84e213c2277588bcc292892c2b0ce
Diffstat (limited to 'src')
-rw-r--r-- | src/test5.c | 26 | ||||
-rw-r--r-- | src/utf.c | 36 |
2 files changed, 35 insertions, 27 deletions
diff --git a/src/test5.c b/src/test5.c index 8ce005323..cd6d877f3 100644 --- a/src/test5.c +++ b/src/test5.c @@ -15,7 +15,7 @@ ** is used for testing the SQLite routines for converting between ** the various supported unicode encodings. ** -** $Id: test5.c,v 1.11 2004/06/18 04:24:55 danielk1977 Exp $ +** $Id: test5.c,v 1.12 2004/06/23 13:46:32 danielk1977 Exp $ */ #include "sqliteInt.h" #include "vdbeInt.h" @@ -116,6 +116,10 @@ static u8 name_to_enc(Tcl_Interp *interp, Tcl_Obj *pObj){ return pEnc->enc; } +/* +** Usage: test_translate <string/blob> <from enc> <to enc> ?<transient>? +** +*/ static int test_translate( void * clientData, Tcl_Interp *interp, @@ -126,16 +130,20 @@ static int test_translate( u8 enc_to; sqlite3_value *pVal; - const char *z; + char *z; int len; + void (*xDel)(void *p) = SQLITE_STATIC; - if( objc!=4 ){ + if( objc!=4 && objc!=5 ){ Tcl_AppendResult(interp, "wrong # args: should be \"", Tcl_GetStringFromObj(objv[0], 0), " <string/blob> <from enc> <to enc>", 0 ); return TCL_ERROR; } + if( objc==5 ){ + xDel = sqlite3FreeX; + } enc_from = name_to_enc(interp, objv[2]); if( !enc_from ) return TCL_ERROR; @@ -146,10 +154,18 @@ static int test_translate( if( enc_from==SQLITE_UTF8 ){ z = Tcl_GetString(objv[1]); - sqlite3ValueSetStr(pVal, -1, z, enc_from, SQLITE_STATIC); + if( objc==5 ){ + z = sqliteStrDup(z); + } + sqlite3ValueSetStr(pVal, -1, z, enc_from, xDel); }else{ z = Tcl_GetByteArrayFromObj(objv[1], &len); - sqlite3ValueSetStr(pVal, -1, z, enc_from, SQLITE_STATIC); + if( objc==5 ){ + char *zTmp = z; + z = sqliteMalloc(len); + memcpy(z, zTmp, len); + } + sqlite3ValueSetStr(pVal, -1, z, enc_from, xDel); } z = sqlite3ValueText(pVal, enc_to); @@ -12,7 +12,7 @@ ** This file contains routines used to translate between UTF-8, ** UTF-16, UTF-16BE, and UTF-16LE. ** -** $Id: utf.c,v 1.24 2004/06/23 00:23:49 danielk1977 Exp $ +** $Id: utf.c,v 1.25 2004/06/23 13:46:32 danielk1977 Exp $ ** ** Notes on UTF-8: ** @@ -292,11 +292,7 @@ int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){ zOut = sqliteMallocRaw(len); if( !zOut ) return SQLITE_NOMEM; }else{ - if( pMem->z==pMem->zShort ){ - zOut = zShort; - }else{ - zOut = pMem->zShort; - } + zOut = zShort; } z = zOut; @@ -343,9 +339,7 @@ int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){ sqlite3VdbeMemRelease(pMem); pMem->flags &= ~(MEM_Static|MEM_Dyn|MEM_Ephem|MEM_Short); pMem->enc = desiredEnc; - if( (char *)zOut==pMem->zShort ){ - pMem->flags |= (MEM_Term|MEM_Short); - }else if( zOut==zShort ){ + if( zOut==zShort ){ memcpy(pMem->zShort, zOut, len); zOut = pMem->zShort; pMem->flags |= (MEM_Term|MEM_Short); @@ -390,22 +384,20 @@ int sqlite3VdbeMemHandleBom(Mem *pMem){ } if( bom ){ - if( pMem->flags & MEM_Short ){ - memmove(pMem->zShort, &pMem->zShort[2], NBFS-2); - pMem->n -= 2; - pMem->enc = bom; - } - else if( pMem->flags & MEM_Dyn ){ + /* This function is called as soon as a string is stored in a Mem*, + ** from within sqlite3VdbeMemSetStr(). At that point it is not possible + ** for the string to be stored in Mem.zShort, or for it to be stored + ** in dynamic memory with no destructor. + */ + assert( !(pMem->flags&MEM_Short) ); + assert( !(pMem->flags&MEM_Dyn) || pMem->xDel ); + if( pMem->flags & MEM_Dyn ){ void (*xDel)(void*) = pMem->xDel; char *z = pMem->z; pMem->z = 0; pMem->xDel = 0; rc = sqlite3VdbeMemSetStr(pMem, &z[2], pMem->n-2, bom, SQLITE_TRANSIENT); - if( xDel ){ - xDel(z); - }else{ - sqliteFree(z); - } + xDel(z); }else{ rc = sqlite3VdbeMemSetStr(pMem, &pMem->z[2], pMem->n-2, bom, SQLITE_TRANSIENT); @@ -424,7 +416,7 @@ int sqlite3VdbeMemHandleBom(Mem *pMem){ int sqlite3utf8CharLen(const char *z, int nByte){ int r = 0; const char *zTerm; - if( nByte>0 ){ + if( nByte>=0 ){ zTerm = &z[nByte]; }else{ zTerm = (const char *)(-1); @@ -528,7 +520,7 @@ void sqlite3utfSelfTest(){ int n; int c; - for(i=0; 0 && i<0x00110000; i++){ + for(i=0; i<0x00110000; i++){ z = zBuf; WRITE_UTF8(z, i); n = z-zBuf; |