fixed int_range, too

This commit is contained in:
Meredith L. Patterson 2012-05-24 12:09:38 +02:00
parent 7ab9f7c92f
commit a1d6e60222

View file

@ -379,12 +379,32 @@ const parser_t* ch_range(const uint8_t lower, const uint8_t upper) {
}
typedef struct {
const parser_t *p;
int64_t lower;
int64_t upper;
} range_t;
static parse_result_t* parse_int_range(void *env, parse_state_t *state) {
return NULL;
range_t *r_env = (range_t*)env;
if (!r_env->p)
return NULL;
parse_result_t *ret = do_parse(r_env->p, state);
if (!ret || !ret->ast)
return NULL;
switch(ret->ast->token_type) {
case TT_SINT:
if (r_env->lower <= ret->ast->sint && r_env->upper >= ret->ast->sint)
return ret;
else
return NULL;
case TT_UINT:
if ((uint64_t)r_env->lower <= ret->ast->uint && (uint64_t)r_env->upper >= ret->ast->uint)
return ret;
else
return NULL;
default:
return NULL;
}
}
const parser_t* int_range(const parser_t *p, const int64_t lower, const int64_t upper) {
@ -395,6 +415,7 @@ const parser_t* int_range(const parser_t *p, const int64_t lower, const int64_t
assert_message(!(b_env->signedp) ? (b_env->length < 64) : true, "int_range can't use a uint64 parser");
range_t *r_env = g_new(range_t, 1);
r_env->p = p;
r_env->lower = lower;
r_env->upper = upper;
parser_t *ret = g_new(parser_t, 1);