static void test_Mimic_and_Clone(TestBatch *batch) { CharBuf *wanted = S_get_cb("foo"); CharBuf *got = S_get_cb("bar"); CB_Mimic(got, (Obj*)wanted); TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "Mimic"); DECREF(got); got = S_get_cb("bar"); CB_Mimic_Str(got, "foo", 3); TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "Mimic_Str"); DECREF(got); got = CB_Clone(wanted); TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "Clone"); DECREF(got); DECREF(wanted); }
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; } }