annotate trunk/src/Support/Parameters.cc @ 706:f8e90b5d85fd tip

Delete CARFAC code from this repository. It has been moved to https://github.com/google/carfac Please email me with your github username to get access. I've also created a new mailing list to discuss CARFAC development: https://groups.google.com/forum/#!forum/carfac-dev
author ronw@google.com
date Thu, 18 Jul 2013 20:56:51 +0000
parents 0a8e7d0c70dc
children
rev   line source
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