/// <summary>
        /// Parses the specified string.
        /// </summary>
        /// <param name="s">The string.</param>
        /// <returns>The CMapToUnicode or null if the characters map directly to unicode</returns>
        public static CMapToUnicode Parse(string s)
        {
            CMapToUnicode parse = new CMapToUnicode();

            InternalParseBFRange(s, parse);
            InternalParseBFChar(s, parse);

            return(parse.BFRanges.Count == 0 ? null : parse);
        }
        private static void InternalParseBFRange(string s, CMapToUnicode parse)
        {
            string bfRange;
            int    beginBfRangePosition = s.IndexOf("beginbfrange", StringComparison.CurrentCultureIgnoreCase);

            if (beginBfRangePosition == -1)
            {
                return;
            }
            beginBfRangePosition += 12;

            int endBfRangePosition = s.IndexOf("endbfrange", beginBfRangePosition, StringComparison.CurrentCultureIgnoreCase);

            bfRange = s.Substring(beginBfRangePosition, endBfRangePosition - beginBfRangePosition);

            int i = 0;

            Statement.SkipSpace(bfRange, ref i);
            while (i < bfRange.Length)
            {
                parse.BFRanges.Add(BFRange.Parse(bfRange, ref i));
                Statement.SkipSpace(bfRange, ref i);
            }
        }