1 /**********************************************************************
2 * This source code is copyright 1999 by Gus Hartmann & Peter Keller *
3 * It may be distributed under the terms of the GNU General Purpose *
4 * License, version 2 or above; see the file COPYING for more *
5 * information. *
6 * *
7 * $Id: files.c,v 1.10 2003-10-11 20:50:50 hartmann Exp $
8 * *
9 **********************************************************************/
10
11 #include "sweep.h"
12
SourceFile(GameStats * Game,FILE * PrefsFile)13 int SourceFile(GameStats* Game,FILE* PrefsFile)
14 {
15 char RawBuffer[MAX_LINE];
16 char *NameBuffer, *ValueBuffer;
17 int Value=0;
18
19 while (feof(PrefsFile)==0)
20 {
21 if (fgets(RawBuffer,MAX_LINE,PrefsFile)==0)
22 {
23 return 0;
24 }
25 if ((NameBuffer=strtok(RawBuffer,DELIMITERS))!=0)
26 {
27 /* This is essentially a great big switch statement. */
28 if ((ValueBuffer=strtok(NULL,DELIMITERS))!=0)
29 {
30 if (strncasecmp(NameBuffer,"color",5)==0)
31 {
32 Value=atoi(ValueBuffer);
33 ((CheckColor(Value)>0)?Game->Color=Value:fprintf(stderr,"Invalid value for color in preference file.\n"));
34 }
35 else if (strncasecmp(NameBuffer,"faststart",9)==0)
36 {
37 Value=atoi(ValueBuffer);
38 ((CheckFast(Value)>0)?Game->Fast=Value:fprintf(stderr,"Invalid value for faststart in preference file.\n"));
39 }
40 else if (strncasecmp(NameBuffer,"height",6)==0)
41 {
42 Value=atoi(ValueBuffer);
43 ((CheckHeight(Value)>0)?Game->Height=Value:fprintf(stderr,"Invalid value for height in preference file.\n"));
44 }
45 else if (strncasecmp(NameBuffer,"linedraw",8)==0)
46 {
47 Value=atoi(ValueBuffer);
48 ((CheckLineDraw(Value)>0)?InitCharSet(Game,Value):fprintf(stderr,"Invalid value for linedraw in preference file.\n"));
49 }
50 else if (strncasecmp(NameBuffer,"percent",7)==0)
51 {
52 Value=atoi(ValueBuffer);
53 ((CheckPercent(Value)>0)?Game->Percent=Value,Game->NumMines=0:fprintf(stderr,"Invaid value for percent in preference file.\n"));
54 }
55 else if (strncasecmp(NameBuffer,"mines",5)==0)
56 {
57 Value=atoi(ValueBuffer);
58 ((CheckNumMines(Value,Game->Height,Game->Width)>0)?Game->NumMines=Value,Game->Percent=0:fprintf(stderr,"Invalid value for mines in preference file.\n"));
59 }
60 else if (strncasecmp(NameBuffer,"width",5)==0)
61 {
62 Value=atoi(ValueBuffer);
63 ((CheckWidth(Value)>0)?Game->Width=Value:fprintf(stderr,"Invalid value for width in preference file.\n"));
64 }
65 else if (strncasecmp(NameBuffer,"alert",5)==0)
66 {
67 /* This option takes different strings as arguments. */
68 if (strncasecmp(ValueBuffer,"beep",4)==0)
69 {
70 Game->Alert=BEEP;
71 }
72 else if (strncasecmp(ValueBuffer,"flash",5)==0)
73 {
74 Game->Alert=FLASH;
75 }
76 else if (strncasecmp(ValueBuffer,"none",4)==0)
77 {
78 Game->Alert=NO_ALERT;
79 }
80 else
81 {
82 fprintf(stderr,"Bad value for Alert in preference file.\n");
83 }
84 }
85 else if (strncasecmp(NameBuffer,"#",1)!=0)
86 {
87 fprintf(stderr,"Unknown tag %s in file.\n",NameBuffer);
88 }
89 }
90 }
91 }
92 return 0;
93 }
94
SourceHomeFile(GameStats * Game)95 int SourceHomeFile(GameStats* Game)
96 {
97 FILE* PrefsFile;
98 char *Buffer, *Pathname;
99
100 Pathname=(char*)xmalloc(MAX_LINE);
101
102 if ((Buffer=getenv("HOME"))==NULL)
103 {
104 perror("SourceHomeFile::getenv");
105 return 1;
106 }
107 #if defined(HAVE_SNPRINTF)
108 snprintf(Pathname, MAX_LINE, "%s/%s", Buffer, DFL_PREFS_FILE);
109 #else
110 snprintf(Pathname, MAX_LINE, "%s/%s", Buffer, DFL_PREFS_FILE);
111 #endif
112
113 if ((PrefsFile=fopen(Pathname,"r"))==NULL)
114 {
115 /* The user has no personal preferences. */
116 free(Pathname);
117 return 0;
118 }
119 else if (SourceFile(Game,PrefsFile)==1)
120 {
121 /* An error occurred while reading the file. Try closing it. */
122 fclose(PrefsFile);
123 free(Pathname);
124 return 1;
125 }
126 else
127 {
128 /* Done, so close the file. */
129 fclose(PrefsFile);
130 free(Pathname);
131 return 0;
132 }
133
134 }
135
SourceGlobalFile(GameStats * Game)136 int SourceGlobalFile(GameStats* Game)
137 {
138 FILE* PrefsFile;
139
140 if ((PrefsFile=fopen(GLOBAL_PREFS_FILE,"r"))==NULL)
141 {
142 /* The global file is invalid or non-existant. */
143 fprintf(stderr,"Unable to open the global prefernces file %s\n", GLOBAL_PREFS_FILE);
144 /* perror("SourceGlobalFile::fopen"); */
145 return 1;
146 }
147 else if (SourceFile(Game,PrefsFile)==1)
148 {
149 /* An error occurred while reading the file. Try closing it. */
150 fclose(PrefsFile);
151 return 1;
152 }
153 else
154 {
155 /* Done, so close the file. */
156 fclose(PrefsFile);
157 return 0;
158 }
159 }
160
WritePrefsFile(GameStats * Game)161 int WritePrefsFile(GameStats* Game)
162 {
163 FILE* PrefsFile;
164 char *Buffer, Pathname[MAX_LINE+1];
165
166 if ((Buffer=getenv("HOME"))==NULL)
167 {
168 perror("WriteHomeFile::getenv");
169 return 1;
170 }
171
172 #if defined(HAVE_SNPRINTF)
173 snprintf(Pathname, MAX_LINE, "%s/%s", Buffer, DFL_PREFS_FILE);
174 #else
175 sprintf(Pathname, "%s/%s", Buffer, DFL_PREFS_FILE);
176 #endif
177
178 if ((PrefsFile=fopen(Pathname,"w"))==NULL)
179 {
180 perror("WritePrefsFile::fopen");
181 return 1;
182 }
183 else
184 {
185 fprintf(PrefsFile,"# Freesweep version %s\n",VERSION);
186 fprintf(PrefsFile,"# This is a generated file, but you can edit it if you like.\n");
187 fprintf(PrefsFile,"Height=%d\n",Game->Height);
188 fprintf(PrefsFile,"Width=%d\n",Game->Width);
189 if (Game->NumMines==0)
190 {
191 fprintf(PrefsFile,"Percent=%d\n",Game->Percent);
192 }
193 else
194 {
195 fprintf(PrefsFile,"Mines=%d\n",Game->NumMines);
196 }
197 fprintf(PrefsFile,"FastStart=%d\n",Game->Fast);
198 fprintf(PrefsFile,"Color=%d\n",Game->Color);
199 fprintf(PrefsFile,"LineDraw=%d\n",Game->LineDraw);
200 switch (Game->Alert)
201 {
202 case BEEP:
203 fprintf(PrefsFile,"Alert=Beep\n");
204 break;
205 case FLASH:
206 fprintf(PrefsFile,"Alert=Flash\n");
207 break;
208 case NO_ALERT:
209 fprintf(PrefsFile,"Alert=None\n");
210 break;
211 default:
212 break;
213 }
214
215 fclose(PrefsFile);
216 }
217 return 0;
218 }
219