Opens a file with the specified filename and mode, converting filename and mode to UTF-16 on Windows.
| 242 | |
| 243 | /// Opens a file with the specified filename and mode, converting filename and mode to UTF-16 on Windows. |
| 244 | FILE* LASfopen(const char* const filename, const char* const mode) { |
| 245 | if (filename == nullptr || mode == nullptr || mode[0] == '\0') { |
| 246 | return nullptr; |
| 247 | } |
| 248 | FILE* file = nullptr; |
| 249 | |
| 250 | #ifdef _WIN32 |
| 251 | wchar_t* utf16_file_name = nullptr; |
| 252 | wchar_t* utf16_mode = nullptr; |
| 253 | |
| 254 | #ifdef FORCE_UTF8_PATH |
| 255 | utf16_file_name = UTF8toUTF16(filename); |
| 256 | #else |
| 257 | if (validate_utf8(filename)) { |
| 258 | utf16_file_name = UTF8toUTF16(filename); |
| 259 | } else { |
| 260 | utf16_file_name = ANSItoUTF16(filename); |
| 261 | } |
| 262 | // mode can be converted with UTF8toUTF16, as it contains only ASCII characters |
| 263 | utf16_mode = UTF8toUTF16(mode); |
| 264 | |
| 265 | if (utf16_file_name && utf16_mode) { |
| 266 | file = _wfopen(utf16_file_name, utf16_mode); |
| 267 | } |
| 268 | delete[] utf16_file_name; |
| 269 | delete[] utf16_mode; |
| 270 | #endif |
| 271 | #else |
| 272 | // The following block of code is deactivated as it is very unlikely to be needed under non-Windows systems. |
| 273 | // To re-enable, change #if 0 to #if 1. |
| 274 | #if 0 |
| 275 | char* utf8_file_name = nullptr; |
| 276 | |
| 277 | if (validate_utf8(filename)) { |
| 278 | file = fopen(filename, mode); |
| 279 | } else { |
| 280 | utf8_file_name = ANSItoUTF8(filename); |
| 281 | file = fopen(utf8_file_name, mode); |
| 282 | } |
| 283 | delete[] utf8_file_name; |
| 284 | #else |
| 285 | file = fopen(filename, mode); |
| 286 | #endif |
| 287 | #endif |
| 288 | |
| 289 | return file; |
| 290 | } |
| 291 | |
| 292 | /// <summary> |
| 293 | /// delete a file on common OS and report failure |
no test coverage detected