]> code.citadel.org Git - citadel.git/blobdiff - webcit/subst.c
* add generic lists with strings
[citadel.git] / webcit / subst.c
index 619e479dc95a0fd0e7f25c9b77f2cde2e5308dbd..7d8541e7b05aaae571866822ed8ef361c5712b78 100644 (file)
@@ -105,6 +105,7 @@ const char *CtxNames[]  = {
        "Context MIME_ATACH",
        "Context FILELIST",
        "Context STRBUF",
+       "Context STRBUFARR",
        "Context LONGVECTOR",
        "Context ROOMS",
        "Context FLOORS",
@@ -766,6 +767,31 @@ void pvo_do_cmd(StrBuf *Target, StrBuf *servcmd) {
        }
 }
 
+int HaveTemplateTokenString(StrBuf *Target, 
+                           WCTemplputParams *TP,
+                           int N,
+                           const char **Value, 
+                           long *len)
+{
+       if (N >= TP->Tokens->nParameters) {
+               return 0;
+       }
+
+       switch (TP->Tokens->Params[N]->Type) {
+       case TYPE_INTDEFINE:
+       case TYPE_STR:
+       case TYPE_BSTR:
+       case TYPE_PREFSTR:
+       case TYPE_GETTEXT:
+       case TYPE_SUBTEMPLATE:
+               return 1;
+       case TYPE_LONG:
+       case TYPE_PREFINT:
+       default:
+               return 0;
+       }
+}
+
 void GetTemplateTokenString(StrBuf *Target, 
                            WCTemplputParams *TP,
                            int N,
@@ -2417,6 +2443,39 @@ void RegisterTokenParamDefine(const char *Name, long len,
        Put(Defines, Name, len, PVal, NULL);
 }
 
+long GetTokenDefine(const char *Name, long len, 
+                   long DefValue)
+{
+       void *vPVal;
+
+       if (GetHash(Defines, Name, len, &vPVal) &&
+            (vPVal != NULL))
+        {
+                return *(long*) vPVal;
+        }
+        else
+        {
+                return DefValue;
+        }
+}
+
+void tmplput_DefStr(StrBuf *Target, WCTemplputParams *TP)
+{
+       const char *Str;
+       long len;
+       GetTemplateTokenString(Target, TP, 2, &Str, &len);
+       
+       StrBufAppendBufPlain(Target, Str, len, 0);
+}
+
+void tmplput_DefVal(StrBuf *Target, WCTemplputParams *TP)
+{
+       int val;
+
+       val = GetTemplateTokenNumber(Target, TP, 0, 0);
+       StrBufAppendPrintf(Target, "%d", val);
+}
+
 HashList *Defines;
 
 /*-----------------------------------------------------------------------------
@@ -2436,6 +2495,36 @@ int ConditionalContextStr(StrBuf *Target, WCTemplputParams *TP)
        return strcmp(ChrPtr(TokenText), CompareToken) == 0;
 }
 
+void tmplput_ContextStringArray(StrBuf *Target, WCTemplputParams *TP)
+{
+       HashList *Arr = (HashList*) CTX;
+       void *pV;
+       int val;
+
+       val = GetTemplateTokenNumber(Target, TP, 0, 0);
+       if (GetHash(Arr, IKEY(val), &pV) && 
+           (pV != NULL)) {
+               StrBufAppendTemplate(Target, TP, (StrBuf*)pV, 1);
+       }
+}
+int ConditionalContextStrinArray(StrBuf *Target, WCTemplputParams *TP)
+{
+       HashList *Arr = (HashList*) CTX;
+       void *pV;
+       int val;
+       const char *CompareToken;
+       long len;
+
+       GetTemplateTokenString(Target, TP, 2, &CompareToken, &len);
+       val = GetTemplateTokenNumber(Target, TP, 0, 0);
+       if (GetHash(Arr, IKEY(val), &pV) && 
+           (pV != NULL)) {
+               return strcmp(ChrPtr((StrBuf*)pV), CompareToken) == 0;
+       }
+       else
+               return 0;
+}
+
 /*-----------------------------------------------------------------------------
  *                      Boxed-API
  */
@@ -2474,6 +2563,68 @@ void tmpl_do_boxed(StrBuf *Target, WCTemplputParams *TP)
 /*-----------------------------------------------------------------------------
  *                      Tabbed-API
  */
+int preeval_do_tabbed(WCTemplateToken *Token)
+{
+       WCTemplputParams TPP;
+       WCTemplputParams *TP;
+       const char *Ch;
+       long len;
+       int i, nTabs;
+
+
+       memset(&TPP, 0, sizeof(WCTemplputParams));
+       TP = &TPP;
+       TP->Tokens = Token;
+       nTabs = TP->Tokens->nParameters / 2 - 1;
+       if (TP->Tokens->nParameters % 2 != 0)
+       {
+               LogTemplateError(NULL, "TabbedApi", ERR_PARM1, TP,
+                                "need even number of arguments");
+               return 0;
+
+       }
+       else for (i = 0; i < nTabs; i++) {
+               if (!HaveTemplateTokenString(NULL, 
+                                            TP, 
+                                            i * 2,
+                                            &Ch,
+                                            &len) || 
+                   (TP->Tokens->Params[i * 2]->len == 0))
+               {
+                       LogTemplateError(NULL, "TabbedApi", ERR_PARM1, TP,
+                                        "Tab-Subject %d needs to be able to produce a string, have %s", 
+                                        i, TP->Tokens->Params[i * 2]->Start);
+                       return 0;
+               }
+               if (!HaveTemplateTokenString(NULL, 
+                                            TP, 
+                                            i * 2 + 1,
+                                            &Ch,
+                                            &len) || 
+                   (TP->Tokens->Params[i * 2 + 1]->len == 0))
+               {
+                       LogTemplateError(NULL, "TabbedApi", ERR_PARM1, TP,
+                                        "Tab-Content %d needs to be able to produce a string, have %s", 
+                                        i, TP->Tokens->Params[i * 2 + 1]->Start);
+                       return 0;
+               }
+       }
+
+       if (!HaveTemplateTokenString(NULL, 
+                                    TP, 
+                                    i * 2 + 1,
+                                    &Ch,
+                                    &len) || 
+           (TP->Tokens->Params[i * 2 + 1]->len == 0))
+       {
+               LogTemplateError(NULL, "TabbedApi", ERR_PARM1, TP,
+                                "Tab-Content %d needs to be able to produce a string, have %s", 
+                                i, TP->Tokens->Params[i * 2 + 1]->Start);
+               return 0;
+       }
+       return 1;
+}
+
 
 void tmpl_do_tabbed(StrBuf *Target, WCTemplputParams *TP)
 {
@@ -2512,6 +2663,8 @@ void tmpl_do_tabbed(StrBuf *Target, WCTemplputParams *TP)
                DoTemplate(TKEY(i * 2 + 1), Target, TP);
                StrEndTab(Target, i, nTabs);
        }
+       for (i = 0; i < ntabs; i++) 
+               FreeStrBuf(&TabNames[i]);
 }
 
 
@@ -2888,12 +3041,16 @@ InitModule_SUBST
        RegisterNamespace("SORT:ORDER", 1, 2, tmplput_SORT_ORDER, NULL, CTX_NONE);
        RegisterNamespace("SORT:NEXT", 1, 2, tmplput_SORT_NEXT, NULL, CTX_NONE);
        RegisterNamespace("CONTEXTSTR", 0, 1, tmplput_ContextString, NULL, CTX_STRBUF);
+       RegisterNamespace("CONTEXTSTRARR", 0, 1, tmplput_ContextStringArray, NULL, CTX_STRBUF);
        RegisterNamespace("ITERATE", 2, 100, tmpl_iterate_subtmpl, preeval_iterate, CTX_NONE);
        RegisterNamespace("DOBOXED", 1, 2, tmpl_do_boxed, NULL, CTX_NONE);
-       RegisterNamespace("DOTABBED", 2, 100, tmpl_do_tabbed, NULL, CTX_NONE);
+       RegisterNamespace("DOTABBED", 2, 100, tmpl_do_tabbed, preeval_do_tabbed, CTX_NONE);
        RegisterNamespace("LONGVECTOR", 1, 1, tmplput_long_vector, NULL, CTX_LONGVECTOR);
+
+
        RegisterConditional(HKEY("COND:SUBST"), 3, ConditionalVar, CTX_NONE);
        RegisterConditional(HKEY("COND:CONTEXTSTR"), 3, ConditionalContextStr, CTX_STRBUF);
+       RegisterConditional(HKEY("COND:CONTEXTSTR"), 4, ConditionalContextStrinArray, CTX_STRBUFARR);
        RegisterConditional(HKEY("COND:LONGVECTOR"), 4, ConditionalLongVector, CTX_LONGVECTOR);
 
        RegisterControlConditional(HKEY("COND:ITERATE:ISGROUPCHANGE"), 2, 
@@ -2910,6 +3067,10 @@ InitModule_SUBST
        RegisterControlNS(HKEY("ITERATE:KEY"), 0, 0, tmplput_ITERATE_KEY, CTX_ITERATE);
        RegisterControlNS(HKEY("ITERATE:N"), 0, 0, tmplput_ITERATE_LASTN, CTX_ITERATE);
        RegisterNamespace("CURRENTFILE", 0, 1, tmplput_CURRENT_FILE, NULL, CTX_NONE);
+       RegisterNamespace("DEF:STR", 0, 0, tmplput_DefStr, NULL, CTX_NONE);
+       RegisterNamespace("DEF:VAL", 0, 0, tmplput_DefVal, NULL, CTX_NONE);
+
+
 
 
 }