X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp.git/blobdiff_plain/b15d22a4e43f86058b3b053096ab885a4cef6603..5f7f3586b0444116d5c1340465ecae8d6daa2461:/avr/cmd_fat.c diff --git a/avr/cmd_fat.c b/avr/cmd_fat.c index 16a5157..c5791e5 100644 --- a/avr/cmd_fat.c +++ b/avr/cmd_fat.c @@ -1,3 +1,13 @@ +/* + * (C) Copyright 2014 Leo C. + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +/* + * FAT filesystem commands + */ + #include "common.h" #include #include @@ -12,8 +22,8 @@ #include "timer.h" #include "debug.h" - -#define MAX_MEMORY (1ul << 20) +/* TODO: use memory size test function (cmd_mem.c) */ +#define MAX_MEMORY (1ul << 19) #define BUFFER_SIZE 512 @@ -76,36 +86,31 @@ void put_rc (FRESULT rc) } } -/* Work register for fs command */ -static DWORD AccSize; -static WORD AccFiles, AccDirs; -#if _USE_LFN -char Lfname[_MAX_LFN+1]; -FILINFO Finfo = { - .lfname = Lfname, - .lfsize = sizeof Lfname - }; -#else -FILINFO Finfo; -#endif - -static const FLASH char swirlchar[] = { '-','\\','|','/' }; static void swirl(void) { + static const FLASH char swirlchar[] = { '-','\\','|','/' }; static uint_fast8_t cnt; static uint32_t tstamp; if (get_timer(0) > tstamp) { printf_P(PSTR("\b%c"), swirlchar[cnt]); cnt = (cnt+1) % ARRAY_SIZE(swirlchar); - tstamp = get_timer(0) + 300; + tstamp = get_timer(0) + 250; } } +/* Work register for fs command */ +struct stat_dat_s { + DWORD AccSize; + WORD AccFiles, AccDirs; + FILINFO Finfo; +}; + static FRESULT scan_files ( - char* path /* Pointer to the working buffer with start path */ + char *path, /* Pointer to the working buffer with start path */ + struct stat_dat_s *statp ) { DIR dirs; @@ -117,23 +122,23 @@ FRESULT scan_files ( swirl(); if (res == FR_OK) { i = strlen(path); - while (((res = f_readdir(&dirs, &Finfo)) == FR_OK) && Finfo.fname[0]) { - if (_FS_RPATH && Finfo.fname[0] == '.') continue; -#if _USE_LFN - fn = *Finfo.lfname ? Finfo.lfname : Finfo.fname; -#else - fn = Finfo.fname; -#endif - if (Finfo.fattrib & AM_DIR) { - AccDirs++; - path[i] = '/'; strcpy(path+i+1, fn); - res = scan_files(path); + while (((res = f_readdir(&dirs, &statp->Finfo)) == FR_OK) && + statp->Finfo.fname[0]) { + if (_FS_RPATH && statp->Finfo.fname[0] == '.') + continue; + fn = statp->Finfo.fname; + if (statp->Finfo.fattrib & AM_DIR) { + statp->AccDirs++; + path[i] = '/'; + strcpy(path+i+1, fn); + res = scan_files(path, statp); path[i] = '\0'; - if (res != FR_OK) break; + if (res != FR_OK) + break; } else { -// printf_P(PSTR("%s/%s\n"), path, fn); - AccFiles++; - AccSize += Finfo.fsize; + //printf_P(PSTR("%s/%s\n"), path, fn); + statp->AccFiles++; + statp->AccSize += statp->Finfo.fsize; } if (check_abort()) { res = 255; @@ -155,15 +160,16 @@ command_ret_t do_fat_stat(cmd_tbl_t *cmdtp, int flag, int argc, char * const arg FATFS *FatFs, *fs; DWORD nfreeclst; FRESULT res; - char *buffer; + char *path; + struct stat_dat_s statp; (void) cmdtp; (void) flag; (void) argc; FatFs = (FATFS *) malloc(sizeof (FATFS)); - buffer = (char *) malloc(BUFFER_SIZE); - if (FatFs == NULL || buffer == NULL) { + path = (char *) malloc(BUFFER_SIZE); + if (FatFs == NULL || path == NULL) { printf_P(PSTR("fatstat: Out of Memory!\n")); - free(buffer); + free(path); free(FatFs); return CMD_RET_FAILURE; } @@ -199,25 +205,24 @@ command_ret_t do_fat_stat(cmd_tbl_t *cmdtp, int flag, int argc, char * const arg #endif if (!res) { my_puts_P(PSTR("\nCounting... ")); - AccSize = AccFiles = AccDirs = 0; + statp.AccSize = statp.AccFiles = statp.AccDirs = 0; + strcpy(path, argv[1]); - strcpy(buffer, argv[1]); - - res = scan_files(buffer); + res = scan_files(path, &statp); } if (!res) { printf_P(PSTR("\r%u files, %lu bytes.\n%u folders.\n" "%lu KB total disk space.\n%lu KB available.\n"), - AccFiles, AccSize, AccDirs, + statp.AccFiles, statp.AccSize, statp.AccDirs, (fs->n_fatent - 2) * (fs->csize / 2), nfreeclst * (fs->csize / 2) ); } } } - f_mount(NULL, argv[1], 0); - free(buffer); + free(path); free(FatFs); + f_mount(NULL, argv[1], 0); if (res) { put_rc(res); return CMD_RET_FAILURE; @@ -295,6 +300,39 @@ command_ret_t do_fat_ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ return CMD_RET_SUCCESS; } +static +FRESULT mkpath(TCHAR *path) +{ + /* TODO: */ + (void) path; +#if 0 + FILINFO fd + TCHAR *p, *q; + FRESULT ret; + +#if _USE_LFN + fd.lfname = 0; +#endif + + + res = f_stat (path, &fd) + + p = strchr(path, ':'); + if (p == NULL || *++p == '\0' || *p++ != '/') + return FR_OK; + + while ((q = strchr(p, '/')) != NULL) { + *q = '\0'; + ret = f_mkdir(path); + *q = '/'; + if (ret != FR_OK && ret != FR_EXIST) + return ret; + p = q + 1; + } +#endif + + return FR_OK; +} /* * fatread/write - load binary file to/from a dos filesystem @@ -348,6 +386,12 @@ command_ret_t do_fat_rw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ } res = f_mount(FatFs, argv[1], 0); + + if (!res) { + if (dowrite) { + res = mkpath(argv[1]); + } + } if (!res) { res = f_open(&File, argv[1], dowrite ? FA_WRITE | FA_CREATE_ALWAYS : FA_READ );