Esempio n. 1
0
        static int loadline(Lua.lua_State L)
        {
            int status;

            Lua.lua_settop(L, 0);
            if (pushline(L, 1) == 0)
            {
                return(-1);                 /* no input */
            }
            for (; ;)
            {              /* repeat until gets a complete line */
                Lua.CharPtr line = Lua.lua_tostring(L, 1);
                Lua.WriteLog(line.ToString());
                status = Lua.luaL_loadbuffer(L, Lua.lua_tostring(L, 1), Lua.lua_strlen(L, 1), "=stdin");
                if (incomplete(L, status) == 0)
                {
                    break;                              /* cannot try to add lines? */
                }
                if (pushline(L, 0) == 0)                /* no more input? */
                {
                    return(-1);
                }
                Lua.lua_pushliteral(L, "\n");          /* add a new line... */
                Lua.lua_insert(L, -2);                 /* ...between the two lines */
                Lua.lua_concat(L, 3);                  /* join them */
            }
            Lua.lua_saveline(L, 1);
            Lua.lua_remove(L, 1);              /* remove line */
            return(status);
        }
Esempio n. 2
0
        //#define	IS(s)	(strcmp(argv[i],s)==0)

        static int doargs(int argc, string[] argv)
        {
            int i;
            int version = 0;

            if ((argv.Length > 0) && (argv[0] != ""))
            {
                progname = argv[0];
            }
            for (i = 1; i < argc; i++)
            {
                if (argv[i][0] != '-')                  /* end of options; keep it */
                {
                    break;
                }
                else if (Lua.strcmp(argv[i], "--") == 0)                        /* end of options; skip it */
                {
                    ++i;
                    if (version != 0)
                    {
                        ++version;
                    }
                    break;
                }
                else if (Lua.strcmp(argv[i], "-") == 0)                         /* end of options; use stdin */
                {
                    break;
                }
                else if (Lua.strcmp(argv[i], "-l") == 0)                        /* list */
                {
                    ++listing;
                }
                else if (Lua.strcmp(argv[i], "-o") == 0)                        /* output file */
                {
                    output = argv[++i];
                    if (output == null || (output[0] == 0))
                    {
                        usage(Lua.LUA_QL("-o") + " needs argument");
                    }
                    if (Lua.strcmp(argv[i], "-") == 0)
                    {
                        output = null;
                    }
                }
                else if (Lua.strcmp(argv[i], "-p") == 0)                        /* parse only */
                {
                    dumping = 0;
                }
                else if (Lua.strcmp(argv[i], "-s") == 0)                        /* strip debug information */
                {
                    stripping = 1;
                }
                else if (Lua.strcmp(argv[i], "-v") == 0)                        /* show version */
                {
                    ++version;
                }
                else                                    /* unknown option */
                {
                    usage(argv[i]);
                }
            }
            if (i == argc && ((listing != 0) || (dumping == 0)))
            {
                dumping   = 0;
                argv[--i] = Output.ToString();
            }
            if (version != 0)
            {
                Lua.printf("%s  %s\n", Lua.LUA_RELEASE, Lua.LUA_COPYRIGHT);
                if (version == argc - 1)
                {
                    Environment.Exit(Lua.EXIT_SUCCESS);
                }
            }
            return(i);
        }
Esempio n. 3
0
        public static string dolua_(string message)
        {
            if (DEBUG_)
            {
                Lua.fprintf(Lua.stdout, "%s\n", "==============>" + message);
            }
            if (L_ == null)
            {
                L_ = Lua.luaL_newstate();
                Lua.luaL_openlibs(L_);
            }

            if (DEBUG_)
            {
                Lua.fprintf(Lua.stdout, "%s\n", "==============>2");
            }

            string errorMessage = null;
            bool   printResult  = true;
            int    status       = Lua.luaL_loadbuffer(L_, message, (uint)Lua.strlen(message), "=stdin");

            if (status == 0)
            {
                if (DEBUG_)
                {
                    Lua.fprintf(Lua.stdout, "%s\n", "==============>3");
                }
                status = docall_(L_, 0, printResult ? Lua.LUA_MULTRET : 0);
            }
            if ((status != 0) && !Lua.lua_isnil(L_, -1))
            {
                if (DEBUG_)
                {
                    Lua.fprintf(Lua.stdout, "%s\n", "==============>4");
                }
                Lua.CharPtr msg = Lua.lua_tostring(L_, -1);
                if (msg == null)
                {
                    msg = "(error object is not a string)";
                }
                errorMessage = msg.ToString();
                Lua.lua_pop(L_, 1);
                /* force a complete garbage collection in case of errors */
                Lua.lua_gc(L_, Lua.LUA_GCCOLLECT, 0);
            }
            if (printResult)
            {
                //see Lua.LUA_MULTRET
                if (status == 0 && Lua.lua_gettop(L_) > 0)                    /* any result to print? */
                {
                    Lua.luaL_checkstack(L_, Lua.LUA_MINSTACK, "too many results to print");
                    Lua.lua_getglobal(L_, "print");
                    Lua.lua_insert(L_, 1);
                    if (Lua.lua_pcall(L_, Lua.lua_gettop(L_) - 1, 0, 0) != 0)
                    {
                        l_message_(progname, Lua.lua_pushfstring(L_,
                                                                 "error calling " + Lua.LUA_QL("print").ToString() + " (%s)",
                                                                 Lua.lua_tostring(L_, -1)));
                    }
                }
            }
            return(errorMessage);
        }
        static int pmain(Lua.lua_State L)
        {
            Smain s = (Smain)Lua.lua_touserdata(L, 1);

            Lua.CharPtr inputPath = s.argv[0];
            string      fileText  = System.IO.File.ReadAllText(inputPath.ToString());

            // Extract function name
            string funcName = "";
            Match  m        = Regex.Match(fileText, @"function (.+)\(");

            if (m.Success)
            {
                funcName = m.Result("$1");
            }
            else
            {
                Lua.luaL_error(L, "input file missing function definition!");
            }

            // Extract function argument(s) if any
            string argsStr = "";

            m = Regex.Match(fileText, @"function .+\((.+)\)");
            if (m.Success)
            {
                argsStr = Regex.Replace(m.Result("$1"), @"\s", "");
            }

            if (Lua.luaL_loadfile_DAI(L, inputPath, fileText) != 0)
            {
                fatal(Lua.lua_tostring(L, -1));
            }

            Lua.CharPtr outputPath = Path.ChangeExtension(inputPath.ToString(), ".luac");
            Stream      D          = Lua.fopen(outputPath, "wb");

            if (D == null)
            {
                cannot(outputPath, "open");
            }

            // Write DAI header
            BinaryWriter bw = new BinaryWriter(D);

            bw.Write((uint)0xE1850009);
            bw.Write((uint)1);
            bw.Write((uint)funcName.Length + 1);
            uint argsCnt = 0;

            if (argsStr != "")
            {
                argsCnt = 1;
                foreach (char c in argsStr)
                {
                    if (c == ',')
                    {
                        argsCnt++;
                    }
                }
            }
            bw.Write((uint)argsStr.Length + 1);
            bw.Write((uint)argsCnt);
            long dataSizePos = bw.BaseStream.Position;

            bw.Write((uint)0);
            bw.Write((char[])funcName.ToCharArray(), 0, funcName.Length);
            bw.Write((byte)0);
            if (argsCnt > 0)
            {
                bw.Write((char[])argsStr.ToCharArray(), 0, argsStr.Length);
            }
            bw.Write((byte)0);

            // Write luac data
            Lua.Proto f        = toproto(L, -1);
            long      startPos = D.Position;

            Lua.luaU_dump(L, f, writer, D, 0);
            if (Lua.ferror(D) != 0)
            {
                cannot(outputPath, "write");
            }
            // Update data size in DAI header
            long dataSize = (D.Position - startPos);

            bw.Seek((int)dataSizePos, SeekOrigin.Begin);
            bw.Write((uint)dataSize);

            if (Lua.fclose(D) != 0)
            {
                cannot(outputPath, "close");
            }
            return(0);
        }