std::vector<std::string> args; if (!ReadArgs(state, argv, &args)) { return nullptr;
}
// Parse up to at least long long or 64-bit integers.
int64_t l_int; if (!android::base::ParseInt(args[0].c_str(), &l_int)) {
state->errmsg = "failed to parse int in " + args[0]; return nullptr;
}
int64_t r_int; if (!android::base::ParseInt(args[1].c_str(), &r_int)) {
state->errmsg = "failed to parse int in " + args[1]; return nullptr;
}
std::vector<std::string> args; if (!ReadArgs(state, argv, &args)) { return nullptr;
}
// Parse up to at least long long or 64-bit integers.
int64_t l_int; if (!android::base::ParseInt(args[0].c_str(), &l_int)) {
state->errmsg = "failed to parse int in " + args[0]; return nullptr;
}
int64_t r_int; if (!android::base::ParseInt(args[1].c_str(), &r_int)) {
state->errmsg = "failed to parse int in " + args[1]; return nullptr;
}
// ----------------------------------------------------------------- // the function table // -----------------------------------------------------------------
// ----------------------------------------------------------------- // convenience methods for functions // -----------------------------------------------------------------
// Evaluate the expressions in argv, and put the results of strings in args. If any expression // evaluates to nullptr, return false. Return true on success. bool ReadArgs(State* state, const std::vector<std::unique_ptr<Expr>>& argv,
std::vector<std::string>* args) { return ReadArgs(state, argv, args, 0, argv.size());
}
bool ReadArgs(State* state, const std::vector<std::unique_ptr<Expr>>& argv,
std::vector<std::string>* args, size_t start, size_t len) { if (args == nullptr) { returnfalse;
} if (start + len > argv.size()) { returnfalse;
} for (size_t i = start; i < start + len; ++i) {
std::string var; if (!Evaluate(state, argv[i], &var)) {
args->clear(); returnfalse;
}
args->push_back(var);
} returntrue;
}
// Evaluate the expressions in argv, and put the results of Value* in args. If any expression // evaluate to nullptr, return false. Return true on success. bool ReadValueArgs(State* state, const std::vector<std::unique_ptr<Expr>>& argv,
std::vector<std::unique_ptr<Value>>* args) { return ReadValueArgs(state, argv, args, 0, argv.size());
}
bool ReadValueArgs(State* state, const std::vector<std::unique_ptr<Expr>>& argv,
std::vector<std::unique_ptr<Value>>* args, size_t start, size_t len) { if (args == nullptr) { returnfalse;
} if (len == 0 || start + len > argv.size()) { returnfalse;
} for (size_t i = start; i < start + len; ++i) {
std::unique_ptr<Value> v(EvaluateValue(state, argv[i])); if (!v) {
args->clear(); returnfalse;
}
args->push_back(std::move(v));
} returntrue;
}
// Use printf-style arguments to compose an error message to put into // *state. Returns nullptr.
Value* ErrorAbort(State* state, constchar* format, ...) {
va_list ap;
va_start(ap, format);
android::base::StringAppendV(&state->errmsg, format, ap);
va_end(ap); return nullptr;
}
Value* ErrorAbort(State* state, CauseCode cause_code, constchar* format, ...) {
std::string err_message;
va_list ap;
va_start(ap, format);
android::base::StringAppendV(&err_message, format, ap);
va_end(ap); // Ensure that there's exactly one line break at the end of the error message.
state->errmsg = android::base::Trim(err_message) + "\n";
state->cause_code = cause_code; return nullptr;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.