OSDN Git Service

Merge branch 'master' of git.osdn.net:/gitroot/hengband/hengband
[hengband/hengband.git] / src / io-dump / dump-remover.c
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) return;
30
31         FILE *tmp_fff = NULL;
32         char tmp_file[FILE_NAME_SIZE];
33         if (!open_temporary_file(&tmp_fff, tmp_file)) return;
34
35         while (TRUE)
36         {
37                 if (angband_fgets(orig_fff, buf, sizeof(buf)))
38                 {
39                         if (between_mark)
40                         {
41                                 fseek(orig_fff, header_location, SEEK_SET);
42                                 between_mark = FALSE;
43                                 continue;
44                         }
45                         else
46                         {
47                                 break;
48                         }
49                 }
50
51                 if (!between_mark)
52                 {
53                         if (!strcmp(buf, header_mark_str))
54                         {
55                                 header_location = ftell(orig_fff);
56                                 line_num = 0;
57                                 between_mark = TRUE;
58                                 changed = TRUE;
59                         }
60                         else
61                         {
62                                 fprintf(tmp_fff, "%s\n", buf);
63                         }
64
65                         continue;
66                 }
67
68                 if (!strncmp(buf, footer_mark_str, mark_len))
69                 {
70                         int tmp;
71                         if (!sscanf(buf + mark_len, " (%d)", &tmp)
72                                 || tmp != line_num)
73                         {
74                                 fseek(orig_fff, header_location, SEEK_SET);
75                         }
76
77                         between_mark = FALSE;
78                         continue;
79                 }
80
81                 line_num++;
82         }
83
84         angband_fclose(orig_fff);
85         angband_fclose(tmp_fff);
86
87         if (changed)
88         {
89                 tmp_fff = angband_fopen(tmp_file, "r");
90                 orig_fff = angband_fopen(orig_file, "w");
91                 while (!angband_fgets(tmp_fff, buf, sizeof(buf)))
92                         fprintf(orig_fff, "%s\n", buf);
93
94                 angband_fclose(orig_fff);
95                 angband_fclose(tmp_fff);
96         }
97
98         fd_kill(tmp_file);
99 }