aboutsummaryrefslogtreecommitdiffstats
path: root/edify
diff options
context:
space:
mode:
authorDoug Zongker <dougz@android.com>2009-06-12 16:13:52 -0700
committerDoug Zongker <dougz@android.com>2009-06-12 16:13:52 -0700
commite3da02e7bcfd85c543419e7590a3c86f64d8cc8a (patch)
tree54535b2854f7312a23f9df838abfc0312befd1d2 /edify
parentd9c9d10d9da76f067d3955bea71f7bb39e859fa5 (diff)
downloadbootable_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.c53
-rw-r--r--edify/main.c10
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;