aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordanielk1977 <danielk1977@noemail.net>2004-06-23 13:46:32 +0000
committerdanielk1977 <danielk1977@noemail.net>2004-06-23 13:46:32 +0000
commit1ba1b5511ce578095e1153f36ba820cd170866ef (patch)
tree1d2bfb9c04648997a51b41954fcb9851ff93c232 /src
parente12c17bab332adbb0ae5d9887d64562798ae38b9 (diff)
downloadsqlite-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.c26
-rw-r--r--src/utf.c36
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);
diff --git a/src/utf.c b/src/utf.c
index 4bb08b5e0..326e9bde9 100644
--- a/src/utf.c
+++ b/src/utf.c
@@ -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;