#ifndef SCC_TREE_DUMP_H #define SCC_TREE_DUMP_H #include "scc_core_str.h" #include "scc_core_vec.h" typedef struct scc_tree_dump { scc_str_t buf; // 字符串缓冲区 SCC_VEC(cbool) stack; // 缩进栈:每个元素表示该层是否为最后一个子节点 cbool use_color; // 是否启用颜色 cbool line_start; // 当前是否在行首(需要输出缩进) // 可配置的缩进字符串 const char *vertical; // "| " const char *branch; // "|-" const char *last_branch; // "`-" const char *space; // " " // 颜色字符串(当 use_color 为 false 时为空字符串) const char *node_color; // 节点名称颜色 const char *value_color; // 值颜色 const char *branch_color; // 分支符号颜色 const char *reset_color; // 重置颜色 } scc_tree_dump_t; /** * @brief 初始化树形输出器 * @param td 输出器指针 * @param use_color 是否使用 ANSI 颜色 */ void scc_tree_dump_init(scc_tree_dump_t *td, cbool use_color); /** * @brief 释放输出器占用的资源 */ void scc_tree_dump_drop(scc_tree_dump_t *td); /** * @brief 清空当前缓冲区,但保留已分配内存 */ void scc_tree_dump_clear(scc_tree_dump_t *td); /** * @brief 获取当前构建的字符串(以 '\0' 结尾) * @return 内部缓冲区指针,不可 free */ const char *scc_tree_dump_cstr(scc_tree_dump_t *td); /** * @brief 将缓冲区内容通过回调输出,并清空缓冲区 * @param output 输出回调函数,接收字符串指针、长度、用户数据 * @param user 用户数据 */ void scc_tree_dump_flush(scc_tree_dump_t *td, void (*output)(const char *str, usize len, void *user), void *user); /** * @brief 开始一个新行(自动输出缩进) * @note 通常不需要手动调用,因为 append 系列函数会自动处理 */ void scc_tree_dump_begin_line(scc_tree_dump_t *td); /** * @brief 追加普通字符串(自动处理行首缩进) */ void scc_tree_dump_append(scc_tree_dump_t *td, const char *s); /** * @brief 格式化追加(printf 风格) */ void scc_tree_dump_append_fmt(scc_tree_dump_t *td, const char *fmt, ...); /** * @brief 追加带节点颜色的文本 */ #define scc_tree_dump_node(td, fmt, ...) \ scc_tree_dump_append_fmt(td, "%s" fmt "%s", (td)->node_color, \ ##__VA_ARGS__, (td)->reset_color) /** * @brief 追加带值颜色的格式化文本 */ #define scc_tree_dump_value(td, fmt, ...) \ scc_tree_dump_append_fmt(td, "%s" fmt "%s", (td)->value_color, \ ##__VA_ARGS__, (td)->reset_color) /** * @brief 推入新层级 * @param is_last 该层级是否是父节点的最后一个子节点 */ void scc_tree_dump_push(scc_tree_dump_t *td, cbool is_last); /** * @brief 弹出当前层级 */ void scc_tree_dump_pop(scc_tree_dump_t *td); #endif // SCC_TREE_DUMP_H