mirror of
https://github.com/reactos/ninja.git
synced 2025-02-23 05:02:17 +00:00
split out another file
This commit is contained in:
parent
397dd2d707
commit
3af3511a66
58
eval_env.h
Normal file
58
eval_env.h
Normal file
@ -0,0 +1,58 @@
|
||||
|
||||
struct EvalString {
|
||||
struct Env {
|
||||
virtual string Evaluate(const string& var) = 0;
|
||||
};
|
||||
bool Parse(const string& input);
|
||||
string Evaluate(Env* env);
|
||||
|
||||
const string& unparsed() const { return unparsed_; }
|
||||
|
||||
string unparsed_;
|
||||
enum TokenType { RAW, SPECIAL };
|
||||
typedef vector<pair<string, TokenType> > TokenList;
|
||||
TokenList parsed_;
|
||||
};
|
||||
|
||||
bool EvalString::Parse(const string& input) {
|
||||
unparsed_ = input;
|
||||
|
||||
string::size_type start, end;
|
||||
start = 0;
|
||||
do {
|
||||
end = input.find_first_of("@$", start);
|
||||
if (end == string::npos) {
|
||||
end = input.size();
|
||||
break;
|
||||
}
|
||||
if (end > start)
|
||||
parsed_.push_back(make_pair(input.substr(start, end - start), RAW));
|
||||
start = end;
|
||||
for (end = start + 1; end < input.size(); ++end) {
|
||||
if (!('a' <= input[end] && input[end] <= 'z'))
|
||||
break;
|
||||
}
|
||||
if (end == start + 1) {
|
||||
// XXX report bad parse here
|
||||
return false;
|
||||
}
|
||||
parsed_.push_back(make_pair(input.substr(start, end - start), SPECIAL));
|
||||
start = end;
|
||||
} while (end < input.size());
|
||||
if (end > start)
|
||||
parsed_.push_back(make_pair(input.substr(start, end - start), RAW));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
string EvalString::Evaluate(Env* env) {
|
||||
string result;
|
||||
for (TokenList::iterator i = parsed_.begin(); i != parsed_.end(); ++i) {
|
||||
if (i->second == RAW)
|
||||
result.append(i->first);
|
||||
else
|
||||
result.append(env->Evaluate(i->first));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
59
ninja.h
59
ninja.h
@ -9,6 +9,8 @@
|
||||
|
||||
using namespace std;
|
||||
|
||||
#include "eval_env.h"
|
||||
|
||||
struct Node;
|
||||
struct FileStat {
|
||||
FileStat(const string& path) : path_(path), mtime_(0), node_(NULL) {}
|
||||
@ -34,63 +36,6 @@ struct Node {
|
||||
vector<Edge*> out_edges_;
|
||||
};
|
||||
|
||||
struct EvalString {
|
||||
struct Env {
|
||||
virtual string Evaluate(const string& var) = 0;
|
||||
};
|
||||
bool Parse(const string& input);
|
||||
string Evaluate(Env* env);
|
||||
|
||||
const string& unparsed() const { return unparsed_; }
|
||||
|
||||
string unparsed_;
|
||||
enum TokenType { RAW, SPECIAL };
|
||||
typedef vector<pair<string, TokenType> > TokenList;
|
||||
TokenList parsed_;
|
||||
};
|
||||
|
||||
bool EvalString::Parse(const string& input) {
|
||||
unparsed_ = input;
|
||||
|
||||
string::size_type start, end;
|
||||
start = 0;
|
||||
do {
|
||||
end = input.find_first_of("@$", start);
|
||||
if (end == string::npos) {
|
||||
end = input.size();
|
||||
break;
|
||||
}
|
||||
if (end > start)
|
||||
parsed_.push_back(make_pair(input.substr(start, end - start), RAW));
|
||||
start = end;
|
||||
for (end = start + 1; end < input.size(); ++end) {
|
||||
if (!('a' <= input[end] && input[end] <= 'z'))
|
||||
break;
|
||||
}
|
||||
if (end == start + 1) {
|
||||
// XXX report bad parse here
|
||||
return false;
|
||||
}
|
||||
parsed_.push_back(make_pair(input.substr(start, end - start), SPECIAL));
|
||||
start = end;
|
||||
} while (end < input.size());
|
||||
if (end > start)
|
||||
parsed_.push_back(make_pair(input.substr(start, end - start), RAW));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
string EvalString::Evaluate(Env* env) {
|
||||
string result;
|
||||
for (TokenList::iterator i = parsed_.begin(); i != parsed_.end(); ++i) {
|
||||
if (i->second == RAW)
|
||||
result.append(i->first);
|
||||
else
|
||||
result.append(env->Evaluate(i->first));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
struct Rule {
|
||||
Rule(const string& name, const string& command) :
|
||||
name_(name) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user