| // 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. | |
| #ifndef SRC_DEVELOPER_DEBUG_ZXDB_EXPR_PARSE_STRING_H_ | |
| #define SRC_DEVELOPER_DEBUG_ZXDB_EXPR_PARSE_STRING_H_ | |
| #include <optional> | |
| #include <string> | |
| #include <string_view> | |
| #include "src/developer/debug/zxdb/common/err_or.h" | |
| #include "src/developer/debug/zxdb/expr/expr_language.h" | |
| namespace zxdb { | |
| struct StringLiteralBegin { | |
| ExprLanguage language = ExprLanguage::kC; | |
| // Set when this is a raw string. If we need to support Rust byte strings this may become an | |
| // enum. | |
| bool is_raw = false; | |
| // For raw strings, this is the marker for the end of the string. For rust this will be some | |
| // nonzero number of '#' characters. For C++, this will be the sequence between the opening quote | |
| // and the opening paren (which will often be empty). | |
| std::string_view raw_marker; | |
| // Index into the input string of the first character of the string input (this will be the | |
| // opening quote or "R" character). | |
| size_t string_begin = 0; | |
| // Index into the input string of the first character after the prefix (this will be the first | |
| // thing in the string itself). | |
| size_t contents_begin = 0; | |
| }; | |
| // Returns a StringLiteralBegin if the current location starts a string. This can be passed into | |
| // ParseString if so. | |
| // | |
| // When parsing a raw string prefix, we may encounter a state where we know it should be a string | |
| // prefix but it's malformed. Currently we don't report the error and we say it's not a string. | |
| // The return value could be converted to a tri-state (not a string, string, error) if needed. | |
| std::optional<StringLiteralBegin> DoesBeginStringLiteral(ExprLanguage lang, std::string_view input, | |
| size_t cur); | |
| // Parses a string starting at index |*cur| inside |input|. On error, the |*error_location| will | |
| // be set to the byte that goes along with the error. The info should have been computed by | |
| // DoesBeginStringLiteral(). | |
| ErrOr<std::string> ParseStringLiteral(std::string_view input, const StringLiteralBegin& info, | |
| size_t* cur, size_t* error_location); | |
| } // namespace zxdb | |
| #endif // SRC_DEVELOPER_DEBUG_ZXDB_EXPR_PARSE_STRING_H_ |