From b1f06798f789dc40b1415f7066e4444f7ea49258 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Wilfried=20G=C3=B6esgens?= Date: Sun, 28 Feb 2010 21:33:29 +0000 Subject: [PATCH] * add generic lists with strings * use them for the configs, since there is no way to say how many items are in the list --- webcit/roomlist.c | 22 ++++++++++++++++------ webcit/subst.c | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/webcit/roomlist.c b/webcit/roomlist.c index 493375d73..5584928a0 100644 --- a/webcit/roomlist.c +++ b/webcit/roomlist.c @@ -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); diff --git a/webcit/subst.c b/webcit/subst.c index 07a0c7af3..7d8541e7b 100644 --- a/webcit/subst.c +++ b/webcit/subst.c @@ -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, -- 2.30.2