Skip to content
Snippets Groups Projects
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;
}