Skip to content

Commit 9da99c2

Browse files
committed
feat: add defer
1 parent e63a32e commit 9da99c2

10 files changed

+424
-389
lines changed

.vscode/launch.json

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,21 @@
11
{
2-
// 使用 IntelliSense 了解相关属性。
2+
// 使用 IntelliSense 了解相关属性。
33
// 悬停以查看现有属性的描述。
44
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
55
"version": "0.2.0",
66
"configurations": [
7+
{
8+
"name": "onscripter 启动",
9+
"type": "cppdbg",
10+
"request": "launch",
11+
"program": "${workspaceFolder}/build/macosx/x86_64/debug/onscripter",
12+
"args": ["/Users/zero/Documents/ons/初音岛2"],
13+
"stopAtEntry": false,
14+
"cwd": "${workspaceFolder}",
15+
"environment": [],
16+
"externalConsole": false,
17+
"MIMode": "lldb"
18+
},
719
{
820
"name": "(lldb) 启动",
921
"type": "cppdbg",

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -172,3 +172,4 @@ adb install ./app/build/outputs/apk/debug/app-debug.apk
172172
- [gb2312码表](https://uic.io/zh/charset/show/gb2312/)
173173
- [gb18030码表](https://uic.io/zh/charset/show/gb18030/)
174174
- [SDL2_Tutorials](https://lazyfoo.net/tutorials/SDL/index.php)
175+
- [C++开源库列表](https://www.cnblogs.com/chendeqiang/p/12861712.html)

include/infra/Config.hpp

+21
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,27 @@ template <typename T, typename... Args>
8181
inline UniquePtr<T> MakeUnique(Args&&... args) {
8282
return std::make_unique<T, Args...>(std::forward<Args>(args)...);
8383
}
84+
85+
#define var_defer__(x) defer__ ## x
86+
#define var_defer_(x) var_defer__(x)
87+
#define defer(ops) onscripter::Defer var_defer_(__COUNTER__)(ops)
88+
#define ref_defer(ops) onscripter::Defer var_defer_(__COUNTER__)([&]{ ops; }) // Capture all by ref
89+
#define val_defer(ops) onscripter::Defer var_defer_(__COUNTER__)([=]{ ops; }) // Capture all by val
90+
#define none_defer(ops) onscripter::Defer var_defer_(__COUNTER__)([]{ ops; }) // Capture nothing
91+
92+
struct Defer {
93+
std::function<void(void)> action;
94+
Defer(const std::function<void(void)>& act): action(act) {};
95+
Defer(const std::function<void(void)>&& act): action(std::move(act)) {};
96+
Defer(const Defer& act) = delete;
97+
Defer& operator=(const Defer& act) = delete;
98+
Defer(Defer&& act) = delete;
99+
Defer& operator=(Defer&& act) = delete;
100+
~Defer() {
101+
action();
102+
};
103+
};
104+
84105
}; // namespace onscripter
85106

86107
#endif

src/ScriptHandler.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -689,9 +689,8 @@ void ScriptHandler::saveKidokuData() {
689689
utils::printError("can't write kidoku.dat\n");
690690
return;
691691
}
692-
692+
defer([&fp]{fclose(fp);});
693693
fwrite(kidoku_buffer, 1, script_buffer_length / 8, fp);
694-
fclose(fp);
695694
}
696695

697696
void ScriptHandler::loadKidokuData() {
@@ -702,8 +701,8 @@ void ScriptHandler::loadKidokuData() {
702701
memset(kidoku_buffer, 0, script_buffer_length / 8 + 1);
703702

704703
if ((fp = fopen("kidoku.dat", "rb", true)) != NULL) {
704+
defer([&fp]{fclose(fp);});
705705
fread(kidoku_buffer, 1, script_buffer_length / 8, fp);
706-
fclose(fp);
707706
}
708707
}
709708

src/ScriptParser.cpp

+3-4
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,7 @@ int ScriptParser::saveFileIOBuf(const char *filename,
519519

520520
FILE *fp;
521521
if ((fp = fopen(filename, "wb", use_save_dir)) == NULL) return -1;
522+
defer([&fp]{fclose(fp);});
522523

523524
size_t ret = fwrite(file_io_buf + offset, 1, file_io_buf_ptr - offset, fp);
524525

@@ -529,8 +530,6 @@ int ScriptParser::saveFileIOBuf(const char *filename,
529530
fputc('*', fp);
530531
}
531532

532-
fclose(fp);
533-
534533
if (ret != file_io_buf_ptr - offset) return -2;
535534

536535
return 0;
@@ -542,6 +541,7 @@ size_t ScriptParser::loadFileIOBuf(const char *filename) {
542541

543542
FILE *fp;
544543
if ((fp = fopen(filename, "rb", use_save_dir)) == NULL) return 0;
544+
defer([&fp]{fclose(fp);});
545545

546546
fseek(fp, 0, SEEK_END);
547547
size_t len = ftell(fp);
@@ -550,7 +550,6 @@ size_t ScriptParser::loadFileIOBuf(const char *filename) {
550550

551551
fseek(fp, 0, SEEK_SET);
552552
size_t ret = fread(file_io_buf, 1, len, fp);
553-
fclose(fp);
554553

555554
return ret;
556555
}
@@ -840,6 +839,7 @@ void ScriptParser::createKeyTable(const char *key_exe) {
840839
utils::printError("createKeyTable: can't open EXE file %s\n", key_exe);
841840
return;
842841
}
842+
defer([&fp]{fclose(fp);});
843843

844844
key_table = new unsigned char[256];
845845

@@ -862,7 +862,6 @@ void ScriptParser::createKeyTable(const char *key_exe) {
862862
ring_buffer[ring_last] = ch;
863863
ring_last = (ring_last + 1) % 256;
864864
}
865-
fclose(fp);
866865

867866
if (ch == EOF) errorAndExit("createKeyTable: can't find a key table.");
868867

src/entry/onscripter_main.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,7 @@ ONSCRIPTER_MAIN_EXTREN int main(int argc, char *argv[]) {
457457
} else
458458
fp = fopen(argfilename, "r");
459459
if (fp) {
460+
defer([&fp]{fclose(fp);});
460461
char **args = new char *[16];
461462
int argn = 0;
462463
args[argn] = new char[64]{0};

src/onscripter/ONScripter_command.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -2336,6 +2336,7 @@ int ONScripter::getregCommand() {
23362336
utils::printError("Cannot open file [%s]\n", registry_file);
23372337
return RET_CONTINUE;
23382338
}
2339+
defer([&fp]{fclose(fp);});
23392340

23402341
char reg_buf[256], reg_buf2[256];
23412342
bool found_flag = false;
@@ -2376,7 +2377,6 @@ int ONScripter::getregCommand() {
23762377
}
23772378

23782379
if (!found_flag) utils::printError(" The key is not found.\n");
2379-
fclose(fp);
23802380

23812381
return RET_CONTINUE;
23822382
}
@@ -2676,6 +2676,7 @@ int ONScripter::exec_dllCommand() {
26762676
"Cannot open file [%s] while reading %s\n", dll_file, dll_name);
26772677
return RET_CONTINUE;
26782678
}
2679+
defer([&fp]{fclose(fp);});
26792680

26802681
char dll_buf[256], dll_buf2[256];
26812682
bool found_flag = false;
@@ -2720,7 +2721,6 @@ int ONScripter::exec_dllCommand() {
27202721

27212722
if (!found_flag)
27222723
utils::printError(" The DLL is not found in %s.\n", dll_file);
2723-
fclose(fp);
27242724

27252725
return RET_CONTINUE;
27262726
}

src/onscripter/ONScripter_sound.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,8 @@ int ONScripter::playSound(const char *filename,
149149
utils::printError("can't open temporaly MIDI file %s\n",
150150
TMP_MUSIC_FILE);
151151
} else {
152+
defer([&fp]{fclose(fp);});
152153
fwrite(buffer, 1, length, fp);
153-
fclose(fp);
154154
ext_music_play_once_flag = !loop_flag;
155155
if (playMIDI(loop_flag) == 0) {
156156
delete[] buffer;

src/reader/DirectReader.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,7 @@ size_t DirectReader::getFile(const char *file_name,
401401
FILE *fp = getFileHandle(file_name, compression_type, &len);
402402

403403
if (fp) {
404+
defer([&fp]{fclose(fp);});
404405
if (compression_type & NBZ_COMPRESSION)
405406
return decodeNBZ(fp, 0, buffer);
406407
else if (compression_type & SPB_COMPRESSION)
@@ -417,7 +418,6 @@ size_t DirectReader::getFile(const char *file_name,
417418
fread(buffer, 1, c, fp);
418419
buffer += c;
419420
}
420-
fclose(fp);
421421
if (location) *location = ARCHIVE_TYPE_NONE;
422422
}
423423

0 commit comments

Comments
 (0)