f_number_unsigned_t i = 0;
uint8_t j = 0;
const f_number_unsigned_t used_original = recurse->path.used;
+ f_number_unsigned_t used_directory = 0;
static const uint32_t flag_actions[] = {
f_directory_recurse_do_flag_before_e,
// Guarantee NULL termination.
recurse->path.string[recurse->path.used] = 0;
+ used_directory = recurse->path.used;
if (F_status_is_error_not(recurse->state.status)) {
recurse->state.status = f_directory_exists(recurse->path);
// This loop is not considered a loop for breaking and continuing.
if (recurse->state.status == F_break || recurse->state.status == F_done || recurse->state.status == F_continue || F_status_set_fine(recurse->state.status) == F_interrupt) break;
+ // Reset the path after operating on child directories.
+ recurse->path.used = used_directory;
+ recurse->path.string[recurse->path.used] = 0;
+
recurse->action(recurse, recurse->listing.directory.array[i], f_directory_recurse_do_flag_action_e | f_directory_recurse_do_flag_directory_e);
if (F_status_is_error(recurse->state.status)) {
recurse->path.used = used_original;
+ if (recurse->path.used < recurse->path.size) {
+ recurse->path.string[recurse->path.used] = 0;
+ }
+
// Only the directory is to be freed because all others are preserved between recursions.
f_memory_arrays_resize(0, sizeof(f_string_dynamic_t), (void **) &recurse->listing.directory.array, &recurse->listing.directory.used, &recurse->listing.directory.size, &f_string_dynamics_delete_callback);