#include #include #include static void print_rope(const struct fx_rope *rope, int depth) { for (int i = 0; i < depth; i++) { printf(" "); } printf("[%x:", rope->r_flags); (FX_ROPE_TYPE(rope->r_flags) == FX_ROPE_F_CHAR) && printf(" CHAR"); (FX_ROPE_TYPE(rope->r_flags) == FX_ROPE_F_CSTR) && printf(" CSTR"); (FX_ROPE_TYPE(rope->r_flags) == FX_ROPE_F_CSTR_BORROWED) && printf(" CSTR_BORROWED"); (FX_ROPE_TYPE(rope->r_flags) == FX_ROPE_F_CSTR_STATIC) && printf(" CSTR_STATIC"); (FX_ROPE_TYPE(rope->r_flags) == FX_ROPE_F_INT) && printf(" INT"); (FX_ROPE_TYPE(rope->r_flags) == FX_ROPE_F_UINT) && printf(" UINT"); (FX_ROPE_TYPE(rope->r_flags) == FX_ROPE_F_COMPOSITE) && printf(" COMPOSITE"); (rope->r_flags & FX_ROPE_F_MALLOC) && printf(" MALLOC"); printf("] "); switch (FX_ROPE_TYPE(rope->r_flags)) { case FX_ROPE_F_CHAR: printf("%c", rope->r_v.v_char); break; case FX_ROPE_F_CSTR: case FX_ROPE_F_CSTR_BORROWED: case FX_ROPE_F_CSTR_STATIC: printf("%s", rope->r_v.v_cstr.s); break; case FX_ROPE_F_INT: printf("%" PRIdPTR, rope->r_v.v_int); break; case FX_ROPE_F_UINT: printf("%" PRIuPTR, rope->r_v.v_uint); break; default: break; } printf("\n"); if (FX_ROPE_TYPE(rope->r_flags) == FX_ROPE_F_COMPOSITE) { if (rope->r_v.v_composite.r_left) { print_rope(rope->r_v.v_composite.r_left, depth + 1); } if (rope->r_v.v_composite.r_right) { print_rope(rope->r_v.v_composite.r_right, depth + 1); } } } int main(void) { fx_rope a = FX_ROPE_CHAR('a'); fx_rope b = FX_ROPE_CSTR_STATIC("Hello, world!"); fx_rope c = FX_ROPE_INT(-4096); fx_rope d = FX_ROPE_UINT(4096); fx_rope str; const fx_rope *ropes[] = { &a, &b, &c, &d, }; fx_rope_join(&str, ropes, sizeof ropes / sizeof ropes[0]); print_rope(&str, 0); char cstr[1024]; fx_rope_to_cstr(&str, cstr, sizeof cstr); fx_rope_destroy(&str); printf("%s\n", cstr); return 0; }