ensemble.cc 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. // Copyright (c) 2011 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "courgette/ensemble.h"
  5. #include <stddef.h>
  6. #include <stdint.h>
  7. #include "base/strings/string_number_conversions.h"
  8. #include "courgette/program_detector.h"
  9. #include "courgette/region.h"
  10. #include "courgette/simple_delta.h"
  11. #include "courgette/streams.h"
  12. namespace courgette {
  13. Element::Element(ExecutableType kind,
  14. Ensemble* ensemble,
  15. const Region& region)
  16. : kind_(kind), ensemble_(ensemble), region_(region) {
  17. }
  18. Element::~Element() = default;
  19. std::string Element::Name() const {
  20. return ensemble_->name() + "(" + base::NumberToString(kind()) + "," +
  21. base::NumberToString(offset_in_ensemble()) + "," +
  22. base::NumberToString(region().length()) + ")";
  23. }
  24. // Scans the Ensemble's region, sniffing out Elements. We assume that the
  25. // elements do not overlap.
  26. Status Ensemble::FindEmbeddedElements() {
  27. size_t length = region_.length();
  28. const uint8_t* start = region_.start();
  29. size_t position = 0;
  30. while (position < length) {
  31. ExecutableType type;
  32. size_t detected_length;
  33. Status result = DetectExecutableType(start + position,
  34. length - position,
  35. &type, &detected_length);
  36. if (result == C_OK) {
  37. Region region(start + position, detected_length);
  38. Element* element = new Element(type, this, region);
  39. owned_elements_.push_back(element);
  40. elements_.push_back(element);
  41. position += region.length();
  42. } else {
  43. position++;
  44. }
  45. }
  46. return C_OK;
  47. }
  48. Ensemble::~Ensemble() {
  49. for (size_t i = 0; i < owned_elements_.size(); ++i)
  50. delete owned_elements_[i];
  51. }
  52. } // namespace