static tb_bool_t tb_environment_set_impl(tb_char_t const* name, tb_char_t const* value) { // check tb_assert_and_check_return_val(name, tb_false); // done tb_bool_t ok = tb_false; tb_size_t size = 0; tb_wchar_t* value_w = tb_null; tb_size_t value_n = 0; do { // make name tb_wchar_t name_w[512] = {0}; tb_size_t name_n = tb_atow(name_w, name, tb_arrayn(name_w)); tb_assert_and_check_break(name_n); // exists value? if (value) { // make value value_n = tb_strlen(value); value_w = (tb_wchar_t*)tb_malloc0(sizeof(tb_wchar_t) * (value_n + 1)); tb_assert_and_check_break(value_w); // init value if (!tb_atow(value_w, value, value_n + 1)) break; // set it if (!tb_kernel32()->SetEnvironmentVariableW(name_w, value_w)) break; } // remove this variable else { // remove it if (!tb_kernel32()->SetEnvironmentVariableW(name_w, tb_null)) break; } // ok ok = tb_true; } while (0); // exit data if (value_w) tb_free(value_w); value_w = tb_null; // ok? return ok; }
/* ////////////////////////////////////////////////////////////////////////////////////// * callback */ static tb_void_t tb_directory_walk_remove(tb_char_t const* path, tb_file_info_t const* info, tb_cpointer_t priv) { // check tb_assert_and_check_return(path && info); // remove file if (info->type == TB_FILE_TYPE_FILE) tb_file_remove(path); // remvoe directory else if (info->type == TB_FILE_TYPE_DIRECTORY) { tb_wchar_t temp[TB_PATH_MAXN] = {0}; if (tb_atow(temp, path, TB_PATH_MAXN)) RemoveDirectoryW(temp); } }
/* ////////////////////////////////////////////////////////////////////////////////////// * private implementation */ static tb_bool_t tb_directory_walk_remove(tb_char_t const* path, tb_file_info_t const* info, tb_cpointer_t priv) { // check tb_assert_and_check_return_val(path && info, tb_false); // remove file if (info->type == TB_FILE_TYPE_FILE) tb_file_remove(path); // remvoe directory else if (info->type == TB_FILE_TYPE_DIRECTORY) { tb_wchar_t temp[TB_PATH_MAXN]; if (tb_atow(temp, path, TB_PATH_MAXN) != -1) RemoveDirectoryW(temp); } // continue return tb_true; }
static tb_wchar_t* tb_printf_object(tb_wchar_t* pb, tb_wchar_t* pe, tb_printf_entry_t e, tb_cpointer_t object) { // the object name tb_char_t data[1024] = {0}; tb_wtoa(data, e.object, tb_arrayn(data)); // find the object func tb_printf_object_func_t func = tb_printf_object_find(data); if (func) { // printf it tb_long_t size = func(object, data, tb_arrayn(data) - 1); if (size >= 0) { // end data[size] = '\0'; // atow size = tb_atow(pb, data, pe - pb); if (size >= 0) pb += size; } else { // invalid if (pb < pe) *pb++ = L'i'; if (pb < pe) *pb++ = L'n'; if (pb < pe) *pb++ = L'v'; if (pb < pe) *pb++ = L'a'; if (pb < pe) *pb++ = L'l'; if (pb < pe) *pb++ = L'i'; if (pb < pe) *pb++ = L'd'; } } else { // null if (pb < pe) *pb++ = L'n'; if (pb < pe) *pb++ = L'u'; if (pb < pe) *pb++ = L'l'; if (pb < pe) *pb++ = L'l'; } return pb; }
tb_void_t tb_directory_walk(tb_char_t const* path, tb_long_t recursion, tb_bool_t prefix, tb_directory_walk_func_t func, tb_cpointer_t priv) { // check tb_assert_and_check_return(path && func); // walk it directly if rootdir is relative path tb_file_info_t info = {0}; if (!tb_path_is_absolute(path) && tb_file_info(path, &info) && info.type == TB_FILE_TYPE_DIRECTORY) { tb_wchar_t path_w[TB_PATH_MAXN]; if (tb_atow(path_w, path, tb_arrayn(path_w)) != -1) tb_directory_walk_impl(path_w, recursion, prefix, func, priv); } else { // the absolute path (translate "~/") tb_wchar_t full_w[TB_PATH_MAXN]; if (tb_path_absolute_w(path, full_w, TB_PATH_MAXN)) tb_directory_walk_impl(full_w, recursion, prefix, func, priv); } }
/* ////////////////////////////////////////////////////////////////////////////////////// * private implementation */ static tb_char_t* tb_environment_get_impl(tb_char_t const* name, tb_size_t* psize) { // check tb_assert_and_check_return_val(name, 0); // done tb_bool_t ok = tb_false; tb_size_t size = 0; tb_size_t maxn = 256; tb_char_t* value = tb_null; tb_wchar_t* value_w = tb_null; do { // make value_w value_w = (tb_wchar_t*)tb_malloc0(sizeof(tb_wchar_t) * maxn); tb_assert_and_check_break(value_w); // make name tb_wchar_t name_w[512]; tb_size_t name_n = tb_atow(name_w, name, tb_arrayn(name_w)); tb_assert_and_check_break(name_n != -1); // get it size = (tb_size_t)tb_kernel32()->GetEnvironmentVariableW(name_w, value_w, (DWORD)maxn); if (!size) { // error? if (ERROR_ENVVAR_NOT_FOUND == GetLastError()) { // trace tb_trace_d("environment variable(%s) does not exist", name); } break; } else if (size > maxn) { // grow space value_w = (tb_wchar_t*)tb_ralloc(value_w, sizeof(tb_wchar_t) * (size + 1)); tb_assert_and_check_break(value_w); // get it size = (tb_size_t)tb_kernel32()->GetEnvironmentVariableW(name_w, value_w, (DWORD)size + 1); tb_assert_and_check_break(size); } // make value value = (tb_char_t*)tb_malloc0(sizeof(tb_char_t) * (size + 1)); tb_assert_and_check_break(value); // save value if ((size = tb_wtoa(value, value_w, size)) == -1) break; // save size if (psize) *psize = size; // ok ok = tb_true; } while (0); // failed? if (!ok) { // exit value if (value) tb_free(value); value = tb_null; } // exit value_w if (value_w) tb_free(value_w); value_w = tb_null; // ok? return value; }