1 /*
2  *  preferences.c
3  *
4  *
5  *  Created by Guillaume Borios on 03/08/04.
6  *  Copyright 2004 iOS. All rights reserved.
7  *
8  */
9 
10 #include "preferences.h"
11 
12 
13 #ifdef __APPLE__
14 
15 #include <CoreFoundation/CoreFoundation.h>
16 
SetIntPreference(const char * name,int value)17 void SetIntPreference(const char * name, int value)
18 {
19     CFStringRef nom = CFStringCreateWithCString (NULL,name,CFStringGetSystemEncoding());
20     if (nom != NULL)
21     {
22         CFNumberRef aValue = CFNumberCreate(NULL,kCFNumberIntType,&value);
23         if (aValue != NULL)
24         {
25             CFPreferencesSetAppValue (nom,aValue,kCFPreferencesCurrentApplication);
26             (void)CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);
27             CFRelease(aValue);
28         }
29         CFRelease(nom);
30     }
31 }
32 
SetBoolPreference(const char * name,int value)33 void SetBoolPreference(const char * name, int value)
34 {
35     CFStringRef nom = CFStringCreateWithCString (NULL,name,CFStringGetSystemEncoding());
36     if (nom != NULL)
37     {
38         CFPreferencesSetAppValue (nom,value?CFSTR("YES"):CFSTR("NO"),kCFPreferencesCurrentApplication);
39         (void)CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);
40         CFRelease(nom);
41     }
42 }
43 
GetIntPreference(const char * name,int defaut)44 int GetIntPreference(const char * name, int defaut)
45 {
46     int retour = defaut;
47 
48     CFStringRef nom = CFStringCreateWithCString (NULL,name,CFStringGetSystemEncoding());
49 
50     if (nom != NULL)
51     {
52         CFNumberRef value = (CFNumberRef)CFPreferencesCopyAppValue(nom,kCFPreferencesCurrentApplication);
53 
54         if (value != NULL)
55         {
56            if (CFGetTypeID(value) == CFNumberGetTypeID ())
57            {
58             if (CFNumberGetValue (value, kCFNumberIntType,&retour) == false)
59                 retour = defaut;
60            }
61             CFRelease(value);
62         }
63         CFRelease(nom);
64     }
65 
66     return retour;
67 }
68 
GetBoolPreference(const char * name,int defaut)69 int GetBoolPreference(const char * name, int defaut)
70 {
71     int retour = defaut;
72 
73     CFStringRef nom = CFStringCreateWithCString (NULL,name,CFStringGetSystemEncoding());
74 
75     if (nom != NULL)
76     {
77         CFStringRef value = (CFStringRef)CFPreferencesCopyAppValue(nom,kCFPreferencesCurrentApplication);
78 
79         if (value != NULL)
80         {
81             if (CFGetTypeID(value) == CFStringGetTypeID ())
82             {
83                 retour = (CFStringCompare(value, CFSTR("YES"), kCFCompareCaseInsensitive) == kCFCompareEqualTo) ? 1 : 0;
84             }
85             CFRelease(value);
86         }
87         CFRelease(nom);
88     }
89 
90 
91     return retour;
92 }
93 
SetStrPreference(const char * name,const char * value)94 void SetStrPreference (const char *name, const char *value)
95 {
96     CFStringRef nom = CFStringCreateWithCString (NULL,name,CFStringGetSystemEncoding());
97     if (nom != NULL)
98     {
99         CFStringRef val = CFStringCreateWithCString (NULL,value,CFStringGetSystemEncoding());
100         if (val != NULL)
101         {
102             CFPreferencesSetAppValue (nom,val,kCFPreferencesCurrentApplication);
103             (void)CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);
104             CFRelease(val);
105         }
106         CFRelease(nom);
107     }
108 }
109 
GetStrPreference(const char * name,char * out,const char * defaut,const int bufferSize)110 void GetStrPreference (const char *name, char *out, const char *defaut, const int bufferSize)
111 {
112     if ((out==NULL) || (name==NULL)) return;
113 
114     if (defaut != NULL)
115     {
116         strncpy(out,defaut,bufferSize-1);
117         out[bufferSize-1]=0;
118     }
119     else out[0]=0;
120 
121     CFStringRef nom = CFStringCreateWithCString (NULL,name,CFStringGetSystemEncoding());
122 
123     if (nom != NULL)
124     {
125         CFStringRef value = (CFStringRef)CFPreferencesCopyAppValue(nom,kCFPreferencesCurrentApplication);
126 
127         if (value != NULL)
128         {
129             if (CFGetTypeID(value) == CFStringGetTypeID ())
130             {
131                 if ((!CFStringGetCString (value, out, bufferSize, CFStringGetSystemEncoding())) && (defaut != NULL))
132                     strcpy(out,defaut);
133             }
134             CFRelease(value);
135         }
136         CFRelease(nom);
137     }
138 }
139 
140 #else /* Not __APPLE__ */
141 
142 #include <stdio.h>
143 #include <stdlib.h>
144 #include <string.h>
145 #include <sys/types.h>
146 #include <sys/stat.h>
147 
148 static const char * prefsfile = ".flobopuyorc";
149 static const char * sep = "\n\r";
150 
151 static char * file = NULL;
152 static char * home = NULL;
153 
fetchFile(void)154 static void fetchFile(void)
155 {
156     FILE * prefs;
157     struct stat myStat;
158 
159     if (home == NULL)
160     {
161 #ifndef _WIN32
162         char * h = getenv("HOME");
163 #else
164         char * h = ".";
165 #endif
166         if (h==NULL) return;
167         home = (char *)malloc(strlen(h)+strlen(prefsfile)+2);
168         strcpy(home,h);
169         strcat(home,"/");
170         strcat(home,prefsfile);
171     }
172 
173     if (file != NULL)
174     {
175         free(file);
176         file = NULL;
177     }
178 
179     prefs = fopen(home, "r");
180     if (prefs == NULL) return;
181 
182     if (stat(home,&myStat) == 0)
183     {
184         file = (char *)malloc((size_t)(myStat.st_size)+1);
185         int l = fread(file, 1,(size_t)(myStat.st_size), prefs);
186         file[l]=0;
187     }
188 
189     fclose(prefs);
190 }
191 
192 
SetBoolPreference(const char * name,int value)193 void SetBoolPreference(const char *name, int value)
194 {
195     SetIntPreference(name, value);
196 }
197 
SetIntPreference(const char * name,int value)198 void SetIntPreference(const char *name, int value)
199 {
200   char var[256];
201   sprintf(var,"%d",value);
202   SetStrPreference(name,var);
203 }
204 
205 
GetBoolPreference(const char * name,int defaut)206 int GetBoolPreference(const char *name, int defaut)
207 {
208     return GetIntPreference(name,defaut)?true:false;
209 }
210 
GetIntPreference(const char * name,int defaut)211 int GetIntPreference(const char *name, int defaut)
212 {
213   char var[256];
214   var[0] = 0;
215   GetStrPreference(name,var,NULL,256);
216   if (var[0]) return atoi(var);
217   return defaut;
218 }
219 
SetStrPreference(const char * name,const char * value)220 void SetStrPreference (const char *name, const char *value)
221 {
222     char * key;
223     FILE * prefs;
224 
225     fetchFile();
226 
227     if (home == NULL) return;
228 
229     prefs = fopen(home, "w+");
230     if (prefs == NULL) return;
231 
232     if (file != NULL)
233     {
234         for (key = strtok(file, sep); key; key = strtok(NULL, sep))
235         {
236             if (strstr(key,name)==NULL)
237             {
238                 fprintf(prefs,"%s\n",key);
239             }
240         }
241         free(file);
242         file = NULL;
243     }
244 
245     fprintf(prefs,"%s=%s\n",name,value);
246 
247     fclose(prefs);
248 }
249 
250 
GetStrPreference(const char * name,char * out,const char * defaut,const int bufferSize)251 void GetStrPreference (const char *name, char *out, const char *defaut, const int bufferSize)
252 {
253     char * key, *copiedfile;
254     int tmplen;
255 
256     if ((out==NULL) || (name==NULL)) return;
257 
258     if (defaut != NULL)
259     {
260         strncpy(out,defaut,bufferSize-1);
261         out[bufferSize-1]=0;
262     }
263     else out[0]=0;
264 
265     if (file==NULL) fetchFile();
266     if (file==NULL) return;
267 
268     char tmp[256];
269     sprintf(tmp,"%s=",name);
270     tmplen = strlen(tmp);
271 
272     copiedfile = strdup(file);
273 
274     for (key = strtok(copiedfile, sep); key; key = strtok(NULL, sep))
275     {
276         if (strncmp(key, tmp, tmplen) == 0)
277         {
278             strncpy(out, key+tmplen, bufferSize-1);
279             out[bufferSize-1] = 0;
280             free(copiedfile);
281             return;
282         }
283     }
284     free(copiedfile);
285 
286     return;
287 }
288 
289 
290 #endif /* Not __APPLE__ */
291 
292