コード例 #1
0
     /*
     ** 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
     }
コード例 #2
0
        /*
        ** 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);
        }
コード例 #3
0
        /*
        ** 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);
        }