* add generic lists with strings
authorWilfried Göesgens <willi@citadel.org>
Sun, 28 Feb 2010 21:33:29 +0000 (21:33 +0000)
committerWilfried Göesgens <willi@citadel.org>
Sun, 28 Feb 2010 21:33:29 +0000 (21:33 +0000)
* use them for the configs, since there is no way to say how many items are in the list

webcit/roomlist.c
webcit/subst.c

index 493375d73223e42378f07c734d786861757dec5c..5584928a0362a07f1357a0d1c991ca04e9b4c679 100644 (file)
@@ -290,19 +290,29 @@ HashList *GetNetConfigHash(StrBuf *Target, WCTemplputParams *TP)
                StrBuf_ServGetln(Line);
                StrBufExtract_NextToken(Token, Line, &Pos, '|');
                PutTo = GetTokenDefine(SKEY(Token), -1);
-               if ((PutTo > 0) && (PutTo < maxRoomNetCfg))
+               if ((PutTo > 0) && 
+                   (PutTo < maxRoomNetCfg) &&
+                   (Pos != StrBufNOTNULL))
                {
                        int n;
+                       HashList *SubH;
 
                        if (WCC->CurRoom.IgnetCfgs[PutTo] == NULL)
                                WCC->CurRoom.IgnetCfgs[PutTo] = NewHash(1, NULL);
-                       Content = NewStrBuf();
-                       StrBufExtract_NextToken(Content, Line, &Pos, '|');
+                       SubH = NewHash(1, NULL);
                        n = GetCount(WCC->CurRoom.IgnetCfgs[PutTo]) + 1;
                        Put(WCC->CurRoom.IgnetCfgs[PutTo], 
                            IKEY(n),
-                           Content, 
-                           HFreeStrBuf);
+                           SubH, 
+                           HDeleteHash);
+                       while (Pos != StrBufNOTNULL) {
+                               Content = NewStrBuf();
+                               StrBufExtract_NextToken(Content, Line, &Pos, '|');
+                               Put(SubH, 
+                                   IKEY(n),
+                                   Content, 
+                                   HFreeStrBuf);
+                       }
                }
        }
        else if (State == 550)
@@ -848,7 +858,7 @@ InitModule_ROOMLIST
        RegisterConditional(HKEY("COND:FLOOR:ISSUBROOM"), 0, ConditionalFloorIsSUBROOM, CTX_FLOORS);
        RegisterConditional(HKEY("COND:ROOM:REST:ISSUBFLOOR"), 0, ConditionalFloorIsRESTSubFloor, CTX_FLOORS);
 
-       RegisterIterator("ITERATE:THISROOM:GNET", 1, NULL, GetNetConfigHash, NULL, NULL, CTX_STRBUF, CTX_NONE, IT_NOFLAG);
+       RegisterIterator("ITERATE:THISROOM:GNET", 1, NULL, GetNetConfigHash, NULL, NULL, CTX_STRBUFARR, CTX_NONE, IT_NOFLAG);
 
        RegisterIterator("LFLR", 0, NULL, GetFloorListHash, NULL, NULL, CTX_FLOORS, CTX_NONE, IT_FLAG_DETECT_GROUPCHANGE);
 
index 07a0c7af38138e06fa066848cda12783e5d49564..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",
@@ -2494,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
  */
@@ -3010,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, 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,