Esempio n. 1
0
        public override LuaValue Execute(LuaTable enviroment, out bool isBreak)
        {
            LuaNumber start = this.Start.Evaluate(enviroment) as LuaNumber;
            LuaNumber end   = this.End.Evaluate(enviroment) as LuaNumber;

            double step = 1;

            if (this.Step != null)
            {
                step = (this.Step.Evaluate(enviroment) as LuaNumber).Number;
            }

            var table = new LuaTable(enviroment);

            table.SetNameValue(this.VarName, start);
            this.Body.Enviroment = table;

            while (step > 0 && start.Number <= end.Number ||
                   step <= 0 && start.Number >= end.Number)
            {
                var returnValue = this.Body.Execute(out isBreak);
                if (returnValue != null || isBreak == true)
                {
                    isBreak = false;
                    return(returnValue);
                }
                start.Number += step;
            }

            isBreak = false;
            return(null);
        }
Esempio n. 2
0
        public static LuaValue Wait(LuaValue[] args)
        {
            LuaNumber time = args[0] as LuaNumber;

            if (time == null)
            {
                LuaFunction cond = args[0] as LuaFunction;
                if (cond == null)
                {
                    throw new Exception("wait: object '" + args[0] + "' is not a number or function!");
                }

                bool condOK = false;
                while (!condOK)
                {
                    try
                    {
                        condOK = cond.Invoke(null).GetBooleanValue();
                    }
                    catch (Exception e)
                    {
                        A8Console.WriteLine("Exception on wait: " + e.GetType().Name + " - " + e.Message);
                    }
                    if (!condOK)
                    {
                        System.Threading.Thread.Sleep(100);
                    }
                }
            }
            else
            {
                System.Threading.Thread.Sleep(int.Parse((time.Number * 1000).ToString()));
            }
            return(null);
        }
        public static LuaValue concat(LuaValue[] values)
        {
            LuaTable  table       = values[0] as LuaTable;
            LuaString separator   = values.Length > 1 ? values[1] as LuaString : LuaString.Empty;
            LuaNumber startNumber = values.Length > 2 ? values[2] as LuaNumber : null;
            LuaNumber endNumber   = values.Length > 3 ? values[3] as LuaNumber : null;

            int start = startNumber == null ? 1 : (int)startNumber.Number;
            int end   = endNumber == null ? table.Length : (int)endNumber.Number;

            if (start > end)
            {
                return(LuaString.Empty);
            }
            else
            {
                StringBuilder text = new StringBuilder();

                for (int index = start; index < end; index++)
                {
                    text.Append(table.GetValue(index).ToString());
                    text.Append(separator.Text);
                }
                text.Append(table.GetValue(end).ToString());

                return(new LuaString(text.ToString()));
            }
        }
Esempio n. 4
0
        public static LuaValue randomseed(LuaValue[] values)
        {
            LuaNumber number = CheckArgs(values);

            randomGenerator = new Random((int)number.Number);
            return(number);
        }
Esempio n. 5
0
        public static LuaValue seek(LuaValue[] values)
        {
            LuaUserdata data   = values[0] as LuaUserdata;
            Stream      stream = null;

            StreamWriter writer = data.Value as StreamWriter;

            if (writer != null)
            {
                stream = writer.BaseStream;
            }
            else
            {
                StreamReader reader = data.Value as StreamReader;
                if (reader != null)
                {
                    stream = reader.BaseStream;
                }
            }

            if (stream != null)
            {
                LuaString whenceStr = values.Length > 1 ? values[1] as LuaString : null;
                string    whence    = whenceStr == null ? "cur" : whenceStr.Text;

                LuaNumber offsetNum = values.Length > 1 && whenceStr == null ? values[1] as LuaNumber : null;
                offsetNum = values.Length > 2 && offsetNum == null ? values[2] as LuaNumber : null;
                long offset = offsetNum == null ? 0 : (long)offsetNum.Number;

                stream.Seek(offset, GetSeekOrigin(whence));
            }

            return(null);
        }
Esempio n. 6
0
        public static LuaValue Wait(LuaValue[] args)
        {
            LuaNumber time = args[0] as LuaNumber;

            if (time == null)
            {
                throw new Exception("object '" + args[0] + "' is not a number!");
            }
            System.Threading.Thread.Sleep(int.Parse((time.Number * 1000).ToString()));
            return(null);
        }
Esempio n. 7
0
        public void NumberOperators()
        {
            LuaNumber ln = 5;

            Assert.IsTrue(6 == ln + 1);
            Assert.IsTrue(1 + ln == 6);
            Assert.IsTrue(6 == (LuaNumber)1 + ln);

            Assert.IsTrue(20 == ln * 4);

            Assert.IsNull((LuaNumber)null + 5);
        }
Esempio n. 8
0
        public static LuaValue rep(LuaValue[] values)
        {
            LuaString     str    = values[0] as LuaString;
            LuaNumber     number = values[1] as LuaNumber;
            StringBuilder text   = new StringBuilder();

            for (int i = 0; i < number.Number; i++)
            {
                text.Append(str.Text);
            }
            return(new LuaString(text.ToString()));
        }
Esempio n. 9
0
 private Object floatToInt(Object key)
 {
     if (TypeExtension.TypeEqual <double>(key))
     {
         double f = (double)key;
         if (LuaNumber.IsInteger(f))
         {
             return(Convert.ToInt64(f));
         }
     }
     return(key);
 }
Esempio n. 10
0
        public static LuaValue modf(LuaValue[] values)
        {
            LuaNumber number  = CheckArgs(values);
            double    integer = Math.Floor(number.Number);

            return(new LuaMultiValue(new LuaNumber[]
            {
                new LuaNumber(integer),
                new LuaNumber(number.Number - integer)
            }
                                     ));
        }
Esempio n. 11
0
        public static LuaValue Read(LuaValue[] values)
        {
            LuaUserdata data   = values[0] as LuaUserdata;
            TextReader  reader = data.Value as TextReader;

            LuaNumber number = values.Length > 1 ? values[1] as LuaNumber : null;

            if (number != null)
            {
                if (number.Number == 0)
                {
                    return(LuaString.Empty);
                }

                if (reader.Peek() == -1)
                {
                    return(LuaNil.Nil);
                }

                char[] block = new char[(int)number.Number];
                int    chars = reader.Read(block, 0, block.Length);
                return(new LuaString(new string(block, 0, chars)));
            }

            LuaString param = values.Length > 1 ? values[1] as LuaString : null;
            string    mode  = param == null ? "*l" : param.Text;

            switch (mode)
            {
            case "*l":
                if (reader.Peek() == -1)
                {
                    return(LuaNil.Nil);
                }
                return(new LuaString(reader.ReadLine()));

            case "*a":
                return(new LuaString(reader.ReadToEnd()));

            case "*n":
                List <char> buffer = new List <char>();
                int         ch     = reader.Peek();
                while (ch >= '0' && ch <= '9')
                {
                    buffer.Add((char)reader.Read());
                    ch = reader.Peek();
                }
                return(new LuaNumber(int.Parse(new string(buffer.ToArray()))));
            }

            return(null);
        }
 public static LuaValue setn(LuaValue[] values)         //[PixelCrushers]
 {
     if (values.Length >= 2)
     {
         LuaTable  table  = values[0] as LuaTable;
         LuaNumber number = values[1] as LuaNumber;
         if (table != null && number != null)
         {
             table.SetNameValue("n", number);
         }
     }
     return(LuaNil.Nil);
 }
Esempio n. 13
0
        public static LuaValue UnPack(LuaValue[] values)
        {
            LuaTable  table        = values[0] as LuaTable;
            LuaNumber startNumber  = values.Length > 1 ? values[1] as LuaNumber : null;
            LuaNumber lengthNumber = values.Length > 2 ? values[2] as LuaNumber : null;

            int start  = startNumber == null ? 1 : (int)startNumber.Number;
            int length = lengthNumber == null ? values.Length : (int)lengthNumber.Number;

            LuaValue[] section = new LuaValue[length];
            for (int i = 0; i < length; i++)
            {
                section[i] = table.GetValue(start + i);
            }
            return(new LuaMultiValue(section));
        }
        public static LuaValue remove(LuaValue[] values)
        {
            LuaTable table = values[0] as LuaTable;
            int      index = table.Length;

            if (values.Length == 2)
            {
                LuaNumber number = values[1] as LuaNumber;
                index = (int)number.Number;
            }

            LuaValue item = table.GetValue(index);

            table.RemoveAt(index);
            return(item);
        }
 public static LuaValue random(LuaValue[] values)
 {
     if (values.Length == 0)
     {
         return(new LuaNumber(randomGenerator.NextDouble()));
     }
     else if (values.Length == 1)
     {
         LuaNumber number1 = values[0] as LuaNumber;
         return(new LuaNumber(randomGenerator.Next((int)number1.Number + 1)));                //[PixelCrushers] Added "+1" (upper is exclusive)
     }
     else
     {
         var numbers = CheckArgs2(values);
         return(new LuaNumber(randomGenerator.Next((int)numbers.Item1, (int)numbers.Item2 + 1))); //[PixelCrushers] Added "+1" (upper is exclusive)
     }
 }
Esempio n. 16
0
        public static LuaValue @byte(LuaValue[] values)
        {
            LuaString str         = values[0] as LuaString;
            LuaNumber startNumber = values.Length > 1 ? values[1] as LuaNumber : null;
            LuaNumber endNumber   = values.Length > 2 ? values[2] as LuaNumber : null;

            int start = startNumber == null ? 1 : (int)startNumber.Number;
            int end   = endNumber == null ? start : (int)endNumber.Number;

            LuaValue[] numbers = new LuaValue[end - start + 1];
            for (int i = 0; i < numbers.Length; i++)
            {
                numbers[i] = new LuaNumber(char.ConvertToUtf32(str.Text, start - 1 + i));
            }

            return(new LuaMultiValue(numbers));
        }
Esempio n. 17
0
        public static LuaValue @byte(LuaValue[] values)
        {
            LuaString str = values[0] as LuaString;
            LuaNumber startNumber = values.Length > 1 ? values[1] as LuaNumber : null;
            LuaNumber endNumber = values.Length > 2 ? values[2] as LuaNumber : null;

            int start = startNumber == null ? 1 : (int)startNumber.Number;
            int end = endNumber == null ? start : (int)endNumber.Number;

            LuaValue[] numbers = new LuaValue[end - start + 1];
            for (int i = 0; i < numbers.Length; i++)
            {
                numbers[i] = new LuaNumber (char.ConvertToUtf32(str.Text, start - 1 + i) );
            }

            return new LuaMultiValue(numbers);
        }
Esempio n. 18
0
 public static LuaValue random(LuaValue[] values)
 {
     if (values.Length == 0)
     {
         return(new LuaNumber(randomGenerator.NextDouble()));
     }
     else if (values.Length == 1)
     {
         LuaNumber number1 = values[0] as LuaNumber;
         return(new LuaNumber(randomGenerator.Next((int)number1.Number)));
     }
     else
     {
         var numbers = CheckArgs2(values);
         return(new LuaNumber(randomGenerator.Next((int)numbers.Item1, (int)numbers.Item2)));
     }
 }
        public static LuaValue maxn(LuaValue[] values)
        {
            LuaTable table    = values[0] as LuaTable;
            double   maxIndex = double.MinValue;

            foreach (var key in table.Keys)
            {
                LuaNumber number = key as LuaNumber;
                if (number != null && number.Number > 0)
                {
                    if (number.Number > maxIndex)
                    {
                        maxIndex = number.Number;
                    }
                }
            }
            return(new LuaNumber(maxIndex));
        }
        public static LuaValue insert(LuaValue[] values)
        {
            LuaTable table = values[0] as LuaTable;

            if (values.Length == 2)
            {
                LuaValue item = values[1];
                table.AddValue(item);
            }
            else if (values.Length == 3)
            {
                LuaNumber number = values[1] as LuaNumber;
                LuaValue  item   = values[2];
                int       index  = (int)number.Number;
                table.InsertValue(index, item);
            }
            return(null);
        }
Esempio n. 21
0
        public static long?ToInteger(string s)
        {
            long?i = LuaNumber.ParseLong(s);

            if (i != null)
            {
                return(i);
            }
            double?f = LuaNumber.ParseDouble(s);

            if (f != null && LuaNumber.IsInteger(f))
            {
                return(LuaNumber.ParseLong(f));
            }
            else
            {
                return(null);
            }
        }
Esempio n. 22
0
 private static LuaNumber CheckArgs(LuaValue[] values)
 {
     if (values.Length >= 1)
     {
         LuaNumber number = values[0] as LuaNumber;
         if (number != null)
         {
             return(number);
         }
         else
         {
             throw new LuaError("bad argument #1 to 'abs' (number expected, got {0})", values[0].GetTypeCode());
         }
     }
     else
     {
         throw new LuaError("bad argument #1 to 'abs' (number expected, got no value)");
     }
 }
Esempio n. 23
0
 public static double?ToFloat(Object val)
 {
     if (TypeExtension.TypeEqual <double>(val))
     {
         return((double)val);
     }
     else if (TypeExtension.TypeEqual <long>(val))
     {
         return(Convert.ToDouble(((long)val)));
     }
     else if (TypeExtension.TypeEqual <string>(val))
     {
         return(LuaNumber.ParseDouble((string)val));
     }
     else
     {
         return(null);
     }
 }
Esempio n. 24
0
        private static int?Compare(LuaValue leftValue, LuaValue rightValue)
        {
            LuaNumber left  = leftValue as LuaNumber;
            LuaNumber right = rightValue as LuaNumber;

            if (left != null && right != null)
            {
                return(left.Number.CompareTo(right.Number));
            }

            LuaString leftString  = leftValue as LuaString;
            LuaString rightString = rightValue as LuaString;

            if (leftString != null && rightString != null)
            {
                return(StringComparer.Ordinal.Compare(leftString.Text, rightString.Text));
            }

            return(null);
        }
Esempio n. 25
0
 public static long?ToInteger(Object val)
 {
     if (TypeExtension.TypeEqual <long>(val))
     {
         return((long)val);
     }
     else if (TypeExtension.TypeEqual <double>(val))
     {
         double n = (double)val;
         return(LuaNumber.IsInteger(n) ? (long?)n : null);
     }
     else if (TypeExtension.TypeEqual <string>(val))
     {
         return(ToInteger((string)val));
     }
     else
     {
         return(null);
     }
 }
Esempio n. 26
0
        public static LuaValue sub(LuaValue[] values)
        {
            LuaString str         = values[0] as LuaString;
            LuaNumber startNumber = values[1] as LuaNumber;
            LuaNumber endNumber   = values.Length > 2 ? values[2] as LuaNumber : null;

            int start = (int)startNumber.Number;
            int end   = endNumber == null ? -1 : (int)endNumber.Number;

            if (start < 0)
            {
                start = str.Text.Length + start + 1;
            }
            if (end < 0)
            {
                end = str.Text.Length + end + 1;
            }

            return(new LuaString(str.Text.Substring(start - 1, end - start + 1)));
        }
Esempio n. 27
0
        public static LuaTable GetControlMetaTable()
        {
            if (controlMetaTable == null)
            {
                controlMetaTable = new LuaTable();

                controlMetaTable.SetNameValue("__index", new LuaFunction((values) =>
                {
                    LuaUserdata control = values[0] as LuaUserdata;
                    Type type           = control.Value.GetType();

                    LuaString member = values[1] as LuaString;
                    if (member != null)
                    {
                        return(GetMemberValue(control.Value, type, member.Text));
                    }

                    LuaNumber index = values[1] as LuaNumber;
                    if (index != null)
                    {
                        return(GetIndexerValue(control.Value, type, index.Number));
                    }

                    return(LuaNil.Nil);
                }));

                controlMetaTable.SetNameValue("__newindex", new LuaFunction((values) =>
                {
                    LuaUserdata control = values[0] as LuaUserdata;
                    LuaString member    = values[1] as LuaString;
                    LuaValue value      = values[2];

                    Type type = control.Value.GetType();
                    SetMemberValue(control.Value, type, member.Text, value.Value);
                    return(null);
                }));
            }

            return(controlMetaTable);
        }
Esempio n. 28
0
        public static LuaValue find(LuaValue[] values) //[PixelCrushers] Added string.find()
        {
            LuaString strValue     = values[0] as LuaString;
            LuaString patternValue = values[1] as LuaString;
            LuaNumber initNumber   = values.Length > 2 ? values[2] as LuaNumber : null;
            //---Not implemented: LuaBoolean plainBoolean = values.Length > 3 ? values[3] as LuaBoolean : null;
            string s       = strValue.ToString();
            string pattern = patternValue.ToString();
            int    init    = (initNumber != null) ? (int)initNumber.Number : 1;
            //---Not implemented: bool plain = (plainBoolean != null) ? plainBoolean.BoolValue : false;
            var startIndex = s.IndexOf(pattern, init - 1) + 1;

            if (startIndex == 0)
            {
                return(LuaNil.Nil);
            }
            var endIndex = startIndex + pattern.Length - 1;
            var result   = new LuaTable();

            result.AddValue(new LuaNumber(startIndex));
            result.AddValue(new LuaNumber(endIndex));
            return(result);
        }
Esempio n. 29
0
        private static Tuple <double, double> CheckArgs2(LuaValue[] values)
        {
            if (values.Length >= 2)
            {
                LuaNumber number1 = values[0] as LuaNumber;
                if (number1 == null)
                {
                    throw new LuaError("bad argument #1 to 'abs' (number expected, got {0})", values[0].GetTypeCode());
                }

                LuaNumber number2 = values[1] as LuaNumber;
                if (number2 == null)
                {
                    throw new LuaError("bad argument #2 to 'abs' (number expected, got {0})", values[1].GetTypeCode());
                }

                return(Tuple.Create(number1.Number, number2.Number));
            }
            else
            {
                throw new LuaError("bad argument #1 to 'abs' (number expected, got no value)");
            }
        }
Esempio n. 30
0
        public static LuaValue Select(LuaValue[] values)
        {
            LuaNumber number = values[0] as LuaNumber;

            if (number != null)
            {
                int        index = (int)number.Number;
                LuaValue[] args  = new LuaValue[values.Length - index];
                for (int i = 0; i < args.Length; i++)
                {
                    args[i] = values[index + i];
                }
                return(new LuaMultiValue(args));
            }

            LuaString text = values[0] as LuaString;

            if (text.Text == "#")
            {
                return(new LuaNumber(values.Length - 1));
            }

            return(LuaNil.Nil);
        }
Esempio n. 31
0
        public static LuaValue cosh(LuaValue[] values)
        {
            LuaNumber number = CheckArgs(values);

            return(new LuaNumber(Math.Cosh(number.Number)));
        }