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