/* logic/library.h — 漫画书库扫描/排序(纯 C,不依赖 meow_ui.h)。 * * 分层契约同 examples/hello:logic 层只含文件系统与纯数据,宿主 gcc 可直接裸测。 * (M7 起另提供每册续读角标与册间顺序查询;续读状态本身由 logic/reader.c 持久化, * 本层只读它来拼副标题,宿主测试用配置存根顶替。) * 书库语义: * - 从 TF 卡根(MR_ROOT_DIR)起列「直接子目录」; * - 只保留自身含 PNG/JPEG/BMP 的目录,或子树中最终含图的中间目录(可继续导航); * - 行的 pages=该目录直接图片数;subdirs=其下含图子目录数(中间目录用于副标题); * - cover=缩略图源文件:优先该目录自然序第一张图,否则取第一个含图子目录的 cover; * - 条目按名称自然排序(page2 < page10),含前导零与数字/字母混合名。 * * 深度上限 MR_LIB_MAX_DEPTH 用于防止坏卡/超大树的无限递归;隐藏目录与系统目录 * (. 开头、MeowAPPs/MeowData/MeowOS/lost+found)不参与书库。符号链接跳过(防环)。 */ #ifndef MR_LIBRARY_H #define MR_LIBRARY_H #ifdef __cplusplus extern "C" { #endif #define MR_PATH_MAX 512 #define MR_NAME_MAX 256 #define MR_LIB_MAX_DEPTH 8 typedef struct mr_library_entry { char name[MR_NAME_MAX]; /* 目录名(行主标题) */ char path[MR_PATH_MAX]; /* 完整路径(导航/进 reader 用) */ char cover[MR_PATH_MAX]; /* 缩略图源图(空=none) */ char subtitle[48]; /* 预先格式化好的 "N pages" / "N folders" */ int pages; /* 本目录直接图片数 */ int subdirs; /* 本目录下含图子目录数 */ int has_images; /* 1=本目录直接含图(点入进 reader) */ } mr_library_entry; typedef struct mr_library { mr_library_entry *items; int count; int cap; } mr_library; /* 扩展名判断:png/jpg/jpeg/bmp(大小写不敏感)。1=受支持图片。 */ int mr_path_is_image(const char *name); /* 自然排序比较:数字段按数值比(page2 < page10),数字相等时前导零少的在前; * 非数字段 ASCII 大小写不敏感,完全等价时按原始字节序定序。 */ int mr_natural_cmp(const char *a, const char *b); /* 扫描 dir 的直接子目录,写入 lib(先释放 lib 旧内容)。 * 返回条目数(>=0);dir 不可读返回 -1(lib 仍为空且可安全 mr_library_free)。 * max_depth<=0 或超过 MR_LIB_MAX_DEPTH 时按上限处理。 */ int mr_library_scan(mr_library *lib, const char *dir, int max_depth); /* 释放条目数组并清零(可重复调用)。 */ void mr_library_free(mr_library *lib); /* 取父目录路径(去掉末尾 '/' 后截断最后一段)。根 "/" 返回 "/"。 * 成功 0;参数非法/输出缓冲不足 -1。 */ int mr_path_parent(const char *path, char *out, int outsz); /* 目录是否**直接**含受支持图片(= 书库语义里的「一本书」,可直接进 reader)。 * 1=有;0=没有/不可读。 */ int mr_library_dir_has_images(const char *dir); /* 册间衔接(M7):同父目录下按书库自然序排列的「直接含图」兄弟册。 * delta=+1 下一册 / -1 上一册。1=找到并写入 out 完整路径; * 0=没有相邻册(当前册是首/末册,或当前册不在兄弟表中);-1=参数非法。 * 语义与书库一致:跳过隐藏/系统目录与符号链接,排序同 mr_natural_cmp。 */ int mr_book_adjacent(const char *dir, int delta, char *out, int outsz); #ifdef __cplusplus } #endif #endif /* MR_LIBRARY_H */