tomwalters@0
|
1 // Copyright 2006-2010, Willem van Engen
|
tomwalters@0
|
2 //
|
tomwalters@0
|
3 // AIM-C: A C++ implementation of the Auditory Image Model
|
tomwalters@0
|
4 // http://www.acousticscale.org/AIMC
|
tomwalters@0
|
5 //
|
tomwalters@0
|
6 // This program is free software: you can redistribute it and/or modify
|
tomwalters@0
|
7 // it under the terms of the GNU General Public License as published by
|
tomwalters@0
|
8 // the Free Software Foundation, either version 3 of the License, or
|
tomwalters@0
|
9 // (at your option) any later version.
|
tomwalters@0
|
10 //
|
tomwalters@0
|
11 // This program is distributed in the hope that it will be useful,
|
tomwalters@0
|
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
|
tomwalters@0
|
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
tomwalters@0
|
14 // GNU General Public License for more details.
|
tomwalters@0
|
15 //
|
tomwalters@0
|
16 // You should have received a copy of the GNU General Public License
|
tomwalters@0
|
17 // along with this program. If not, see <http://www.gnu.org/licenses/>.
|
tomwalters@0
|
18
|
tomwalters@8
|
19 /*!
|
tomwalters@8
|
20 * \file
|
tomwalters@8
|
21 * \brief Main parameters store
|
tomwalters@8
|
22 *
|
tomwalters@8
|
23 * \author Willem van Engen <cnbh@willem.engen.nl>
|
tomwalters@8
|
24 * \date created 2006/09/21
|
tomwalters@23
|
25 * \version \$Id$
|
tomwalters@8
|
26 */
|
tomwalters@0
|
27
|
tomwalters@0
|
28 #include <stdio.h>
|
tomwalters@0
|
29 #include <stdlib.h>
|
tomwalters@0
|
30 #include <string.h>
|
tomwalters@0
|
31
|
tomwalters@0
|
32 #include "Support/Common.h"
|
tomwalters@0
|
33 #include "Support/Parameters.h"
|
tomwalters@0
|
34
|
tomwalters@0
|
35 namespace aimc {
|
tomwalters@0
|
36 const char *Parameters::m_SDefaultIniSection = "";
|
tomwalters@0
|
37
|
tomwalters@0
|
38 Parameters::Parameters() {
|
tomwalters@0
|
39 m_iNestCount = 0;
|
tomwalters@0
|
40 m_pIni = new CSimpleIniCase(false, false, true);
|
tomwalters@0
|
41 AIM_ASSERT(m_pIni);
|
tomwalters@0
|
42 }
|
tomwalters@0
|
43
|
tomwalters@0
|
44 Parameters::~Parameters() {
|
tomwalters@0
|
45 DELETE_IF_NONNULL(m_pIni);
|
tomwalters@0
|
46 }
|
tomwalters@0
|
47
|
tomwalters@0
|
48 const char * Parameters::DefaultString(const char* sName, const char* val) {
|
tomwalters@0
|
49 AIM_ASSERT(m_pIni);
|
tomwalters@0
|
50 if (!IsSet(sName)) {
|
tomwalters@1
|
51 SetString(sName, val);
|
tomwalters@0
|
52 }
|
tomwalters@1
|
53 return GetString(sName);
|
tomwalters@0
|
54 }
|
tomwalters@0
|
55
|
tomwalters@0
|
56 int Parameters::DefaultInt(const char* sName, int val) {
|
tomwalters@0
|
57 AIM_ASSERT(m_pIni);
|
tomwalters@0
|
58 if (!IsSet(sName)) {
|
tomwalters@1
|
59 SetInt(sName, val);
|
tomwalters@0
|
60 }
|
tomwalters@1
|
61 return GetInt(sName);
|
tomwalters@0
|
62 }
|
tomwalters@0
|
63
|
tomwalters@0
|
64 unsigned int Parameters::DefaultUInt(const char* sName, unsigned int val) {
|
tomwalters@0
|
65 AIM_ASSERT(m_pIni);
|
tomwalters@0
|
66 if (!IsSet(sName)) {
|
tomwalters@1
|
67 SetUInt(sName, val);
|
tomwalters@0
|
68 }
|
tomwalters@1
|
69 return GetUInt(sName);
|
tomwalters@0
|
70 }
|
tomwalters@0
|
71
|
tomwalters@0
|
72 float Parameters::DefaultFloat(const char* sName, float val) {
|
tomwalters@0
|
73 AIM_ASSERT(m_pIni);
|
tomwalters@0
|
74 if (!IsSet(sName)) {
|
tomwalters@1
|
75 SetFloat(sName, val);
|
tomwalters@0
|
76 }
|
tomwalters@1
|
77 return GetFloat(sName);
|
tomwalters@0
|
78 }
|
tomwalters@0
|
79
|
tomwalters@0
|
80 bool Parameters::DefaultBool(const char* sName, bool val) {
|
tomwalters@0
|
81 AIM_ASSERT(m_pIni);
|
tomwalters@0
|
82 if (!IsSet(sName)) {
|
tomwalters@1
|
83 SetBool(sName, val);
|
tomwalters@0
|
84 }
|
tomwalters@1
|
85 return GetBool(sName);
|
tomwalters@0
|
86 }
|
tomwalters@0
|
87
|
tomwalters@0
|
88 void Parameters::SetString(const char *sName, const char *val) {
|
tomwalters@0
|
89 AIM_ASSERT(m_pIni);
|
tomwalters@0
|
90 m_pIni->SetValue(m_SDefaultIniSection, sName, val);
|
tomwalters@0
|
91 }
|
tomwalters@0
|
92
|
tomwalters@0
|
93 void Parameters::SetInt(const char *sName, int val) {
|
tomwalters@0
|
94 char sVal[20];
|
tomwalters@0
|
95 snprintf(sVal, sizeof(sVal)/sizeof(sVal[0]), "%d", val);
|
tomwalters@0
|
96 SetString(sName, sVal);
|
tomwalters@0
|
97 }
|
tomwalters@0
|
98
|
tomwalters@0
|
99 void Parameters::SetUInt(const char *sName, unsigned int val) {
|
tomwalters@0
|
100 char sVal[20];
|
tomwalters@0
|
101 snprintf(sVal, sizeof(sVal)/sizeof(sVal[0]), "%ud", val);
|
tomwalters@0
|
102 SetString(sName, sVal);
|
tomwalters@0
|
103 }
|
tomwalters@0
|
104
|
tomwalters@0
|
105 void Parameters::SetBool(const char *sName, bool val) {
|
tomwalters@0
|
106 SetString(sName, val ? "true" : "false");
|
tomwalters@0
|
107 }
|
tomwalters@0
|
108
|
tomwalters@0
|
109 void Parameters::SetFloat(const char *sName, float val) {
|
tomwalters@0
|
110 char sVal[20];
|
tomwalters@0
|
111 snprintf(sVal, sizeof(sVal)/sizeof(sVal[0]), "%f", val);
|
tomwalters@0
|
112 SetString(sName, sVal);
|
tomwalters@0
|
113 }
|
tomwalters@0
|
114
|
tomwalters@0
|
115 const char *Parameters::GetString(const char *sName) {
|
tomwalters@0
|
116 AIM_ASSERT(m_pIni);
|
tomwalters@0
|
117 const char *sVal = m_pIni->GetValue(m_SDefaultIniSection, sName, NULL);
|
tomwalters@0
|
118 if (!sVal) {
|
tomwalters@0
|
119 LOG_ERROR(_T("Parameter not found '%s'"), sName);
|
tomwalters@0
|
120 return "";
|
tomwalters@0
|
121 }
|
tomwalters@0
|
122 return sVal;
|
tomwalters@0
|
123 }
|
tomwalters@0
|
124
|
tomwalters@0
|
125 int Parameters::GetInt(const char *sName) {
|
tomwalters@0
|
126 return atoi(GetString(sName));
|
tomwalters@0
|
127 }
|
tomwalters@0
|
128
|
tomwalters@0
|
129 unsigned int Parameters::GetUInt(const char *sName) {
|
tomwalters@0
|
130 return atoi(GetString(sName));
|
tomwalters@0
|
131 }
|
tomwalters@0
|
132
|
tomwalters@0
|
133 float Parameters::GetFloat(const char *sName) {
|
tomwalters@8
|
134 return atof(GetString(sName));
|
tomwalters@0
|
135 }
|
tomwalters@0
|
136
|
tomwalters@0
|
137 bool Parameters::GetBool(const char *sName) {
|
tomwalters@0
|
138 const char *sVal = GetString(sName);
|
tomwalters@8
|
139 if (strcmp(sVal, "true") == 0 || strcmp(sVal, "on") == 0 ||
|
tomwalters@8
|
140 strcmp(sVal, "yes") == 0 || strcmp(sVal, "1") == 0 ||
|
tomwalters@8
|
141 strcmp(sVal, "y") == 0 || strcmp(sVal, "t") == 0)
|
tomwalters@0
|
142 return true;
|
tomwalters@0
|
143 else
|
tomwalters@0
|
144 return false;
|
tomwalters@0
|
145 }
|
tomwalters@0
|
146
|
tomwalters@0
|
147 bool Parameters::IsSet(const char *sName) {
|
tomwalters@0
|
148 AIM_ASSERT(m_pIni);
|
tomwalters@8
|
149 return m_pIni->GetValue(m_SDefaultIniSection, sName, NULL) != NULL;
|
tomwalters@0
|
150 }
|
tomwalters@0
|
151
|
tomwalters@0
|
152 bool Parameters::Parse(const char *sCmd) {
|
tomwalters@8
|
153 /*! \todo There is some code duplication here from Parameters::Merge()
|
tomwalters@8
|
154 */
|
tomwalters@0
|
155
|
tomwalters@0
|
156 CSimpleIniCase *pIni2 = new CSimpleIniCase(false, false, true);
|
tomwalters@0
|
157 AIM_ASSERT(pIni2);
|
tomwalters@0
|
158 if (pIni2->Load(sCmd, strlen(sCmd)) < 0) {
|
tomwalters@0
|
159 LOG_ERROR(_T("Could not parse option '%s'"), sCmd);
|
tomwalters@0
|
160 delete pIni2;
|
tomwalters@0
|
161 return false;
|
tomwalters@0
|
162 }
|
tomwalters@0
|
163
|
tomwalters@0
|
164 // if there are keys and values...
|
tomwalters@0
|
165 const CSimpleIniCase::TKeyVal *pSectionData =
|
tomwalters@0
|
166 pIni2->GetSection(m_SDefaultIniSection);
|
tomwalters@0
|
167 if (pSectionData) {
|
tomwalters@0
|
168 // iterate over all keys and set them in the current parameter file
|
tomwalters@0
|
169 CSimpleIniCase::TKeyVal::const_iterator iKeyVal = pSectionData->begin();
|
tomwalters@0
|
170 for ( ;iKeyVal != pSectionData->end(); ++iKeyVal) {
|
tomwalters@0
|
171 m_pIni->SetValue(m_SDefaultIniSection,
|
tomwalters@0
|
172 iKeyVal->first.pItem,
|
tomwalters@0
|
173 iKeyVal->second);
|
tomwalters@0
|
174 }
|
tomwalters@0
|
175 }
|
tomwalters@0
|
176 delete pIni2;
|
tomwalters@0
|
177 return true;
|
tomwalters@0
|
178 }
|
tomwalters@0
|
179
|
tomwalters@0
|
180 bool Parameters::Delete(const char *sName) {
|
tomwalters@0
|
181 AIM_ASSERT(m_pIni);
|
tomwalters@0
|
182 return(m_pIni->Delete(m_SDefaultIniSection, sName));
|
tomwalters@0
|
183 }
|
tomwalters@0
|
184
|
tomwalters@0
|
185 bool Parameters::LoadFile(const char *sParamFilename) {
|
tomwalters@0
|
186 AIM_ASSERT(m_pIni);
|
tomwalters@0
|
187 SI_Error siErr;
|
tomwalters@0
|
188 bool bRet = true;
|
tomwalters@0
|
189
|
tomwalters@0
|
190 // Avoid inclusion loops
|
tomwalters@0
|
191 if (m_iNestCount >= m_iNestCountMaximum) {
|
tomwalters@0
|
192 LOG_ERROR(_T("Possible inclusion loop in file '%s' (%d times)"),
|
tomwalters@0
|
193 sParamFilename, m_iNestCount);
|
tomwalters@0
|
194 return false;
|
tomwalters@0
|
195 }
|
tomwalters@0
|
196 m_iNestCount++;
|
tomwalters@0
|
197
|
tomwalters@8
|
198 if ((siErr=m_pIni->LoadFile(sParamFilename)) < 0) {
|
tomwalters@0
|
199 // Don't complain if file not found, but do return error
|
tomwalters@8
|
200 if (siErr != SI_FILE)
|
tomwalters@0
|
201 LOG_ERROR(_T("Couldn't parse parameters from '%s'"), sParamFilename);
|
tomwalters@0
|
202 m_iNestCount--;
|
tomwalters@0
|
203 return false;
|
tomwalters@0
|
204 }
|
tomwalters@0
|
205
|
tomwalters@0
|
206 m_iNestCount--;
|
tomwalters@0
|
207 return bRet;
|
tomwalters@0
|
208 }
|
tomwalters@0
|
209
|
tomwalters@0
|
210 bool Parameters::MergeFile(const char *sParamFilename) {
|
tomwalters@0
|
211 Parameters *pParam2 = new Parameters();
|
tomwalters@0
|
212 AIM_ASSERT(pParam2);
|
tomwalters@0
|
213 if (!pParam2->LoadFile(sParamFilename)) {
|
tomwalters@0
|
214 LOG_ERROR(_T("Could not load parameter file '%s' for merging"),
|
tomwalters@0
|
215 sParamFilename);
|
tomwalters@0
|
216 delete pParam2;
|
tomwalters@0
|
217 return false;
|
tomwalters@0
|
218 }
|
tomwalters@0
|
219
|
tomwalters@0
|
220 // if there are keys and values...
|
tomwalters@0
|
221 const CSimpleIniCase::TKeyVal *pSectionData =
|
tomwalters@0
|
222 pParam2->m_pIni->GetSection(m_SDefaultIniSection);
|
tomwalters@0
|
223 if (pSectionData) {
|
tomwalters@0
|
224 // iterate over all keys and set them in the current parameter file
|
tomwalters@0
|
225 CSimpleIniCase::TKeyVal::const_iterator iKeyVal = pSectionData->begin();
|
tomwalters@0
|
226 for ( ;iKeyVal != pSectionData->end(); ++iKeyVal) {
|
tomwalters@0
|
227 m_pIni->SetValue(m_SDefaultIniSection,
|
tomwalters@0
|
228 iKeyVal->first.pItem,
|
tomwalters@0
|
229 iKeyVal->second);
|
tomwalters@0
|
230 }
|
tomwalters@0
|
231 }
|
tomwalters@0
|
232
|
tomwalters@0
|
233 delete pParam2;
|
tomwalters@0
|
234 return true;
|
tomwalters@0
|
235 }
|
tomwalters@0
|
236
|
tomwalters@0
|
237 bool Parameters::Merge(const char *sParamFilename) {
|
tomwalters@0
|
238 return MergeFile(sParamFilename);
|
tomwalters@0
|
239 }
|
tomwalters@0
|
240
|
tomwalters@0
|
241 bool Parameters::Load(const char *sParamFilename) {
|
tomwalters@0
|
242 bool bRet = true;
|
tomwalters@0
|
243 // Load parameter file
|
tomwalters@0
|
244 bRet &= Merge(sParamFilename);
|
tomwalters@0
|
245 return bRet;
|
tomwalters@0
|
246 }
|
tomwalters@0
|
247
|
tomwalters@0
|
248 bool Parameters::Save(const char *sParamFilename) {
|
tomwalters@0
|
249 AIM_ASSERT(m_pIni);
|
tomwalters@0
|
250 SI_Error siErr;
|
tomwalters@0
|
251 FILE *pSaveFile;
|
tomwalters@0
|
252
|
tomwalters@0
|
253 pSaveFile = fopen(sParamFilename, "wb");
|
tomwalters@0
|
254 if (pSaveFile == NULL) {
|
tomwalters@0
|
255 LOG_ERROR(_T("Couldn't create parameters file '%s' to save to"),
|
tomwalters@0
|
256 sParamFilename);
|
tomwalters@0
|
257 return false;
|
tomwalters@0
|
258 }
|
tomwalters@0
|
259
|
tomwalters@8
|
260 if ((siErr = m_pIni->SaveFile(pSaveFile)) < 0) {
|
tomwalters@0
|
261 LOG_ERROR(_T("Couldn't save parameters in file '%s'"), sParamFilename);
|
tomwalters@0
|
262 return false;
|
tomwalters@0
|
263 }
|
tomwalters@0
|
264
|
tomwalters@0
|
265 fclose(pSaveFile);
|
tomwalters@0
|
266
|
tomwalters@0
|
267 return true;
|
tomwalters@0
|
268 }
|
tomwalters@1
|
269
|
tomwalters@1
|
270 std::string Parameters::WriteString() {
|
tomwalters@1
|
271 AIM_ASSERT(m_pIni);
|
tomwalters@1
|
272 SI_Error siErr;
|
tomwalters@1
|
273 std::string output_string;
|
tomwalters@1
|
274
|
tomwalters@8
|
275 if ((siErr = m_pIni->Save(output_string)) < 0) {
|
tomwalters@1
|
276 LOG_ERROR(_T("Couldn't write parameters to string"));
|
tomwalters@1
|
277 return false;
|
tomwalters@1
|
278 }
|
tomwalters@1
|
279 return output_string;
|
tomwalters@1
|
280 }
|
tomwalters@1
|
281
|
tomwalters@0
|
282 } // namespace aimc
|