Exemple #1
0
    static void Main(string[] args)
    {
        using (var v = new Squirrel())
        {
            v.SetPrintFunc(PrintFunc, ErrorFunc);
            v.PushRootTable();
            v.RegisterBlobLib();
            v.RegisterIOLib();
            v.RegisterSystemLib();
            v.RegisterMathLib();
            v.RegisterStringLib();

            // aux library
            // sets error handlers
            v.SetErrorHandlers();

            bool   justCompile = false;
            string outFile     = string.Empty;

            for (int i = 0; i < args.Length; i++)
            {
                if (args[i].StartsWith("-") && args[i].Length <= 1)
                {
                    switch (args[i][1])
                    {
                    case 'd': // DEBUG (debug infos)
                        v.EnableDebugInfo(true);
                        break;

                    case 'c':
                        justCompile = true;
                        break;

                    case 'o':
                        if (i < args.Length)
                        {
                            outFile = args[++i];
                        }
                        break;

                    case 'v':
                        PrintVersionInfo();
                        return;

                    case 'h':
                        PrintVersionInfo();
                        PrintUsage();
                        return;

                    default:
                        PrintVersionInfo();
                        Console.WriteLine("unknown parameter '-{0}'", args[i][1]);
                        PrintUsage();
                        return;
                    }
                }
                else
                {
                    string inFile = args[i++];

                    if (justCompile)
                    {
                        if (v.LoadFile(inFile, true) >= 0)
                        {
                            if (v.WriteClosureToFile(string.IsNullOrEmpty(outFile) ? "out.cnut" : outFile) >= 0)
                            {
                                return;
                            }
                        }
                    }
                    else
                    {
                        if (v.LoadFile(inFile, true) >= 0)
                        {
                            int callArgs = 1;
                            v.PushRootTable();

                            for (int j = i; j < args.Length; j++, callArgs++)
                            {
                                v.PushString(args[j], -1);
                            }

                            if (v.Call(callArgs, true, true) >= 0)
                            {
                                ObjectType type = v.GetType(-1);
                                if (type == ObjectType.Integer)
                                {
                                    int result = (int)type;
                                    v.GetInteger(-1, out result);
                                    Environment.Exit(result);
                                }
                            }
                        }
                    }

                    return;
                }
            }

            Interactive(v);
        }
    }
Exemple #2
0
    static void Interactive(Squirrel v)
    {
        // print version information
        PrintVersionInfo();

        // add "quit()" function
        v.PushRootTable();
        v.PushString("quit", -1);
        v.NewClosure(Quit, 0);
        v.SetParamsCheck(1, null);
        v.NewSlot(-3, false);

        for (;;)
        {
            int    blocks  = 0;
            bool   str     = false;
            bool   retVal  = false;
            bool   execute = false;
            string buffer  = string.Empty;
            Console.Write("\nsq>");

            while (!execute)
            {
                var c = (char)Console.Read();

                switch (c)
                {
                case '\r': continue;

                case '\n':
                    if (buffer.Length > 0 && buffer.Last() == '\\')
                    {
                        buffer = buffer.Remove(buffer.Length - 1);
                        continue;
                    }
                    if (blocks == 0)
                    {
                        execute = true;
                    }
                    break;

                case '}':
                    if (!str)
                    {
                        blocks--;
                    }
                    break;

                case '{':
                    if (!str)
                    {
                        blocks++;
                    }
                    break;

                case '"':
                case '\'':
                    str = !str;
                    break;
                }

                buffer += c;
            }

            if (!string.IsNullOrEmpty(buffer))
            {
                if (buffer.StartsWith("="))
                {
                    buffer = $"return ({buffer.Substring(1)})";
                    retVal = true;
                }

                int oldtop = v.GetTop();
                if (v.CompileBuffer(buffer, buffer.Length, "interactive console", true) >= 0)
                {
                    v.PushRootTable();
                    if (v.Call(1, retVal, true) >= 0 && retVal != false)
                    {
                        Console.WriteLine();
                        v.PushRootTable();
                        v.PushString("print", -1);
                        v.Get(-2);
                        v.PushRootTable();
                        v.Push(-4);
                        v.Call(2, false, true);
                        retVal = false;
                        Console.WriteLine();
                    }
                }

                v.SetTop(oldtop);
            }
        }
    }