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@268
|
34 namespace aimc {
|
tomwalters@268
|
35 const char *Parameters::m_SDefaultIniSection = "";
|
tomwalters@268
|
36
|
tomwalters@268
|
37 Parameters::Parameters() {
|
tomwalters@268
|
38 m_iNestCount = 0;
|
tomwalters@268
|
39 m_pIni = new CSimpleIniCase(false, false, true);
|
tomwalters@268
|
40 AIM_ASSERT(m_pIni);
|
tomwalters@268
|
41 }
|
tomwalters@268
|
42
|
tomwalters@268
|
43 Parameters::~Parameters() {
|
tomwalters@268
|
44 DELETE_IF_NONNULL(m_pIni);
|
tomwalters@268
|
45 }
|
tomwalters@268
|
46
|
tomwalters@268
|
47 const char * Parameters::DefaultString(const char* sName, const char* val) {
|
tomwalters@268
|
48 AIM_ASSERT(m_pIni);
|
tomwalters@268
|
49 if (!IsSet(sName)) {
|
tomwalters@273
|
50 SetString(sName, val);
|
tomwalters@268
|
51 }
|
tomwalters@273
|
52 return GetString(sName);
|
tomwalters@268
|
53 }
|
tomwalters@268
|
54
|
tomwalters@268
|
55 int Parameters::DefaultInt(const char* sName, int val) {
|
tomwalters@268
|
56 AIM_ASSERT(m_pIni);
|
tomwalters@268
|
57 if (!IsSet(sName)) {
|
tomwalters@273
|
58 SetInt(sName, val);
|
tomwalters@268
|
59 }
|
tomwalters@273
|
60 return GetInt(sName);
|
tomwalters@268
|
61 }
|
tomwalters@268
|
62
|
tomwalters@268
|
63 unsigned int Parameters::DefaultUInt(const char* sName, unsigned int val) {
|
tomwalters@268
|
64 AIM_ASSERT(m_pIni);
|
tomwalters@268
|
65 if (!IsSet(sName)) {
|
tomwalters@273
|
66 SetUInt(sName, val);
|
tomwalters@268
|
67 }
|
tomwalters@273
|
68 return GetUInt(sName);
|
tomwalters@268
|
69 }
|
tomwalters@268
|
70
|
tomwalters@268
|
71 float Parameters::DefaultFloat(const char* sName, float val) {
|
tomwalters@268
|
72 AIM_ASSERT(m_pIni);
|
tomwalters@268
|
73 if (!IsSet(sName)) {
|
tomwalters@273
|
74 SetFloat(sName, val);
|
tomwalters@268
|
75 }
|
tomwalters@273
|
76 return GetFloat(sName);
|
tomwalters@268
|
77 }
|
tomwalters@268
|
78
|
tomwalters@268
|
79 bool Parameters::DefaultBool(const char* sName, bool val) {
|
tomwalters@268
|
80 AIM_ASSERT(m_pIni);
|
tomwalters@268
|
81 if (!IsSet(sName)) {
|
tomwalters@273
|
82 SetBool(sName, val);
|
tomwalters@268
|
83 }
|
tomwalters@273
|
84 return GetBool(sName);
|
tomwalters@268
|
85 }
|
tomwalters@268
|
86
|
tomwalters@268
|
87 void Parameters::SetString(const char *sName, const char *val) {
|
tomwalters@268
|
88 AIM_ASSERT(m_pIni);
|
tomwalters@268
|
89 m_pIni->SetValue(m_SDefaultIniSection, sName, val);
|
tomwalters@268
|
90 }
|
tomwalters@268
|
91
|
tomwalters@268
|
92 void Parameters::SetInt(const char *sName, int val) {
|
tomwalters@268
|
93 char sVal[20];
|
tomwalters@268
|
94 snprintf(sVal, sizeof(sVal)/sizeof(sVal[0]), "%d", val);
|
tomwalters@268
|
95 SetString(sName, sVal);
|
tomwalters@268
|
96 }
|
tomwalters@268
|
97
|
tomwalters@268
|
98 void Parameters::SetUInt(const char *sName, unsigned int val) {
|
tomwalters@268
|
99 char sVal[20];
|
tomwalters@268
|
100 snprintf(sVal, sizeof(sVal)/sizeof(sVal[0]), "%ud", val);
|
tomwalters@268
|
101 SetString(sName, sVal);
|
tomwalters@268
|
102 }
|
tomwalters@268
|
103
|
tomwalters@268
|
104 void Parameters::SetBool(const char *sName, bool val) {
|
tomwalters@268
|
105 SetString(sName, val ? "true" : "false");
|
tomwalters@268
|
106 }
|
tomwalters@268
|
107
|
tomwalters@268
|
108 void Parameters::SetFloat(const char *sName, float val) {
|
tomwalters@268
|
109 char sVal[20];
|
tomwalters@268
|
110 snprintf(sVal, sizeof(sVal)/sizeof(sVal[0]), "%f", val);
|
tomwalters@268
|
111 SetString(sName, sVal);
|
tomwalters@268
|
112 }
|
tomwalters@268
|
113
|
tomwalters@268
|
114 const char *Parameters::GetString(const char *sName) {
|
tomwalters@268
|
115 AIM_ASSERT(m_pIni);
|
tomwalters@268
|
116 const char *sVal = m_pIni->GetValue(m_SDefaultIniSection, sName, NULL);
|
tomwalters@268
|
117 if (!sVal) {
|
tomwalters@268
|
118 LOG_ERROR(_T("Parameter not found '%s'"), sName);
|
tomwalters@268
|
119 return "";
|
tomwalters@268
|
120 }
|
tomwalters@268
|
121 return sVal;
|
tomwalters@268
|
122 }
|
tomwalters@268
|
123
|
tomwalters@268
|
124 int Parameters::GetInt(const char *sName) {
|
tomwalters@268
|
125 return atoi(GetString(sName));
|
tomwalters@268
|
126 }
|
tomwalters@268
|
127
|
tomwalters@268
|
128 unsigned int Parameters::GetUInt(const char *sName) {
|
tomwalters@268
|
129 return atoi(GetString(sName));
|
tomwalters@268
|
130 }
|
tomwalters@268
|
131
|
tomwalters@268
|
132 float Parameters::GetFloat(const char *sName) {
|
tomwalters@280
|
133 return atof(GetString(sName));
|
tomwalters@268
|
134 }
|
tomwalters@268
|
135
|
tomwalters@268
|
136 bool Parameters::GetBool(const char *sName) {
|
tomwalters@268
|
137 const char *sVal = GetString(sName);
|
tomwalters@280
|
138 if (strcmp(sVal, "true") == 0 || strcmp(sVal, "on") == 0 ||
|
tomwalters@280
|
139 strcmp(sVal, "yes") == 0 || strcmp(sVal, "1") == 0 ||
|
tomwalters@280
|
140 strcmp(sVal, "y") == 0 || strcmp(sVal, "t") == 0)
|
tomwalters@268
|
141 return true;
|
tomwalters@268
|
142 else
|
tomwalters@268
|
143 return false;
|
tomwalters@268
|
144 }
|
tomwalters@268
|
145
|
tomwalters@268
|
146 bool Parameters::IsSet(const char *sName) {
|
tomwalters@268
|
147 AIM_ASSERT(m_pIni);
|
tomwalters@280
|
148 return m_pIni->GetValue(m_SDefaultIniSection, sName, NULL) != NULL;
|
tomwalters@268
|
149 }
|
tomwalters@268
|
150
|
tomwalters@268
|
151 bool Parameters::Parse(const char *sCmd) {
|
tomwalters@280
|
152 /*! \todo There is some code duplication here from Parameters::Merge()
|
tomwalters@280
|
153 */
|
tomwalters@268
|
154
|
tomwalters@268
|
155 CSimpleIniCase *pIni2 = new CSimpleIniCase(false, false, true);
|
tomwalters@268
|
156 AIM_ASSERT(pIni2);
|
tomwalters@268
|
157 if (pIni2->Load(sCmd, strlen(sCmd)) < 0) {
|
tomwalters@268
|
158 LOG_ERROR(_T("Could not parse option '%s'"), sCmd);
|
tomwalters@268
|
159 delete pIni2;
|
tomwalters@268
|
160 return false;
|
tomwalters@268
|
161 }
|
tomwalters@268
|
162
|
tomwalters@268
|
163 // if there are keys and values...
|
tomwalters@268
|
164 const CSimpleIniCase::TKeyVal *pSectionData =
|
tomwalters@268
|
165 pIni2->GetSection(m_SDefaultIniSection);
|
tomwalters@268
|
166 if (pSectionData) {
|
tomwalters@268
|
167 // iterate over all keys and set them in the current parameter file
|
tomwalters@268
|
168 CSimpleIniCase::TKeyVal::const_iterator iKeyVal = pSectionData->begin();
|
tomwalters@268
|
169 for ( ;iKeyVal != pSectionData->end(); ++iKeyVal) {
|
tomwalters@268
|
170 m_pIni->SetValue(m_SDefaultIniSection,
|
tomwalters@268
|
171 iKeyVal->first.pItem,
|
tomwalters@268
|
172 iKeyVal->second);
|
tomwalters@268
|
173 }
|
tomwalters@268
|
174 }
|
tomwalters@268
|
175 delete pIni2;
|
tomwalters@268
|
176 return true;
|
tomwalters@268
|
177 }
|
tomwalters@268
|
178
|
tomwalters@268
|
179 bool Parameters::Delete(const char *sName) {
|
tomwalters@268
|
180 AIM_ASSERT(m_pIni);
|
tomwalters@268
|
181 return(m_pIni->Delete(m_SDefaultIniSection, sName));
|
tomwalters@268
|
182 }
|
tomwalters@268
|
183
|
tomwalters@268
|
184 bool Parameters::LoadFile(const char *sParamFilename) {
|
tomwalters@268
|
185 AIM_ASSERT(m_pIni);
|
tomwalters@268
|
186 SI_Error siErr;
|
tomwalters@268
|
187 bool bRet = true;
|
tomwalters@268
|
188
|
tomwalters@268
|
189 // Avoid inclusion loops
|
tomwalters@268
|
190 if (m_iNestCount >= m_iNestCountMaximum) {
|
tomwalters@268
|
191 LOG_ERROR(_T("Possible inclusion loop in file '%s' (%d times)"),
|
tomwalters@268
|
192 sParamFilename, m_iNestCount);
|
tomwalters@268
|
193 return false;
|
tomwalters@268
|
194 }
|
tomwalters@268
|
195 m_iNestCount++;
|
tomwalters@268
|
196
|
tomwalters@280
|
197 if ((siErr=m_pIni->LoadFile(sParamFilename)) < 0) {
|
tomwalters@268
|
198 // Don't complain if file not found, but do return error
|
tomwalters@280
|
199 if (siErr != SI_FILE)
|
tomwalters@268
|
200 LOG_ERROR(_T("Couldn't parse parameters from '%s'"), sParamFilename);
|
tomwalters@268
|
201 m_iNestCount--;
|
tomwalters@268
|
202 return false;
|
tomwalters@268
|
203 }
|
tomwalters@268
|
204
|
tomwalters@268
|
205 m_iNestCount--;
|
tomwalters@268
|
206 return bRet;
|
tomwalters@268
|
207 }
|
tomwalters@268
|
208
|
tomwalters@268
|
209 bool Parameters::MergeFile(const char *sParamFilename) {
|
tomwalters@268
|
210 Parameters *pParam2 = new Parameters();
|
tomwalters@268
|
211 AIM_ASSERT(pParam2);
|
tomwalters@268
|
212 if (!pParam2->LoadFile(sParamFilename)) {
|
tomwalters@268
|
213 LOG_ERROR(_T("Could not load parameter file '%s' for merging"),
|
tomwalters@268
|
214 sParamFilename);
|
tomwalters@268
|
215 delete pParam2;
|
tomwalters@268
|
216 return false;
|
tomwalters@268
|
217 }
|
tomwalters@268
|
218
|
tomwalters@268
|
219 // if there are keys and values...
|
tomwalters@268
|
220 const CSimpleIniCase::TKeyVal *pSectionData =
|
tomwalters@268
|
221 pParam2->m_pIni->GetSection(m_SDefaultIniSection);
|
tomwalters@268
|
222 if (pSectionData) {
|
tomwalters@268
|
223 // iterate over all keys and set them in the current parameter file
|
tomwalters@268
|
224 CSimpleIniCase::TKeyVal::const_iterator iKeyVal = pSectionData->begin();
|
tomwalters@268
|
225 for ( ;iKeyVal != pSectionData->end(); ++iKeyVal) {
|
tomwalters@268
|
226 m_pIni->SetValue(m_SDefaultIniSection,
|
tomwalters@268
|
227 iKeyVal->first.pItem,
|
tomwalters@268
|
228 iKeyVal->second);
|
tomwalters@268
|
229 }
|
tomwalters@268
|
230 }
|
tomwalters@268
|
231
|
tomwalters@268
|
232 delete pParam2;
|
tomwalters@268
|
233 return true;
|
tomwalters@268
|
234 }
|
tomwalters@268
|
235
|
tomwalters@268
|
236 bool Parameters::Merge(const char *sParamFilename) {
|
tomwalters@268
|
237 return MergeFile(sParamFilename);
|
tomwalters@268
|
238 }
|
tomwalters@268
|
239
|
tomwalters@268
|
240 bool Parameters::Load(const char *sParamFilename) {
|
tomwalters@268
|
241 bool bRet = true;
|
tomwalters@268
|
242 // Load parameter file
|
tomwalters@268
|
243 bRet &= Merge(sParamFilename);
|
tomwalters@268
|
244 return bRet;
|
tomwalters@268
|
245 }
|
tomwalters@268
|
246
|
tomwalters@268
|
247 bool Parameters::Save(const char *sParamFilename) {
|
tomwalters@268
|
248 AIM_ASSERT(m_pIni);
|
tomwalters@268
|
249 SI_Error siErr;
|
tomwalters@268
|
250 FILE *pSaveFile;
|
tomwalters@268
|
251
|
tomwalters@268
|
252 pSaveFile = fopen(sParamFilename, "wb");
|
tomwalters@268
|
253 if (pSaveFile == NULL) {
|
tomwalters@268
|
254 LOG_ERROR(_T("Couldn't create parameters file '%s' to save to"),
|
tomwalters@268
|
255 sParamFilename);
|
tomwalters@268
|
256 return false;
|
tomwalters@268
|
257 }
|
tomwalters@268
|
258
|
tomwalters@280
|
259 if ((siErr = m_pIni->SaveFile(pSaveFile)) < 0) {
|
tomwalters@268
|
260 LOG_ERROR(_T("Couldn't save parameters in file '%s'"), sParamFilename);
|
tomwalters@268
|
261 return false;
|
tomwalters@268
|
262 }
|
tomwalters@268
|
263
|
tomwalters@268
|
264 fclose(pSaveFile);
|
tomwalters@268
|
265
|
tomwalters@268
|
266 return true;
|
tomwalters@268
|
267 }
|
tomwalters@273
|
268
|
tomwalters@273
|
269 std::string Parameters::WriteString() {
|
tomwalters@273
|
270 AIM_ASSERT(m_pIni);
|
tomwalters@273
|
271 SI_Error siErr;
|
tomwalters@273
|
272 std::string output_string;
|
tomwalters@273
|
273
|
tomwalters@280
|
274 if ((siErr = m_pIni->Save(output_string)) < 0) {
|
tomwalters@273
|
275 LOG_ERROR(_T("Couldn't write parameters to string"));
|
tomwalters@273
|
276 return false;
|
tomwalters@273
|
277 }
|
tomwalters@273
|
278 return output_string;
|
tomwalters@273
|
279 }
|
tomwalters@273
|
280
|
tomwalters@268
|
281 } // namespace aimc
|