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); }
//#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); }
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); }