public static void resume(LuaInterop lua) { LuaThread co = lua.Argument <LuaThread>(0); co.BeginResume(lua.ArgumentCount - 1); for (int argument = 0; argument < lua.ArgumentCount - 1; ++argument) { co.ResumeArgument(argument, lua.Argument(argument)); } int resultCount; try { resultCount = co.Resume(LuaThread.VarResult); } catch (Exception e) { lua.BeginReturn(2); lua.ReturnResult(0, false); lua.ReturnResult(1, e.Message); lua.EndReturn(); return; } lua.BeginReturn(resultCount + 1); lua.ReturnResult(0, true); for (int result = 0; result < resultCount; ++result) { lua.ReturnResult(result + 1, co.ResumeResult(result)); } co.EndResume(); lua.EndReturn(); }
public void read(LuaInterop lua) { EnsureReader(); if (lua.ArgumentCount > 0) { List <LuaValue> results = new List <LuaValue>(); for (int argument = 0; argument < lua.ArgumentCount; ++argument) { string type = lua.ArgumentType(argument); if (type == "number") { int number = lua.Argument <int>(argument); if (number > 0) { // Read actual number of characters. char[] s = new char[number]; int count = reader.ReadBlock(s, 0, number); if (count > 0) { results.Add(new String(s, 0, count)); } else { results.Add(null); } } else { // Check for EOF. if (reader.Peek() != -1) { results.Add(""); } else { results.Add(null); } } } else { string format = lua.Argument <string>(argument); if (format == "*n") { StringBuilder s = new StringBuilder(); // Read a number token from the file. while (Char.IsWhiteSpace(GetChar())) { Shift(); } if (GetChar() == '+' || GetChar() == '-') { s.Append(Shift()); } while (Char.IsDigit(GetChar()) || GetChar() == '.') { s.Append(Shift()); } if (GetChar() == 'e' || GetChar() == 'E') { s.Append(Shift()); if (GetChar() == '+' || GetChar() == '-') { s.Append(Shift()); } } while (Char.IsLetter(GetChar()) || Char.IsNumber(GetChar()) || GetChar() == '_') { s.Append(Shift()); } // Parse the number. int integerValue; double doubleValue; string v = s.ToString(); if (v.StartsWith("0x") && Int32.TryParse(v.Substring(2), NumberStyles.HexNumber, NumberFormatInfo.InvariantInfo, out integerValue)) { results.Add(integerValue); } else if (Int32.TryParse(v, NumberStyles.Number, NumberFormatInfo.InvariantInfo, out integerValue)) { results.Add(integerValue); } else if (Double.TryParse(v, NumberStyles.Float, NumberFormatInfo.InvariantInfo, out doubleValue)) { results.Add(doubleValue); } else { results.Add(null); } } else if (format == "*a") { results.Add(reader.ReadToEnd() ?? ""); } else if (format == "*l") { results.Add(reader.ReadLine()); } } } lua.BeginReturn(results.Count); for (int result = 0; result < results.Count; ++result) { lua.ReturnResult(result, results[result]); } lua.EndReturn(); } else { lua.Return(reader.ReadLine()); } }