-
Kia authored
span.c 1.29 KiB
/*
* Integer-range parser combinator exhaustive test
*
*/
#include <hammer/hammer.h>
#include <hammer/glue.h>
#include <string.h>
#include <stdlib.h>
#define BKEND PB_LALR
//#define BKEND PB_MIN
HParser *int16_ranger(int16_t left, int16_t right) {
H_RULE(littleint16, h_with_endianness(BYTE_BIG_ENDIAN,h_int16()));
H_RULE(int16range, h_int_range(littleint16, left, right));
return h_sequence(int16range,h_end_p(),NULL);
}
int run_parse(HParser *parser, HParserBackend backend,
uint8_t *input, size_t input_len) {
assert(h_compile(parser, backend, NULL) == 0);
return h_parse(parser, input, input_len);
}
int main(int argc, char *argv[]) {
assert(argc == 3);
int16_t low = atoi(argv[1]);
int16_t high = atoi(argv[2]);
printf("%d %d\n", low, high);
HParser *pp = int16_ranger(low, high);
int16_t k;
for (k=INT16_MIN; k<INT16_MAX; k++) {
uint8_t tmp1[2], tmp2[2];
// if (0) {
// memcpy(tmp1, &k, 2);
// tmp2[0] = tmp1[1];
// tmp2[1] = tmp1[0];
// } else
// {
memcpy(tmp2, &k, 2);
// }
if(!run_parse(pp, BKEND, tmp2, 2)) {
printf("parse failed %d\n", k);
} else {
printf("parse success 0x%hx\n", k);
}
}
return 0;
}