[go: nahoru, domu]

blob: eb09a770b3c114a72092259bcc6e077b054bbaa4 [file] [log] [blame]
Avi Drissman0ff8a7e2022-09-13 18:35:421// Copyright 2011 The Chromium Authors
sra@chromium.org04ca1bc2009-05-08 23:00:292// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
sra@chromium.org04ca1bc2009-05-08 23:00:295#include "courgette/ensemble.h"
6
aviab98dcc92015-12-21 19:35:337#include <stddef.h>
8#include <stdint.h>
9
avi@chromium.org68c986e2013-06-11 13:26:2510#include "base/strings/string_number_conversions.h"
huangs8d5be252016-01-29 22:14:1811#include "courgette/program_detector.h"
sra@chromium.org04ca1bc2009-05-08 23:00:2912#include "courgette/region.h"
sra@chromium.org04ca1bc2009-05-08 23:00:2913#include "courgette/simple_delta.h"
avi@chromium.org68c986e2013-06-11 13:26:2514#include "courgette/streams.h"
sra@chromium.org04ca1bc2009-05-08 23:00:2915
16namespace courgette {
17
dgarrett@chromium.org93d529ca2011-10-21 22:24:1918Element::Element(ExecutableType kind,
19 Ensemble* ensemble,
dgarrett@chromium.org423a3812011-10-26 00:50:2020 const Region& region)
21 : kind_(kind), ensemble_(ensemble), region_(region) {
dgarrett@chromium.org93d529ca2011-10-21 22:24:1922}
23
Chris Watkins2903a822017-11-30 03:19:5724Element::~Element() = default;
sra@chromium.org04ca1bc2009-05-08 23:00:2925
26std::string Element::Name() const {
Raul Tambree7ef5c52019-02-11 19:54:5027 return ensemble_->name() + "(" + base::NumberToString(kind()) + "," +
Daniel Cheng3d199b12017-12-12 03:51:0928 base::NumberToString(offset_in_ensemble()) + "," +
29 base::NumberToString(region().length()) + ")";
sra@chromium.org04ca1bc2009-05-08 23:00:2930}
31
sra@chromium.org04ca1bc2009-05-08 23:00:2932// Scans the Ensemble's region, sniffing out Elements. We assume that the
33// elements do not overlap.
34Status Ensemble::FindEmbeddedElements() {
dgarrett@chromium.org93d529ca2011-10-21 22:24:1935
sra@chromium.org04ca1bc2009-05-08 23:00:2936 size_t length = region_.length();
aviab98dcc92015-12-21 19:35:3337 const uint8_t* start = region_.start();
sra@chromium.org04ca1bc2009-05-08 23:00:2938
39 size_t position = 0;
40 while (position < length) {
dgarrett@chromium.org423a3812011-10-26 00:50:2041 ExecutableType type;
42 size_t detected_length;
dgarrett@chromium.org423a3812011-10-26 00:50:2043 Status result = DetectExecutableType(start + position,
44 length - position,
45 &type, &detected_length);
dgarrett@chromium.org423a3812011-10-26 00:50:2046 if (result == C_OK) {
47 Region region(start + position, detected_length);
48
49 Element* element = new Element(type, this, region);
50 owned_elements_.push_back(element);
51 elements_.push_back(element);
52 position += region.length();
53 } else {
54 position++;
sra@chromium.org04ca1bc2009-05-08 23:00:2955 }
sra@chromium.org04ca1bc2009-05-08 23:00:2956 }
57 return C_OK;
58}
59
60Ensemble::~Ensemble() {
61 for (size_t i = 0; i < owned_elements_.size(); ++i)
62 delete owned_elements_[i];
63}
64
65} // namespace