| // Copyright 2017 the V8 project 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 <algorithm> | |
| #include <fstream> | |
| #include <iostream> | |
| #include <string> | |
| #include "src/torque/ast.h" | |
| #include "src/torque/utils.h" | |
| namespace v8 { | |
| namespace internal { | |
| namespace torque { | |
| std::string StringLiteralUnquote(const std::string& s) { | |
| DCHECK(('"' == s.front() && '"' == s.back()) || | |
| ('\'' == s.front() && '\'' == s.back())); | |
| std::stringstream result; | |
| for (size_t i = 1; i < s.length() - 1; ++i) { | |
| if (s[i] == '\\') { | |
| switch (s[++i]) { | |
| case 'n': | |
| result << '\n'; | |
| break; | |
| case 'r': | |
| result << '\r'; | |
| break; | |
| case 't': | |
| result << '\t'; | |
| break; | |
| case '\'': | |
| case '"': | |
| case '\\': | |
| result << s[i]; | |
| break; | |
| default: | |
| UNREACHABLE(); | |
| } | |
| } else { | |
| result << s[i]; | |
| } | |
| } | |
| return result.str(); | |
| } | |
| std::string StringLiteralQuote(const std::string& s) { | |
| std::stringstream result; | |
| result << '"'; | |
| for (size_t i = 0; i < s.length() - 1; ++i) { | |
| switch (s[i]) { | |
| case '\n': | |
| result << "\\n"; | |
| break; | |
| case '\r': | |
| result << "\\r"; | |
| break; | |
| case '\t': | |
| result << "\\t"; | |
| break; | |
| case '\'': | |
| case '"': | |
| case '\\': | |
| result << "\\" << s[i]; | |
| break; | |
| default: | |
| result << s[i]; | |
| } | |
| } | |
| result << '"'; | |
| return result.str(); | |
| } | |
| std::string CurrentPositionAsString() { | |
| return PositionAsString(CurrentSourcePosition::Get()); | |
| } | |
| [[noreturn]] void ReportError(const std::string& error) { | |
| std::cerr << CurrentPositionAsString() << ": Torque error: " << error << "\n"; | |
| std::abort(); | |
| } | |
| std::string CamelifyString(const std::string& underscore_string) { | |
| std::string result; | |
| bool word_beginning = true; | |
| for (auto current : underscore_string) { | |
| if (current == '_' || current == '-') { | |
| word_beginning = true; | |
| continue; | |
| } | |
| if (word_beginning) { | |
| current = toupper(current); | |
| } | |
| result += current; | |
| word_beginning = false; | |
| } | |
| return result; | |
| } | |
| std::string DashifyString(const std::string& underscore_string) { | |
| std::string result = underscore_string; | |
| std::replace(result.begin(), result.end(), '_', '-'); | |
| return result; | |
| } | |
| void ReplaceFileContentsIfDifferent(const std::string& file_path, | |
| const std::string& contents) { | |
| std::ifstream old_contents_stream(file_path.c_str()); | |
| std::string old_contents; | |
| if (old_contents_stream.good()) { | |
| std::istreambuf_iterator<char> eos; | |
| old_contents = | |
| std::string(std::istreambuf_iterator<char>(old_contents_stream), eos); | |
| old_contents_stream.close(); | |
| } | |
| if (old_contents.length() == 0 || old_contents != contents) { | |
| std::ofstream new_contents_stream; | |
| new_contents_stream.open(file_path.c_str()); | |
| new_contents_stream << contents; | |
| new_contents_stream.close(); | |
| } | |
| } | |
| } // namespace torque | |
| } // namespace internal | |
| } // namespace v8 |