annotate trunk/src/Support/Parameters.cc @ 296:fe5ce00a64f5

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