| 181 | } |
| 182 | |
| 183 | static std::optional<FileHandle> FioFOpenFileSp(std::string_view filename, std::string_view mode, Searchpath sp, Subdirectory subdir, size_t *filesize) |
| 184 | { |
| 185 | #if defined(_WIN32) |
| 186 | /* fopen is implemented as a define with ellipses for |
| 187 | * Unicode support (prepend an L). As we are not sending |
| 188 | * a string, but a variable, it 'renames' the variable, |
| 189 | * so make that variable to makes it compile happily */ |
| 190 | wchar_t Lmode[5]; |
| 191 | MultiByteToWideChar(CP_ACP, 0, mode.data(), static_cast<int>(std::size(mode)), Lmode, static_cast<int>(std::size(Lmode))); |
| 192 | #endif |
| 193 | std::string buf; |
| 194 | |
| 195 | if (subdir == NO_DIRECTORY) { |
| 196 | buf = filename; |
| 197 | } else { |
| 198 | buf = fmt::format("{}{}{}", _searchpaths[sp], _subdirs[subdir], filename); |
| 199 | } |
| 200 | |
| 201 | auto f = FileHandle::Open(buf, mode); |
| 202 | #if !defined(_WIN32) |
| 203 | if (!f.has_value() && strtolower(buf, subdir == NO_DIRECTORY ? 0 : _searchpaths[sp].size() - 1) ) { |
| 204 | f = FileHandle::Open(buf, mode); |
| 205 | } |
| 206 | #endif |
| 207 | if (f.has_value() && filesize != nullptr) { |
| 208 | /* Find the size of the file */ |
| 209 | fseek(*f, 0, SEEK_END); |
| 210 | *filesize = ftell(*f); |
| 211 | fseek(*f, 0, SEEK_SET); |
| 212 | } |
| 213 | return f; |
| 214 | } |
| 215 | |
| 216 | /** |
| 217 | * Opens a file from inside a tar archive. |
no test coverage detected