summaryrefslogtreecommitdiffstatshomepage
path: root/extmod
diff options
context:
space:
mode:
Diffstat (limited to 'extmod')
-rw-r--r--extmod/vfs_fat.c58
-rw-r--r--extmod/vfs_fat.h2
-rw-r--r--extmod/vfs_fat_misc.c59
3 files changed, 57 insertions, 62 deletions
diff --git a/extmod/vfs_fat.c b/extmod/vfs_fat.c
index 0076df2626..58af0a8e81 100644
--- a/extmod/vfs_fat.c
+++ b/extmod/vfs_fat.c
@@ -109,6 +109,52 @@ STATIC MP_DEFINE_CONST_STATICMETHOD_OBJ(fat_vfs_mkfs_obj, MP_ROM_PTR(&fat_vfs_mk
STATIC MP_DEFINE_CONST_FUN_OBJ_3(fat_vfs_open_obj, fatfs_builtin_open_self);
+typedef struct _mp_vfs_fat_ilistdir_it_t {
+ mp_obj_base_t base;
+ mp_fun_1_t iternext;
+ bool is_str;
+ FF_DIR dir;
+} mp_vfs_fat_ilistdir_it_t;
+
+STATIC mp_obj_t mp_vfs_fat_ilistdir_it_iternext(mp_obj_t self_in) {
+ mp_vfs_fat_ilistdir_it_t *self = MP_OBJ_TO_PTR(self_in);
+
+ for (;;) {
+ FILINFO fno;
+ FRESULT res = f_readdir(&self->dir, &fno);
+ char *fn = fno.fname;
+ if (res != FR_OK || fn[0] == 0) {
+ // stop on error or end of dir
+ break;
+ }
+
+ // Note that FatFS already filters . and .., so we don't need to
+
+ // make 3-tuple with info about this entry
+ mp_obj_tuple_t *t = MP_OBJ_TO_PTR(mp_obj_new_tuple(3, NULL));
+ if (self->is_str) {
+ t->items[0] = mp_obj_new_str(fn, strlen(fn));
+ } else {
+ t->items[0] = mp_obj_new_bytes((const byte*)fn, strlen(fn));
+ }
+ if (fno.fattrib & AM_DIR) {
+ // dir
+ t->items[1] = MP_OBJ_NEW_SMALL_INT(MP_S_IFDIR);
+ } else {
+ // file
+ t->items[1] = MP_OBJ_NEW_SMALL_INT(MP_S_IFREG);
+ }
+ t->items[2] = MP_OBJ_NEW_SMALL_INT(0); // no inode number
+
+ return MP_OBJ_FROM_PTR(t);
+ }
+
+ // ignore error because we may be closing a second time
+ f_closedir(&self->dir);
+
+ return MP_OBJ_STOP_ITERATION;
+}
+
STATIC mp_obj_t fat_vfs_ilistdir_func(size_t n_args, const mp_obj_t *args) {
mp_obj_fat_vfs_t *self = MP_OBJ_TO_PTR(args[0]);
bool is_str_type = true;
@@ -122,7 +168,17 @@ STATIC mp_obj_t fat_vfs_ilistdir_func(size_t n_args, const mp_obj_t *args) {
path = "";
}
- return fat_vfs_ilistdir2(self, path, is_str_type);
+ // Create a new iterator object to list the dir
+ mp_vfs_fat_ilistdir_it_t *iter = m_new_obj(mp_vfs_fat_ilistdir_it_t);
+ iter->base.type = &mp_type_polymorph_iter;
+ iter->iternext = mp_vfs_fat_ilistdir_it_iternext;
+ iter->is_str = is_str_type;
+ FRESULT res = f_opendir(&self->fatfs, &iter->dir, path);
+ if (res != FR_OK) {
+ mp_raise_OSError(fresult_to_errno_table[res]);
+ }
+
+ return MP_OBJ_FROM_PTR(iter);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(fat_vfs_ilistdir_obj, 1, 2, fat_vfs_ilistdir_func);
diff --git a/extmod/vfs_fat.h b/extmod/vfs_fat.h
index 688452973c..b6a4795bb4 100644
--- a/extmod/vfs_fat.h
+++ b/extmod/vfs_fat.h
@@ -60,6 +60,4 @@ mp_import_stat_t fat_vfs_import_stat(struct _fs_user_mount_t *vfs, const char *p
mp_obj_t fatfs_builtin_open_self(mp_obj_t self_in, mp_obj_t path, mp_obj_t mode);
MP_DECLARE_CONST_FUN_OBJ_KW(mp_builtin_open_obj);
-mp_obj_t fat_vfs_ilistdir2(struct _fs_user_mount_t *vfs, const char *path, bool is_str_type);
-
#endif // MICROPY_INCLUDED_EXTMOD_VFS_FAT_H
diff --git a/extmod/vfs_fat_misc.c b/extmod/vfs_fat_misc.c
index 1f90ac14ce..d72d9c69c6 100644
--- a/extmod/vfs_fat_misc.c
+++ b/extmod/vfs_fat_misc.c
@@ -31,65 +31,6 @@
#include "py/runtime.h"
#include "lib/oofatfs/ff.h"
#include "extmod/vfs_fat.h"
-#include "py/lexer.h"
-
-typedef struct _mp_vfs_fat_ilistdir_it_t {
- mp_obj_base_t base;
- mp_fun_1_t iternext;
- bool is_str;
- FF_DIR dir;
-} mp_vfs_fat_ilistdir_it_t;
-
-STATIC mp_obj_t mp_vfs_fat_ilistdir_it_iternext(mp_obj_t self_in) {
- mp_vfs_fat_ilistdir_it_t *self = MP_OBJ_TO_PTR(self_in);
-
- for (;;) {
- FILINFO fno;
- FRESULT res = f_readdir(&self->dir, &fno);
- char *fn = fno.fname;
- if (res != FR_OK || fn[0] == 0) {
- // stop on error or end of dir
- break;
- }
-
- // Note that FatFS already filters . and .., so we don't need to
-
- // make 3-tuple with info about this entry
- mp_obj_tuple_t *t = MP_OBJ_TO_PTR(mp_obj_new_tuple(3, NULL));
- if (self->is_str) {
- t->items[0] = mp_obj_new_str(fn, strlen(fn));
- } else {
- t->items[0] = mp_obj_new_bytes((const byte*)fn, strlen(fn));
- }
- if (fno.fattrib & AM_DIR) {
- // dir
- t->items[1] = MP_OBJ_NEW_SMALL_INT(MP_S_IFDIR);
- } else {
- // file
- t->items[1] = MP_OBJ_NEW_SMALL_INT(MP_S_IFREG);
- }
- t->items[2] = MP_OBJ_NEW_SMALL_INT(0); // no inode number
-
- return MP_OBJ_FROM_PTR(t);
- }
-
- // ignore error because we may be closing a second time
- f_closedir(&self->dir);
-
- return MP_OBJ_STOP_ITERATION;
-}
-
-mp_obj_t fat_vfs_ilistdir2(fs_user_mount_t *vfs, const char *path, bool is_str_type) {
- mp_vfs_fat_ilistdir_it_t *iter = m_new_obj(mp_vfs_fat_ilistdir_it_t);
- iter->base.type = &mp_type_polymorph_iter;
- iter->iternext = mp_vfs_fat_ilistdir_it_iternext;
- iter->is_str = is_str_type;
- FRESULT res = f_opendir(&vfs->fatfs, &iter->dir, path);
- if (res != FR_OK) {
- mp_raise_OSError(fresult_to_errno_table[res]);
- }
- return MP_OBJ_FROM_PTR(iter);
-}
mp_import_stat_t fat_vfs_import_stat(fs_user_mount_t *vfs, const char *path) {
FILINFO fno;