Skip to content

Commit

Permalink
add less_than_int, greater_than_int to edify
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Doug Zongker committed Jun 12, 2009
1 parent d9c9d10 commit e3da02e
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 0 deletions.
53 changes: 53 additions & 0 deletions edify/expr.c
Original file line number Diff line number Diff line change
Expand Up @@ -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]);
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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);
}


Expand Down
10 changes: 10 additions & 0 deletions edify/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit e3da02e

Please sign in to comment.