wasCSharpSQLite – Rev 1

Subversion Repositories:
Rev:
using System;
using System.Collections;
using System.Diagnostics;
using System.Text;

using sqlite_int64 = System.Int64;
using i32 = System.Int32;
using i64 = System.Int64;
using u32 = System.UInt32;

namespace tcl.lang
{
#if TCLSH
  using lang;
  using Tcl_Channel = Channel;
  using Tcl_DString = TclString;
  using Tcl_Interp = Interp;
  using Tcl_Obj = TclObject;
  using Tcl_WideInt = System.Int64;

  public partial class TCL
  {

    // -- Conversion from TCL to tclsharp coding
    // Included in SQLite3 port to C# for use in testharness only;  2008 Noah B Hart
    public static void Tcl_AppendElement( Interp interp, StringBuilder toAppend )
    {
      interp.appendElement( toAppend.ToString() );
    }

    public static void Tcl_AppendElement( Interp interp, string toAppend )
    {
      interp.appendElement( toAppend );
    }

    public static void Tcl_AppendResult( Interp interp, params object[] tos )
    {
      if ( tos != null )
      {
        StringBuilder result = new StringBuilder( 100 );
        for ( int i = 0; i < tos.Length && tos[i] != null; i++ )
          result.Append( tos[i].ToString() );
        interp.appendElement( result.ToString() );
      }
    }

    public static void Tcl_AppendResult( Interp interp, params string[] strings )
    {
      if ( strings != null )
      {
        StringBuilder result = new StringBuilder( 100 );
        for ( int i = 0; i < strings.Length && strings[i] != null && strings[i] != ""; i++ )
          result.Append( strings[i] );
        interp.appendElement( result.ToString() );
      }
    }

    public static void Tcl_BackgroundError( Interp interp )
    {
      interp.setErrorCode( TclInteger.newInstance( TCL_ERROR ) );
      interp.addErrorInfo( "Background Error" );
    }

    public static void Tcl_CreateCommand( Interp interp, string cmdName, Interp.dxObjCmdProc ObjCmdProc, object ClientData, Interp.dxCmdDeleteProc DbDeleteCmd )
    {
      interp.createObjCommand( cmdName, ObjCmdProc, ClientData, DbDeleteCmd );
    }

    public static void Tcl_CreateObjCommand( Interp interp, string cmdName, Interp.dxObjCmdProc ObjCmdProc, object ClientData, Interp.dxCmdDeleteProc DbDeleteCmd )
    {
      interp.createObjCommand( cmdName, ObjCmdProc, ClientData, DbDeleteCmd );
    }


    public static bool Tcl_CreateCommandPointer( Interp interp, StringBuilder command, object clientData )
    {
      try
      {
        interp.createObjCommand( command.ToString(), null, clientData, null );
        return false;
      }
      catch
      {
        return true;
      }
    }

    public static bool Tcl_CreateCommandPointer( Interp interp, string command, object clientData )
    {
      try
      {
        interp.createObjCommand( command, null, clientData, null );
        return false;
      }
      catch
      {
        return true;
      }
    }

    public static void Tcl_DecrRefCount( ref TclObject to )
    {
      to.release();
      if ( to.internalRep == null )
        to = null;
    }

    public static int Tcl_DeleteCommand( Interp interp, string cmdName )
    {
      return interp.deleteCommand( cmdName );
    }

    public static void Tcl_DStringAppendElement( TclObject str, string append )
    {
      TclString.append( str, append );
    }

    public static void Tcl_DStringFree( ref TclObject str )
    {
      str.release();
    }

    public static void Tcl_DStringInit( out TclObject str )
    {
      str = TclString.newInstance( "" );
      str.preserve();
    }

    public static int Tcl_DStringLength( TclObject str )
    {
      return str.ToString().Length;
    }

    public static TclObject Tcl_DuplicateObj( TclObject to )
    {
      return to.duplicate();
    }

    public static int Tcl_Eval( Interp interp, string s )
    {
      try
      {
        interp.eval( s );
        return 0;
      }
      catch
      {
        return 1;
      };
    }
    public static int Tcl_EvalObjEx( Interp interp, TclObject tobj, int flags )
    {
      try
      {
        interp.eval( tobj, flags );
        return 0;
      }
      catch ( TclException e )
      {
        if ( e.getCompletionCode() == TCL.CompletionCode.RETURN )
          return TCL_RETURN;
        else if ( e.getCompletionCode() == TCL.CompletionCode.BREAK || interp.getResult().ToString() == "invoked \"break\" outside of a loop" )
          return TCL_BREAK;
        else
          return TCL_ERROR;
      };
    }

    public static void Tcl_Free( ref TclObject[] to )
    {
      if ( to != null )
        for ( int i = 0; i < to.Length; i++ )
          while ( to[i] != null && to[i].refCount > 0 )
            to[i].release();
      to = null;
    }

    public static void Tcl_Free( ref TclObject to )
    {
      while ( to.refCount > 0 )
        to.release();
    }

    public static void Tcl_Free<T>( ref T x ) where T : class
    {
      x = null;
    }

    public static bool Tcl_GetBoolean( Interp interp, TclObject to, out int result )
    {
      try
      {
        result = ( TclBoolean.get( interp, to ) ? 1 : 0 );
        return false;
      }
      catch
      {
        result = 0;
        return true;
      }
    }

    public static bool Tcl_GetBoolean( Interp interp, TclObject to, out bool result )
    {
      try
      {
        result = TclBoolean.get( interp, to );
        return false;
      }
      catch
      {
        result = false;
        return true;
      }
    }

    public static bool Tcl_GetBooleanFromObj( Interp interp, TclObject to, out bool result )
    {
      try
      {
        result = TclBoolean.get( interp, to );
        return false;
      }
      catch
      {
        result = false;
        return true;
      }
    }

    public static bool Tcl_GetCommandInfo( Interp interp, string command, out WrappedCommand value )
    {
      try
      {
        value = interp.getObjCommand( command );
        return false;
      }
      catch
      {
        value = null;
        return true;
      }
    }

    public static byte[] Tcl_GetByteArrayFromObj( TclObject to, out int n )
    {
      n = TclByteArray.getLength( null, to );
      return Encoding.UTF8.GetBytes( to.ToString() );
    }

    public static bool Tcl_GetDouble( Interp interp, TclObject to, out double value )
    {
      try
      {
        value = TclDouble.get( interp, to );
        return false;
      }
      catch
      {
        value = 0;
        return true;
      }
    }

    public static bool Tcl_GetDoubleFromObj( Interp interp, TclObject to, out double value )
    {
      try
      {
        if ( to.ToString() == "NaN" )
          value = Double.NaN;
        else
          value = TclDouble.get( interp, to );
        return false;
      }
      catch
      {
        value = 0;
        return true;
      }
    }

    public static bool Tcl_GetIndexFromObj( Interp interp, TclObject to, string[] table, string msg, int flags, out int index )
    {
      try
      {
        index = TclIndex.get( interp, to, table, msg, flags );
        return false;
      }
      catch
      {
        index = 0;
        return true;
      }
    }

    public static bool Tcl_GetInt( Interp interp, TclObject to, out int value )
    {
      try
      {
        value = TclInteger.get( interp, to );
        return false;
      }
      catch
      {
        value = 0;
        return true;
      }
    }

    public static bool Tcl_GetInt( Interp interp, TclObject to, out u32 value )
    {
      try
      {
        value = (u32)TclInteger.get( interp, to );
        return false;
      }
      catch
      {
        value = 0;
        return true;
      }
    }

    public static int Tcl_GetIntFromObj( Interp interp, TclObject to, out int value )
    {
      try
      {
        value = TclInteger.get( interp, to );
        return TCL.TCL_OK;
      }
      catch
      {
        value = 0;
        return TCL.TCL_ERROR;
      }
    }

    public static bool Tcl_GetLong( Interp interp, TclObject to, out i64 value )
    {
      try
      {
        value = (i64)TclLong.get( interp, to );
        return false;
      }
      catch
      {
        value = 0;
        return true;
      }
    }

    public static TclObject Tcl_GetObjResult( Interp interp )
    {
      TclObject toReturn = interp.getResult();
      return toReturn;
    }

    public static string Tcl_GetString( TclObject to )
    {
      return to.ToString();
    }

    public static string Tcl_GetStringFromObj( TclObject to, int n )
    {
      Debug.Assert( n == 0, "Try calling by ref" );
      return to.ToString();
    }

    public static string Tcl_GetStringFromObj( TclObject to, out int n )
    {
      byte[] tb = System.Text.Encoding.UTF8.GetBytes( to.ToString() );
      string ts = System.Text.Encoding.UTF8.GetString( tb, 0, tb.Length );
      n = ts.Length;
      return ts;
    }

    public static string Tcl_GetStringResult( Interp interp )
    {
      return interp.getResult().ToString();
    }

    public static TclObject Tcl_GetVar2Ex( Interp interp, string part1, string part2, VarFlag flags )
    {
      try
      {
        Var[] result = Var.lookupVar( interp, part1, part2, flags, "read", false, true );
        if ( result == null )
        {
          // lookupVar() returns null only if VarFlag.LEAVE_ERR_MSG is
          // not part of the flags argument, return null in this case.

          return null;
        }

        Var var = result[0];
        Var array = result[1];
        TclObject to = null;

        if ( var.isVarScalar() && !var.isVarUndefined() )
        {
          to = (TclObject)var.value;
          //if ( to.typePtr != "String" )
          //{
          //  double D = 0;
          //  if ( !Double.TryParse( to.ToString(), out D ) ) { if ( String.IsNullOrEmpty( to.typePtr ) ) to.typePtr = "string"; }
          //  else if ( to.typePtr == "ByteArray" )
          //    to.typePtr = "bytearray";
          //  else if ( to.ToString().Contains( "." ) )
          //    to.typePtr = "double";
          //  else
          //    to.typePtr = "int";
          //}
          return to;
        }
        else if ( var.isSQLITE3_Link() )
        {
          to = (TclObject)var.sqlite3_get();
        }
        else
        {
          to = TclList.newInstance();
          foreach ( string key in ( (Hashtable)array.value ).Keys )
          {
            Var  s = (Var)( (Hashtable)array.value )[key];
            if (s.value != null) TclList.append( null, to, TclString.newInstance( s.value.ToString() ) );
          }
        }
        return to;
      }
      catch (Exception e)
      {
        return null;
      };
    }

    public static TclObject Tcl_GetVar( Interp interp, string part, VarFlag flags )
    {
      try
      {
        TclObject to = interp.getVar( part, flags );
        return to;
      }
      catch ( Exception e )
      {
        return TclObj.newInstance( "" );
      };
    }


    public static TclObject Tcl_GetVarType( Interp interp, string part1, string part2, VarFlag flags )
    {
      try
      {
        TclObject to = interp.getVar( part1, part2, flags );
        return to;
      }
      catch
      {
        return null;
      };
    }

    public static bool Tcl_GetWideIntFromObj( Interp interp, TclObject to, out sqlite_int64 value )
    {
      try
      {
        if ( to.ToString() == "NaN" )
          unchecked
          {
            value = (long)Double.NaN;
          }
        else
          value = TclLong.get( interp, to );
        return false;
      }
      catch
      {
        value = 0;
        return true;
      };
    }

    public static void Tcl_IncrRefCount( TclObject to )
    {
      to.preserve();
    }

    public static void Tcl_LinkVar( Interp interp, string name, Object GetSet, VarFlags flags )
    {
      Debug.Assert( ( ( flags & VarFlags.SQLITE3_LINK_READ_ONLY ) != 0 ) || GetSet.GetType().Name == "SQLITE3_GETSET" );
      Var[] linkvar = Var.lookupVar( interp, name, null, VarFlag.GLOBAL_ONLY, "define", true, false );
      linkvar[0].flags |= VarFlags.SQLITE3_LINK | flags;
      linkvar[0].sqlite3_get_set = GetSet;
      linkvar[0].refCount++;
    }

    public static bool Tcl_ListObjAppendElement( Interp interp, TclObject to, TclObject elemObj )
    {
      try
      {
        TclList.append( interp, to, elemObj );
        return false;
      }
      catch
      {
        return true;
      }
    }

    public static void Tcl_ListObjIndex( Interp interp, TclObject to, int nItem, out TclObject elmObj )
    {
      try
      {
        elmObj = TclList.index( interp, to, nItem );
      }
      catch
      {
        elmObj = null;
      }
    }

    public static bool Tcl_ListObjGetElements( Interp interp, TclObject to, out int nItem, out TclObject[] elmObj )
    {
      try
      {
        elmObj = TclList.getElements( interp, to );
        nItem = elmObj.Length;
        return false;
      }
      catch
      {
        elmObj =null;
        nItem = 0;
        return true;
      }
    }

    public static void Tcl_ListObjLength( Interp interp, TclObject to, out int nArg )
    {
      try
      {
        nArg = TclList.getLength( interp, to );
      }
      catch
      {
        nArg = 0;
      }
    }

    public static TclObject Tcl_NewBooleanObj( int value )
    {
      return TclBoolean.newInstance( value != 0 );
    }

    public static TclObject Tcl_NewByteArrayObj( byte[] value, int bytes )
    {
      if ( value == null || value.Length == 0 || bytes == 0 )
        return TclByteArray.newInstance();
      else
        return TclByteArray.newInstance( value, 0, bytes );
    }

    public static TclObject Tcl_NewByteArrayObj( string value, int bytes )
    {
      if ( value == null || bytes == 0 )
        return TclByteArray.newInstance();
      else
        return TclByteArray.newInstance( System.Text.Encoding.UTF8.GetBytes( value.Substring( 0, bytes ) ) );
    }

    public static TclObject Tcl_NewDoubleObj( double value )
    {
      return TclDouble.newInstance( value );
    }

    public static TclObject Tcl_NewIntObj( int value )
    {
      return TclInteger.newInstance( value );
    }

    public static TclObject Tcl_NewListObj( int nArg, TclObject[] aArg )
    {
      TclObject to = TclList.newInstance();
      for ( int i = 0; i < nArg; i++ )
        TclList.append( null, to, aArg[i] );
      return to;
    }

    public static TclObject Tcl_NewObj()
    {
      return TclString.newInstance( "" );
    }

    public static TclObject Tcl_NewStringObj( byte[] value, int iLength )
    {
      if ( iLength > 0 && iLength < value.Length )
        return TclString.newInstance( Encoding.UTF8.GetString( value, 0, iLength ) );
      else
        return TclString.newInstance( Encoding.UTF8.GetString( value, 0, value.Length ) );
    }

    public static TclObject Tcl_NewStringObj( string value, int iLength )
    {
      if ( value == null )
        value = "";
      else
        value = value.Split( '\0' )[0];
      if ( iLength <= 0 )
        iLength = value.Length;
      return TclString.newInstance( value.Substring( 0, iLength ) );
    }

    public static TclObject Tcl_NewWideIntObj( long value )
    {
      return TclLong.newInstance( value );
    }

    public static bool Tcl_ObjSetVar2( Interp interp, TclObject toName, TclObject part2, TclObject toValue, VarFlag flags )
    {
      try
      {
        if ( part2 == null )
          interp.setVar( toName, toValue, flags );
        else
          interp.setVar( toName.ToString(), part2.ToString(), toValue.ToString(), flags );
        return false;
      }
      catch
      {
        return true;
      }
    }
    public static void Tcl_PkgProvide( Interp interp, string name, string version )
    {
      interp.pkgProvide( name, version );
    }

    public static void Tcl_ResetResult( Interp interp )
    {
      interp.resetResult();
    }

    public static void Tcl_SetBooleanObj( TclObject to, int result )
    {
      to.stringRep = TclBoolean.newInstance( result != 0 ).ToString();
      to.preserve();
    }

    public static bool Tcl_SetCommandInfo( Interp interp, string command, WrappedCommand value )
    {
      try
      {
        value = interp.getObjCommand( command );
        return false;
      }
      catch
      {
        return true;
      }
    }

    public static void Tcl_SetIntObj( TclObject to, int result
      )
    {
      while ( to.Shared )
        to.release();
      TclInteger.set( to, result );
      to.preserve();
    }

    public static void Tcl_SetLongObj( TclObject to, long result )
    {
      while ( to.Shared )
        to.release();
      TclLong.set( to, result );
      to.preserve();
    }

    public static void Tcl_SetObjResult( Interp interp, TclObject to )
    {
      interp.resetResult();
      interp.setResult( to );
    }

    public static void Tcl_SetResult( Interp interp, StringBuilder result, int dummy )
    {
      interp.resetResult();
      interp.setResult( result.ToString() );
    }

    public static void Tcl_SetResult( Interp interp, string result, int dummy )
    {
      interp.resetResult();
      interp.setResult( result );
    }

    public static void Tcl_SetVar( Interp interp, string part, string value, int flags )
    {
      interp.setVar( part, value, (VarFlag)flags );
    }
    
    public static void Tcl_SetVar2( Interp interp, string part1, string part2, string value, int flags )
    {
      interp.setVar( part1, part2, value, (VarFlag)flags );
    }

    public static void Tcl_SetVar2( Interp interp, string part1, string part2, TclObject value, int flags )
    {
      interp.setVar( part1, part2, value, (VarFlag)flags );
    }

    public static void Tcl_UnregisterChannel( Interp interp, Channel chan )
    {
      TclIO.unregisterChannel( interp, chan );
    }

    public static int Tcl_VarEval( Interp interp, string Scriptname, params string[] argv )
    {
      try
      {
        //Tcl_Obj[] aArg = null;
        int rc = 0;
        Tcl_Obj pCmd = Tcl_NewStringObj( Scriptname, -1 );
        Tcl_IncrRefCount( pCmd );
        for ( int i = 0; i < argv.Length; i++ )
        {
          if ( argv[i] != null && argv[i] != " " )
            rc = Tcl_ListObjAppendElement( interp, pCmd, Tcl_NewStringObj( argv[i], -1 ) ) ? 1 : 0;
          if ( rc != 0 )
          {
            Tcl_DecrRefCount( ref pCmd );
            return 1;
          }
        }
        rc = Tcl_EvalObjEx( interp, pCmd, TCL_EVAL_DIRECT );
        Tcl_DecrRefCount( ref pCmd );
        return rc == TCL_BREAK ? 1 : 0;
      }
      catch
      {
        return 1;
      }
    }

    public static void Tcl_WrongNumArgs( Interp interp, int argc, TclObject[] argv, string message )
    {
      throw new TclNumArgsException( interp, argc, argv, message == null ? "option ?arg ...?" : message );
    }

    public static Interp Tcl_GetSlave( Interp interp, string slaveInterp )
    {
      try
      {
        return ( (tcl.lang.InterpSlaveCmd)interp.slaveTable[slaveInterp] ).slaveInterp;
      }
      catch
      {
        return null;
      }
    }
  }
#endif
}