Exemplo n.º 1
0
Arquivo: Main.cs Projeto: tspring/ioke
        public static void Main(string[] args)
        {
            string current  = System.Reflection.Assembly.GetExecutingAssembly().Location;
            string iokeHome = new FileInfo(current).Directory.Parent.FullName;
            string iokeLib  = Path.Combine(iokeHome, "lib");

            Runtime r = new Runtime();

            r.Init();

            IokeObject context = r.Ground;
            Message    mx      = new Message(r, ".", null, true);

            mx.Line     = 0;
            mx.Position = 0;
            IokeObject message = r.CreateMessage(mx);

            string cwd = null;

            var  scripts  = new SaneList <string>();
            var  loadDirs = new SaneList <string>();
            bool debug    = false;

            try {
                int  start            = 0;
                bool done             = false;
                bool readStdin        = false;
                bool printedSomething = false;

                for (; !done && start < args.Length; start++)
                {
                    string arg = args[start];
                    if (arg.Length > 0)
                    {
                        if (arg[0] != '-')
                        {
                            done = true;
                            break;
                        }
                        else
                        {
                            if (arg.Equals("--"))
                            {
                                done = true;
                            }
                            else if (arg.Equals("-d"))
                            {
                                debug   = true;
                                r.Debug = true;
                            }
                            else if (arg.StartsWith("-e"))
                            {
                                if (arg.Length == 2)
                                {
                                    scripts.Add(args[++start]);
                                }
                                else
                                {
                                    scripts.Add(arg.Substring(2));
                                }
                            }
                            else if (arg.StartsWith("-I"))
                            {
                                if (arg.Length == 2)
                                {
                                    loadDirs.Add(args[++start]);
                                }
                                else
                                {
                                    loadDirs.Add(arg.Substring(2));
                                }
                            }
                            else if (arg.Equals("-h") || arg.Equals("--help"))
                            {
                                Console.Error.Write(HELP);
                                return;
                            }
                            else if (arg.Equals("--version"))
                            {
                                Console.Error.WriteLine(getVersion());
                                printedSomething = true;
                            }
                            else if (arg.Equals("--copyright"))
                            {
                                Console.Error.Write(COPYRIGHT);
                                printedSomething = true;
                            }
                            else if (arg.Equals("-"))
                            {
                                readStdin = true;
                            }
                            else if (arg[1] == 'C')
                            {
                                if (arg.Length == 2)
                                {
                                    cwd = args[++start];
                                }
                                else
                                {
                                    cwd = arg.Substring(2);
                                }
                            }
                            else
                            {
                                IokeObject condition = IokeObject.As(IokeObject.GetCellChain(r.Condition,
                                                                                             message,
                                                                                             context,
                                                                                             "Error",
                                                                                             "CommandLine",
                                                                                             "DontUnderstandOption"), null).Mimic(message, context);
                                condition.SetCell("message", message);
                                condition.SetCell("context", context);
                                condition.SetCell("receiver", context);
                                condition.SetCell("option", r.NewText(arg));
                                r.ErrorCondition(condition);
                            }
                        }
                    }
                }

                if (cwd != null)
                {
                    r.CurrentWorkingDirectory = cwd;
                }

                ((IokeSystem)IokeObject.dataOf(r.System)).CurrentProgram = "-e";

                string lib = Environment.GetEnvironmentVariable("ioke.lib");
                if (lib == null)
                {
                    lib = iokeLib;
                }
                ((IokeSystem)IokeObject.dataOf(r.System)).AddLoadPath(lib + "/ioke");
                ((IokeSystem)IokeObject.dataOf(r.System)).AddLoadPath("lib/ioke");

                foreach (string ss in loadDirs)
                {
                    ((IokeSystem)IokeObject.dataOf(r.System)).AddLoadPath(ss);
                }

                foreach (string script in scripts)
                {
                    r.EvaluateStream("-e", new StringReader(script), message, context);
                }

                if (readStdin)
                {
                    ((IokeSystem)IokeObject.dataOf(r.System)).CurrentProgram = "<stdin>";
                    r.EvaluateStream("<stdin>", Console.In, message, context);
                }

                if (args.Length > start)
                {
                    if (args.Length > (start + 1))
                    {
                        for (int i = start + 1, j = args.Length; i < j; i++)
                        {
                            r.AddArgument(args[i]);
                        }
                    }
                    string file = args[start];
                    if (file.StartsWith("\""))
                    {
                        file = file.Substring(1, file.Length - 1);
                    }

                    if (file.Length > 1 && file[file.Length - 1] == '"')
                    {
                        file = file.Substring(0, file.Length - 1);
                    }

                    ((IokeSystem)IokeObject.dataOf(r.System)).CurrentProgram = file;
                    r.EvaluateFile(file, message, context);
                }
                else
                {
                    if (!readStdin && scripts.Count == 0 && !printedSomething)
                    {
                        r.EvaluateString("use(\"builtin/iik\"). IIk mainLoop", message, context);
                    }
                }

                r.TearDown();
            } catch (ControlFlow.Exit e) {
                int exitVal = e.ExitValue;
                try {
                    r.TearDown();
                } catch (ControlFlow.Exit e2) {
                    exitVal = e2.ExitValue;
                }
                Environment.Exit(exitVal);
            } catch (ControlFlow e) {
                string name = e.GetType().FullName;
                System.Console.Error.WriteLine("unexpected control flow: " + name.Substring(name.LastIndexOf(".") + 1).ToLower());
                if (debug)
                {
                    System.Console.Error.WriteLine(e);
                }
                Environment.Exit(1);
            }
        }