Skip to content

Commit 29142bd

Browse files
fix windows build
1 parent 14db6ea commit 29142bd

5 files changed

Lines changed: 36 additions & 56 deletions

File tree

CMakeLists.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ else()
1717
endif()
1818

1919
find_package(phosg REQUIRED PATHS ${CMAKE_INSTALL_FULL_LIBDIR})
20-
find_package(SDL3)
20+
if (NOT DEFINED DISABLE_SDL)
21+
find_package(SDL3)
22+
endif()
2123

2224

2325

@@ -123,7 +125,7 @@ else()
123125
message("SDL3 is not available; disabling audio playback support in smssynth and modsynth")
124126
endif()
125127

126-
foreach(ExecutableName IN ITEMS resource_dasm m68kdasm blobbo_render bugs_bannis_render decode_data dupe_finder ferazel_render gamma_zee_render harry_render hypercard_dasm infotron_render lemmings_render m68kexec mshines_render render_bits render_sprite render_text replace_clut assemble_images icon_dearchiver)
128+
foreach(ExecutableName IN ITEMS resource_dasm m68kdasm blobbo_render bugs_bannis_render decode_data dupe_finder ferazel_render gamma_zee_render harry_render hypercard_dasm infotron_render lemmings_render m68kexec mshines_render pop2_render render_bits render_sprite render_text replace_clut assemble_images icon_dearchiver)
127129
add_executable(${ExecutableName} src/${ExecutableName}.cc)
128130
target_link_libraries(${ExecutableName} resource_file)
129131
endforeach()

src/Audio/AAFArchive.cc

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -240,8 +240,7 @@ struct BARCHeader {
240240
}
241241
};
242242

243-
unordered_map<string, SequenceProgram> barc_decode(const void* vdata,
244-
size_t size, const char* base_directory) {
243+
unordered_map<string, SequenceProgram> barc_decode(const void* vdata, size_t size, const char* base_directory) {
245244
if (size < sizeof(BARCHeader)) {
246245
throw invalid_argument("BARC data too small for header");
247246
}
@@ -254,27 +253,20 @@ unordered_map<string, SequenceProgram> barc_decode(const void* vdata,
254253
throw invalid_argument("BARC data too small for header");
255254
}
256255

257-
string sequence_archive_filename = format("{}/Seqs/{}", base_directory,
258-
barc->archive_filename);
259-
phosg::scoped_fd sequence_archive_fd(sequence_archive_filename.c_str(), O_RDONLY);
256+
string sequence_archive_filename = format("{}/Seqs/{}", base_directory, barc->archive_filename);
257+
auto f = phosg::fopen_unique(sequence_archive_filename, "rb");
260258

261259
unordered_map<string, SequenceProgram> ret;
262260
for (size_t x = 0; x < barc->entry_count; x++) {
263261
const auto& e = barc->entries[x];
264-
#ifdef WINDOWS
265-
// windows doesn't have pread, so simulate it in a non-thread-safe way
266-
lseek(sequence_archive_fd, e.offset, SEEK_SET);
267-
string data = readx(sequence_archive_fd, e.size);
268-
#else
269-
string data = phosg::preadx(sequence_archive_fd, e.size, e.offset);
270-
#endif
262+
fseek(f.get(), e.offset, SEEK_SET);
263+
string data = freadx(f.get(), e.size);
271264
size_t suffix = 0;
272265
string effective_name = e.name;
273266
while (ret.count(effective_name)) {
274267
effective_name = format("{}@{}", e.name, ++suffix);
275268
}
276-
ret.emplace(piecewise_construct, forward_as_tuple(effective_name),
277-
forward_as_tuple(x, std::move(data)));
269+
ret.emplace(piecewise_construct, forward_as_tuple(effective_name), forward_as_tuple(x, std::move(data)));
278270
}
279271

280272
return ret;
@@ -619,10 +611,7 @@ SoundEnvironment load_sound_environment(const char* base_directory) {
619611
}
620612

621613
{
622-
static const vector<string> filenames = {
623-
"/JaiInit.aaf",
624-
"/msound.aaf", // Super Mario Sunshine
625-
};
614+
static const vector<string> filenames = {"/JaiInit.aaf", "/msound.aaf"};
626615
for (const auto& filename : filenames) {
627616
string data;
628617
try {
@@ -635,11 +624,7 @@ SoundEnvironment load_sound_environment(const char* base_directory) {
635624
}
636625

637626
{
638-
static const vector<string> filenames = {
639-
"/GCKart.baa",
640-
"/Z2Sound.baa",
641-
"/SMR.baa",
642-
};
627+
static const vector<string> filenames = {"/GCKart.baa", "/Z2Sound.baa", "/SMR.baa"};
643628
for (const auto& filename : filenames) {
644629
string data;
645630
try {

src/IndexFormats/Directory.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ ResourceFile load_resource_file_from_directory(const string& dir_path) {
2222
continue;
2323
}
2424

25-
string type_item_name = type_item.path().filename();
25+
string type_item_name = type_item.path().filename().string();
2626
uint32_t type = resource_type_for_raw_string(unescape_hex_bytes_for_filename(type_item_name));
2727

2828
for (const auto& res_item : std::filesystem::directory_iterator(std::filesystem::path(dir_path) / type_item_name)) {
@@ -35,7 +35,7 @@ ResourceFile load_resource_file_from_directory(const string& dir_path) {
3535
? std::format(".{}", ext_it->second)
3636
: ".bin";
3737

38-
string res_item_name = res_item.path().filename();
38+
string res_item_name = res_item.path().filename().string();
3939
if (!res_item_name.ends_with(file_extension)) {
4040
continue;
4141
}

src/gcmasm.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ struct File {
151151
explicit File(const string& src_path)
152152
: src_path(src_path),
153153
name(phosg::basename(this->src_path)),
154-
size(phosg::stat(this->src_path).st_size) {
154+
size(std::filesystem::file_size(this->src_path)) {
155155
phosg::log_info_f("Add file: {} (as {})", this->src_path, this->name);
156156
}
157157

src/gcmdump.cc

Lines changed: 21 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ uint32_t dol_file_size(const DOLHeader* dol) {
132132
}
133133

134134
void parse_until(
135-
phosg::scoped_fd& fd,
135+
FILE* f,
136136
const FSTEntry* fst,
137137
const char* string_table,
138138
int start,
@@ -153,19 +153,11 @@ void parse_until(
153153
&string_table[fst[x].string_offset()]);
154154

155155
pwd += sanitize_filename(&string_table[fst[x].file.dir_flag_string_offset & 0x00FFFFFF]);
156-
if (mkdir(pwd.c_str(), S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) &&
157-
(errno != EEXIST)) {
158-
throw runtime_error("cannot create directory " + pwd);
159-
}
160-
if (chdir(pwd.c_str())) {
161-
throw runtime_error("cannot enter directory " + pwd);
162-
}
163-
parse_until(fd, fst, string_table, x + 1, fst[x].dir.next_offset,
164-
base_offset, target_filenames);
156+
std::filesystem::create_directories(pwd);
157+
std::filesystem::current_path(pwd);
158+
parse_until(f, fst, string_table, x + 1, fst[x].dir.next_offset, base_offset, target_filenames);
165159
pwd.resize(pwd_end);
166-
if (chdir(pwd.c_str())) {
167-
throw runtime_error("cannot return to directory " + pwd);
168-
}
160+
std::filesystem::current_path(pwd.c_str());
169161

170162
x = fst[x].dir.next_offset - 1;
171163

@@ -179,7 +171,8 @@ void parse_until(
179171
target_filenames.count(&string_table[fst[x].string_offset()])) {
180172
string filename = sanitize_filename(&string_table[fst[x].string_offset()]);
181173
try {
182-
phosg::save_file(filename, preadx(fd, fst[x].file.file_size, fst[x].file.file_offset + base_offset));
174+
fseek(f, fst[x].file.file_offset + base_offset, SEEK_SET);
175+
phosg::save_file(filename, phosg::freadx(f, fst[x].file.file_size));
183176
} catch (const exception& e) {
184177
phosg::fwrite_fmt(stderr, "!!! failed to write file: {}\n", e.what());
185178
}
@@ -220,10 +213,10 @@ int main(int argc, char* argv[]) {
220213
return -1;
221214
}
222215

223-
phosg::scoped_fd fd(filename, O_RDONLY);
216+
auto f = phosg::fopen_unique(filename, "rb");
224217

225218
ImageHeader header;
226-
phosg::readx(fd, &header, sizeof(ImageHeader));
219+
phosg::freadx(f.get(), &header, sizeof(ImageHeader));
227220
if (format == Format::UNKNOWN) {
228221
if (header.gcm.gc_magic == 0xC2339F3D) {
229222
format = Format::GCM;
@@ -261,29 +254,30 @@ int main(int argc, char* argv[]) {
261254
// if there are target filenames and default.dol isn't specified, don't
262255
// extract it
263256
if (target_filenames.empty() || target_filenames.count("default.dol")) {
264-
string dol_data = phosg::preadx(fd, sizeof(DOLHeader), dol_offset);
265-
uint32_t dol_size = dol_file_size(reinterpret_cast<const DOLHeader*>(
266-
dol_data.data()));
257+
fseek(f.get(), dol_offset, SEEK_SET);
258+
string dol_data = phosg::freadx(f.get(), sizeof(DOLHeader));
259+
uint32_t dol_size = dol_file_size(reinterpret_cast<const DOLHeader*>(dol_data.data()));
267260

268-
dol_data += phosg::preadx(fd, dol_size - sizeof(DOLHeader),
269-
dol_offset + sizeof(DOLHeader));
261+
dol_data += phosg::freadx(f.get(), dol_size - sizeof(DOLHeader));
270262

271263
phosg::save_file("default.dol", dol_data);
272264
}
273265

274266
if (target_filenames.empty() || target_filenames.count("__gcm_header__.bin")) {
275-
phosg::save_file("__gcm_header__.bin", preadx(fd, 0x2440, gcm_offset));
267+
fseek(f.get(), gcm_offset, SEEK_SET);
268+
phosg::save_file("__gcm_header__.bin", phosg::freadx(f.get(), 0x2440));
276269
}
277270

278271
if (target_filenames.empty() || target_filenames.count("apploader.bin")) {
279-
string data = phosg::preadx(fd, sizeof(ApploaderHeader), gcm_offset + 0x2440);
272+
fseek(f.get(), gcm_offset + 0x2440, SEEK_SET);
273+
string data = phosg::freadx(f.get(), sizeof(ApploaderHeader));
280274
const auto* header = reinterpret_cast<const ApploaderHeader*>(data.data());
281-
data += phosg::preadx(
282-
fd, header->size + header->trailer_size, gcm_offset + 0x2440 + sizeof(ApploaderHeader));
275+
data += phosg::freadx(f.get(), header->size + header->trailer_size);
283276
phosg::save_file("apploader.bin", data);
284277
}
285278

286-
string fst_data = phosg::preadx(fd, fst_size, fst_offset);
279+
fseek(f.get(), fst_offset, SEEK_SET);
280+
string fst_data = phosg::freadx(f.get(), fst_size);
287281
const FSTEntry* fst = reinterpret_cast<const FSTEntry*>(fst_data.data());
288282

289283
// if there are target filenames and fst.bin isn't specified, don't extract it
@@ -295,8 +289,7 @@ int main(int argc, char* argv[]) {
295289
phosg::fwrite_fmt(stderr, "> root: {:08X} files\n", num_entries);
296290

297291
char* string_table = (char*)fst + (sizeof(FSTEntry) * num_entries);
298-
parse_until(fd, fst, string_table, 1, num_entries, base_offset,
299-
target_filenames);
292+
parse_until(f.get(), fst, string_table, 1, num_entries, base_offset, target_filenames);
300293

301294
return 0;
302295
}

0 commit comments

Comments
 (0)