Exemplo n.º 1
0
        //String
        public bool findString(IffTag tag, ref string result, SeekPos seekPos = SeekPos.BEGIN)
        {
            //Begin chunk
            if (!findChunk(tag, seekPos))
            {
                return(false);
            }

            //Read
            switch (currentChunk.type)
            {
            case IffWriter.ChunkType.UTF8:
            {
                //Read data
                byte[] bytes = reader.ReadBytes((int)currentChunk.size);
                result = System.Text.Encoding.UTF8.GetString(bytes);
                break;
            }

            default:
            {
                Debug.Assert(false);
                endChunk();
                return(false);
            }
            }

            //End
            endChunk();

            //Return
            return(true);
        }
Exemplo n.º 2
0
        TYPE readStruct <TYPE>(IffTag tag, TYPE defaultValue, SeekPos seekPos = SeekPos.BEGIN) where TYPE : struct
        {
            TYPE result = defaultValue;

            if (findStruct <TYPE>(tag, ref result, seekPos))
            {
                return(result);
            }
            else
            {
                return(defaultValue);
            }
        }
Exemplo n.º 3
0
        public string readString(IffTag tag, string defaultValue, SeekPos seekPos = SeekPos.BEGIN)
        {
            string value = "";

            if (findString(tag, ref value, seekPos))
            {
                return(value);
            }
            else
            {
                return(defaultValue);
            }
        }
Exemplo n.º 4
0
        public Single readFloat32(IffTag tag, Single defaultValue, SeekPos seekPos = SeekPos.BEGIN)
        {
            Single value = 0;

            if (findFloat32(tag, ref value, seekPos))
            {
                return(value);
            }
            else
            {
                return(defaultValue);
            }
        }
Exemplo n.º 5
0
        public Double readFloat64(IffTag tag, Double defaultValue, SeekPos seekPos = SeekPos.BEGIN)
        {
            Double value = 0;

            if (findFloat64(tag, ref value, seekPos))
            {
                return(value);
            }
            else
            {
                return(defaultValue);
            }
        }
Exemplo n.º 6
0
        public byte readInt8(IffTag tag, byte defaultValue, SeekPos seekPos = SeekPos.BEGIN)
        {
            byte value = 0;

            if (findInt8(tag, ref value, seekPos))
            {
                return(value);
            }
            else
            {
                return(defaultValue);
            }
        }
Exemplo n.º 7
0
        public Int64 readInt64(IffTag tag, Int64 defaultValue, SeekPos seekPos = SeekPos.BEGIN)
        {
            Int64 value = 0;

            if (findInt64(tag, ref value, seekPos))
            {
                return(value);
            }
            else
            {
                return(defaultValue);
            }
        }
Exemplo n.º 8
0
        public UInt32 readUInt32(IffTag tag, UInt32 defaultValue, SeekPos seekPos = SeekPos.BEGIN)
        {
            UInt32 value = 0;

            if (findUInt32(tag, ref value, seekPos))
            {
                return(value);
            }
            else
            {
                return(defaultValue);
            }
        }
Exemplo n.º 9
0
        //Read
        public bool readBool(IffTag tag, bool defaultValue, SeekPos seekPos = SeekPos.BEGIN)
        {
            bool value = false;

            if (findBool(tag, ref value, seekPos))
            {
                return(value);
            }
            else
            {
                return(defaultValue);
            }
        }
Exemplo n.º 10
0
        public bool findFloat64(IffTag tag, ref Double result, SeekPos seekPos = SeekPos.BEGIN)
        {
            //Begin chunk
            if (!findChunk(tag, seekPos))
            {
                return(false);
            }

            //Parse
            result = BitConverter.ToDouble(parseNumeric(), 0);

            //Return
            endChunk();
            return(true);
        }
Exemplo n.º 11
0
        public bool findInt8(IffTag tag, ref byte result, SeekPos seekPos = SeekPos.BEGIN)
        {
            //Begin chunk
            if (!findChunk(tag, seekPos))
            {
                return(false);
            }

            //Parse
            result = parseNumeric()[0];

            //Return
            endChunk();
            return(true);
        }
Exemplo n.º 12
0
        public void seekChunk(Int32 offset, SeekPos seekPos)
        {
            offset += (Int32)currentChunk.dataPos;
            SeekOrigin way;

            switch (seekPos)
            {
            default:
            case SeekPos.BEGIN: way = SeekOrigin.Begin; break;

            case SeekPos.CURRENT: way = SeekOrigin.Current; break;

            case SeekPos.END: way = SeekOrigin.End; break;
            }
            stream.Seek(offset, way);
        }
Exemplo n.º 13
0
        //Struct
        bool findStruct <TYPE>(IffTag tag, ref TYPE data, SeekPos seekPos = SeekPos.BEGIN) where TYPE : struct
        {
            //Begin chunk
            if (!findChunk(tag, seekPos))
            {
                return(false);
            }

            //Read
            switch (currentChunk.type)
            {
            case IffWriter.ChunkType.BINARY:
            {
                //Check size
                int structSize = Marshal.SizeOf(data);
                if (currentChunk.size != structSize)
                {
                    Debug.Assert(false);
                    return(false);
                }

                //Read data
                byte[]   bytes  = reader.ReadBytes(structSize);
                GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
                data = (TYPE)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(TYPE));
                handle.Free();

                //End
                break;
            }

            default:
            {
                Debug.Assert(false);
                endChunk();
                return(false);
            }
            }

            //End
            endChunk();

            //Return
            return(true);
        }
Exemplo n.º 14
0
        public byte[] readBytes(IffTag tag, byte[] defaultValue, SeekPos seekPos = SeekPos.BEGIN)
        {
            if (findChunk(tag, seekPos))
            {
                if (currentChunk.type != IffWriter.ChunkType.BINARY)
                {
                    endChunk();
                    return(defaultValue);
                }
                else
                {
                    var data = reader.ReadBytes((int)currentChunk.size);
                    endChunk();
                    return(data);
                }
            }

            //Return default
            return(defaultValue);
        }
Exemplo n.º 15
0
        //Standard Chunks
        public bool findChunk(IffTag tag, SeekPos seekPos = SeekPos.BEGIN)
        {
            if (chunkStack.Count != 0)
            {
                //Move stream to beginning of chunk
                if (seekPos == SeekPos.BEGIN)
                {
                    stream.Seek(currentChunk.dataPos, SeekOrigin.Begin);
                }

                //Look for the chunk
                while (true)
                {
                    //Read in chunk header
                    Chunk chunk = new Chunk();
                    if (!readChunk(ref chunk))
                    {
                        return(false);
                    }

                    //Check if tag
                    if (chunk.tag == tag.value)
                    {
                        //Push chunk
                        chunkStack.Add(chunk);
                        currentChunk = chunk;

                        //Return
                        return(true);
                    }
                    else
                    {
                        //Otherwise, skip this tag
                        stream.Seek(chunk.size, SeekOrigin.Current);
                    }
                }
            }
            else
            {
                //Read in chunk header
                Chunk chunk = new Chunk();
                if (!readChunk(ref chunk))
                {
                    return(false);
                }

                //Check if tag
                if (chunk.tag == tag.value)
                {
                    //Push chunk
                    chunkStack.Add(chunk);
                    currentChunk = chunk;

                    //Return
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
        }