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