74{
75 std::ifstream file(filename, std::ios::binary | std::ios::ate);
76 if (!file.is_open()) {
77 std::cerr << "\n\tError: Could not open file: " << filename
78 << "\n\tTarget: " << target << "\n" << std::endl;
79 return false;
80 }
81
82 const std::streampos
pos = file.tellg();
83
84
85
86 if (pos < 0) {
87 std::cerr << "\n\tError: Could not determine file size: " << filename
88 << "\n\tTarget: " << target << "\n" << std::endl;
89 return false;
90 }
91
92 const auto size =
static_cast<std::size_t
>(
pos);
93
94 if (size == 0)
95 return true;
96
97 file.seekg(0, std::ios::beg);
98 std::vector<char> buffer(size);
99
100
101
102
103 if (!file.read(buffer.data(), static_cast<std::streamsize>(size))) {
104 std::cerr << "\n\tError: Could not read source file: " << filename
105 << "\n\tTarget: " << target << "\n" << std::endl;
106 return false;
107 }
108
109 buffer.push_back('\0');
110
111 if (
utf8_check(
reinterpret_cast<unsigned char*
>(buffer.data())) !=
nullptr) {
112 std::cerr << "\n\tError: Source file does not contain (valid) UTF-8: " << filename
113 << "\n\tTarget: " << target << "\n" << std::endl;
114 return false;
115 }
116
117 if (buffer.size() >= 3
118 && buffer[0] == '\xef'
119 && buffer[1] == '\xbb'
120 && buffer[2] == '\xbf') {
121 std::cerr << "\n\tError: Source file is valid UTF-8 but contains a BOM mark: " << filename
122 << "\n\tTarget: " << target << "\n" << std::endl;
123 return false;
124 }
125
126 return true;
127}
unsigned char * utf8_check(unsigned char *s)
Definition encoding-check.cpp:27
Vec3d pos(const Pt &p)
Definition ReprojectPointsOnMesh.hpp:16