aboutsummaryrefslogtreecommitdiff
path: root/src/test_hexio.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/test_hexio.c')
-rw-r--r--src/test_hexio.c34
1 files changed, 23 insertions, 11 deletions
diff --git a/src/test_hexio.c b/src/test_hexio.c
index 8999d84d2..048ab1324 100644
--- a/src/test_hexio.c
+++ b/src/test_hexio.c
@@ -122,7 +122,7 @@ static int SQLITE_TCLAPI hexio_read(
in = fopen(zFile, "r");
}
if( in==0 ){
- Tcl_AppendResult(interp, "cannot open input file ", zFile, 0);
+ Tcl_AppendResult(interp, "cannot open input file ", zFile, NULL);
return TCL_ERROR;
}
fseek(in, offset, SEEK_SET);
@@ -132,7 +132,7 @@ static int SQLITE_TCLAPI hexio_read(
got = 0;
}
sqlite3TestBinToHex(zBuf, got);
- Tcl_AppendResult(interp, zBuf, 0);
+ Tcl_AppendResult(interp, zBuf, NULL);
sqlite3_free(zBuf);
return TCL_OK;
}
@@ -175,7 +175,7 @@ static int SQLITE_TCLAPI hexio_write(
out = fopen(zFile, "r+");
}
if( out==0 ){
- Tcl_AppendResult(interp, "cannot open output file ", zFile, 0);
+ Tcl_AppendResult(interp, "cannot open output file ", zFile, NULL);
return TCL_ERROR;
}
fseek(out, offset, SEEK_SET);
@@ -187,7 +187,7 @@ static int SQLITE_TCLAPI hexio_write(
}
/*
-** USAGE: hexio_get_int HEXDATA
+** USAGE: hexio_get_int [-littleendian] HEXDATA
**
** Interpret the HEXDATA argument as a big-endian integer. Return
** the value of that integer. HEXDATA can contain between 2 and 8
@@ -205,12 +205,20 @@ static int SQLITE_TCLAPI hexio_get_int(
const unsigned char *zIn;
unsigned char *aOut;
unsigned char aNum[4];
+ int bLittle = 0;
- if( objc!=2 ){
- Tcl_WrongNumArgs(interp, 1, objv, "HEXDATA");
+ if( objc==3 ){
+ Tcl_Size n;
+ char *z = Tcl_GetStringFromObj(objv[1], &n);
+ if( n>=2 && n<=13 && memcmp(z, "-littleendian", n)==0 ){
+ bLittle = 1;
+ }
+ }
+ if( (objc-bLittle)!=2 ){
+ Tcl_WrongNumArgs(interp, 1, objv, "[-littleendian] HEXDATA");
return TCL_ERROR;
}
- zIn = (const unsigned char *)Tcl_GetStringFromObj(objv[1], &nIn);
+ zIn = (const unsigned char *)Tcl_GetStringFromObj(objv[1+bLittle], &nIn);
aOut = sqlite3_malloc64( 1 + nIn/2 );
if( aOut==0 ){
return TCL_ERROR;
@@ -223,7 +231,11 @@ static int SQLITE_TCLAPI hexio_get_int(
memcpy(&aNum[4-nOut], aOut, nOut);
}
sqlite3_free(aOut);
- val = (aNum[0]<<24) | (aNum[1]<<16) | (aNum[2]<<8) | aNum[3];
+ if( bLittle ){
+ val = (int)((u32)aNum[3]<<24) | (aNum[2]<<16) | (aNum[1]<<8) | aNum[0];
+ }else{
+ val = (int)((u32)aNum[0]<<24) | (aNum[1]<<16) | (aNum[2]<<8) | aNum[3];
+ }
Tcl_SetObjResult(interp, Tcl_NewIntObj(val));
return TCL_OK;
}
@@ -312,12 +324,12 @@ static int SQLITE_TCLAPI utf8_to_utf8(
z[n] = 0;
nOut = sqlite3Utf8To8(z);
sqlite3TestBinToHex(z,nOut);
- Tcl_AppendResult(interp, (char*)z, 0);
+ Tcl_AppendResult(interp, (char*)z, NULL);
sqlite3_free(z);
return TCL_OK;
#else
Tcl_AppendResult(interp,
- "[utf8_to_utf8] unavailable - SQLITE_DEBUG not defined", 0
+ "[utf8_to_utf8] unavailable - SQLITE_DEBUG not defined", NULL
);
return TCL_ERROR;
#endif
@@ -401,7 +413,7 @@ static int SQLITE_TCLAPI make_fts3record(
}
for(i=0; i<(int)nArg; i++){
- sqlite3_int64 iVal;
+ Tcl_WideInt iVal;
if( TCL_OK==Tcl_GetWideIntFromObj(0, aArg[i], &iVal) ){
if( nOut+10>nAlloc ){
int nNew = nAlloc?nAlloc*2:128;