diff options
Diffstat (limited to 'src/test5.c')
-rw-r--r-- | src/test5.c | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/src/test5.c b/src/test5.c new file mode 100644 index 000000000..aa8cc26f9 --- /dev/null +++ b/src/test5.c @@ -0,0 +1,196 @@ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** Code for testing the utf.c module in SQLite. This code +** is not included in the SQLite library. It is used for automated +** testing of the SQLite library. +** +** $Id: +*/ +#include "sqliteInt.h" +#include "tcl.h" +#include <stdlib.h> +#include <string.h> + +/* +** Return the number of bytes up to and including the first \u0000 +** character in *pStr. +*/ +static int utf16_length(const unsigned char *pZ){ + const unsigned char *pC1 = pZ; + const unsigned char *pC2 = pZ+1; + while( *pC1 || *pC2 ){ + pC1 += 2; + pC2 += 2; + } + return (pC1-pZ)+2; +} + +static int sqlite_utf8to16le( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + unsigned char *out; + unsigned char *in; + Tcl_Obj *res; + + if( objc!=2 ){ + Tcl_AppendResult(interp, "wrong # args: should be \"", + Tcl_GetStringFromObj(objv[0], 0), "<utf-8 encoded-string>", 0); + return TCL_ERROR; + } + + in = Tcl_GetByteArrayFromObj(objv[1], 0); + out = (unsigned char *)sqlite3utf8to16le(in, -1); + res = Tcl_NewByteArrayObj(out, utf16_length(ret)); + sqliteFree(out); + + Tcl_SetObjResult(interp, res); + + return TCL_OK; +} + +static int sqlite_utf8to16be( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + unsigned char *out; + unsigned char *in; + Tcl_Obj *res; + + if( objc!=2 ){ + Tcl_AppendResult(interp, "wrong # args: should be \"", + Tcl_GetStringFromObj(objv[0], 0), "<utf-8 encoded-string>", 0); + return TCL_ERROR; + } + + in = Tcl_GetByteArrayFromObj(objv[1], 0); + out = (unsigned char *)sqlite3utf8to16be(in, -1); + res = Tcl_NewByteArrayObj(out, utf16_length(ret)); + sqliteFree(out); + + Tcl_SetObjResult(interp, res); + + return TCL_OK; +} + +static int sqlite_utf16to16le( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + unsigned char *out; + unsigned char *in; + int in_len; + Tcl_Obj *res; + + if( objc!=2 ){ + Tcl_AppendResult(interp, "wrong # args: should be \"", + Tcl_GetStringFromObj(objv[0], 0), "<utf-16 encoded-string>", 0); + return TCL_ERROR; + } + + in = Tcl_GetByteArrayFromObj(objv[1], &in_len); + out = (unsigned char *)sqliteMalloc(in_len); + memcpy(out, in, in_len); + + sqlite3utf16to16le(out, -1); + res = Tcl_NewByteArrayObj(out, utf16_length(ret)); + sqliteFree(out); + + Tcl_SetObjResult(interp, res); + + return TCL_OK; +} + +static int sqlite_utf16to16be( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + unsigned char *out; + unsigned char *in; + int in_len; + Tcl_Obj *res; + + if( objc!=2 ){ + Tcl_AppendResult(interp, "wrong # args: should be \"", + Tcl_GetStringFromObj(objv[0], 0), "<utf-16 encoded-string>", 0); + return TCL_ERROR; + } + + in = Tcl_GetByteArrayFromObj(objv[1], &in_len); + out = (unsigned char *)sqliteMalloc(in_len); + memcpy(out, in, in_len); + + sqlite3utf16to16be(out, -1); + res = Tcl_NewByteArrayObj(out, utf16_length(ret)); + sqliteFree(out); + + Tcl_SetObjResult(interp, res); + + return TCL_OK; +} + +static int sqlite_utf16to8( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + unsigned char *out; + unsigned char *in; + Tcl_Obj *res; + + if( objc!=2 ){ + Tcl_AppendResult(interp, "wrong # args: should be \"", + Tcl_GetStringFromObj(objv[0], 0), "<utf-16 encoded-string>", 0); + return TCL_ERROR; + } + + in = Tcl_GetByteArrayFromObj(objv[1], 0); + out = sqlite3utf16to8(in, -1); + res = Tcl_NewByteArrayObj(out, strlen(ret)); + sqliteFree(out); + + Tcl_SetObjResult(interp, res); + + return TCL_OK; +} + + +/* +** Register commands with the TCL interpreter. +*/ +int Sqlitetest5_Init(Tcl_Interp *interp){ + static struct { + char *zName; + Tcl_CmdProc *xProc; + } aCmd[] = { + { "sqlite_utf16to8", (Tcl_CmdProc*)sqlite_utf16to8 }, + { "sqlite_utf8to16le", (Tcl_CmdProc*)sqlite_utf8to16le }, + { "sqlite_utf8to16be", (Tcl_CmdProc*)sqlite_utf8to16be }, + { "sqlite_utf16to16le", (Tcl_CmdProc*)sqlite_utf16to16le }, + { "sqlite_utf16to16be", (Tcl_CmdProc*)sqlite_utf16to16be } + }; + int i; + for(i=0; i<sizeof(aCmd)/sizeof(aCmd[0]); i++){ + Tcl_CreateCommand(interp, aCmd[i].zName, aCmd[i].xProc, 0, 0); + } + + return TCL_OK; +} |