22 std::vector<std::string> result;
23 re2::StringPiece mutable_input(
input);
26 if (!re2::RE2::FindAndConsume(&mutable_input, R
"((?:^|\n)deps\s*=\s*\{)")) {
31 size_t brace_close_pos = std::string_view::npos;
33 for (
size_t i = 0;
i < mutable_input.length(); ++
i) {
34 if (mutable_input[
i] ==
'{') {
36 }
else if (mutable_input[
i] ==
'}') {
38 if (brace_count == 0) {
45 if (brace_close_pos == std::string_view::npos) {
50 std::string_view deps_content = mutable_input.substr(0, brace_close_pos);
53 std::string cleaned_content;
54 size_t current_pos_clean = 0;
55 while (current_pos_clean < deps_content.length()) {
56 size_t next_newline = deps_content.find(
'\n', current_pos_clean);
57 if (next_newline == std::string_view::npos) {
58 next_newline = deps_content.length();
61 std::string_view line = deps_content.substr(
62 current_pos_clean, next_newline - current_pos_clean);
64 size_t first_char = line.find_first_not_of(
" \t");
65 if (first_char != std::string_view::npos) {
66 line = line.substr(first_char);
71 if (line.empty() || line[0] !=
'#') {
72 cleaned_content.append(line);
73 cleaned_content.append(
"\n");
76 current_pos_clean = next_newline + 1;
80 size_t current_pos = 0;
81 while (current_pos < cleaned_content.length()) {
83 size_t key_start = cleaned_content.find(
'\'', current_pos);
84 if (key_start == std::string_view::npos) {
90 size_t key_end = cleaned_content.find(
'\'', key_start);
91 if (key_end == std::string_view::npos) {
95 std::string_view
key =
96 std::string_view(&cleaned_content[key_start], key_end - key_start);
99 size_t colon_pos = cleaned_content.find(
':', key_end);
100 if (colon_pos == std::string_view::npos) {
106 cleaned_content.find_first_not_of(
" \t\n", colon_pos + 1);
107 if (value_start == std::string_view::npos) {
112 size_t value_end = std::string_view::npos;
114 int bracket_level = 0;
115 for (
size_t i = value_start;
i < cleaned_content.length(); ++
i) {
116 char c = cleaned_content[
i];
119 }
else if (c ==
'}') {
121 }
else if (c ==
'[') {
123 }
else if (c ==
']') {
125 }
else if (c ==
',' && brace_level == 0 && bracket_level == 0) {
131 if (value_end == std::string_view::npos) {
132 value_end = cleaned_content.length();
135 std::string_view
value = std::string_view(&cleaned_content[value_start],
136 value_end - value_start);
139 if (
value.find(
"'dep_type': 'cipd'") != std::string_view::npos) {
140 result.emplace_back(
key);
143 current_pos = value_end + 1;