using System.Collections.Generic;
using Mono.CSharp;
-using Mono.Attach;
namespace Mono {
static int Main (string [] args)
{
+#if !ON_DOTNET
if (args.Length > 0 && args [0] == "--attach") {
new ClientCSharpShell (Int32.Parse (args [1])).Run (null);
return 0;
- } else if (args.Length > 0 && args [0].StartsWith ("--agent:")) {
+ }
+
+ if (args.Length > 0 && args [0].StartsWith ("--agent:")) {
new CSharpAgent (args [0]);
return 0;
- } else {
- string [] startup_files;
- try {
- startup_files = Evaluator.InitAndGetStartupFiles (args);
- } catch {
- return 1;
- }
+ }
+#endif
+ return Startup(args);
+ }
+
+ static int Startup (string[] args)
+ {
+ string[] startup_files;
+ try {
+ startup_files = Evaluator.InitAndGetStartupFiles (args);
+ Evaluator.DescribeTypeExpressions = true;
+ Evaluator.SetInteractiveBaseClass (typeof (InteractiveBaseShell));
+ } catch {
+ return 1;
+ }
+
+ return new CSharpShell ().Run (startup_files);
+ }
+ }
+
+ public class InteractiveBaseShell : InteractiveBase {
+ static bool tab_at_start_completes;
+
+ static InteractiveBaseShell ()
+ {
+ tab_at_start_completes = false;
+ }
+
+ internal static Mono.Terminal.LineEditor Editor;
+
+ public static bool TabAtStartCompletes {
+ get {
+ return tab_at_start_completes;
+ }
+
+ set {
+ tab_at_start_completes = value;
+ if (Editor != null)
+ Editor.TabAtStartCompletes = value;
+ }
+ }
- return new CSharpShell ().Run (startup_files);
+ public static new string help {
+ get {
+ return InteractiveBase.help +
+ " TabAtStartCompletes - Whether tab will complete even on emtpy lines\n";
}
}
}
public class CSharpShell {
- static bool isatty = true;
+ static bool isatty = true, is_unix = false;
string [] startup_files;
Mono.Terminal.LineEditor editor;
void SetupConsole ()
{
- string term = Environment.GetEnvironmentVariable ("TERM");
- dumb = term == "dumb" || term == null || isatty == false;
+ if (is_unix){
+ string term = Environment.GetEnvironmentVariable ("TERM");
+ dumb = term == "dumb" || term == null || isatty == false;
+ } else
+ dumb = false;
editor = new Mono.Terminal.LineEditor ("csharp", 300);
+ InteractiveBaseShell.Editor = editor;
+
+ editor.AutoCompleteEvent += delegate (string s, int pos){
+ string prefix = null;
+
+ string complete = s.Substring (0, pos);
+
+ string [] completions = Evaluator.GetCompletions (complete, out prefix);
+
+ return new Mono.Terminal.LineEditor.Completion (prefix, completions);
+ };
+
#if false
//
// This is a sample of how completions sould be implemented.
void InitTerminal ()
{
- isatty = UnixUtils.isatty (0) && UnixUtils.isatty (1);
+#if ON_DOTNET
+ is_unix = false;
+ isatty = true;
+#else
+ int p = (int) Environment.OSVersion.Platform;
+ is_unix = (p == 4) || (p == 128);
+
+ if (is_unix)
+ isatty = UnixUtils.isatty (0) && UnixUtils.isatty (1);
+ else
+ isatty = true;
+#endif
// Work around, since Console is not accounting for
// cursor position when writing to Stderr. It also
// has the undesirable side effect of making
// errors plain, with no coloring.
- Report.Stderr = Console.Out;
+// Report.Stderr = Console.Out;
SetupConsole ();
if (isatty)
public int ReadEvalPrintLoop ()
{
- if (startup_files.Length == 0)
+ if (startup_files != null && startup_files.Length == 0)
InitTerminal ();
InitializeUsing ();
}
+#if !ON_DOTNET
//
// A shell connected to a CSharpAgent running in a remote process.
// - maybe add 'class_name' and 'method_name' arguments to LoadAgent.
((IPEndPoint)listener.Server.LocalEndPoint).Port,
((IPEndPoint)interrupt_listener.Server.LocalEndPoint).Port);
- VirtualMachine vm = new VirtualMachine (pid);
+ var vm = new Attach.VirtualMachine (pid);
vm.Attach (agent_assembly, agent_arg);
/* Wait for the client to connect */
try {
string error_string;
StringWriter error_output = new StringWriter ();
- Report.Stderr = error_output;
+// Report.Stderr = error_output;
string line = s.GetString ();
}
}
}
+
+ public class UnixUtils {
+ [System.Runtime.InteropServices.DllImport ("libc", EntryPoint="isatty")]
+ extern static int _isatty (int fd);
+
+ public static bool isatty (int fd)
+ {
+ try {
+ return _isatty (fd) == 1;
+ } catch {
+ return false;
+ }
+ }
+ }
+#endif
}
namespace Mono.Management
}
}
-