+
+#ifdef HAVE_STRCASECMP
+ else if (!strncasecmp(thispos, fortag.c_str(), fortag.length()))
+#else
+ else if (!_strnicmp(thispos, fortag.c_str(), fortag.length()))
+#endif
+ {
+ // Save this position off.
+ lastpos = thispos + iftag.length();
+ string key;
+ bool cond = visible;
+
+ // search for the end of this tag
+ if ((thispos = strchr(lastpos, '>')) != nullptr) {
+ key = buf.substr(lastpos-line, thispos-lastpos);
+ trimspace(key);
+ lastpos = thispos + 1; // strlen(">")
+ }
+
+ const multimap<string,string>* forParams = parameters.getLoopCollection(key.c_str());
+ if (!forParams || forParams->size() == 0) {
+ process(false, buf, lastpos, os, parameters, emptyPair, e);
+ }
+ else {
+ const char* savlastpos = lastpos;
+ for (multimap<string,string>::const_iterator i=forParams->begin(); i!=forParams->end(); ++i) {
+ lastpos = savlastpos;
+ process(cond, buf, lastpos, os, parameters, *i, e);
+ }
+ }
+ }
+
+#ifdef HAVE_STRCASECMP
+ else if (!strncasecmp(thispos, forendtag.c_str(), forendtag.length()))
+#else
+ else if (!_strnicmp(thispos, forendtag.c_str(), forendtag.length()))
+#endif
+ {
+ // Save this position off and pop the stack.
+ lastpos = thispos + forendtag.length();
+ return;
+ }
+