summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--avr/cmd_fat.c79
1 files 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;