示例#1
0
            private IodineObject Writeln(VirtualMachine vm, IodineObject self, IodineObject[] args)
            {
                IodineStream thisObj = self as IodineStream;

                if (thisObj.Closed)
                {
                    vm.RaiseException(new IodineIOException("Stream has been closed!"));
                    return(null);
                }

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

                foreach (IodineObject obj in args)
                {
                    if (!thisObj.Write(obj))
                    {
                        vm.RaiseException(new IodineNotSupportedException(
                                              "The requested type is not supported"
                                              ));
                        return(null);
                    }
                    foreach (byte b in Environment.NewLine)
                    {
                        thisObj.File.WriteByte(b);
                    }
                }
                return(null);
            }
示例#2
0
            private IodineObject Tell(VirtualMachine vm, IodineObject self, IodineObject[] args)
            {
                IodineStream thisObj = self as IodineStream;

                if (thisObj.Closed)
                {
                    vm.RaiseException("Stream has been closed!");
                    return(null);
                }
                return(new IodineInteger(thisObj.File.Position));
            }
示例#3
0
            private IodineObject Flush(VirtualMachine vm, IodineObject self, IodineObject[] args)
            {
                IodineStream thisObj = self as IodineStream;

                if (thisObj.Closed)
                {
                    vm.RaiseException("Stream has been closed!");
                    return(null);
                }
                thisObj.File.Flush();
                return(null);
            }
示例#4
0
            private IodineObject Readln(VirtualMachine vm, IodineObject self, IodineObject[] argss)
            {
                IodineStream thisObj = self as IodineStream;

                if (thisObj.Closed)
                {
                    vm.RaiseException("Stream has been closed!");
                    return(null);
                }

                if (!thisObj.CanRead)
                {
                    vm.RaiseException("Stream is not open for reading!");
                    return(null);
                }

                return(thisObj.ReadLine());
            }
示例#5
0
        private static byte[] PreformHash(VirtualMachine vm, IodineObject obj, HashAlgorithm algol)
        {
            if (obj is IodineString || obj is IodineBytes)
            {
                byte[] data = GetBytes(obj);

                return(algol.ComputeHash(data));
            }

            IodineStream stream = obj as IodineStream;

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

            return(algol.ComputeHash(stream.File));
        }
示例#6
0
            private IodineObject Write(VirtualMachine vm, IodineObject self, IodineObject[] args)
            {
                IodineStream thisObj = self as IodineStream;

                if (thisObj.Closed)
                {
                    vm.RaiseException(new IodineIOException("Stream has been closed!"));
                    return(null);
                }

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

                foreach (IodineObject obj in args)
                {
                    thisObj.Write(obj);
                }
                return(null);
            }
示例#7
0
            private IodineObject Read(VirtualMachine vm, IodineObject self, IodineObject[] args)
            {
                IodineStream thisObj = self as IodineStream;

                if (thisObj.Closed)
                {
                    vm.RaiseException("Stream has been closed!");
                    return(null);
                }

                if (!thisObj.CanRead)
                {
                    vm.RaiseException("Stream is not open for reading!");
                    return(null);
                }

                if (args.Length > 0)
                {
                    IodineInteger intv = args [0] as IodineInteger;

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

                    byte[] buf = new byte[(int)intv.Value];
                    thisObj.File.Read(buf, 0, buf.Length);
                    return(new IodineString(Encoding.UTF8.GetString(buf)));
                }
                else
                {
                    vm.RaiseException(new IodineArgumentException(1));
                    return(null);
                }
            }
示例#8
0
            private IodineObject ReadAll(VirtualMachine vm, IodineObject self, IodineObject[] args)
            {
                IodineStream thisObj = self as IodineStream;

                if (thisObj.Closed)
                {
                    vm.RaiseException("Stream has been closed!");
                    return(null);
                }

                List <byte> bytes = new List <byte> ();
                int         ch    = 0;

                while ((ch = thisObj.File.ReadByte()) != -1)
                {
                    bytes.Add((byte)ch);
                }

                if (thisObj.BinaryMode)
                {
                    return(new IodineBytes(bytes.ToArray()));
                }
                return(new IodineString(Encoding.UTF8.GetString(bytes.ToArray())));
            }
示例#9
0
            private IodineObject Seek(VirtualMachine vm, IodineObject self, IodineObject[] args)
            {
                IodineStream thisObj = self as IodineStream;

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

                if (thisObj.Closed)
                {
                    vm.RaiseException(new IodineException("The underlying stream has been closed!"));
                    return(null);
                }

                if (!thisObj.File.CanSeek)
                {
                    vm.RaiseException(new IodineIOException("The stream does not support seek"));
                    return(null);
                }

                IodineInteger offsetObj = args [0] as IodineInteger;
                int           whence    = SEEK_SET;
                long          offset    = offsetObj.Value;

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

                if (args.Length > 1)
                {
                    IodineInteger whenceObj = args [1] as IodineInteger;

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

                    whence = (int)whenceObj.Value;
                }

                switch (whence)
                {
                case SEEK_SET:
                    thisObj.File.Position = offset;
                    break;

                case SEEK_CUR:
                    thisObj.File.Seek(offset, SeekOrigin.Current);
                    break;

                case SEEK_END:
                    thisObj.File.Seek(offset, SeekOrigin.End);
                    break;

                default:
                    vm.RaiseException(new IodineNotSupportedException());
                    return(null);
                }
                return(null);
            }