diff options
author | Doug Zongker <dougz@android.com> | 2009-06-12 16:13:52 -0700 |
---|---|---|
committer | Doug Zongker <dougz@android.com> | 2009-06-12 16:13:52 -0700 |
commit | e3da02e7bcfd85c543419e7590a3c86f64d8cc8a (patch) | |
tree | 54535b2854f7312a23f9df838abfc0312befd1d2 /edify | |
parent | d9c9d10d9da76f067d3955bea71f7bb39e859fa5 (diff) | |
download | bootable_recovery-e3da02e7bcfd85c543419e7590a3c86f64d8cc8a.zip bootable_recovery-e3da02e7bcfd85c543419e7590a3c86f64d8cc8a.tar.gz bootable_recovery-e3da02e7bcfd85c543419e7590a3c86f64d8cc8a.tar.bz2 |
add less_than_int, greater_than_int to edify
Add functions less_than_int() and greater_than_int() that interpret
their args as ints and do the comparison. ("<" and ">" operators, if
implemented, should do string comparison.) This lets us do the build
time check currently done by the check_prereq binary.
Diffstat (limited to 'edify')
-rw-r--r-- | edify/expr.c | 53 | ||||
-rw-r--r-- | edify/main.c | 10 |
2 files changed, 63 insertions, 0 deletions
diff --git a/edify/expr.c b/edify/expr.c index 406c67e..f1c5555 100644 --- a/edify/expr.c +++ b/edify/expr.c @@ -72,6 +72,8 @@ char* ConcatFn(const char* name, State* state, int argc, Expr* argv[]) { char* IfElseFn(const char* name, State* state, int argc, Expr* argv[]) { if (argc != 2 && argc != 3) { + free(state->errmsg); + state->errmsg = strdup("ifelse expects 2 or 3 arguments"); return NULL; } char* cond = Evaluate(state, argv[0]); @@ -244,6 +246,54 @@ char* SequenceFn(const char* name, State* state, int argc, Expr* argv[]) { return Evaluate(state, argv[1]); } +char* LessThanIntFn(const char* name, State* state, int argc, Expr* argv[]) { + if (argc != 2) { + free(state->errmsg); + state->errmsg = strdup("less_than_int expects 2 arguments"); + return NULL; + } + + char* left; + char* right; + if (ReadArgs(state, argv, 2, &left, &right) < 0) return NULL; + + bool result = false; + char* end; + + long l_int = strtol(left, &end, 10); + if (left[0] == '\0' || *end != '\0') { + fprintf(stderr, "[%s] is not an int\n", left); + goto done; + } + + long r_int = strtol(right, &end, 10); + if (right[0] == '\0' || *end != '\0') { + fprintf(stderr, "[%s] is not an int\n", right); + goto done; + } + + result = l_int < r_int; + + done: + free(left); + free(right); + return strdup(result ? "t" : ""); +} + +char* GreaterThanIntFn(const char* name, State* state, int argc, Expr* argv[]) { + if (argc != 2) { + free(state->errmsg); + state->errmsg = strdup("greater_than_int expects 2 arguments"); + return NULL; + } + + Expr* temp[2]; + temp[0] = argv[1]; + temp[1] = argv[0]; + + return LessThanIntFn(name, state, 2, temp); +} + char* Literal(const char* name, State* state, int argc, Expr* argv[]) { return strdup(name); } @@ -313,6 +363,9 @@ void RegisterBuiltins() { RegisterFunction("is_substring", SubstringFn); RegisterFunction("stdout", StdoutFn); RegisterFunction("sleep", SleepFn); + + RegisterFunction("less_than_int", LessThanIntFn); + RegisterFunction("greater_than_int", GreaterThanIntFn); } diff --git a/edify/main.c b/edify/main.c index 03eefc6..0e36108 100644 --- a/edify/main.c +++ b/edify/main.c @@ -143,6 +143,16 @@ int test() { expect("if \"\" then yes endif", "", &errors); expect("if \"\"; t then yes endif", "yes", &errors); + // numeric comparisons + expect("less_than_int(3, 14)", "t", &errors); + expect("less_than_int(14, 3)", "", &errors); + expect("less_than_int(x, 3)", "", &errors); + expect("less_than_int(3, x)", "", &errors); + expect("greater_than_int(3, 14)", "", &errors); + expect("greater_than_int(14, 3)", "t", &errors); + expect("greater_than_int(x, 3)", "", &errors); + expect("greater_than_int(3, x)", "", &errors); + printf("\n"); return errors; |