public TCL.CompletionCode cmdProc( Interp interp, TclObject[] argv )
    {
      if ( argv.Length != 1 )
      {
        throw new TclNumArgsException( interp, 1, argv, null );
      }

      // Get the name of the working dir.

      string dirName = interp.getWorkingDir().ToString();

      // Java File Object methods use backslashes on Windows.
      // Convert them to forward slashes before returning the dirName to Tcl.

      if ( JACL.PLATFORM == JACL.PLATFORM_WINDOWS )
      {
        dirName = dirName.Replace( '\\', '/' );
      }

      interp.setResult( dirName );
      return TCL.CompletionCode.RETURN;
    }
Exemplo n.º 2
0
    private System.Diagnostics.Process execReflection( Interp interp, TclObject[] argv, int first, int last )
    {

      string[] strv = new string[last - first];

      for ( int i = first, j = 0 ; i < last ; j++, i++ )
      {

        strv[j] = argv[i].ToString();
      }

      System.Object[] methodArgs = new System.Object[3];
      methodArgs[0] = strv; // exec command arguments
      methodArgs[1] = null; // inherit all environment variables
      methodArgs[2] = interp.getWorkingDir();

      try
      {
        return (System.Diagnostics.Process)execMethod.Invoke( System.Diagnostics.Process.GetCurrentProcess(), (System.Object[])methodArgs );
      }
      catch ( System.UnauthorizedAccessException ex )
      {
        throw new TclRuntimeError( "IllegalAccessException in execReflection" );
      }
      catch ( System.ArgumentException ex )
      {
        throw new TclRuntimeError( "IllegalArgumentException in execReflection" );
      }
      catch ( System.Reflection.TargetInvocationException ex )
      {
                System.Exception t = ex.GetBaseException();

        if ( t is System.ApplicationException )
        {
          throw (System.ApplicationException)t;
        }
        else if ( t is System.IO.IOException )
        {
          throw (System.IO.IOException)t;
        }
        else
        {
          throw new TclRuntimeError( "unexected exception in execReflection" );
        }
      }
    }
Exemplo n.º 3
0
    private System.Diagnostics.Process execWin( Interp interp, TclObject[] argv, int first, int last )
    {
      StringBuilder sb = new StringBuilder();
      for ( int i = ( first + 1 ) ; i < last ; i++ )
      {
        sb.Append( '"' );
        sb.Append( escapeWinString( argv[i].ToString() ) );
        sb.Append( '"' );
        sb.Append( ' ' );
      }

      System.Diagnostics.Process proc = new System.Diagnostics.Process();
      proc.StartInfo.UseShellExecute = false;
      proc.StartInfo.RedirectStandardOutput = true;
      proc.StartInfo.RedirectStandardError = true;
      proc.StartInfo.RedirectStandardInput = true;
      proc.StartInfo.WorkingDirectory = interp.getWorkingDir().FullName;
      proc.StartInfo.FileName = argv[first].ToString();
      proc.StartInfo.Arguments = sb.ToString();
      return proc;
    }
    internal static FileInfo getNewFileObj( Interp interp, string fileName )
    {
      fileName = translateFileName( interp, fileName );
      System.Diagnostics.Debug.WriteLine( "File name is \"" + fileName + "\"" );
      switch ( getPathType( fileName ) )
      {

        case PATH_RELATIVE:
          if ( fileName == ":memory:" )
            return null;
          System.Diagnostics.Debug.WriteLine( "File name is PATH_RELATIVE" );
          return new FileInfo( interp.getWorkingDir().FullName + "\\" + fileName );

        case PATH_VOLUME_RELATIVE:
          System.Diagnostics.Debug.WriteLine( "File name is PATH_VOLUME_RELATIVE" );

          // Something is very wrong if interp.getWorkingDir()
          // does not start with C: or another drive letter
          string cwd = interp.getWorkingDir().ToString();
          int index = beginsWithLetterColon( cwd );
          if ( index == 0 )
          {
            throw new TclRuntimeError( "interp working directory \"" + cwd + "\" does not start with a drive letter" );
          }

          // We can not use the joinPath() method because joing("D:/", "/f.txt")
          // returns "/f.txt" for some wacky reason. Just do it ourselves.
          StringBuilder buff = new StringBuilder();
          buff.Append( cwd.Substring( 0, ( 2 ) - ( 0 ) ) );
          buff.Append( '\\' );
          for ( int i = 0; i < fileName.Length; i++ )
          {
            if ( fileName[i] != '\\' )
            {
              // Once we skip all the \ characters at the front
              // append the rest of the fileName onto the buffer
              buff.Append( fileName.Substring( i ) );
              break;
            }
          }

          fileName = buff.ToString();

          System.Diagnostics.Debug.WriteLine( "After PATH_VOLUME_RELATIVE join \"" + fileName + "\"" );

          return new FileInfo( fileName );

        case PATH_ABSOLUTE:
          System.Diagnostics.Debug.WriteLine( "File name is PATH_ABSOLUTE" );
          return new FileInfo( fileName );

        default:
          throw new TclRuntimeError( "type for fileName \"" + fileName + "\" not matched in case statement" );

      }
    }
Exemplo n.º 5
0
    private static FileInfo createAbsoluteFileObj( Interp interp, string fileName )
    {
      if ( fileName.Equals( "" ) )
      {
        return ( interp.getWorkingDir() );
      }

      if ( ( JACL.PLATFORM == JACL.PLATFORM_WINDOWS ) && ( fileName.Length >= 2 ) && ( fileName[1] == ':' ) )
      {
        string tmp = null;
        if ( fileName.Length == 2 )
        {
          tmp = fileName.Substring( 0, ( 2 ) - ( 0 ) ) + '\\';
        }
        else if ( fileName[2] != '\\' )
        {
          tmp = fileName.Substring( 0, ( 2 ) - ( 0 ) ) + '\\' + fileName.Substring( 2 );
        }
        if ( (System.Object)tmp != null )
        {
          return FileUtil.getNewFileObj( interp, tmp );
        }
      }

      return FileUtil.getNewFileObj( interp, fileName );
    }
Exemplo n.º 6
0
    private static void addFileToResult( Interp interp, string fileName, string separators, TclObject resultList )
    {
      string prettyFileName = fileName;
      int prettyLen = fileName.Length;

      // Java IO reuqires Windows volumes [A-Za-z]: to be followed by '\\'.

      if ( ( JACL.PLATFORM == JACL.PLATFORM_WINDOWS ) && ( prettyLen >= 2 ) && ( fileName[1] == ':' ) )
      {
        if ( prettyLen == 2 )
        {
          fileName = fileName + '\\';
        }
        else if ( fileName[2] != '\\' )
        {
          fileName = fileName.Substring( 0, ( 2 ) - ( 0 ) ) + '\\' + fileName.Substring( 2 );
        }
      }

      TclObject[] arrayObj = TclList.getElements( interp, FileUtil.splitAndTranslate( interp, fileName ) );
      fileName = FileUtil.joinPath( interp, arrayObj, 0, arrayObj.Length );

      FileInfo f;
      if ( FileUtil.getPathType( fileName ) == FileUtil.PATH_ABSOLUTE )
      {
        f = FileUtil.getNewFileObj( interp, fileName );
      }
      else
      {
        f = new FileInfo( interp.getWorkingDir().FullName + "\\" + fileName );
      }

      // If the last character is a spearator, make sure the file is an
      // existing directory, otherwise check that the file exists.

      if ( ( prettyLen > 0 ) && ( separators.IndexOf( (System.Char)prettyFileName[prettyLen - 1] ) != -1 ) )
      {
        if ( Directory.Exists( f.FullName ) )
        {
          TclList.append( interp, resultList, TclString.newInstance( prettyFileName ) );
        }
      }
      else
      {
        bool tmpBool;
        if ( File.Exists( f.FullName ) )
          tmpBool = true;
        else
          tmpBool = Directory.Exists( f.FullName );
        if ( tmpBool )
        {
          TclList.append( interp, resultList, TclString.newInstance( prettyFileName ) );
        }
      }
    }