Subversion Repositories display

Rev

Rev 219 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package test.display;

import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

/**
 * Used to analyse possible sections in the file.  You add sections that you
 * find and then call analyze which sorts them and sees if there are any gaps
 * or overlaps - in which case you have found the wrong thing or are missing
 * some.
 */

public class SectList implements Iterable<Section> {
        private final List<Section> sections = new ArrayList<Section>();

        public Section get(int n) {
                return sections.get(n);
        }

        public void add(Section sect) {
                sections.add(sect);
        }

        public void add(int n, Section section) {
                sections.add(n, section);
        }

        public int size() {
                return sections.size();
        }

        public Iterator<Section> iterator() {
                return sections.iterator();
        }

        public void analyze(PrintStream outStream) {
                outStream.println("--Analyse sections that are known--");

                List<Section> sectionList = new ArrayList<Section>(sections);
                Collections.sort(sectionList);

                for (int i = 0; i < sectionList.size(); i++) {
                        Section s = sectionList.get(i);
                        outStream.printf("%-15s %08x len=%-6x next=%08x\n",
                                        s.getName(), s.getStart(), s.getLen(), s.getEnd());
                        if (s.getRecordSize() > 0) {
                                outStream.printf(" fixed record size %d\n", s.getRecordSize());
                                if (s.getLen() > 0) {
                                        double nrecords = (double) s.getLen() / s.getRecordSize();
                                        outStream.printf(" number of records %.2f\n", nrecords);
                                        if (nrecords != (int) nrecords)
                                                outStream.printf(" +++ FRACTIONAL NUMBER OF RECORDS\n");
                                }
                        }

                        // The implied size is the distance between this sect and the next.
                        // Usually if we have everything, then the size of the section
                        // should be equal to the implied size.  This allows us to spot
                        // missing sections.
                        if (i < sectionList.size() - 1) {
                                Section next = sectionList.get(i + 1);
                                long implen = next.getStart() - s.getStart();
                                outStream.printf(" implied size=%-10d  (%#x)%s\n",
                                                implen, implen,
                                                (implen==s.getLen() || s.getStart() == 0)?"":"  +++MISMATCH");

                                // If there is a length and it is smaller than the implied length, see
                                // if it is a simple multiple of it.
                                int len = s.getLen();
                                if (len > 0 && len < implen) {
                                        double scale = implen/len;
                                        outStream.printf(" size multiplier %.2f %d\n", scale, implen/len);
                                        s.setRecordSize((int) (implen/len));

                                }
                        }
                }

                outStream.println("--End of section dump--");
        }
}