From 5fe280ac96a2c13f613b7138bb239c3f36d35c9f Mon Sep 17 00:00:00 2001 From: Tianjie Xu Date: Mon, 17 Oct 2016 18:15:20 -0700 Subject: Cleanup ReadArgs & ReadValueArgs usage ReadArgs will switch to using std::string and std::unique_ptr. Also cleanup the callers. Test: mma & component test passed. Change-Id: I4724406ae6c0c134a27bbd1cdd24ad5d343b2a3b --- edify/expr.cpp | 123 ++++++--------------------------------------------------- edify/expr.h | 25 +----------- 2 files changed, 13 insertions(+), 135 deletions(-) (limited to 'edify') diff --git a/edify/expr.cpp b/edify/expr.cpp index ec2409752..329cf3acd 100644 --- a/edify/expr.cpp +++ b/edify/expr.cpp @@ -254,31 +254,25 @@ Value* LessThanIntFn(const char* name, State* state, int argc, Expr* argv[]) { return nullptr; } - char* left; - char* right; - if (ReadArgs(state, argv, 2, &left, &right) < 0) return nullptr; - - bool result = false; - char* end; + std::vector args; + if (!ReadArgs(state, 2, argv, &args)) { + return nullptr; + } // Parse up to at least long long or 64-bit integers. - int64_t l_int = static_cast(strtoll(left, &end, 10)); - if (left[0] == '\0' || *end != '\0') { - goto done; + 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; - r_int = static_cast(strtoll(right, &end, 10)); - if (right[0] == '\0' || *end != '\0') { - goto done; + if (!android::base::ParseInt(args[1].c_str(), &r_int)) { + state->errmsg = "failed to parse int in " + args[1]; + return nullptr; } - result = l_int < r_int; - - done: - free(left); - free(right); - return StringValue(result ? "t" : ""); + return StringValue(l_int < r_int ? "t" : ""); } Value* GreaterThanIntFn(const char* name, State* state, @@ -372,99 +366,6 @@ bool ReadValueArgs(State* state, int argc, Expr* argv[], return true; } -// Evaluate the expressions in argv, giving 'count' char* (the ... is -// zero or more char** to put them in). If any expression evaluates -// to NULL, free the rest and return -1. Return 0 on success. -int ReadArgs(State* state, Expr* argv[], int count, ...) { - char** args = reinterpret_cast(malloc(count * sizeof(char*))); - va_list v; - va_start(v, count); - int i; - for (i = 0; i < count; ++i) { - std::string str; - if (!Evaluate(state, argv[i], &str) || - (args[i] = strdup(str.c_str())) == nullptr) { - va_end(v); - int j; - for (j = 0; j < i; ++j) { - free(args[j]); - } - free(args); - return -1; - } - *(va_arg(v, char**)) = args[i]; - } - va_end(v); - free(args); - return 0; -} - -// Evaluate the expressions in argv, giving 'count' Value* (the ... is -// zero or more Value** to put them in). If any expression evaluates -// to NULL, free the rest and return -1. Return 0 on success. -int ReadValueArgs(State* state, Expr* argv[], int count, ...) { - Value** args = new Value*[count]; - va_list v; - va_start(v, count); - for (int i = 0; i < count; ++i) { - args[i] = EvaluateValue(state, argv[i]); - if (args[i] == NULL) { - va_end(v); - int j; - for (j = 0; j < i; ++j) { - delete args[j]; - } - delete[] args; - return -1; - } - *(va_arg(v, Value**)) = args[i]; - } - va_end(v); - delete[] args; - return 0; -} - -// Evaluate the expressions in argv, returning an array of char* -// results. If any evaluate to NULL, free the rest and return NULL. -// The caller is responsible for freeing the returned array and the -// strings it contains. -char** ReadVarArgs(State* state, int argc, Expr* argv[]) { - char** args = (char**)malloc(argc * sizeof(char*)); - for (int i = 0; i < argc; ++i) { - std::string str; - if (!Evaluate(state, argv[i], &str) || - (args[i] = strdup(str.c_str())) == nullptr) { - for (int j = 0; j < i; ++j) { - free(args[j]); - } - free(args); - return NULL; - } - } - return args; -} - -// Evaluate the expressions in argv, returning an array of Value* -// results. If any evaluate to NULL, free the rest and return NULL. -// The caller is responsible for freeing the returned array and the -// Values it contains. -Value** ReadValueVarArgs(State* state, int argc, Expr* argv[]) { - Value** args = new Value*[argc]; - int i = 0; - for (i = 0; i < argc; ++i) { - args[i] = EvaluateValue(state, argv[i]); - if (args[i] == NULL) { - int j; - for (j = 0; j < i; ++j) { - delete args[j]; - } - delete[] args; - return NULL; - } - } - return args; -} - // Use printf-style arguments to compose an error message to put into // *state. Returns nullptr. Value* ErrorAbort(State* state, const char* format, ...) { diff --git a/edify/expr.h b/edify/expr.h index 85306542d..911adbc82 100644 --- a/edify/expr.h +++ b/edify/expr.h @@ -128,30 +128,7 @@ bool ReadArgs(State* state, int argc, Expr* argv[], std::vector* ar // Evaluate the expressions in argv, and put the results of Value* in // args. If any expression evaluate to nullptr, free the rest and return // false. Return true on success. -bool ReadValueArgs(State* state, int argc, Expr* argv[], - std::vector>* args); - -// Evaluate the expressions in argv, giving 'count' char* (the ... is -// zero or more char** to put them in). If any expression evaluates -// to NULL, free the rest and return -1. Return 0 on success. -int ReadArgs(State* state, Expr* argv[], int count, ...); - -// Evaluate the expressions in argv, giving 'count' Value* (the ... is -// zero or more Value** to put them in). If any expression evaluates -// to NULL, free the rest and return -1. Return 0 on success. -int ReadValueArgs(State* state, Expr* argv[], int count, ...); - -// Evaluate the expressions in argv, returning an array of char* -// results. If any evaluate to NULL, free the rest and return NULL. -// The caller is responsible for freeing the returned array and the -// strings it contains. -char** ReadVarArgs(State* state, int argc, Expr* argv[]); - -// Evaluate the expressions in argv, returning an array of Value* -// results. If any evaluate to NULL, free the rest and return NULL. -// The caller is responsible for freeing the returned array and the -// Values it contains. -Value** ReadValueVarArgs(State* state, int argc, Expr* argv[]); +bool ReadValueArgs(State* state, int argc, Expr* argv[], std::vector>* args); // Use printf-style arguments to compose an error message to put into // *state. Returns NULL. -- cgit v1.2.3