OSDN Git Service

Merge pull request #2945 from backwardsEric/sprintf-refactor-pit_subtype_string
[hengbandforosx/hengbandosx.git] / src / io-dump / dump-remover.cpp
1 #include "io-dump/dump-remover.h"
2 #include "io-dump/dump-util.h"
3 #include "io/read-pref-file.h"
4 #include "term/z-form.h"
5 #include "util/angband-files.h"
6
7 /*!
8  * @brief prefファイルを選択して処理する /
9  * Ask for a "user pref line" and process it
10  * @brief prf出力内容を消去する /
11  * Remove old lines automatically generated before.
12  * @param orig_file 消去を行うファイル名
13  * @param auto_dump_mark 出力するヘッダマーク
14  */
15 void remove_auto_dump(concptr orig_file, concptr auto_dump_mark)
16 {
17     char buf[1024];
18     bool between_mark = false;
19     bool changed = false;
20     int line_num = 0;
21     long header_location = 0;
22     char header_mark_str[80];
23     char footer_mark_str[80];
24
25     strnfmt(header_mark_str, sizeof(header_mark_str), auto_dump_header, auto_dump_mark);
26     strnfmt(footer_mark_str, sizeof(footer_mark_str), auto_dump_footer, auto_dump_mark);
27     size_t mark_len = strlen(footer_mark_str);
28
29     FILE *orig_fff;
30     orig_fff = angband_fopen(orig_file, "r");
31     if (!orig_fff) {
32         return;
33     }
34
35     FILE *tmp_fff = nullptr;
36     char tmp_file[FILE_NAME_SIZE];
37     if (!open_temporary_file(&tmp_fff, tmp_file)) {
38         return;
39     }
40
41     while (true) {
42         if (angband_fgets(orig_fff, buf, sizeof(buf))) {
43             if (between_mark) {
44                 fseek(orig_fff, header_location, SEEK_SET);
45                 between_mark = false;
46                 continue;
47             } else {
48                 break;
49             }
50         }
51
52         if (!between_mark) {
53             if (!strcmp(buf, header_mark_str)) {
54                 header_location = ftell(orig_fff);
55                 line_num = 0;
56                 between_mark = true;
57                 changed = true;
58             } else {
59                 fprintf(tmp_fff, "%s\n", buf);
60             }
61
62             continue;
63         }
64
65         if (!strncmp(buf, footer_mark_str, mark_len)) {
66             int tmp;
67             if (!sscanf(buf + mark_len, " (%d)", &tmp) || tmp != line_num) {
68                 fseek(orig_fff, header_location, SEEK_SET);
69             }
70
71             between_mark = false;
72             continue;
73         }
74
75         line_num++;
76     }
77
78     angband_fclose(orig_fff);
79     angband_fclose(tmp_fff);
80
81     if (changed) {
82         tmp_fff = angband_fopen(tmp_file, "r");
83         orig_fff = angband_fopen(orig_file, "w");
84         while (!angband_fgets(tmp_fff, buf, sizeof(buf))) {
85             fprintf(orig_fff, "%s\n", buf);
86         }
87
88         angband_fclose(orig_fff);
89         angband_fclose(tmp_fff);
90     }
91
92     fd_kill(tmp_file);
93 }