fixed int_range, too
This commit is contained in:
parent
7ab9f7c92f
commit
a1d6e60222
1 changed files with 22 additions and 1 deletions
23
src/hammer.c
23
src/hammer.c
|
|
@ -379,12 +379,32 @@ const parser_t* ch_range(const uint8_t lower, const uint8_t upper) {
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
const parser_t *p;
|
||||||
int64_t lower;
|
int64_t lower;
|
||||||
int64_t upper;
|
int64_t upper;
|
||||||
} range_t;
|
} range_t;
|
||||||
|
|
||||||
static parse_result_t* parse_int_range(void *env, parse_state_t *state) {
|
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) {
|
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");
|
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);
|
range_t *r_env = g_new(range_t, 1);
|
||||||
|
r_env->p = p;
|
||||||
r_env->lower = lower;
|
r_env->lower = lower;
|
||||||
r_env->upper = upper;
|
r_env->upper = upper;
|
||||||
parser_t *ret = g_new(parser_t, 1);
|
parser_t *ret = g_new(parser_t, 1);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue