MsfDirectory.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. // Copyright (c) Microsoft. All rights reserved.
  2. // Licensed under the MIT license. See LICENSE file in the project root for full license information.
  3. using System;
  4. namespace Microsoft.Cci.Pdb {
  5. internal class MsfDirectory {
  6. internal MsfDirectory(PdbReader reader, PdbFileHeader head, BitAccess bits) {
  7. int pages = reader.PagesFromSize(head.directorySize);
  8. // 0..n in page of directory pages.
  9. bits.MinCapacity(head.directorySize);
  10. int directoryRootPages = head.directoryRoot.Length;
  11. int pagesPerPage = head.pageSize / 4;
  12. int pagesToGo = pages;
  13. for (int i = 0; i < directoryRootPages; i++) {
  14. int pagesInThisPage = pagesToGo <= pagesPerPage ? pagesToGo : pagesPerPage;
  15. reader.Seek(head.directoryRoot[i], 0);
  16. bits.Append(reader.reader, pagesInThisPage * 4);
  17. pagesToGo -= pagesInThisPage;
  18. }
  19. bits.Position = 0;
  20. DataStream stream = new DataStream(head.directorySize, bits, pages);
  21. bits.MinCapacity(head.directorySize);
  22. stream.Read(reader, bits);
  23. // 0..3 in directory pages
  24. int count;
  25. bits.ReadInt32(out count);
  26. // 4..n
  27. int[] sizes = new int[count];
  28. bits.ReadInt32(sizes);
  29. // n..m
  30. streams = new DataStream[count];
  31. for (int i = 0; i < count; i++) {
  32. if (sizes[i] <= 0) {
  33. streams[i] = new DataStream();
  34. } else {
  35. streams[i] = new DataStream(sizes[i], bits,
  36. reader.PagesFromSize(sizes[i]));
  37. }
  38. }
  39. }
  40. internal DataStream[] streams;
  41. }
  42. }