#include "helper.h" #include "big_endian.h" struct Label read_label(unsigned char *ptr) { struct Label label = { 0 }; switch (*ptr) { case Plain: label.status = Plain; break; case Packed: label.status = Packed; break; default: label.status = Clone; label.clone_index = from_big_endian(ptr+1); break; } label.start = from_big_endian(ptr+9); label.end = from_big_endian(ptr+17); switch (*(ptr+25)) { case Terminal: label.variant = Terminal; break; case Nonterminal: label.variant = Nonterminal; break; default: label.variant = Rule; break; } label.content = from_big_endian(ptr+26); return label; } void print_label(struct Label label) { switch (label.status) { case Plain: printf("a plain node "); break; case Packed: printf("a packed node "); break; default: printf("a cloned node with index %llu ", label.clone_index); break; } printf("spanning (%llu, %llu) ", label.start, label.end); printf("labelled as a "); switch (label.variant) { case Terminal: printf("terminal "); break; case Nonterminal: printf("non-terminal "); break; default: printf("rule "); break; } printf("%llu\n", label.content); } void print_node(struct CForest *forest, uint64_t node) { unsigned char node_ptr[8] = { 0 }; to_big_endian(node, node_ptr); print_forest_node(forest, node_ptr); }