Mercurial > mplayer.hg
annotate gui/cfg.c @ 33212:c52a2600de15
Clip x/y offsets to avoid bad video placement.
author | reimar |
---|---|
date | Fri, 22 Apr 2011 12:33:08 +0000 |
parents | 422e5d306d44 |
children | f0c2a62e3e89 |
rev | line source |
---|---|
26458 | 1 /* |
2 * This file is part of MPlayer. | |
3 * | |
4 * MPlayer is free software; you can redistribute it and/or modify | |
5 * it under the terms of the GNU General Public License as published by | |
6 * the Free Software Foundation; either version 2 of the License, or | |
7 * (at your option) any later version. | |
8 * | |
9 * MPlayer is distributed in the hope that it will be useful, | |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 * GNU General Public License for more details. | |
13 * | |
14 * You should have received a copy of the GNU General Public License along | |
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
17 */ | |
23077 | 18 |
19 #include <stdlib.h> | |
20 #include <stdio.h> | |
21 #include <string.h> | |
22 | |
33179 | 23 #include "cfg.h" |
24 #include "interface.h" | |
25 | |
23077 | 26 #include "config.h" |
27 #include "help_mp.h" | |
30653
3d23e24c5c60
Declare externally used variables from vd.c as extern in vd.h.
diego
parents:
30633
diff
changeset
|
28 #include "libmpcodecs/vd.h" |
23077 | 29 #include "libvo/video_out.h" |
31385
f2aebe1309b2
Declare stop_xscreensaver extern in x11_common.h instead of all over the code.
diego
parents:
30901
diff
changeset
|
30 #include "libvo/x11_common.h" |
33179 | 31 #include "m_config.h" |
32 #include "m_option.h" | |
33 #include "mixer.h" | |
34 #include "mp_msg.h" | |
35 #include "mpcommon.h" | |
36 #include "mplayer.h" | |
37 #include "parser-cfg.h" | |
38 #include "path.h" | |
32981 | 39 #include "sub/font_load.h" |
33179 | 40 #include "sub/sub.h" |
23077 | 41 |
33180 | 42 int gtkCacheOn = 0; |
43 int gtkCacheSize = 2048; | |
44 | |
45 int gtkVfLAVC = 0; | |
46 int gtkVfPP = 0; | |
23077 | 47 |
33180 | 48 #ifdef CONFIG_DXR3 |
49 char *gtkDXR3Device; | |
50 #endif | |
51 | |
52 int gtkAutoSyncOn = 0; | |
53 int gtkAutoSync = 0; | |
23077 | 54 |
33179 | 55 int gtkAONorm = 0; |
56 int gtkAOSurround = 0; | |
57 int gtkAOExtraStereo = 0; | |
58 float gtkAOExtraStereoMul = 1.0; | |
33180 | 59 |
27390
9d95dc936e66
Introduce CONFIG_ALSA preprocessor directive for ALSA 0.9 and 1.x.
diego
parents:
27387
diff
changeset
|
60 #ifdef CONFIG_ALSA |
33179 | 61 char *gtkAOALSAMixer; |
62 char *gtkAOALSAMixerChannel; | |
63 char *gtkAOALSADevice; | |
23077 | 64 #endif |
33180 | 65 |
66 #ifdef CONFIG_OSS_AUDIO | |
67 char *gtkAOOSSMixer; | |
68 char *gtkAOOSSMixerChannel; | |
69 char *gtkAOOSSDevice; | |
23077 | 70 #endif |
33180 | 71 |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
72 #ifdef CONFIG_ESD |
33179 | 73 char *gtkAOESDDevice; |
23077 | 74 #endif |
75 | |
33180 | 76 #ifdef CONFIG_SDL |
77 char *gtkAOSDLDriver; | |
78 #endif | |
23077 | 79 |
33180 | 80 int gtkEnableAudioEqualizer = 0; |
23077 | 81 |
33179 | 82 int gtkSubDumpMPSub = 0; |
83 int gtkSubDumpSrt = 0; | |
23077 | 84 |
33180 | 85 #ifdef CONFIG_ASS |
86 gtkASS_t gtkASS; | |
87 #endif | |
88 | |
89 int gtkEnablePlayBar = 1; | |
33179 | 90 int gtkLoadFullscreen = 0; |
91 int gtkShowVideoWindow = 1; | |
23077 | 92 |
33179 | 93 int gui_save_pos = 1; |
94 int gui_main_pos_x = -2; | |
95 int gui_main_pos_y = -2; | |
96 int gui_sub_pos_x = -1; | |
97 int gui_sub_pos_y = -1; | |
23077 | 98 |
33179 | 99 static m_config_t *gui_conf; |
23077 | 100 |
33179 | 101 // NOTE TO MYSELF: Do we really need all/any non-gtkOptions, i.e. override mplayer's ones? |
102 static const m_option_t gui_opts[] = { | |
103 { "enable_audio_equ", >kEnableAudioEqualizer, CONF_TYPE_FLAG, 0, 0, 1, NULL }, | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
104 |
33179 | 105 { "vo_driver", &video_driver_list, CONF_TYPE_STRING_LIST, 0, 0, 0, NULL }, |
106 { "vo_panscan", &vo_panscan, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 1.0, NULL }, | |
107 { "vo_doublebuffering", &vo_doublebuffering, CONF_TYPE_FLAG, 0, 0, 1, NULL }, | |
108 { "vo_direct_render", &vo_directrendering, CONF_TYPE_FLAG, 0, 0, 1, NULL }, | |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27359
diff
changeset
|
109 #ifdef CONFIG_DXR3 |
33179 | 110 { "vo_dxr3_device", >kDXR3Device, CONF_TYPE_STRING, 0, 0, 0, NULL }, |
23077 | 111 #endif |
112 | |
33179 | 113 { "v_framedrop", &frame_dropping, CONF_TYPE_INT, CONF_RANGE, 0, 2, NULL }, |
114 { "v_flip", &flip, CONF_TYPE_INT, CONF_RANGE, -1, 1, NULL }, | |
115 { "v_ni", &force_ni, CONF_TYPE_FLAG, 0, 0, 1, NULL }, | |
116 { "v_idx", &index_mode, CONF_TYPE_INT, CONF_RANGE, -1, 2, NULL }, | |
117 { "v_vfm", &video_fm_list, CONF_TYPE_STRING_LIST, 0, 0, 0, NULL }, | |
118 { "a_afm", &audio_fm_list, CONF_TYPE_STRING_LIST, 0, 0, 0, NULL }, | |
23077 | 119 |
33179 | 120 { "vf_pp", >kVfPP, CONF_TYPE_FLAG, 0, 0, 1, NULL }, |
121 { "vf_autoq", &auto_quality, CONF_TYPE_INT, CONF_RANGE, 0, 100, NULL }, | |
122 { "vf_lavc", >kVfLAVC, CONF_TYPE_FLAG, 0, 0, 1, NULL }, | |
23077 | 123 |
33179 | 124 { "ao_driver", &audio_driver_list, CONF_TYPE_STRING_LIST, 0, 0, 0, NULL }, |
125 { "ao_volnorm", >kAONorm, CONF_TYPE_FLAG, 0, 0, 1, NULL }, | |
126 { "softvol", &soft_vol, CONF_TYPE_FLAG, 0, 0, 1, NULL }, | |
127 { "ao_surround", >kAOSurround, CONF_TYPE_FLAG, 0, 0, 1, NULL }, | |
128 { "ao_extra_stereo", >kAOExtraStereo, CONF_TYPE_FLAG, 0, 0, 1, NULL }, | |
129 { "ao_extra_stereo_coefficient", >kAOExtraStereoMul, CONF_TYPE_FLOAT, CONF_RANGE, -10, 10, NULL }, | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
130 #ifdef CONFIG_OSS_AUDIO |
33179 | 131 { "ao_oss_mixer", >kAOOSSMixer, CONF_TYPE_STRING, 0, 0, 0, NULL }, |
132 { "ao_oss_mixer_channel", >kAOOSSMixerChannel, CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
133 { "ao_oss_device", >kAOOSSDevice, CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
23077 | 134 #endif |
27390
9d95dc936e66
Introduce CONFIG_ALSA preprocessor directive for ALSA 0.9 and 1.x.
diego
parents:
27387
diff
changeset
|
135 #ifdef CONFIG_ALSA |
33179 | 136 { "ao_alsa_mixer", >kAOALSAMixer, CONF_TYPE_STRING, 0, 0, 0, NULL }, |
137 { "ao_alsa_mixer_channel", >kAOALSAMixerChannel, CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
138 { "ao_alsa_device", >kAOALSADevice, CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
23077 | 139 #endif |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27359
diff
changeset
|
140 #ifdef CONFIG_SDL |
33179 | 141 { "ao_sdl_subdriver", >kAOSDLDriver, CONF_TYPE_STRING, 0, 0, 0, NULL }, |
23077 | 142 #endif |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
143 #ifdef CONFIG_ESD |
33179 | 144 { "ao_esd_device", >kAOESDDevice, CONF_TYPE_STRING, 0, 0, 0, NULL }, |
23077 | 145 #endif |
146 | |
33179 | 147 { "dvd_device", &dvd_device, CONF_TYPE_STRING, 0, 0, 0, NULL }, |
148 { "cdrom_device", &cdrom_device, CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
149 |
33179 | 150 { "osd_level", &osd_level, CONF_TYPE_INT, CONF_RANGE, 0, 3, NULL }, |
151 { "sub_auto_load", &sub_auto, CONF_TYPE_FLAG, 0, 0, 1, NULL }, | |
152 { "sub_unicode", &sub_unicode, CONF_TYPE_FLAG, 0, 0, 1, NULL }, | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
153 #ifdef CONFIG_ASS |
33179 | 154 { "ass_enabled", &ass_enabled, CONF_TYPE_FLAG, 0, 0, 1, NULL }, |
155 { "ass_use_margins", &ass_use_margins, CONF_TYPE_FLAG, 0, 0, 1, NULL }, | |
156 { "ass_top_margin", &ass_top_margin, CONF_TYPE_INT, CONF_RANGE, 0, 512, NULL }, | |
157 { "ass_bottom_margin", &ass_bottom_margin, CONF_TYPE_INT, CONF_RANGE, 0, 512, NULL }, | |
23077 | 158 #endif |
33179 | 159 { "sub_pos", &sub_pos, CONF_TYPE_INT, CONF_RANGE, 0, 200, NULL }, |
160 { "sub_overlap", &suboverlap_enabled, CONF_TYPE_FLAG, 0, 0, 0, NULL }, | |
27393 | 161 #ifdef CONFIG_ICONV |
33179 | 162 { "sub_cp", &sub_cp, CONF_TYPE_STRING, 0, 0, 0, NULL }, |
23077 | 163 #endif |
33179 | 164 { "font_factor", &font_factor, CONF_TYPE_FLOAT, CONF_RANGE, 0.0, 10.0, NULL }, |
165 { "font_name", &font_name, CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
27393 | 166 #ifdef CONFIG_FREETYPE |
33179 | 167 { "font_encoding", &subtitle_font_encoding, CONF_TYPE_STRING, 0, 0, 0, NULL }, |
168 { "font_text_scale", &text_font_scale_factor, CONF_TYPE_FLOAT, CONF_RANGE, 0, 100, NULL }, | |
169 { "font_osd_scale", &osd_font_scale_factor, CONF_TYPE_FLOAT, CONF_RANGE, 0, 100, NULL }, | |
170 { "font_blur", &subtitle_font_radius, CONF_TYPE_FLOAT, CONF_RANGE, 0, 8, NULL }, | |
171 { "font_outline", &subtitle_font_thickness, CONF_TYPE_FLOAT, CONF_RANGE, 0, 8, NULL }, | |
172 { "font_autoscale", &subtitle_autoscale, CONF_TYPE_INT, CONF_RANGE, 0, 3, NULL }, | |
23077 | 173 #endif |
174 | |
33179 | 175 { "cache", >kCacheOn, CONF_TYPE_FLAG, 0, 0, 1, NULL }, |
176 { "cache_size", >kCacheSize, CONF_TYPE_INT, CONF_RANGE, -1, 65535, NULL }, | |
23077 | 177 |
33179 | 178 { "playbar", >kEnablePlayBar, CONF_TYPE_FLAG, 0, 0, 1, NULL }, |
179 { "load_fullscreen", >kLoadFullscreen, CONF_TYPE_FLAG, 0, 0, 1, NULL }, | |
180 { "show_videowin", >kShowVideoWindow, CONF_TYPE_FLAG, 0, 0, 1, NULL }, | |
181 { "stopxscreensaver", &stop_xscreensaver, CONF_TYPE_FLAG, 0, 0, 1, NULL }, | |
23077 | 182 |
33179 | 183 { "autosync", >kAutoSyncOn, CONF_TYPE_FLAG, 0, 0, 1, NULL }, |
184 { "autosync_size", >kAutoSync, CONF_TYPE_INT, CONF_RANGE, 0, 10000, NULL }, | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
185 |
33179 | 186 { "gui_skin", &skinName, CONF_TYPE_STRING, 0, 0, 0, NULL }, |
23077 | 187 |
33179 | 188 { "gui_save_pos", &gui_save_pos, CONF_TYPE_FLAG, 0, 0, 1, NULL }, |
189 { "gui_main_pos_x", &gui_main_pos_x, CONF_TYPE_INT, 0, 0, 0, NULL }, | |
190 { "gui_main_pos_y", &gui_main_pos_y, CONF_TYPE_INT, 0, 0, 0, NULL }, | |
191 { "gui_video_out_pos_x", &gui_sub_pos_x, CONF_TYPE_INT, 0, 0, 0, NULL }, | |
192 { "gui_video_out_pos_y", &gui_sub_pos_y, CONF_TYPE_INT, 0, 0, 0, NULL }, | |
23077 | 193 |
33179 | 194 { "equ_channel_1", >kEquChannel1, CONF_TYPE_STRING, 0, 0, 0, NULL }, |
195 { "equ_channel_2", >kEquChannel2, CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
196 { "equ_channel_3", >kEquChannel3, CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
197 { "equ_channel_4", >kEquChannel4, CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
198 { "equ_channel_5", >kEquChannel5, CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
199 { "equ_channel_6", >kEquChannel6, CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
200 |
33179 | 201 #define audio_equ_row(i, j) { "equ_band_" # i # j, >kEquChannels[i][j], CONF_TYPE_FLOAT, CONF_RANGE, -15.0, 15.0, NULL }, |
202 audio_equ_row(0, 0) audio_equ_row(0, 1) audio_equ_row(0, 2) audio_equ_row(0, 3) audio_equ_row(0, 4) audio_equ_row(0, 5) audio_equ_row(0, 6) audio_equ_row(0, 7) audio_equ_row(0, 8) audio_equ_row(0, 9) | |
203 audio_equ_row(1, 0) audio_equ_row(1, 1) audio_equ_row(1, 2) audio_equ_row(1, 3) audio_equ_row(1, 4) audio_equ_row(1, 5) audio_equ_row(1, 6) audio_equ_row(1, 7) audio_equ_row(1, 8) audio_equ_row(1, 9) | |
204 audio_equ_row(2, 0) audio_equ_row(2, 1) audio_equ_row(2, 2) audio_equ_row(2, 3) audio_equ_row(2, 4) audio_equ_row(2, 5) audio_equ_row(2, 6) audio_equ_row(2, 7) audio_equ_row(2, 8) audio_equ_row(2, 9) | |
205 audio_equ_row(3, 0) audio_equ_row(3, 1) audio_equ_row(3, 2) audio_equ_row(3, 3) audio_equ_row(3, 4) audio_equ_row(3, 5) audio_equ_row(3, 6) audio_equ_row(3, 7) audio_equ_row(3, 8) audio_equ_row(3, 9) | |
206 audio_equ_row(4, 0) audio_equ_row(4, 1) audio_equ_row(4, 2) audio_equ_row(4, 3) audio_equ_row(4, 4) audio_equ_row(4, 5) audio_equ_row(4, 6) audio_equ_row(4, 7) audio_equ_row(4, 8) audio_equ_row(4, 9) | |
207 audio_equ_row(5, 0) audio_equ_row(5, 1) audio_equ_row(5, 2) audio_equ_row(5, 3) audio_equ_row(5, 4) audio_equ_row(5, 5) audio_equ_row(5, 6) audio_equ_row(5, 7) audio_equ_row(5, 8) audio_equ_row(5, 9) | |
23077 | 208 #undef audio_equ_row |
209 | |
33179 | 210 { NULL, NULL, 0, 0, 0, 0, NULL } |
23077 | 211 }; |
212 | |
33179 | 213 static char *gfgets(char *str, int size, FILE *f) |
23077 | 214 { |
33179 | 215 char *s, c; |
216 | |
217 s = fgets(str, size, f); | |
218 | |
219 if (s) { | |
220 c = s[strlen(s) - 1]; | |
221 | |
222 if (c == '\n' || c == '\r') | |
223 s[strlen(s) - 1] = 0; | |
224 | |
225 c = s[strlen(s) - 1]; | |
226 | |
227 if (c == '\n' || c == '\r') | |
228 s[strlen(s) - 1] = 0; | |
229 } | |
230 | |
231 return s; | |
23077 | 232 } |
233 | |
33179 | 234 int cfg_read(void) |
23077 | 235 { |
33179 | 236 char *cfg; |
237 FILE *f; | |
238 | |
239 // configuration | |
240 | |
241 cfg = get_path("gui.conf"); | |
242 | |
243 mp_msg(MSGT_GPLAYER, MSGL_V, "[cfg] reading config file: %s\n", cfg); | |
244 | |
245 gui_conf = m_config_new(); | |
246 m_config_register_options(gui_conf, gui_opts); | |
247 | |
248 if (!disable_gui_conf && (m_config_parse_config_file(gui_conf, cfg) < 0)) { | |
249 mp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_ConfigFileError); | |
250 // exit(1); | |
251 } | |
252 | |
253 free(cfg); | |
23077 | 254 |
33179 | 255 // playlist |
256 | |
257 cfg = get_path("gui.pl"); | |
258 f = fopen(cfg, "rt"); | |
259 | |
260 if (f) { | |
261 while (!feof(f)) { | |
262 char tmp[512]; | |
263 plItem *item; | |
23077 | 264 |
33179 | 265 if (gfgets(tmp, 512, f) == NULL) |
266 continue; | |
267 | |
268 item = calloc(1, sizeof(plItem)); | |
269 item->path = strdup(tmp); | |
270 gfgets(tmp, 512, f); | |
271 item->name = strdup(tmp); | |
272 gtkSet(gtkAddPlItem, 0, (void *)item); | |
273 } | |
274 | |
275 fclose(f); | |
23077 | 276 } |
33179 | 277 |
278 free(cfg); | |
279 | |
280 // URL list | |
281 | |
282 cfg = get_path("gui.url"); | |
283 f = fopen(cfg, "rt"); | |
23077 | 284 |
33179 | 285 if (f) { |
286 while (!feof(f)) { | |
287 char tmp[512]; | |
288 URLItem *item; | |
289 | |
290 if (gfgets(tmp, 512, f) == NULL) | |
291 continue; | |
292 | |
293 item = calloc(1, sizeof(URLItem)); | |
294 item->url = strdup(tmp); | |
295 gtkSet(gtkAddURLItem, 0, (void *)item); | |
296 } | |
297 | |
298 fclose(f); | |
23077 | 299 } |
33179 | 300 |
301 free(cfg); | |
302 | |
303 // directory history | |
304 | |
305 cfg = get_path("gui.history"); | |
306 f = fopen(cfg, "rt+"); | |
307 | |
308 if (f) { | |
309 int i = 0; | |
23077 | 310 |
33179 | 311 while (!feof(f)) { |
312 char tmp[512]; | |
313 | |
314 if (gfgets(tmp, 512, f) == NULL) | |
315 continue; | |
316 | |
317 fsHistory[i++] = gstrdup(tmp); | |
318 } | |
319 | |
320 fclose(f); | |
23077 | 321 } |
322 | |
33179 | 323 free(cfg); |
324 | |
325 return 0; | |
23077 | 326 } |
327 | |
33179 | 328 int cfg_write(void) |
23077 | 329 { |
33179 | 330 char *cfg; |
331 FILE *f; | |
332 int i; | |
333 | |
334 // configuration | |
335 | |
336 cfg = get_path("gui.conf"); | |
337 f = fopen(cfg, "wt+"); | |
338 | |
339 if (f) { | |
340 for (i = 0; gui_opts[i].name; i++) { | |
341 char *v = m_option_print(&gui_opts[i], gui_opts[i].p); | |
342 | |
343 if (v == (char *)-1) { | |
344 mp_msg(MSGT_GPLAYER, MSGL_WARN, MSGTR_UnableToSaveOption, gui_opts[i].name); | |
345 v = NULL; | |
346 } | |
23077 | 347 |
33179 | 348 if (v) { |
349 fprintf(f, "%s = \"%s\"\n", gui_opts[i].name, v); | |
350 free(v); | |
351 } | |
352 } | |
353 | |
354 fclose(f); | |
23077 | 355 } |
33179 | 356 |
357 free(cfg); | |
358 | |
359 // playlist | |
360 | |
361 cfg = get_path("gui.pl"); | |
362 f = fopen(cfg, "wt+"); | |
363 | |
364 if (f) { | |
365 plCurrent = plList; | |
366 | |
367 while (plCurrent) { | |
368 if (plCurrent->path && plCurrent->name) { | |
369 fprintf(f, "%s\n", plCurrent->path); | |
370 fprintf(f, "%s\n", plCurrent->name); | |
371 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
372 |
33179 | 373 plCurrent = plCurrent->next; |
374 } | |
375 | |
376 fclose(f); | |
23077 | 377 } |
33179 | 378 |
379 free(cfg); | |
380 | |
381 // URL list | |
382 | |
383 cfg = get_path("gui.url"); | |
384 f = fopen(cfg, "wt+"); | |
385 | |
386 if (f) { | |
387 while (URLList) { | |
388 if (URLList->url) | |
389 fprintf(f, "%s\n", URLList->url); | |
390 | |
391 URLList = URLList->next; | |
392 } | |
23077 | 393 |
33179 | 394 fclose(f); |
23077 | 395 } |
33179 | 396 |
397 free(cfg); | |
398 | |
399 // directory history | |
400 | |
401 cfg = get_path("gui.history"); | |
402 f = fopen(cfg, "wt+"); | |
403 | |
404 if (f) { | |
405 int i = 0; | |
23077 | 406 |
33179 | 407 // while (fsHistory[i] != NULL) |
408 for (i = 0; i < 5; i++) | |
409 if (fsHistory[i]) | |
410 fprintf(f, "%s\n", fsHistory[i]); | |
23077 | 411 |
33179 | 412 fclose(f); |
413 } | |
414 | |
415 free(cfg); | |
416 | |
417 return 0; | |
23077 | 418 } |