preprocesser function now only returns a pp_err_t

We leave the parameter tokens alone, considering it constant, while
the parameter vec_out is used to hold the new stream of tokens.  This
allows the caller to have a before and after view on the token stream
and reduces the worry of double frees.
This commit is contained in:
2024-04-15 16:31:45 +06:30
parent c748ed8386
commit b83bdd0d45
2 changed files with 12 additions and 7 deletions

View File

@@ -27,13 +27,17 @@ using std::pair, std::vector, std::make_pair, std::string, std::string_view;
delete t; \ delete t; \
}); });
pair<vector<token_t *>, pp_err_t> preprocesser(vector<token_t *> &tokens) pp_err_t preprocesser(const vector<token_t *> &tokens,
vector<token_t *> &vec_out)
{ {
vector<token_t *> use_block_tokens; vector<token_t *> use_block_tokens;
pp_err_t pperr{pp_err_type_t::OK}; pp_err_t pperr{pp_err_type_t::OK};
std::tie(use_block_tokens, pperr) = preprocess_use_blocks(tokens); std::tie(use_block_tokens, pperr) = preprocess_use_blocks(tokens);
if (pperr.type != pp_err_type_t::OK) if (pperr.type != pp_err_type_t::OK)
return ERR(pperr); {
vec_out = tokens;
return pperr;
}
vector<token_t *> const_block_tokens; vector<token_t *> const_block_tokens;
std::tie(const_block_tokens, pperr) = std::tie(const_block_tokens, pperr) =
@@ -41,12 +45,14 @@ pair<vector<token_t *>, pp_err_t> preprocesser(vector<token_t *> &tokens)
if (pperr.type != pp_err_type_t::OK) if (pperr.type != pp_err_type_t::OK)
{ {
VCLEAR(tokens); VCLEAR(tokens);
tokens = use_block_tokens; vec_out = use_block_tokens;
return ERR(pperr); return pperr;
} }
VCLEAR(use_block_tokens); VCLEAR(use_block_tokens);
return VAL(const_block_tokens); vec_out = const_block_tokens;
return pp_err_t{pp_err_type_t::OK};
} }
pair<vector<token_t *>, pp_err_t> pair<vector<token_t *>, pp_err_t>

View File

@@ -42,8 +42,7 @@ struct pp_err_t
std::ostream &operator<<(std::ostream &, pp_err_t &); std::ostream &operator<<(std::ostream &, pp_err_t &);
std::pair<std::vector<token_t *>, pp_err_t> pp_err_t preprocesser(const std::vector<token_t *> &, std::vector<token_t *> &);
preprocesser(std::vector<token_t *> &);
std::pair<std::vector<token_t *>, pp_err_t> std::pair<std::vector<token_t *>, pp_err_t>
preprocess_const_blocks(const std::vector<token_t *> &); preprocess_const_blocks(const std::vector<token_t *> &);