blob: a48e40dc81284c984b14ccca816353bc3bda8f18 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/developer/debug/zxdb/symbols/source_util.h"
#include <lib/syslog/cpp/macros.h>
#include <limits>
namespace zxdb {
std::vector<std::string> ExtractSourceLines(const std::string& contents, int first_line,
int last_line) {
FX_DCHECK(first_line > 0);
std::vector<std::string> result;
constexpr char kCR = 13;
constexpr char kLF = 10;
int cur_line = 1;
size_t line_begin = 0; // Byte offset.
while (line_begin < contents.size() && cur_line <= last_line) {
size_t cur = line_begin;
// Locate extent of current line.
size_t next_line_begin = contents.size();
size_t line_end = contents.size();
while (cur < contents.size()) {
if (contents[cur] == kCR) {
// Either CR or CR+LF
line_end = cur;
if (cur < contents.size() - 1 && contents[cur + 1] == kLF) {
next_line_begin = cur + 2;
} else {
next_line_begin = cur + 1;
}
break;
} else if (contents[cur] == kLF) {
// LF by itself.
line_end = cur;
next_line_begin = cur + 1;
break;
}
cur++;
}
if (cur_line >= first_line && cur_line <= last_line)
result.emplace_back(&contents[line_begin], line_end - line_begin);
// Advance to next line.
line_begin = next_line_begin;
cur_line++;
}
return result;
}
std::vector<std::string> ExtractSourceLines(const std::string& contents) {
return ExtractSourceLines(contents, 1, std::numeric_limits<int>::max());
}
} // namespace zxdb