#ifndef HELPER_H #define HELPER_H #include #include #include #include #include "big_endian.h" struct SignedVec { unsigned char *len; unsigned char *capacity; char *data; }; struct UnsignedVec { unsigned char *len; unsigned char *capacity; unsigned char *data; }; struct parser; struct parser *new_parser(char *grammar_string, struct SignedVec *error_vec); void clean_parser(void *parser); int parser_recognize(struct parser *parser, struct UnsignedVec *input_vec, struct SignedVec *error_vec, unsigned char reset_p); struct UnsignedVec * parser_parse (struct parser *parser, struct UnsignedVec *input_vec, struct SignedVec *error_vec, unsigned char reset_p ); struct UnsignedVec * parser_parse(struct parser *parser, struct UnsignedVec *input_vec, struct SignedVec *error_vec, unsigned char reset_p); void clean_signed(struct SignedVec *vec, unsigned char flag); void clean_unsigned(struct UnsignedVec *vec, unsigned char flag); typedef enum Status { Plain = 0, Packed = 1, Clone = 2, } Status; typedef enum Variant { Terminal = 0, Nonterminal = 1, Rule = 2, } Variant; struct Label { Status status; uint64_t clone_index; uint64_t start; uint64_t end; Variant variant; uint64_t content; }; struct Label read_label(unsigned char *ptr); void print_label(struct Label label); #endif