using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace GMWare.IO
{
    /// <summary>
    /// Collection of methods for reading strings using BinaryReader
    /// </summary>
    public static class StringReadingHelper
    {
        /// <summary>
        /// Reads a string of a given length.
        /// </summary>
        /// <param name="reader">BinaryReader to read from</param>
        /// <param name="length">Length of string to read</param>
        /// <returns>The string that was read.</returns>
        public static string ReadLengthedString(BinaryReader reader, int length)
        {
            return new string(reader.ReadChars(length));
        }

        /// <summary>
        /// Reads a null terminated string.
        /// </summary>
        /// <param name="reader">BinaryReader to read from</param>
        /// <returns>The string that was read.</returns>
        public static string ReadNullTerminatedString(BinaryReader reader)
        {
            StringBuilder sb = new StringBuilder();
            for (char ch = reader.ReadChar(); ch != '\0'; ch = reader.ReadChar())
            {
                sb.Append(ch);
            }
            return sb.ToString();
        }

        /// <summary>
        /// Reads a null terminated string from within a fixed size block.
        /// </summary>
        /// <param name="reader">BinaryReader to read from</param>
        /// <param name="blockLen">The length of the fixed size block</param>
        /// <param name="encoding">The encoding the string is in</param>
        /// <returns>The string that was read.</returns>
        public static string ReadNullTerminatedStringFromFixedSizeBlock(BinaryReader reader, int blockLen, Encoding encoding)
        {
            byte[] data = reader.ReadBytes(blockLen);
            string str = encoding.GetString(data);
            int indNull = str.IndexOf('\0');
            if (indNull >= 0)
            {
                return str.Substring(0, indNull);
            }
            else
            {
                return str;
            }
        }
    }
}