annotate trunk/src/Support/Parameters.cc @ 268:e14c70d1b171

- Initial add of support code and modules. Not everything is working yet.
author tomwalters
date Fri, 12 Feb 2010 12:31:23 +0000
parents
children c26222c51fb7
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@268 6 // This program is free software: you can redistribute it and/or modify
tomwalters@268 7 // it under the terms of the GNU General Public License as published by
tomwalters@268 8 // the Free Software Foundation, either version 3 of the License, or
tomwalters@268 9 // (at your option) any later version.
tomwalters@268 10 //
tomwalters@268 11 // This program is distributed in the hope that it will be useful,
tomwalters@268 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
tomwalters@268 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
tomwalters@268 14 // GNU General Public License for more details.
tomwalters@268 15 //
tomwalters@268 16 // You should have received a copy of the GNU General Public License
tomwalters@268 17 // along with this program. If not, see <http://www.gnu.org/licenses/>.
tomwalters@268 18
tomwalters@268 19 //!
tomwalters@268 20 //! \file
tomwalters@268 21 //! \brief Main parameters store
tomwalters@268 22 //!
tomwalters@268 23 //! \author Willem van Engen <cnbh@willem.engen.nl>
tomwalters@268 24 //! \date created 2006/09/21
tomwalters@268 25 //! \version \$Id: Parameters.cc 4 2010-02-03 18:44:58Z tcw $
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@268 50 m_pIni->SetValue(m_SDefaultIniSection, sName, val);
tomwalters@268 51 }
tomwalters@268 52 return m_pIni->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@268 58 m_pIni->SetInt(m_SDefaultIniSection, sName, val);
tomwalters@268 59 }
tomwalters@268 60 return m_pIni->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@268 66 m_pIni->SetUInt(m_SDefaultIniSection, sName, val);
tomwalters@268 67 }
tomwalters@268 68 return m_pIni->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@268 74 m_pIni->SetFloat(m_SDefaultIniSection, sName, val);
tomwalters@268 75 }
tomwalters@268 76 return m_pIni->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@268 82 m_pIni->SetBool(m_SDefaultIniSection, sName, val);
tomwalters@268 83 }
tomwalters@268 84 return m_pIni->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@268 133 return (float)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@268 138 if (strcmp(sVal, "true")==0 || strcmp(sVal, "on")==0 ||
tomwalters@268 139 strcmp(sVal, "yes")==0 || strcmp(sVal, "1")==0 ||
tomwalters@268 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@268 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@268 152 //! \todo There is some code duplication here from Parameters::Merge()
tomwalters@268 153
tomwalters@268 154 CSimpleIniCase *pIni2 = new CSimpleIniCase(false, false, true);
tomwalters@268 155 AIM_ASSERT(pIni2);
tomwalters@268 156 if (pIni2->Load(sCmd, strlen(sCmd)) < 0) {
tomwalters@268 157 LOG_ERROR(_T("Could not parse option '%s'"), sCmd);
tomwalters@268 158 delete pIni2;
tomwalters@268 159 return false;
tomwalters@268 160 }
tomwalters@268 161
tomwalters@268 162 // if there are keys and values...
tomwalters@268 163 const CSimpleIniCase::TKeyVal *pSectionData =
tomwalters@268 164 pIni2->GetSection(m_SDefaultIniSection);
tomwalters@268 165 if (pSectionData) {
tomwalters@268 166 // iterate over all keys and set them in the current parameter file
tomwalters@268 167 CSimpleIniCase::TKeyVal::const_iterator iKeyVal = pSectionData->begin();
tomwalters@268 168 for ( ;iKeyVal != pSectionData->end(); ++iKeyVal) {
tomwalters@268 169 m_pIni->SetValue(m_SDefaultIniSection,
tomwalters@268 170 iKeyVal->first.pItem,
tomwalters@268 171 iKeyVal->second);
tomwalters@268 172 }
tomwalters@268 173 }
tomwalters@268 174 delete pIni2;
tomwalters@268 175 return true;
tomwalters@268 176 }
tomwalters@268 177
tomwalters@268 178 bool Parameters::Delete(const char *sName) {
tomwalters@268 179 AIM_ASSERT(m_pIni);
tomwalters@268 180 return(m_pIni->Delete(m_SDefaultIniSection, sName));
tomwalters@268 181 }
tomwalters@268 182
tomwalters@268 183 bool Parameters::LoadFile(const char *sParamFilename) {
tomwalters@268 184 AIM_ASSERT(m_pIni);
tomwalters@268 185 SI_Error siErr;
tomwalters@268 186 bool bRet = true;
tomwalters@268 187
tomwalters@268 188 // Avoid inclusion loops
tomwalters@268 189 if (m_iNestCount >= m_iNestCountMaximum) {
tomwalters@268 190 LOG_ERROR(_T("Possible inclusion loop in file '%s' (%d times)"),
tomwalters@268 191 sParamFilename, m_iNestCount);
tomwalters@268 192 return false;
tomwalters@268 193 }
tomwalters@268 194 m_iNestCount++;
tomwalters@268 195
tomwalters@268 196 if ( (siErr=m_pIni->LoadFile(sParamFilename))<0 ) {
tomwalters@268 197 // Don't complain if file not found, but do return error
tomwalters@268 198 if (siErr!=SI_FILE)
tomwalters@268 199 LOG_ERROR(_T("Couldn't parse parameters from '%s'"), sParamFilename);
tomwalters@268 200 m_iNestCount--;
tomwalters@268 201 return false;
tomwalters@268 202 }
tomwalters@268 203
tomwalters@268 204 m_iNestCount--;
tomwalters@268 205 return bRet;
tomwalters@268 206 }
tomwalters@268 207
tomwalters@268 208 bool Parameters::MergeFile(const char *sParamFilename) {
tomwalters@268 209 Parameters *pParam2 = new Parameters();
tomwalters@268 210 AIM_ASSERT(pParam2);
tomwalters@268 211 if (!pParam2->LoadFile(sParamFilename)) {
tomwalters@268 212 LOG_ERROR(_T("Could not load parameter file '%s' for merging"),
tomwalters@268 213 sParamFilename);
tomwalters@268 214 delete pParam2;
tomwalters@268 215 return false;
tomwalters@268 216 }
tomwalters@268 217
tomwalters@268 218 // if there are keys and values...
tomwalters@268 219 const CSimpleIniCase::TKeyVal *pSectionData =
tomwalters@268 220 pParam2->m_pIni->GetSection(m_SDefaultIniSection);
tomwalters@268 221 if (pSectionData) {
tomwalters@268 222 // iterate over all keys and set them in the current parameter file
tomwalters@268 223 CSimpleIniCase::TKeyVal::const_iterator iKeyVal = pSectionData->begin();
tomwalters@268 224 for ( ;iKeyVal != pSectionData->end(); ++iKeyVal) {
tomwalters@268 225 m_pIni->SetValue(m_SDefaultIniSection,
tomwalters@268 226 iKeyVal->first.pItem,
tomwalters@268 227 iKeyVal->second);
tomwalters@268 228 }
tomwalters@268 229 }
tomwalters@268 230
tomwalters@268 231 delete pParam2;
tomwalters@268 232 return true;
tomwalters@268 233 }
tomwalters@268 234
tomwalters@268 235 bool Parameters::Merge(const char *sParamFilename) {
tomwalters@268 236 return MergeFile(sParamFilename);
tomwalters@268 237 }
tomwalters@268 238
tomwalters@268 239 bool Parameters::Load(const char *sParamFilename) {
tomwalters@268 240 bool bRet = true;
tomwalters@268 241 // Load parameter file
tomwalters@268 242 bRet &= Merge(sParamFilename);
tomwalters@268 243 return bRet;
tomwalters@268 244 }
tomwalters@268 245
tomwalters@268 246 bool Parameters::Save(const char *sParamFilename) {
tomwalters@268 247 AIM_ASSERT(m_pIni);
tomwalters@268 248 SI_Error siErr;
tomwalters@268 249 FILE *pSaveFile;
tomwalters@268 250
tomwalters@268 251 pSaveFile = fopen(sParamFilename, "wb");
tomwalters@268 252 if (pSaveFile == NULL) {
tomwalters@268 253 LOG_ERROR(_T("Couldn't create parameters file '%s' to save to"),
tomwalters@268 254 sParamFilename);
tomwalters@268 255 return false;
tomwalters@268 256 }
tomwalters@268 257
tomwalters@268 258 if ((siErr = m_pIni->SaveFile(pSaveFile)) < 0 ) {
tomwalters@268 259 LOG_ERROR(_T("Couldn't save parameters in file '%s'"), sParamFilename);
tomwalters@268 260 return false;
tomwalters@268 261 }
tomwalters@268 262
tomwalters@268 263 fclose(pSaveFile);
tomwalters@268 264
tomwalters@268 265 return true;
tomwalters@268 266 }
tomwalters@268 267 } // namespace aimc