feat(preprocessor): date & time macro (#92)
This commit is contained in:
parent
e05d853ba6
commit
15526ab79a
@ -22,6 +22,8 @@ class preprocessor
|
|||||||
std::set<std::string> reject_;
|
std::set<std::string> reject_;
|
||||||
std::deque<token> tokens_;
|
std::deque<token> tokens_;
|
||||||
std::vector<token> expr_;
|
std::vector<token> expr_;
|
||||||
|
std::string date_;
|
||||||
|
std::string time_;
|
||||||
usize curr_expr_;
|
usize curr_expr_;
|
||||||
u32 expand_;
|
u32 expand_;
|
||||||
u32 skip_;
|
u32 skip_;
|
||||||
@ -81,6 +83,8 @@ private:
|
|||||||
auto eval_expr_factor() -> i32;
|
auto eval_expr_factor() -> i32;
|
||||||
auto eval_expr_unary() -> i32;
|
auto eval_expr_unary() -> i32;
|
||||||
auto eval_expr_primary() -> i32;
|
auto eval_expr_primary() -> i32;
|
||||||
|
auto get_date_define(std::tm* time_p) -> void;
|
||||||
|
auto get_time_define(std::tm* time_p) -> void;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace xsk::gsc
|
} // namespace xsk::gsc
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
#include <ctime>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <array>
|
#include <array>
|
||||||
|
@ -38,6 +38,10 @@ preprocessor::preprocessor(context* ctx, std::string const& name, char const* da
|
|||||||
directives_.insert({ "include", directive::INCLUDE });
|
directives_.insert({ "include", directive::INCLUDE });
|
||||||
directives_.insert({ "inline", directive::INLINE });
|
directives_.insert({ "inline", directive::INLINE });
|
||||||
directives_.insert({ "using_animtree", directive::USINGTREE });
|
directives_.insert({ "using_animtree", directive::USINGTREE });
|
||||||
|
|
||||||
|
std::tm l_time = {};
|
||||||
|
get_date_define(&l_time);
|
||||||
|
get_time_define(&l_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto preprocessor::process() -> token
|
auto preprocessor::process() -> token
|
||||||
@ -746,11 +750,11 @@ auto preprocessor::expand(token& tok, define& def) -> void
|
|||||||
}
|
}
|
||||||
else if (tok.data == "__DATE__")
|
else if (tok.data == "__DATE__")
|
||||||
{
|
{
|
||||||
tokens_.push_front(token{ token::STRING, tok.space, tok.pos, tok.data }); // TODO!
|
tokens_.push_front(token{ token::STRING, tok.space, tok.pos, date_ });
|
||||||
}
|
}
|
||||||
else if (tok.data == "__TIME__")
|
else if (tok.data == "__TIME__")
|
||||||
{
|
{
|
||||||
tokens_.push_front(token{ token::STRING, tok.space, tok.pos, tok.data }); // TODO!
|
tokens_.push_front(token{ token::STRING, tok.space, tok.pos, time_ });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (def.type == define::OBJECT)
|
else if (def.type == define::OBJECT)
|
||||||
@ -1320,7 +1324,7 @@ auto preprocessor::eval_expr_primary() -> i32
|
|||||||
if (eval_match(token::INT))
|
if (eval_match(token::INT))
|
||||||
return static_cast<i32>(std::stoi(eval_prev().data));
|
return static_cast<i32>(std::stoi(eval_prev().data));
|
||||||
|
|
||||||
if (eval_match(token::LPAREN))
|
if (eval_match(token::LPAREN))
|
||||||
{
|
{
|
||||||
auto val = eval_expr();
|
auto val = eval_expr();
|
||||||
eval_consume(token::RPAREN, "expect ')' after expression.");
|
eval_consume(token::RPAREN, "expect ')' after expression.");
|
||||||
@ -1353,4 +1357,18 @@ auto preprocessor::eval_expr_primary() -> i32
|
|||||||
throw ppr_error(eval_peek().pos, "invalid preprocessor expression");
|
throw ppr_error(eval_peek().pos, "invalid preprocessor expression");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto preprocessor::get_date_define(std::tm* time_p) -> void
|
||||||
|
{
|
||||||
|
char buf[] = "??? ?? ????";
|
||||||
|
std::strftime(buf, sizeof(buf), "%b %d %Y", time_p);
|
||||||
|
date_ = std::string("\"").append(buf).append("\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
auto preprocessor::get_time_define(std::tm* time_p) -> void
|
||||||
|
{
|
||||||
|
char buf[] = "??:??:??";
|
||||||
|
std::strftime(buf, sizeof(buf), "%T", time_p);
|
||||||
|
time_ = std::string("\"").append(buf).append("\"");
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace xsk::gsc
|
} // namespace xsk::gsc
|
||||||
|
Loading…
Reference in New Issue
Block a user