summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormrwastl <mrwastl@users.sourceforge.net>2012-06-08 19:41:51 +0200
committermrwastl <mrwastl@users.sourceforge.net>2012-06-08 19:41:51 +0200
commite49ae419f41f112092b27412cea1b5c8616329e6 (patch)
tree96152b900691d24f867071449b7bf5d74350ce4a
parentd93490418d190adaa901c9deb05d817d074244ff (diff)
downloadgraphlcd-base-e49ae419f41f112092b27412cea1b5c8616329e6.tar.gz
graphlcd-base-e49ae419f41f112092b27412cea1b5c8616329e6.tar.bz2
permit and evaluate $( )$ expressions to enable direct embedding of functions in the content part of elements such as <text/>.
-rw-r--r--glcdskin/string.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/glcdskin/string.c b/glcdskin/string.c
index 4e96a29..3966449 100644
--- a/glcdskin/string.c
+++ b/glcdskin/string.c
@@ -301,6 +301,34 @@ cType cSkinString::Evaluate(void) const
}
delete result;
}
+
+ // look for $(..)$-expressions
+ result_raw = result_trans;
+ result_trans = "";
+ idxstart = 0;
+ pos = 0;
+ bool err = false;
+ while ( !err && ((idxstart = result_raw.find("$(", idxstart)) != std::string::npos) ) {
+ result_trans.append (result_raw.substr(pos, idxstart - pos) );
+ idxend = result_raw.find(")$", idxstart + 2);
+ if ( idxend == std::string::npos ) { // no $) found: ignore leading $( and pass rest of whole string unparsed
+ result_trans.append(result_raw.substr(pos));
+ err = true;
+ } else {
+ std::string func = result_raw.substr( idxstart + 2, idxend - idxstart - 2 );
+ cSkinFunction *result = new cSkinFunction(mObject);
+ if (result->Parse(func, true)) {
+ std::string result_rescan = (std::string)result->Evaluate();
+ if (result_rescan != "")
+ result_trans.append( result_rescan );
+ }
+ delete result;
+
+ idxstart = idxend + 2;
+ pos = idxstart;
+ }
+ }
+ result_trans.append( result_raw.substr(pos) );
return result_trans;
}