X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fsubst.c;h=130b1a12ac61bd7e2811d485d7775c11527f4803;hb=523dacbf093a836e18649e6e40454e22276ef6e7;hp=02ef070c683b02bdcfebdc24d65c4d1690fb4411;hpb=b3261cb6bd37bf9a5da60e07aa1762741a88629e;p=citadel.git diff --git a/webcit/subst.c b/webcit/subst.c index 02ef070c6..130b1a12a 100644 --- a/webcit/subst.c +++ b/webcit/subst.c @@ -163,6 +163,8 @@ void StackDynamicContext(WCTemplputParams *Super, Sub->Sub = Super->Sub; Super->Sub = Sub; } + if (Sub->Sub != NULL) + Sub->Sub->Super = Sub; Sub->Super = Super; Sub->Context = Context; @@ -179,6 +181,10 @@ void UnStackContext(WCTemplputParams *Sub) { Sub->Super->Sub = Sub->Sub; } + if (Sub->Sub != NULL) + { + Sub->Sub->Super = Sub->Super; + } } void UnStackDynamicContext(StrBuf *Target, WCTemplputParams **TPP) { @@ -315,9 +321,6 @@ void LogTemplateError (StrBuf *Target, const char *Type, int ErrorPos, WCTemplpu */ } - - - void LogError (StrBuf *Target, const char *Type, const char *Format, ...) { wcsession *WCC; @@ -392,7 +395,7 @@ int CheckContext(StrBuf *Target, ContextFilter *Need, WCTemplputParams *TP, cons return 1; LogTemplateError( - Target, ErrType, ERR_PARM1, TP, + Target, ErrType, ERR_NAME, TP, " WARNING: requires Context: [%s], have [%s]!", ContextName(Need->ContextType), ContextName(TP->Filter.ContextType)); @@ -1716,21 +1719,21 @@ int EvaluateToken(StrBuf *Target, int state, WCTemplputParams **TPP) case SV_CONDITIONAL: /** Forward conditional evaluation */ Handler = (HashHandler*) TP->Tokens->PreEval; if (!CheckContext(Target, &Handler->Filter, TP, "Conditional")) { - return -1; + return 0; } return EvaluateConditional(Target, 1, state, TPP); break; case SV_NEG_CONDITIONAL: /** Reverse conditional evaluation */ Handler = (HashHandler*) TP->Tokens->PreEval; if (!CheckContext(Target, &Handler->Filter, TP, "Conditional")) { - return -1; + return 0; } return EvaluateConditional(Target, 0, state, TPP); break; case SV_CUST_STR_CONDITIONAL: /** Conditional put custom strings from params */ Handler = (HashHandler*) TP->Tokens->PreEval; if (!CheckContext(Target, &Handler->Filter, TP, "Conditional")) { - return -1; + return 0; } if (TP->Tokens->nParameters >= 6) { if (EvaluateConditional(Target, 0, state, TPP)) { @@ -1765,7 +1768,7 @@ int EvaluateToken(StrBuf *Target, int state, WCTemplputParams **TPP) case SV_PREEVALUATED: Handler = (HashHandler*) TP->Tokens->PreEval; if (!CheckContext(Target, &Handler->Filter, TP, "Token")) { - return -1; + return 0; } Handler->HandlerFunc(Target, TP); break; @@ -1773,7 +1776,7 @@ int EvaluateToken(StrBuf *Target, int state, WCTemplputParams **TPP) if (GetHash(GlobalNS, TP->Tokens->pName, TP->Tokens->NameEnd, &vVar)) { Handler = (HashHandler*) vVar; if (!CheckContext(Target, &Handler->Filter, TP, "Token")) { - return -1; + return 0; } else { Handler->HandlerFunc(Target, TP); @@ -1801,6 +1804,8 @@ const StrBuf *ProcessTemplate(WCTemplate *Tmpl, StrBuf *Target, WCTemplputParams WCTemplputParams TP; WCTemplputParams *TPtr = &TP; + memset(TPtr, 0, sizeof(WCTemplputParams)); + memcpy(&TP.Filter, &CallingTP->Filter, sizeof(ContextFilter)); TP.Context = CallingTP->Context; @@ -1844,7 +1849,19 @@ const StrBuf *ProcessTemplate(WCTemplate *Tmpl, StrBuf *Target, WCTemplputParams TPtr->nArgs = pTmpl->Tokens[i]->nParameters; TokenRc = EvaluateToken(Target, TokenRc, &TPtr); - if (TokenRc != 0) state = eSkipTilEnd; + if (TokenRc > 0) + { + state = eSkipTilEnd; + } + else if (TokenRc < 0) + { + if ((TPtr != &TP) && + (TPtr->ExitCTXID == -TokenRc)) + { + UnStackDynamicContext(Target, &TPtr); + } + TokenRc = 0; + } while ((state != eNext) && (i+1 < pTmpl->nTokensUsed)) { /* condition told us to skip till its end condition */ @@ -1860,15 +1877,19 @@ const StrBuf *ProcessTemplate(WCTemplate *Tmpl, StrBuf *Target, WCTemplputParams pTmpl->Tokens[i]->Flags, TokenRc, &TPtr); - if (rc == TokenRc) + if (-rc == TokenRc) { TokenRc = 0; state = eNext; - if (TPtr != &TP) + if ((TPtr != &TP) && + (TPtr->ExitCTXID == - rc)) + { UnStackDynamicContext(Target, &TPtr); + } } } } + pData = pTmpl->Tokens[i++]->pTokenEnd + 1; if (i > pTmpl->nTokensUsed) done = 1; @@ -2220,7 +2241,7 @@ int EvaluateConditional(StrBuf *Target, int Neg, int state, WCTemplputParams **T if ((TP->Tokens->Params[0]->len == 1) && (TP->Tokens->Params[0]->Start[0] == 'X')) { - return (state != 0)?TP->Tokens->Params[1]->lvalue:0; + return - (TP->Tokens->Params[1]->lvalue); } Cond = (ConditionalStruct *) TP->Tokens->PreEval; @@ -2228,7 +2249,7 @@ int EvaluateConditional(StrBuf *Target, int Neg, int state, WCTemplputParams **T LogTemplateError( Target, "Conditional", ERR_PARM1, TP, "unknown!"); - return 1; + return 0; } if (!CheckContext(Target, &Cond->Filter, TP, "Conditional")) { @@ -2238,13 +2259,14 @@ int EvaluateConditional(StrBuf *Target, int Neg, int state, WCTemplputParams **T res = Cond->CondF(Target, TP); if (res == Neg) rc = TP->Tokens->Params[1]->lvalue; + if (LoadTemplates > 5) syslog(1, "<%s> : %d %d==%d\n", ChrPtr(TP->Tokens->FlatToken), rc, res, Neg); + if (TP->Sub != NULL) { -//// *XC = Cond->CondExitCtx; *TPP = TP->Sub; } return rc;