annotate src/Support/Parameters.cc @ 45:c5f5e9569863

- Modified licence from GPL 3 to Apache v2
author tomwalters
date Tue, 30 Mar 2010 22:06:24 +0000
parents 491b1b1d1dc5
children e914b02b31b0
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@45 6 // Licensed under the Apache License, Version 2.0 (the "License");
tomwalters@45 7 // you may not use this file except in compliance with the License.
tomwalters@45 8 // You may obtain a copy of the License at
tomwalters@0 9 //
tomwalters@45 10 // http://www.apache.org/licenses/LICENSE-2.0
tomwalters@0 11 //
tomwalters@45 12 // Unless required by applicable law or agreed to in writing, software
tomwalters@45 13 // distributed under the License is distributed on an "AS IS" BASIS,
tomwalters@45 14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
tomwalters@45 15 // See the License for the specific language governing permissions and
tomwalters@45 16 // limitations under the License.
tomwalters@0 17
tomwalters@8 18 /*!
tomwalters@8 19 * \file
tomwalters@8 20 * \brief Main parameters store
tomwalters@8 21 *
tomwalters@8 22 * \author Willem van Engen <cnbh@willem.engen.nl>
tomwalters@8 23 * \date created 2006/09/21
tomwalters@23 24 * \version \$Id$
tomwalters@8 25 */
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@8 133 return 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@8 138 if (strcmp(sVal, "true") == 0 || strcmp(sVal, "on") == 0 ||
tomwalters@8 139 strcmp(sVal, "yes") == 0 || strcmp(sVal, "1") == 0 ||
tomwalters@8 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@8 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@8 152 /*! \todo There is some code duplication here from Parameters::Merge()
tomwalters@8 153 */
tomwalters@0 154
tomwalters@0 155 CSimpleIniCase *pIni2 = new CSimpleIniCase(false, false, true);
tomwalters@0 156 AIM_ASSERT(pIni2);
tomwalters@0 157 if (pIni2->Load(sCmd, strlen(sCmd)) < 0) {
tomwalters@0 158 LOG_ERROR(_T("Could not parse option '%s'"), sCmd);
tomwalters@0 159 delete pIni2;
tomwalters@0 160 return false;
tomwalters@0 161 }
tomwalters@0 162
tomwalters@0 163 // if there are keys and values...
tomwalters@0 164 const CSimpleIniCase::TKeyVal *pSectionData =
tomwalters@0 165 pIni2->GetSection(m_SDefaultIniSection);
tomwalters@0 166 if (pSectionData) {
tomwalters@0 167 // iterate over all keys and set them in the current parameter file
tomwalters@0 168 CSimpleIniCase::TKeyVal::const_iterator iKeyVal = pSectionData->begin();
tomwalters@0 169 for ( ;iKeyVal != pSectionData->end(); ++iKeyVal) {
tomwalters@0 170 m_pIni->SetValue(m_SDefaultIniSection,
tomwalters@0 171 iKeyVal->first.pItem,
tomwalters@0 172 iKeyVal->second);
tomwalters@0 173 }
tomwalters@0 174 }
tomwalters@0 175 delete pIni2;
tomwalters@0 176 return true;
tomwalters@0 177 }
tomwalters@0 178
tomwalters@0 179 bool Parameters::Delete(const char *sName) {
tomwalters@0 180 AIM_ASSERT(m_pIni);
tomwalters@0 181 return(m_pIni->Delete(m_SDefaultIniSection, sName));
tomwalters@0 182 }
tomwalters@0 183
tomwalters@0 184 bool Parameters::LoadFile(const char *sParamFilename) {
tomwalters@0 185 AIM_ASSERT(m_pIni);
tomwalters@0 186 SI_Error siErr;
tomwalters@0 187 bool bRet = true;
tomwalters@0 188
tomwalters@0 189 // Avoid inclusion loops
tomwalters@0 190 if (m_iNestCount >= m_iNestCountMaximum) {
tomwalters@0 191 LOG_ERROR(_T("Possible inclusion loop in file '%s' (%d times)"),
tomwalters@0 192 sParamFilename, m_iNestCount);
tomwalters@0 193 return false;
tomwalters@0 194 }
tomwalters@0 195 m_iNestCount++;
tomwalters@0 196
tomwalters@8 197 if ((siErr=m_pIni->LoadFile(sParamFilename)) < 0) {
tomwalters@0 198 // Don't complain if file not found, but do return error
tomwalters@8 199 if (siErr != SI_FILE)
tomwalters@0 200 LOG_ERROR(_T("Couldn't parse parameters from '%s'"), sParamFilename);
tomwalters@0 201 m_iNestCount--;
tomwalters@0 202 return false;
tomwalters@0 203 }
tomwalters@0 204
tomwalters@0 205 m_iNestCount--;
tomwalters@0 206 return bRet;
tomwalters@0 207 }
tomwalters@0 208
tomwalters@0 209 bool Parameters::MergeFile(const char *sParamFilename) {
tomwalters@0 210 Parameters *pParam2 = new Parameters();
tomwalters@0 211 AIM_ASSERT(pParam2);
tomwalters@0 212 if (!pParam2->LoadFile(sParamFilename)) {
tomwalters@0 213 LOG_ERROR(_T("Could not load parameter file '%s' for merging"),
tomwalters@0 214 sParamFilename);
tomwalters@0 215 delete pParam2;
tomwalters@0 216 return false;
tomwalters@0 217 }
tomwalters@0 218
tomwalters@0 219 // if there are keys and values...
tomwalters@0 220 const CSimpleIniCase::TKeyVal *pSectionData =
tomwalters@0 221 pParam2->m_pIni->GetSection(m_SDefaultIniSection);
tomwalters@0 222 if (pSectionData) {
tomwalters@0 223 // iterate over all keys and set them in the current parameter file
tomwalters@0 224 CSimpleIniCase::TKeyVal::const_iterator iKeyVal = pSectionData->begin();
tomwalters@0 225 for ( ;iKeyVal != pSectionData->end(); ++iKeyVal) {
tomwalters@0 226 m_pIni->SetValue(m_SDefaultIniSection,
tomwalters@0 227 iKeyVal->first.pItem,
tomwalters@0 228 iKeyVal->second);
tomwalters@0 229 }
tomwalters@0 230 }
tomwalters@0 231
tomwalters@0 232 delete pParam2;
tomwalters@0 233 return true;
tomwalters@0 234 }
tomwalters@0 235
tomwalters@0 236 bool Parameters::Merge(const char *sParamFilename) {
tomwalters@0 237 return MergeFile(sParamFilename);
tomwalters@0 238 }
tomwalters@0 239
tomwalters@0 240 bool Parameters::Load(const char *sParamFilename) {
tomwalters@0 241 bool bRet = true;
tomwalters@0 242 // Load parameter file
tomwalters@0 243 bRet &= Merge(sParamFilename);
tomwalters@0 244 return bRet;
tomwalters@0 245 }
tomwalters@0 246
tomwalters@0 247 bool Parameters::Save(const char *sParamFilename) {
tomwalters@0 248 AIM_ASSERT(m_pIni);
tomwalters@0 249 SI_Error siErr;
tomwalters@0 250 FILE *pSaveFile;
tomwalters@0 251
tomwalters@0 252 pSaveFile = fopen(sParamFilename, "wb");
tomwalters@0 253 if (pSaveFile == NULL) {
tomwalters@0 254 LOG_ERROR(_T("Couldn't create parameters file '%s' to save to"),
tomwalters@0 255 sParamFilename);
tomwalters@0 256 return false;
tomwalters@0 257 }
tomwalters@0 258
tomwalters@8 259 if ((siErr = m_pIni->SaveFile(pSaveFile)) < 0) {
tomwalters@0 260 LOG_ERROR(_T("Couldn't save parameters in file '%s'"), sParamFilename);
tomwalters@0 261 return false;
tomwalters@0 262 }
tomwalters@0 263
tomwalters@0 264 fclose(pSaveFile);
tomwalters@0 265
tomwalters@0 266 return true;
tomwalters@0 267 }
tomwalters@1 268
tomwalters@1 269 std::string Parameters::WriteString() {
tomwalters@1 270 AIM_ASSERT(m_pIni);
tomwalters@1 271 SI_Error siErr;
tomwalters@1 272 std::string output_string;
tomwalters@1 273
tomwalters@8 274 if ((siErr = m_pIni->Save(output_string)) < 0) {
tomwalters@1 275 LOG_ERROR(_T("Couldn't write parameters to string"));
tomwalters@1 276 return false;
tomwalters@1 277 }
tomwalters@1 278 return output_string;
tomwalters@1 279 }
tomwalters@1 280
tomwalters@0 281 } // namespace aimc