diff options
author | Novatux <nathanael.courant@laposte.net> | 2013-08-14 20:21:39 +0200 |
---|---|---|
committer | Kahrl <kahrl@gmx.net> | 2013-08-15 22:12:51 +0200 |
commit | 7921fe2cd1b284b35c28419fdf78873af456fded (patch) | |
tree | 8406671ea8106a6bef4ee384bf2a17f3dc384d15 /src | |
parent | a97c085e9e6f5e37c316aa5390f7cb05ad6bcacc (diff) | |
download | minetest-7921fe2cd1b284b35c28419fdf78873af456fded.tar.gz minetest-7921fe2cd1b284b35c28419fdf78873af456fded.tar.bz2 minetest-7921fe2cd1b284b35c28419fdf78873af456fded.zip |
Fix formspec escaping, add escaping to info.txt for texture packs.
Diffstat (limited to 'src')
-rw-r--r-- | src/guiFormSpecMenu.cpp | 63 |
1 files changed, 23 insertions, 40 deletions
diff --git a/src/guiFormSpecMenu.cpp b/src/guiFormSpecMenu.cpp index f09996ef3..049341c14 100644 --- a/src/guiFormSpecMenu.cpp +++ b/src/guiFormSpecMenu.cpp @@ -143,51 +143,34 @@ int GUIFormSpecMenu::getListboxIndex(std::string listboxname) { return -1; } -std::vector<std::string> split(const std::string &s, char delim, bool escape=false) { +std::vector<std::string> split(const std::string &s, char delim) { std::vector<std::string> tokens; - if (!escape) { - int startpos = 0; - size_t nextpos = s.find(delim); - - while(nextpos != std::string::npos) { - std::string toadd = s.substr(startpos,nextpos-startpos); - tokens.push_back(toadd); - startpos = nextpos+1; - nextpos = s.find(delim,nextpos+1); + std::string current = ""; + bool last_was_escape = false; + for(unsigned int i=0; i < s.size(); i++) { + if (last_was_escape) { + current += '\\'; + current += s.c_str()[i]; + last_was_escape = false; } - - //push last element - tokens.push_back(s.substr(startpos)); - } - else { - std::string current = ""; - current += s.c_str()[0]; - bool last_was_escape = false; - for(unsigned int i=1; i < s.size(); i++) { - if (last_was_escape) { - current += '\\'; - current += s.c_str()[i]; + else { + if (s.c_str()[i] == delim) { + tokens.push_back(current); + current = ""; last_was_escape = false; } + else if (s.c_str()[i] == '\\'){ + last_was_escape = true; + } else { - if (s.c_str()[i] == delim) { - tokens.push_back(current); - current = ""; - last_was_escape = false; - } - else if (s.c_str()[i] == '\\'){ - last_was_escape = true; - } - else { - current += s.c_str()[i]; - last_was_escape = false; - } + current += s.c_str()[i]; + last_was_escape = false; } } - //push last element - tokens.push_back(current); } + //push last element + tokens.push_back(current); return tokens; } @@ -518,7 +501,7 @@ void GUIFormSpecMenu::parseTextList(parserData* data,std::string element) { std::vector<std::string> v_pos = split(parts[0],','); std::vector<std::string> v_geom = split(parts[1],','); std::string name = parts[2]; - std::vector<std::string> items = split(parts[3],',',true); + std::vector<std::string> items = split(parts[3],','); std::string str_initial_selection = ""; std::string str_transparent = "false"; @@ -911,7 +894,7 @@ void GUIFormSpecMenu::parseTextArea(parserData* data,std::vector<std::string>& p } void GUIFormSpecMenu::parseField(parserData* data,std::string element,std::string type) { - std::vector<std::string> parts = split(element,';',true); + std::vector<std::string> parts = split(element,';'); if (parts.size() == 3) { parseSimpleField(data,parts); @@ -1275,7 +1258,7 @@ void GUIFormSpecMenu::parseElement(parserData* data,std::string element) { if (element == "") return; - std::vector<std::string> parts = split(element,'[', true); + std::vector<std::string> parts = split(element,'['); // ugly workaround to keep compatibility if (parts.size() > 2) { @@ -1428,7 +1411,7 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) m_boxes.clear(); - std::vector<std::string> elements = split(m_formspec_string,']',true); + std::vector<std::string> elements = split(m_formspec_string,']'); for (unsigned int i=0;i< elements.size();i++) { parseElement(&mydata,elements[i]); |