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