gui: support string resources

storing strings in a map (for fast lookup) in resource manager

To define a string resource in <resources>:
<string name="foo">Hello</string>

To use a string, e.g.:
<text>%@foo%</text>

Not yet done: language-specific resources (should be solved not only for
strings, but for all kinds of resources - e.g. for localized images)

Change-Id: I3ba5cf5298c09e0d28a83973e9662f179271b33f
diff --git a/gui/gui.cpp b/gui/gui.cpp
index f3d31d7..cd6f45d 100644
--- a/gui/gui.cpp
+++ b/gui/gui.cpp
@@ -729,35 +729,37 @@
 	return 0;
 }
 
-std::string gui_parse_text(string inText)
+std::string gui_parse_text(std::string str)
 {
-	// Copied from std::string GUIText::parseText(void)
 	// This function parses text for DataManager values encompassed by %value% in the XML
-	static int counter = 0;
-	std::string str = inText;
+	// and string resources (%@resource_name%)
 	size_t pos = 0;
-	size_t next = 0, end = 0;
 
 	while (1)
 	{
-		next = str.find('%', pos);
+		size_t next = str.find('%', pos);
 		if (next == std::string::npos)
 			return str;
 
-		end = str.find('%', next + 1);
+		size_t end = str.find('%', next + 1);
 		if (end == std::string::npos)
 			return str;
 
 		// We have a block of data
-		std::string var = str.substr(next + 1,(end - next) - 1);
-		str.erase(next,(end - next) + 1);
+		std::string var = str.substr(next + 1, (end - next) - 1);
+		str.erase(next, (end - next) + 1);
 
 		if (next + 1 == end)
 			str.insert(next, 1, '%');
 		else
 		{
 			std::string value;
-			if (DataManager::GetValue(var, value) == 0)
+			if (var.size() > 0 && var[0] == '@') {
+				// this is a string resource ("%@string_name%")
+				value = PageManager::GetResources()->FindString(var.substr(1));
+				str.insert(next, value);
+			}
+			else if (DataManager::GetValue(var, value) == 0)
 				str.insert(next, value);
 		}