static void test_all(TestBatch *batch) { CharBuf *foo = (CharBuf*)ZCB_WRAP_STR("foo", 3); CharBuf *boffo = (CharBuf*)ZCB_WRAP_STR("boffo", 5); CharBuf *foo_boffo = (CharBuf*)ZCB_WRAP_STR("foo/boffo", 9); CharBuf *test_dir = (CharBuf*)ZCB_WRAP_STR("_fsdir_test", 11); FSFolder *folder = FSFolder_new(test_dir); bool_t saw_foo = false; bool_t saw_boffo = false; bool_t foo_was_dir = false; bool_t boffo_was_dir = false; int count = 0; // Clean up after previous failed runs. FSFolder_Delete(folder, foo_boffo); FSFolder_Delete(folder, foo); FSFolder_Delete(folder, boffo); rmdir("_fsdir_test"); FSFolder_Initialize(folder); FSFolder_MkDir(folder, foo); OutStream *outstream = FSFolder_Open_Out(folder, boffo); DECREF(outstream); outstream = FSFolder_Open_Out(folder, foo_boffo); DECREF(outstream); FSDirHandle *dh = FSDH_open(test_dir); CharBuf *entry = FSDH_Get_Entry(dh); while (FSDH_Next(dh)) { count++; if (CB_Equals(entry, (Obj*)foo)) { saw_foo = true; foo_was_dir = FSDH_Entry_Is_Dir(dh); } else if (CB_Equals(entry, (Obj*)boffo)) { saw_boffo = true; boffo_was_dir = FSDH_Entry_Is_Dir(dh); } } TEST_INT_EQ(batch, 2, count, "correct number of entries"); TEST_TRUE(batch, saw_foo, "Directory was iterated over"); TEST_TRUE(batch, foo_was_dir, "Dir correctly identified by Entry_Is_Dir"); TEST_TRUE(batch, saw_boffo, "File was iterated over"); TEST_FALSE(batch, boffo_was_dir, "File correctly identified by Entry_Is_Dir"); DECREF(dh); FSFolder_Delete(folder, foo_boffo); FSFolder_Delete(folder, foo); FSFolder_Delete(folder, boffo); DECREF(folder); rmdir("_fsdir_test"); }
bool FSDH_next(FSDirHandle *self) { FSDirHandleIVARS *const ivars = FSDH_IVARS(self); ivars->sys_dir_entry = (struct dirent*)readdir((DIR*)ivars->sys_dirhandle); if (!ivars->sys_dir_entry) { CB_Set_Size(ivars->entry, 0); return false; } else { struct dirent *sys_dir_entry = (struct dirent*)ivars->sys_dir_entry; #ifdef CHY_HAS_DIRENT_D_NAMLEN size_t len = sys_dir_entry->d_namlen; #else size_t len = strlen(sys_dir_entry->d_name); #endif if (SI_is_updir(sys_dir_entry->d_name, len)) { return FSDH_Next(self); } else { CB_Mimic_Str(ivars->entry, sys_dir_entry->d_name, len); return true; } } }
bool FSDH_next(FSDirHandle *self) { FSDirHandleIVARS *const ivars = FSDH_IVARS(self); HANDLE dirhandle = (HANDLE)ivars->sys_dirhandle; WIN32_FIND_DATA *find_data = (WIN32_FIND_DATA*)ivars->sys_dir_entry; // Attempt to move forward or absorb cached iter. if (!dirhandle || dirhandle == INVALID_HANDLE_VALUE) { return false; } else if (ivars->delayed_iter) { ivars->delayed_iter = false; } else if ((FindNextFile(dirhandle, find_data) == 0)) { // Iterator exhausted. Verify that no errors were encountered. CB_Set_Size(ivars->entry, 0); if (GetLastError() != ERROR_NO_MORE_FILES) { char *win_error = Err_win_error(); ivars->saved_error = Err_new(CB_newf("Error while traversing directory: %s", win_error)); FREEMEM(win_error); } return false; } // Process the results of the iteration. size_t len = strlen(find_data->cFileName); if (SI_is_updir(find_data->cFileName, len)) { return FSDH_Next(self); } else { CB_Mimic_Str(ivars->entry, find_data->cFileName, len); return true; } }