35 using namespace CHRLib;
51 opendir(
const char* name)
53 static_assert(
sizeof(
wchar_t) ==
sizeof(
ucs2_t),
"Wrong character type!");
58 const auto wstr(reinterpret_cast<wchar_t*>(
ucsdup(name)));
63 const auto r(::GetFileAttributesW(wstr));
66 if(r != INVALID_FILE_ATTRIBUTES && r & FILE_ATTRIBUTE_DIRECTORY)
68 const auto dir(static_cast<DIR*>(std::malloc(
sizeof(DIR))));
70 yassume(std::strlen(name) + 2 <
sizeof(dir->Name));
72 dir->WinDir = ::WIN32_FIND_DATAW();
73 yunseq(std::sprintf(dir->Name,
"%s\\*", name), dir->hNode =
nullptr,
74 dir->POSIXDir.lpWinDir = &dir->WinDir);
83 static_assert(
sizeof(
wchar_t) ==
sizeof(
ucs2_t),
"Wrong character type!");
90 yconstraint(dir->Name[std::strlen(dir->Name) - 1] !=
'\\');
92 const auto wstr(reinterpret_cast<wchar_t*>(
ucsdup(dir->Name)));
96 if((dir->hNode = ::FindFirstFileW(wstr, &dir->WinDir))
97 == INVALID_HANDLE_VALUE)
101 else if(!::FindNextFileW(dir->hNode, &dir->WinDir))
103 FindClose(dir->hNode);
104 dir->hNode =
nullptr;
106 if(dir->hNode && dir->hNode != INVALID_HANDLE_VALUE)
108 yassume(dir->WinDir.cFileName);
110 const auto str(static_cast<char*>(std::malloc(
111 std::wcslen(dir->WinDir.cFileName) << 2)));
113 UCS2ToMBCS(str, reinterpret_cast<const ucs2_t*>(dir->WinDir.cFileName));
117 yassume(std::strlen(str) <
sizeof(dir->POSIXDir.d_name));
119 std::strcpy(dir->POSIXDir.d_name, str);
121 dir->POSIXDir.d_reclen = std::strlen(dir->POSIXDir.d_name);
122 yunseq(dir->POSIXDir.d_off = 0, dir->POSIXDir.d_ino = 0);
124 return !dir->hNode ?
nullptr : &dir->POSIXDir;
132 ::FindClose(dir->hNode);
133 dir->hNode =
nullptr;
143 ::FindClose(dir->hNode);