Пример #1
0
        public override IodineObject NotEquals(VirtualMachine vm, IodineObject right)
        {
            IodineBytes str = right as IodineBytes;

            if (str == null)
            {
                return(base.NotEquals(vm, right));
            }
            return(IodineBool.Create(!Enumerable.SequenceEqual <byte> (str.Value, Value)));
        }
Пример #2
0
        public override IodineObject Add(VirtualMachine vm, IodineObject right)
        {
            IodineBytes str = right as IodineBytes;

            if (str == null)
            {
                vm.RaiseException("Right hand value must be of type Bytes!");
                return(null);
            }
            byte[] newArr = new byte[str.Value.Length + Value.Length];
            Array.Copy(Value, newArr, Value.Length);
            Array.Copy(str.Value, 0, newArr, Value.Length, str.Value.Length);
            return(new IodineBytes(newArr));
        }
Пример #3
0
        private IodineObject write(VirtualMachine vm, IodineObject self, IodineObject[] args)
        {
            if (Closed)
            {
                vm.RaiseException(new IodineIOException("Stream has been closed!"));
                return(null);
            }

            if (!CanWrite)
            {
                vm.RaiseException(new IodineIOException("Can not write to stream!"));
                return(null);
            }

            foreach (IodineObject obj in args)
            {
                if (obj is IodineString)
                {
                    write(obj.ToString());
                }
                else if (obj is IodineBytes)
                {
                    IodineBytes arr = obj as IodineBytes;
                    File.Write(arr.Value, 0, arr.Value.Length);
                }
                else if (obj is IodineInteger)
                {
                    IodineInteger intVal = obj as IodineInteger;
                    write((byte)intVal.Value);
                }
                else if (obj is IodineByteArray)
                {
                    IodineByteArray arr = obj as IodineByteArray;
                    File.Write(arr.Array, 0, arr.Array.Length);
                }
                else
                {
                    vm.RaiseException(new IodineTypeException(""));
                }
            }
            return(null);
        }
Пример #4
0
        public bool Write(IodineObject obj)
        {
            if (obj is IodineString)
            {
                Write(obj.ToString());
            }
            else if (obj is IodineBytes)
            {
                IodineBytes arr = obj as IodineBytes;
                File.Write(arr.Value, 0, arr.Value.Length);
            }
            else if (obj is IodineInteger)
            {
                IodineInteger intVal = obj as IodineInteger;
                Write((byte)intVal.Value);
            }
            else
            {
                return(false);
            }

            return(true);
        }
Пример #5
0
        /**
         * Iodine Function: Bytes.contains (self, value)
         * Description: Returns true if this byte string contains value
         */
        private IodineObject Contains(VirtualMachine vm, IodineObject self, IodineObject[] args)
        {
            if (args.Length == 0)
            {
                vm.RaiseException(new IodineArgumentException(1));
                return(null);
            }

            IodineBytes needle = args [0] as IodineBytes;

            if (needle == null)
            {
                vm.RaiseException(new IodineTypeException("Bytes"));
                return(null);
            }

            for (int i = 0; i < Value.Length; i++)
            {
                bool found = true;

                for (int sI = 0; sI < needle.Value.Length; sI++)
                {
                    if (needle.Value [sI] != Value [i])
                    {
                        found = false;
                        break;
                    }
                }

                if (found)
                {
                    return(IodineBool.True);
                }
            }

            return(IodineBool.False);
        }
Пример #6
0
        private IodineObject unpack(VirtualMachine vm, IodineObject self, IodineObject[] args)
        {
            if (args.Length < 2)
            {
                vm.RaiseException(new IodineArgumentException(2));
                return(null);
            }
            IodineString format = args [0] as IodineString;
            IodineBytes  str    = args [1] as IodineBytes;

            if (format == null)
            {
                vm.RaiseException(new IodineTypeException("Str"));
                return(null);
            }

            if (str == null)
            {
                vm.RaiseException(new IodineTypeException("Tuple"));
                return(null);
            }
            List <IodineObject> items = new List <IodineObject> ();

            using (MemoryStream ms = new MemoryStream(str.Value))
                using (BinaryReader br = new BinaryReader(ms)) {
                    int i = 0;
                    while (i < format.Value.Length)
                    {
                        int arg = 1;
                        if (i < format.Value.Length && char.IsDigit(format.Value [i]))
                        {
                            StringBuilder accum = new StringBuilder();
                            do
                            {
                                accum.Append(format.Value [i++]);
                            } while (i < format.Value.Length && char.IsDigit(format.Value [i]));
                            arg = Int32.Parse(accum.ToString());
                        }
                        if (i < format.Value.Length)
                        {
                            char specifier = format.Value [i++];
                            if (i < format.Value.Length && char.IsDigit(format.Value [i]))
                            {
                                StringBuilder accum = new StringBuilder();
                                do
                                {
                                    accum.Append(format.Value [i++]);
                                } while (i < format.Value.Length && char.IsDigit(format.Value [i]));
                                arg = Int32.Parse(accum.ToString());
                            }
                            if (specifier == 'x')
                            {
                                for (int j = 0; j < arg; j++)
                                {
                                    br.ReadByte();
                                }
                            }
                            else
                            {
                                items.Add(unpackObj(vm, br, specifier, arg));
                            }
                        }
                    }
                    return(new IodineTuple(items.ToArray()));
                }
        }
Пример #7
0
        private IodineObject Hex(VirtualMachine vm, IodineObject self, IodineObject[] args)
        {
            string[] lut = new string[] {
                "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0a", "0b", "0c", "0d", "0e", "0f",
                "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "1a", "1b", "1c", "1d", "1e", "1f",
                "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "2a", "2b", "2c", "2d", "2e", "2f",
                "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "3a", "3b", "3c", "3d", "3e", "3f",
                "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "4a", "4b", "4c", "4d", "4e", "4f",
                "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "5a", "5b", "5c", "5d", "5e", "5f",
                "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6a", "6b", "6c", "6d", "6e", "6f",
                "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "7a", "7b", "7c", "7d", "7e", "7f",
                "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "8a", "8b", "8c", "8d", "8e", "8f",
                "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "9a", "9b", "9c", "9d", "9e", "9f",
                "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "aa", "ab", "ac", "ad", "ae", "af",
                "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7", "b8", "b9", "ba", "bb", "bc", "bd", "be", "bf",
                "c0", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "ca", "cb", "cc", "cd", "ce", "cf",
                "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "da", "db", "dc", "dd", "de", "df",
                "e0", "e1", "e2", "e3", "e4", "e5", "e6", "e7", "e8", "e9", "ea", "eb", "ec", "ed", "ee", "ef",
                "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "fa", "fb", "fc", "fd", "fe", "ff"
            };

            if (args.Length <= 0)
            {
                vm.RaiseException(new IodineArgumentException(1));
                return(IodineNull.Instance);
            }


            StringBuilder accum = new StringBuilder();

            if (args [0] is IodineBytes)
            {
                IodineBytes bytes = args [0] as IodineBytes;

                foreach (byte b in bytes.Value)
                {
                    accum.Append(lut [b]);
                }

                return(new IodineString(accum.ToString()));
            }

            if (args [0] is IodineString)
            {
                IodineString str = args [0] as IodineString;

                foreach (byte b in str.Value)
                {
                    accum.Append(lut [b]);
                }

                return(new IodineString(accum.ToString()));
            }

            IodineObject iterator = args [0].GetIterator(vm);


            if (iterator != null)
            {
                while (iterator.IterMoveNext(vm))
                {
                    IodineInteger b = iterator.IterGetCurrent(vm) as IodineInteger;

                    if (b == null)
                    {
                        vm.RaiseException(new IodineTypeException("Int"));
                        return(IodineNull.Instance);
                    }

                    accum.Append(lut [b.Value & 0xFF]);
                }
            }

            return(new IodineString(accum.ToString()));
        }