/* ** USAGE: utf8_to_utf8 HEX ** ** The argument is a UTF8 string represented _in hexadecimal. ** The UTF8 might not be well-formed. Run this string through ** sqlite3Utf8to8() convert it back to hex and return the result. */ static int utf8_to_utf8( object clientdata, Tcl_Interp interp, int objc, Tcl_Obj[] objv ) { #if SQLITE_DEBUG int n = 0; int nOut; string zOrig; byte[] z; if (objc != 2) { TCL.Tcl_WrongNumArgs(interp, 1, objv, "HEX"); return(TCL.TCL_ERROR); } zOrig = TCL.Tcl_GetStringFromObj(objv[1], out n); z = new byte[2 * n + 1];//sqlite3Malloc( n + 3 ); nOut = sqlite3TestHexToBin(zOrig, n, z); //z[n] = 0; nOut = sqlite3Utf8To8(z); sqlite3TestBinToHex(z, zOrig.Length); TCL.Tcl_AppendResult(interp, Encoding.ASCII.GetString(z, 0, n)); //sqlite3_free( z ); return(TCL.TCL_OK); #else Tcl_AppendResult(interp, "[utf8_to_utf8] unavailable - SQLITE_DEBUG not defined", 0 ); return(TCL.TCL_ERROR); #endif }
/* ** USAGE: hexio_get_int HEXDATA ** ** Interpret the HEXDATA argument as a big-endian integer. Return ** the value of that integer. HEXDATA can contain between 2 and 8 ** hexadecimal digits. */ static int hexio_get_int( object clientdata, Tcl_Interp interp, int objc, Tcl_Obj[] objv ) { int val; int nIn = 0, nOut; string zIn; byte[] aOut; byte[] aNum = new byte[4]; if (objc != 2) { TCL.Tcl_WrongNumArgs(interp, 1, objv, "HEXDATA"); return(TCL.TCL_ERROR); } zIn = TCL.Tcl_GetStringFromObj(objv[1], ref nIn); aOut = new byte[nIn / 2];// sqlite3Malloc( nIn / 2 ); if (aOut == null) { return(TCL.TCL_ERROR); } nOut = sqlite3TestHexToBin(zIn, nIn, aOut); if (nOut >= 4) { aNum[0] = aOut[0]; // memcpy( aNum, aOut, 4 ); aNum[1] = aOut[1]; aNum[2] = aOut[2]; aNum[3] = aOut[3]; } else { //memset(aNum, 0, sizeof(aNum)); //memcpy(&aNum[4-nOut], aOut, nOut); aNum[4 - nOut] = aOut[0]; if (nOut > 1) { aNum[4 - nOut + 1] = aOut[1]; } if (nOut > 2) { aNum[4 - nOut + 2] = aOut[2]; } if (nOut > 3) { aNum[4 - nOut + 3] = aOut[3]; } } aOut = null;// sqlite3DbFree( db, ref aOut ); val = (aNum[0] << 24) | (aNum[1] << 16) | (aNum[2] << 8) | aNum[3]; TCL.Tcl_SetObjResult(interp, TCL.Tcl_NewIntObj(val)); return(TCL.TCL_OK); }
/* ** Usage: hexio_write FILENAME OFFSET DATA ** ** Write DATA into file FILENAME beginning at OFFSET from the ** beginning of the file. DATA is expressed _in hexadecimal. */ static int hexio_write( object clientdata, Tcl_Interp interp, int objc, Tcl_Obj[] objv ) { int offset = 0; int nIn = 0, nOut, written; string zFile; string zIn; byte[] aOut; FileStream _out; if (objc != 4) { TCL.Tcl_WrongNumArgs(interp, 1, objv, "FILENAME OFFSET HEXDATA"); return(TCL.TCL_ERROR); } if (TCL.Tcl_GetIntFromObj(interp, objv[2], ref offset)) { return(TCL.TCL_ERROR); } zFile = TCL.Tcl_GetString(objv[1]); zIn = TCL.Tcl_GetStringFromObj(objv[3], ref nIn); aOut = new byte[nIn / 2 + 1];//sqlite3Malloc( nIn/2 ); if (aOut == null) { return(TCL.TCL_ERROR); } nOut = sqlite3TestHexToBin(zIn, nIn, aOut); _out = new FileStream(zFile, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);// fopen( zFile, "r+b" ); //if( _out==0 ){ // _out = fopen(zFile, "r+"); //} if (_out == null) { TCL.Tcl_AppendResult(interp, "cannot open output file ", zFile); return(TCL.TCL_ERROR); } _out.Seek(offset, SeekOrigin.Begin); // fseek( _out, offset, SEEK_SET ); written = (int)_out.Position; _out.Write(aOut, 0, nOut); // written = fwrite( aOut, 1, nOut, _out ); written = (int)_out.Position - written; aOut = null; // sqlite3DbFree( db, ref aOut ); _out.Flush(); _out.Close(); // fclose( _out ); TCL.Tcl_SetObjResult(interp, TCL.Tcl_NewIntObj(written)); return(TCL.TCL_OK); }