]> code.citadel.org Git - citadel.git/blobdiff - webcit/subst.c
* add DAV namespace
[citadel.git] / webcit / subst.c
index 2f45c8088cb6ef4753b54fdeded13f74c9860653..eea66ae6b98c06dcc30d58edea1a1b8dcb8c4060 100644 (file)
@@ -104,6 +104,7 @@ const char *CtxNames[]  = {
        "Context FLOORS",
        "Context ITERATE",
        "Context ICAL",
+       "Context DavNamespace",
        "Context UNKNOWN"
 };
 
@@ -147,10 +148,14 @@ void LogTemplateError (StrBuf *Target, const char *Type, int ErrorPos, WCTemplpu
                Err = (TP->Tokens!= NULL)? TP->Tokens->pName:"";
                break;
        case ERR_PARM1:
-               Err = (TP->Tokens!= NULL)? TP->Tokens->Params[0]->Start:"";
+               Err = ((TP->Tokens!= NULL) && 
+                      (TP->Tokens->nParameters > 0))? 
+                       TP->Tokens->Params[0]->Start : "";
                break;
        case ERR_PARM2:
-               Err = (TP->Tokens!= NULL)? TP->Tokens->Params[1]->Start:"";
+               Err = ((TP->Tokens!= NULL) && 
+                      (TP->Tokens->nParameters > 1))? 
+                       TP->Tokens->Params[1]->Start : "";
                break;
        }
        if (TP->Tokens != NULL) 
@@ -174,8 +179,11 @@ void LogTemplateError (StrBuf *Target, const char *Type, int ErrorPos, WCTemplpu
                return;
 */
        WCC = WC;
-       if (WCC == NULL)
-               return;
+       if (WCC == NULL) {
+               FreeStrBuf(&Info);
+               FreeStrBuf(&Error);
+               return; 
+       }
 
        Header = NewStrBuf();
        if (TP->Tokens != NULL) 
@@ -1501,7 +1509,11 @@ void *load_template(StrBuf *filename, StrBuf *Key, HashList *PutThere)
                /** Find one <? > */
                pos = (-1);
                for (; pch < pE; pch ++) {
-                       if ((*pch=='<')&&(*(pch + 1)=='?'))
+                       if ((*pch=='<')&&(*(pch + 1)=='?') &&
+                           !((pch == pS) && /* we must ommit a <?xml */
+                             (*(pch + 2) == 'x') && 
+                             (*(pch + 3) == 'm') && 
+                             (*(pch + 4) == 'l')))                          
                                break;
                        if (*pch=='\n') Line ++;
                }
@@ -1973,7 +1985,7 @@ void tmpl_iterate_subtmpl(StrBuf *Target, WCTemplputParams *TP)
        while (GetNextHashPos(List, it, &Status.KeyLen, &Status.Key, &vContext)) {
                if ((Status.n >= StartAt) && (Status.n <= StopAt)) {
                        if (DetectGroupChange && Status.n > 0) {
-                               Status.GroupChange = (SortBy->GroupChange(vContext, vLastContext))? 1:0;
+                               Status.GroupChange = SortBy->GroupChange(vContext, vLastContext);
                        }
                        Status.LastN = (Status.n + 1) == nMembersUsed;
                        SubTP.Context = vContext;
@@ -1998,7 +2010,10 @@ void tmpl_iterate_subtmpl(StrBuf *Target, WCTemplputParams *TP)
 int conditional_ITERATE_ISGROUPCHANGE(StrBuf *Target, WCTemplputParams *TP)
 {
        IterateStruct *Ctx = CCTX;
-       return Ctx->GroupChange;
+       if (TP->Tokens->nParameters < 3)
+               return  Ctx->GroupChange;
+
+       return TP->Tokens->Params[2]->lvalue == Ctx->GroupChange;
 }
 
 void tmplput_ITERATE_ODDEVEN(StrBuf *Target, WCTemplputParams *TP)
@@ -2025,6 +2040,12 @@ void tmplput_ITERATE_LASTN(StrBuf *Target, WCTemplputParams *TP)
        StrBufAppendPrintf(Target, "%d", Ctx->n);
 }
 
+int conditional_ITERATE_FIRSTN(StrBuf *Target, WCTemplputParams *TP)
+{
+       IterateStruct *Ctx = CCTX;
+       return Ctx->n == 0;
+}
+
 int conditional_ITERATE_LASTN(StrBuf *Target, WCTemplputParams *TP)
 {
        IterateStruct *Ctx = CCTX;
@@ -2171,7 +2192,7 @@ void tmpl_do_boxed(StrBuf *Target, WCTemplputParams *TP)
                        Headline = NewStrBufPlain(Ch, len);
                }
        }
-       memcpy (&SubTP, TP, sizeof(WCTemplputParams));
+       memcpy (&SubTP, TP, sizeof(WCTemplputParams));
        SubTP.Context = Headline;
        SubTP.Filter.ContextType = CTX_STRBUF;
        DoTemplate(HKEY("beginbox"), Target, &SubTP);
@@ -2597,6 +2618,10 @@ InitModule_SUBST
        RegisterControlConditional(HKEY("COND:ITERATE:LASTN"), 2, 
                                   conditional_ITERATE_LASTN, 
                                   CTX_ITERATE);
+       RegisterControlConditional(HKEY("COND:ITERATE:FIRSTN"), 2, 
+                                  conditional_ITERATE_FIRSTN, 
+                                  CTX_ITERATE);
+
        RegisterControlNS(HKEY("ITERATE:ODDEVEN"), 0, 0, tmplput_ITERATE_ODDEVEN, CTX_ITERATE);
        RegisterControlNS(HKEY("ITERATE:KEY"), 0, 0, tmplput_ITERATE_KEY, CTX_ITERATE);
        RegisterControlNS(HKEY("ITERATE:N"), 0, 0, tmplput_ITERATE_LASTN, CTX_ITERATE);