diff --git a/engine/Configuration.cpp b/engine/Configuration.cpp index 2c618459..af285d3b 100644 --- a/engine/Configuration.cpp +++ b/engine/Configuration.cpp @@ -89,6 +89,12 @@ int Configuration::getIntValue(const String& sect, const String& key, const Toke return s ? s->toInteger(tokens,defvalue) : defvalue; } +double Configuration::getDoubleValue(const String& sect, const String& key, double defvalue) const +{ + const NamedString *s = getKey(sect,key); + return s ? s->toDouble(defvalue) : defvalue; +} + bool Configuration::getBoolValue(const String& sect, const String& key, bool defvalue) const { const NamedString *s = getKey(sect,key); diff --git a/engine/NamedList.cpp b/engine/NamedList.cpp index db7c91f3..317cb058 100644 --- a/engine/NamedList.cpp +++ b/engine/NamedList.cpp @@ -130,6 +130,12 @@ int NamedList::getIntValue(const String& name, const TokenDict* tokens, int defv return s ? s->toInteger(tokens,defvalue) : defvalue; } +double NamedList::getDoubleValue(const String& name, double defvalue) const +{ + const NamedString *s = getParam(name); + return s ? s->toDouble(defvalue) : defvalue; +} + bool NamedList::getBoolValue(const String& name, bool defvalue) const { const NamedString *s = getParam(name); diff --git a/engine/String.cpp b/engine/String.cpp index d9e41d7f..27998722 100644 --- a/engine/String.cpp +++ b/engine/String.cpp @@ -339,6 +339,17 @@ int String::toInteger(const TokenDict* tokens, int defvalue, int base) const return toInteger(defvalue,base); } +double String::toDouble(double defvalue) const +{ + if (!m_string) + return defvalue; + char *eptr = 0; + double val= ::strtod(m_string,&eptr); + if (!eptr || *eptr) + return defvalue; + return val; +} + static const char* str_false[] = { "false", "no", "off", "disable", 0 }; static const char* str_true[] = { "true", "yes", "on", "enable", 0 }; @@ -641,7 +652,7 @@ int String::rfind(char what) const return s ? s-m_string : -1; } -bool String::startsWith(const char* what, bool wordBreak) const +bool String::startsWith(const char* what, bool wordBreak, bool caseInsensitive) const { if (!(m_string && what && *what)) return false; @@ -650,12 +661,15 @@ bool String::startsWith(const char* what, bool wordBreak) const return false; else if (wordBreak && (m_length > l) && !isWordBreak(m_string[l])) return false; + + if (caseInsensitive) + return (::strncasecmp(m_string,what,l) == 0); return (::strncmp(m_string,what,l) == 0); } -bool String::startSkip(const char* what, bool wordBreak) +bool String::startSkip(const char* what, bool wordBreak, bool caseInsensitive) { - if (startsWith(what,wordBreak)) { + if (startsWith(what,wordBreak,caseInsensitive)) { const char *p = m_string + ::strlen(what); if (wordBreak) while (isWordBreak(*p)) @@ -666,7 +680,7 @@ bool String::startSkip(const char* what, bool wordBreak) return false; } -bool String::endsWith(const char* what, bool wordBreak) const +bool String::endsWith(const char* what, bool wordBreak, bool caseInsensitive) const { if (!(m_string && what && *what)) return false; @@ -675,6 +689,8 @@ bool String::endsWith(const char* what, bool wordBreak) const return false; else if (wordBreak && (m_length > l) && !isWordBreak(m_string[m_length-l-1])) return false; + if (caseInsensitive) + return (::strncasecmp(m_string+m_length-l,what,l) == 0); return (::strncmp(m_string+m_length-l,what,l) == 0); } diff --git a/yateclass.h b/yateclass.h index a20fccc7..c17f52ac 100644 --- a/yateclass.h +++ b/yateclass.h @@ -79,6 +79,10 @@ typedef unsigned long in_addr_t; #define strcasecmp _stricmp #endif +#ifndef strncasecmp +#define strncasecmp _strnicmp +#endif + #define vsnprintf _vsnprintf #define snprintf _snprintf #define strdup _strdup @@ -1192,6 +1196,13 @@ public: */ int toInteger(const TokenDict* tokens, int defvalue = 0, int base = 0) const; + /** + * Convert the string to a floating point value. + * @param defvalue Default to return if the string is not a number + * @return The floating-point interpretation or defvalue. + */ + double toDouble(double defvalue = 0.0) const; + /** * Convert the string to a boolean value. * @param defvalue Default to return if the string is not a bool @@ -1426,17 +1437,19 @@ public: * Checks if the string starts with a substring * @param what Substring to search for * @param wordBreak Check if a word boundary follows the substring + * @param caseInsensitive Compare case-insensitive if set * @return True if the substring occurs at the beginning of the string */ - bool startsWith(const char* what, bool wordBreak = false) const; + bool startsWith(const char* what, bool wordBreak = false, bool caseInsensitive = false) const; /** * Checks if the string ends with a substring * @param what Substring to search for * @param wordBreak Check if a word boundary precedes the substring + * @param caseInsensitive Compare case-insensitive if set * @return True if the substring occurs at the end of the string */ - bool endsWith(const char* what, bool wordBreak = false) const; + bool endsWith(const char* what, bool wordBreak = false, bool caseInsensitive = false) const; /** * Checks if the string starts with a substring and removes it @@ -1444,11 +1457,12 @@ public: * @param wordBreak Check if a word boundary follows the substring; * this parameter defaults to True because the intended use of this * method is to separate commands from their parameters + * @param caseInsensitive Compare case-insensitive if set * @return True if the substring occurs at the beginning of the string * and also removes the substring; if wordBreak is True any word * breaking characters are also removed */ - bool startSkip(const char* what, bool wordBreak = true); + bool startSkip(const char* what, bool wordBreak = true, bool caseInsensitive = false); /** * Checks if matches another string @@ -2461,6 +2475,14 @@ public: */ int getIntValue(const String& name, const TokenDict* tokens, int defvalue = 0) const; + /** + * Retrive the floating point value of a parameter. + * @param name Name of parameter to locate + * @param defvalue Default value to return if not found + * @return The number contained in the named parameter or the default + */ + double getDoubleValue(const String& name, double defvalue = 0.0) const; + /** * Retrive the boolean value of a parameter. * @param name Name of parameter to locate diff --git a/yatengine.h b/yatengine.h index 712fa189..4a12e902 100644 --- a/yatengine.h +++ b/yatengine.h @@ -117,6 +117,15 @@ public: */ int getIntValue(const String& sect, const String& key, const TokenDict* tokens, int defvalue = 0) const; + /** + * Retrive the floating point value of a key in a section. + * @param sect Name of the section + * @param key Name of the key in section + * @param defvalue Default value to return if not found + * @return The numeric value contained in the key or the default + */ + double getDoubleValue(const String& sect, const String& key, double defvalue = 0.0) const; + /** * Retrive the boolean value of a key in a section. * @param sect Name of the section