5#ifndef GEMMI_FILEUTIL_HPP_
6#define GEMMI_FILEUTIL_HPP_
11#include <initializer_list>
16#if defined(_WIN32) && !defined(GEMMI_USE_FOPEN)
24 std::initializer_list<const char*>
exts) {
25 size_t pos = path.find_last_of(
"\\/");
26 std::string
basename = pos == std::string::npos ? path : path.substr(pos + 1);
27 for (
const char* ext :
exts) {
28 size_t len = std::strlen(ext);
37typedef std::unique_ptr<std::FILE,
decltype(&std::fclose)>
fileptr_t;
41#if defined(_WIN32) && !defined(GEMMI_USE_FOPEN)
44 if ((file = ::_wfopen(
wpath.c_str(),
wmode.c_str())) ==
nullptr)
46 if ((file = std::fopen(path,
mode)) ==
nullptr)
48 sys_fail(std::string(
"Failed to open ") + path +
49 (*
mode ==
'w' ?
" for writing" :
""));
56 if (path[0] ==
'-' && path[1] ==
'\0')
61inline std::size_t
file_size(std::FILE* f,
const std::string& path) {
64 long length = std::ftell(f);
75 return *
reinterpret_cast<char *
>(&x) == 1;
79 char*
bytes =
static_cast<char*
>(start);
84 char*
bytes =
static_cast<char*
>(start);
90 char*
bytes =
static_cast<char*
>(start);
102 if (std::fread(
buffer.data(), size, 1, f.get()) != 1)
123 if (
input.is_stdin())
125 if (
input.is_compressed())
126 return input.uncompress_into_buffer();
void swap_eight_bytes(void *start)
void swap_four_bytes(void *start)
CharArray read_into_buffer(T &&input)
std::unique_ptr< std::FILE, decltype(&std::fclose)> fileptr_t
CharArray read_stdin_into_buffer()
std::size_t file_size(std::FILE *f, const std::string &path)
std::wstring UTF8_to_wchar(const char *in)
std::string path_basename(const std::string &path, std::initializer_list< const char * > exts)
fileptr_t file_open(const char *path, const char *mode)
void swap_two_bytes(void *start)
GEMMI_COLD void sys_fail(const std::string &msg)
CharArray read_file_into_buffer(const std::string &path)
fileptr_t file_open_or(const char *path, const char *mode, std::FILE *dash_stream)