MCPcopy Create free account
hub / github.com/apache/trafficserver / parse_line

Method parse_line

plugins/header_rewrite/parser.cc:34–152  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

32enum ParserState { PARSER_DEFAULT, PARSER_IN_QUOTE, PARSER_IN_REGEX, PARSER_IN_EXPANSION, PARSER_IN_BRACE };
33
34bool
35Parser::parse_line(const std::string &original_line)
36{
37 std::string line = original_line;
38 ParserState state = PARSER_DEFAULT;
39 bool extracting_token = false;
40 off_t cur_token_start = 0;
41 size_t cur_token_length = 0;
42
43 for (size_t i = 0; i < line.size(); ++i) {
44 if ((state == PARSER_DEFAULT) && (std::isspace(line[i]) || ((line[i] == '=')))) {
45 if (extracting_token) {
46 cur_token_length = i - cur_token_start;
47 if (cur_token_length > 0) {
48 _tokens.push_back(line.substr(cur_token_start, cur_token_length));
49 }
50 extracting_token = false;
51 state = PARSER_DEFAULT;
52 } else if (!std::isspace(line[i])) {
53 // we got a standalone =, > or <
54 _tokens.push_back(std::string(1, line[i]));
55 }
56 } else if ((state != PARSER_IN_QUOTE) && (line[i] == '/')) {
57 // Deal with regexes, nothing gets escaped / quoted in here
58 if ((state != PARSER_IN_REGEX) && !extracting_token) {
59 state = PARSER_IN_REGEX;
60 extracting_token = true;
61 cur_token_start = i;
62 } else if ((state == PARSER_IN_REGEX) && extracting_token && (line[i - 1] != '\\')) {
63 cur_token_length = i - cur_token_start + 1;
64 _tokens.push_back(line.substr(cur_token_start, cur_token_length));
65 state = PARSER_DEFAULT;
66 extracting_token = false;
67 }
68 } else if ((state != PARSER_IN_REGEX) && (line[i] == '\\')) {
69 // Escaping - convert escape sequences to control characters
70 if (!extracting_token) {
71 extracting_token = true;
72 cur_token_start = i;
73 }
74 // Check if next character forms an escape sequence we want to convert
75 if (i + 1 < line.size()) {
76 constexpr std::string_view controls{"trn", 3};
77 constexpr char mapped_ctrls[] = "\t\r\n";
78
79 if (auto pos = controls.find(line[i + 1]); pos != std::string_view::npos) {
80 line[i] = mapped_ctrls[pos];
81 line.erase(i + 1, 1);
82 } else {
83 line.erase(i, 1);
84 }
85 } else {
86 line.erase(i, 1); // Backslash at end of line
87 }
88 } else if ((state != PARSER_IN_REGEX) && (line[i] == '"')) {
89 if ((state != PARSER_IN_QUOTE) && !extracting_token) {
90 state = PARSER_IN_QUOTE;
91 extracting_token = true;

Callers 2

set_valueMethod · 0.45
parse_configMethod · 0.45

Calls 10

stringClass · 0.85
TSErrorFunction · 0.70
sizeMethod · 0.45
push_backMethod · 0.45
substrMethod · 0.45
findMethod · 0.45
eraseMethod · 0.45
c_strMethod · 0.45
clearMethod · 0.45
emptyMethod · 0.45

Tested by

no test coverage detected