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.
			
			
This commit is contained in:
		
							
								
								
									
										53
									
								
								edify/expr.c
									
									
									
									
									
								
							
							
						
						
									
										53
									
								
								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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								edify/main.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								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;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user