#include #include "drive.h" #include "util.h" #include "log.h" static char nbuf2[11]; static char path_builder[200]; static uint8_t path_builder_len; static char indent_builder[20]; static uint8_t indent_builder_len; void reset_tree() { path_builder[0] = '\0'; path_builder_len = 0; indent_builder[0] = ' '; indent_builder[1] = ' '; indent_builder[2] = '\0'; indent_builder_len = 2; } void tree(struct drive *d) { struct directory_content_info infos[100]; uint8_t n_infos = d->enumerate_dir(d, path_builder, infos, 100); if (!n_infos) { logsz(indent_builder); logsz("(empty)\n"); return; } for (uint8_t i = 0; i < n_infos; ++i) { logsz(indent_builder); logsz(infos[i].name); if (infos[i].is_dir) { logsz(":\n"); indent_builder[indent_builder_len] = ' '; indent_builder[indent_builder_len + 1] = ' '; indent_builder[indent_builder_len + 2] = '\0'; indent_builder_len += 2; uint8_t name_length = 0; while (infos[i].name[name_length]) ++name_length; memcpy(path_builder + path_builder_len, infos[i].name, name_length + 1); path_builder_len += name_length; tree(d); path_builder_len -= name_length; path_builder[path_builder_len] = '\0'; indent_builder_len -= 2; indent_builder[indent_builder_len] = '\0'; } else { u32_dec(infos[i].size, nbuf2); logsz(" ("); logsz(nbuf2); logsz(" bytes)\n"); } } }