internal SegmentBreakdownProvider(string name, ILinesProvider linesProvider, string[] segmentNames)
            : this(name, linesProvider)
        {
            if (segmentNames == null)
                throw new ArgumentNullException("segmentNames");

            _segmentNameSelector = segmentNames.Contains;
        }
        private SegmentBreakdownProvider(string name, ILinesProvider linesProvider)
        {
            if (linesProvider == null)
                throw new ArgumentNullException("linesProvider");

            _name = name;
            _linesProvider = linesProvider;
        }
        internal SegmentBreakdownProvider(string name, ILinesProvider linesProvider, Func<string, Boolean> segmentNameSelector)
            : this(name, linesProvider)
        {
            if (segmentNameSelector == null)
                throw new ArgumentNullException("segmentNameSelector");

            _segmentNameSelector = segmentNameSelector;
        }
        public static ZilogModule[] Parse(ILinesProvider linesProvider)
        {
            var lines = linesProvider.GetLines();

            var startIndex = lines.IndexOf("SEGMENTS WITHIN MODULES:");
            var endindex = lines.IndexOf("EXTERNAL DEFINITIONS:");

            var modules = new List<ZilogModule>();

            if (startIndex >= 0 && endindex >= 0)
            {
                var lineIndex = startIndex + 3;

                ZilogModule zilogModule = null;

                while (lineIndex < endindex)
                {
                    if (lines[lineIndex].StartsWith("Module"))
                    {
                        zilogModule = new ZilogModule()
                        {
                            Name = lines[lineIndex].Replace("Module:", "").Trim()
                        };

                        modules.Add(zilogModule);
                    }

                    if (lines[lineIndex].Trim().StartsWith("Segment:"))
                    {
                        var segment = new Segment();

                        segment.Name = lines[lineIndex].Substring(13, 30).Trim();

                        var sizeText = lines[lineIndex].Substring(70, 6).Trim();

                        segment.Size = Convert.ToInt32(sizeText, 16);

                        if (zilogModule != null)
                        {
                            zilogModule.Segments.Add(segment);
                        }
                    }

                    lineIndex++;
                }
            }

            //Return the array
            return modules.ToArray();
        }