Add a limit to node meta data resolving recursion
authorShadowNinja <shadowninja@minetest.net>
Mon, 28 Apr 2014 01:31:46 +0000 (21:31 -0400)
committerShadowNinja <shadowninja@minetest.net>
Wed, 7 May 2014 21:05:44 +0000 (17:05 -0400)
src/nodemetadata.cpp
src/nodemetadata.h

index 911d86d2240573f83d502cd20a3174a3c30ba7fa..4cdd61767df889cc39b6f82ca7291fb49226285d 100644 (file)
@@ -191,3 +191,34 @@ void NodeMetadataList::clear()
        }
        m_data.clear();
 }
+
+std::string NodeMetadata::getString(const std::string &name, unsigned short recursion) const
+{
+       std::map<std::string, std::string>::const_iterator it;
+       it = m_stringvars.find(name);
+       if (it == m_stringvars.end()) {
+               return "";
+       }
+       return resolveString(it->second, recursion);
+}
+
+void NodeMetadata::setString(const std::string &name, const std::string &var)
+{
+       if (var.empty()) {
+               m_stringvars.erase(name);
+       } else {
+               m_stringvars[name] = var;
+       }
+}
+
+std::string NodeMetadata::resolveString(const std::string &str, unsigned short recursion) const
+{
+       if (recursion > 1) {
+               return str;
+       }
+       if (str.substr(0, 2) == "${" && str[str.length() - 1] == '}') {
+               return getString(str.substr(2, str.length() - 3), recursion + 1);
+       }
+       return str;
+}
+
index 710270502f76ab473b99aca4fdcb0e551d95b73e..6baf3b3d37bf3808bedab05e768c6472ccaaed13 100644 (file)
@@ -49,28 +49,10 @@ public:
        void clear();
 
        // Generic key/value store
-       std::string getString(const std::string &name) const
-       {
-               std::map<std::string, std::string>::const_iterator i;
-               i = m_stringvars.find(name);
-               if(i == m_stringvars.end())
-                       return "";
-               return i->second;
-       }
-       void setString(const std::string &name, const std::string &var)
-       {
-               if(var.empty())
-                       m_stringvars.erase(name);
-               else
-                       m_stringvars[name] = var;
-       }
-       // support variable names in values
-       std::string resolveString(const std::string &str) const
-       {
-               if(str.substr(0,2) == "${" && str[str.length()-1] == '}')
-                       return getString(str.substr(2,str.length()-3));
-               return str;
-       }
+       std::string getString(const std::string &name, unsigned short recursion = 0) const;
+       void setString(const std::string &name, const std::string &var);
+       // Support variable names in values
+       std::string resolveString(const std::string &str, unsigned short recursion = 0) const;
        std::map<std::string, std::string> getStrings() const
        {
                return m_stringvars;