From 6204987c3539b71856b4456f218511530af12c6f Mon Sep 17 00:00:00 2001 From: Leo C Date: Wed, 3 Dec 2014 18:34:54 +0100 Subject: [PATCH] Put static work area on heap. LFN buffer not needed for stat function --- avr/cmd_fat.c | 79 ++++++++++++++++++++++++--------------------------- 1 file changed, 37 insertions(+), 42 deletions(-) diff --git a/avr/cmd_fat.c b/avr/cmd_fat.c index 16a5157..df2ae69 100644 --- a/avr/cmd_fat.c +++ b/avr/cmd_fat.c @@ -76,36 +76,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 +112,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 +150,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 +195,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; -- 2.39.2