OSDN Git Service

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