73{
74 if (argc != 3) {
75 std::cerr << "Usage: " << argv[0] << " <program/library> <file>" << std::endl;
76 return -1;
77 }
78
79 const char* target = argv[1];
80 const char* filename = argv[2];
81
82 const auto error_exit = [=](
const char*
error) {
83 std::cerr <<
"\n\tError: " <<
error <<
": " << filename <<
"\n"
84 << "\tTarget: " << target << "\n"
85 << std::endl;
86 std::exit(-2);
87 };
88
89 std::ifstream file(filename, std::ios::binary | std::ios::ate);
90 const auto size = file.tellg();
91
92 if (size == 0) {
93 return 0;
94 }
95
96 file.seekg(0, std::ios::beg);
97 std::vector<char> buffer(size);
98
99 if (file.read(buffer.data(), size)) {
100 buffer.push_back('\0');
101
102
103 if (
utf8_check(
reinterpret_cast<unsigned char*
>(buffer.data())) !=
nullptr) {
104 error_exit("Source file does not contain (valid) UTF-8");
105 }
106
107
108 if (buffer.size() >= 3
109 && buffer[0] == '\xef'
110 && buffer[1] == '\xbb'
111 && buffer[2] == '\xbf') {
112 error_exit("Source file is valid UTF-8 but contains a BOM mark");
113 }
114 } else {
115 error_exit("Could not read source file");
116 }
117
118 return 0;
119}
unsigned char * utf8_check(unsigned char *s)
Definition encoding-check.cpp:26
constexpr auto size(const C &c) -> decltype(c.size())
Definition span.hpp:183
static char error[256]
Definition tga.cpp:50