annotate src/Support/Parameters.cc @ 8:fcbf85ce59fb

- Lots of changes to make cpplint happy. It still complains about header guards, but that's pretty much it now.
author tomwalters
date Thu, 18 Feb 2010 21:12:41 +0000
parents bc394a985042
children 491b1b1d1dc5
rev   line source
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@8 25 * \version \$Id: Parameters.cc 4 2010-02-03 18:44:58Z tcw $
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