From f0d4dec106f607b5bbd5bb1cf1467c55ffefa8c8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Wilfried=20G=C3=B6esgens?= Date: Sun, 17 Aug 2008 15:21:42 +0000 Subject: [PATCH] * correct all GetNextHashPos() calls to have const chars * new template callback: ITERATE("iterator", "subtemplate",...); its to iterate over registered hashlists * new RegisterIterator() call; use this to register your hashlist with the ITERATE functionality --- webcit/addressbook_popup.c | 8 ++-- webcit/auth.c | 2 +- webcit/calendar_view.c | 10 ++--- webcit/preferences.c | 6 +-- webcit/siteconfig.c | 3 +- webcit/subst.c | 84 +++++++++++++++++++++++++++++++++----- webcit/webcit.c | 2 +- webcit/webcit.h | 22 ++++++++-- webcit/webserver.c | 2 + webcit/who.c | 4 +- 10 files changed, 113 insertions(+), 30 deletions(-) diff --git a/webcit/addressbook_popup.c b/webcit/addressbook_popup.c index 9ad632eca..5609c68ae 100644 --- a/webcit/addressbook_popup.c +++ b/webcit/addressbook_popup.c @@ -28,6 +28,7 @@ void display_address_book_middle_div(void) { char buf[256]; long len; char *Name; + const char *VCName; void *Namee; StrBuf *DefAddrBook; HashList *List; @@ -67,7 +68,7 @@ void display_address_book_middle_div(void) { SortByHashKey(List, 1); it = GetNewHashPos(); - while (GetNextHashPos(List, it, &len, &Name, &Namee)) { + while (GetNextHashPos(List, it, &len, &VCName, &Namee)) { wprintf("\n", (!strcasecmp((char*)ZName, buf) ? "selected" : ""), ZName, ZName diff --git a/webcit/subst.c b/webcit/subst.c index d52fc4f0a..cd0afa979 100644 --- a/webcit/subst.c +++ b/webcit/subst.c @@ -26,6 +26,7 @@ HashList *TemplateCache; HashList *LocalTemplateCache; HashList *GlobalNS; +HashList *Iterators; typedef struct _WCTemplate { StrBuf *Data; @@ -316,7 +317,7 @@ void print_value_of(const char *keyname, size_t keylen) { /*if (WCC->vars != NULL) PrintHash(WCC->vars, VarPrintTransition, VarPrintEntry);*/ if (keyname[0] == '=') { - DoTemplate(keyname+1, keylen - 1, NULL); + DoTemplate(keyname+1, keylen - 1, NULL, NULL); } /** Page-local variables */ if ((WCC->vars!= NULL) && GetHash(WCC->vars, keyname, keylen, &vVar)) { @@ -633,7 +634,7 @@ void *load_template(StrBuf *filename, StrBuf *Key, HashList *PutThere) * \brief Display a variable-substituted template * \param templatename template file to load */ -void DoTemplate(const char *templatename, long len, void *Context) +void DoTemplate(const char *templatename, long len, void *Context, StrBuf *Target) { HashList *Static; HashList *StaticLocal; @@ -769,19 +770,80 @@ void tmplput_current_room(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, vo escputs(WC->wc_roomname);////TODO: respcect Target } + +typedef struct _HashIterator { + HashList *StaticList; + RetrieveHashlistFunc GetHash; + HashDestructorFunc Destructor; + SubTemplFunc DoSubTemplate; +} HashIterator; + +void tmpl_iterate_subtmpl(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context) +{ + void *vIt; + HashIterator *It; + HashList *List; + HashPos *it; + long len; + const char *Key; + void *vContext; + StrBuf *SubBuf; + + if (!GetHash(Iterators, + Tokens->Params[0]->Start, + Tokens->Params[0]->len, + &vIt)) + return; + It = (HashIterator*) vIt; + if (It->StaticList == NULL) + List = It->GetHash(); + else + List = It->StaticList; + + SubBuf = NewStrBuf(); + it = GetNewHashPos(); + while (GetNextHashPos(List, it, &len, &Key, &vContext)) { + It->DoSubTemplate(SubBuf, vContext); + DoTemplate(Tokens->Params[0]->Start, + Tokens->Params[0]->len, + vContext, SubBuf); + + StrBufAppendBuf(Target, SubBuf, 0); + FlushStrBuf(SubBuf); + } + DeleteHashPos(&it); + It->Destructor(List); +} + + +void RegisterITERATOR(const char *Name, long len, + HashList *StaticList, + RetrieveHashlistFunc GetHash, + SubTemplFunc DoSubTempl, + HashDestructorFunc Destructor) +{ + HashIterator *It = (HashIterator*)malloc(sizeof(HashIterator)); + It->StaticList = StaticList; + It->GetHash = GetHash; + It->DoSubTemplate = DoSubTempl; + It->Destructor = Destructor; + Put(Iterators, Name, len, It, NULL); +} + void InitModule_SUBST (void) { - RegisterNS(HKEY("SERV_PID"), 0, 0, tmplput_serv_ip); - RegisterNS(HKEY("SERV_NODENAME"), 0, 0, tmplput_serv_nodename); - RegisterNS(HKEY("SERV_HUMANNODE"), 0, 0, tmplput_serv_humannode); - RegisterNS(HKEY("SERV_FQDN"), 0, 0, tmplput_serv_fqdn); - RegisterNS(HKEY("SERV_SOFTWARE"), 0, 0, tmmplput_serv_software); - RegisterNS(HKEY("SERV_REV_LEVEL"), 0, 0, tmplput_serv_rev_level); - RegisterNS(HKEY("SERV_BBS_CITY"), 0, 0, tmmplput_serv_bbs_city); - RegisterNS(HKEY("CURRENT_USER"), 0, 0, tmplput_current_user); - RegisterNS(HKEY("CURRENT_ROOM"), 0, 0, tmplput_current_room); + RegisterNamespace("SERV_PID", 0, 0, tmplput_serv_ip); + RegisterNamespace("SERV_NODENAME", 0, 0, tmplput_serv_nodename); + RegisterNamespace("SERV_HUMANNODE", 0, 0, tmplput_serv_humannode); + RegisterNamespace("SERV_FQDN", 0, 0, tmplput_serv_fqdn); + RegisterNamespace("SERV_SOFTWARE", 0, 0, tmmplput_serv_software); + RegisterNamespace("SERV_REV_LEVEL", 0, 0, tmplput_serv_rev_level); + RegisterNamespace("SERV_BBS_CITY", 0, 0, tmmplput_serv_bbs_city); + RegisterNamespace("CURRENT_USER", 0, 0, tmplput_current_user); + RegisterNamespace("CURRENT_ROOM", 0, 0, tmplput_current_room); + RegisterNamespace("ITERATE", 2, 4, tmpl_iterate_subtmpl); } /*@}*/ diff --git a/webcit/webcit.c b/webcit/webcit.c index 723bc0db9..4f488f392 100644 --- a/webcit/webcit.c +++ b/webcit/webcit.c @@ -173,7 +173,7 @@ void dump_vars(void) urlcontent *u; void *U; long HKLen; - char *HKey; + const char *HKey; HashPos *Cursor; Cursor = GetNewHashPos (); diff --git a/webcit/webcit.h b/webcit/webcit.h index 3923d5aca..bee4cf009 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -317,8 +317,23 @@ typedef struct _TemplateToken { } WCTemplateToken; typedef void (*WCHandlerFunc)(StrBuf *Target, int nArgs, WCTemplateToken *Token, void *Context); +void RegisterNS(const char *NSName, long len, + int nMinArgs, + int nMaxArgs, + WCHandlerFunc HandlerFunc); +#define RegisterNamespace(a, b, c, d) RegisterNS(a, sizeof(a)-1, b, c, d) + + +typedef void (*SubTemplFunc)(StrBuf *TemplBuffer, void *Context); +typedef HashList *(*RetrieveHashlistFunc)(void); +typedef void (*HashDestructorFunc) (HashList *KillMe); +void RegisterITERATOR(const char *Name, long len, + HashList *StaticList, + RetrieveHashlistFunc GetHash, + SubTemplFunc DoSubTempl, + HashDestructorFunc Destructor); +#define RegisterIterator(a, b, c, d) RegisterITERATOR(a, sizeof(a)-1, b, c, d) -void RegisterNS(const char *NSName, long len, int nMinArgs, int nMaxArgs, WCHandlerFunc HandlerFunc); /** * \brief Values for wcs_type @@ -504,6 +519,7 @@ extern HashList *WirelessLocalTemplateCache; extern HashList *TemplateCache; extern HashList *LocalTemplateCache; extern HashList *GlobalNS; +extern HashList *Iterators; void InitialiseSemaphores(void); void begin_critical_section(int which_one); @@ -646,8 +662,8 @@ void SVCALLBACK(char *keyname, var_callback_fptr fcn_ptr); void SVCallback(char *keyname, size_t keylen, var_callback_fptr fcn_ptr); #define svcallback(a, b) SVCallback(a, sizeof(a) - 1, b) -void DoTemplate(const char *templatename, long len, void *Context); -#define do_template(a, b) DoTemplate(a, sizeof(a) -1, b); +void DoTemplate(const char *templatename, long len, void *Context, StrBuf *Target); +#define do_template(a, b) DoTemplate(a, sizeof(a) -1, b, NULL); int lingering_close(int fd); diff --git a/webcit/webserver.c b/webcit/webserver.c index 5bb9e8781..32887f47c 100644 --- a/webcit/webserver.c +++ b/webcit/webserver.c @@ -623,6 +623,7 @@ int main(int argc, char **argv) LocalTemplateCache = NewHash(1, NULL); TemplateCache = NewHash(1, NULL); GlobalNS = NewHash(1, NULL); + Iterators = NewHash(1, NULL); #ifdef DBG_PRINNT_HOOKS_AT_START @@ -953,6 +954,7 @@ void worker_entry(void) DeleteHash(&WirelessLocalTemplateCache); DeleteHash(&TemplateCache); DeleteHash(&LocalTemplateCache); + DeleteHash(&Iterators); #ifdef ENABLE_NLS void ShutdownLocale(void); #endif diff --git a/webcit/who.c b/webcit/who.c index d37105c2b..00a06fdb0 100644 --- a/webcit/who.c +++ b/webcit/who.c @@ -117,7 +117,7 @@ void who_inner_div(void) { struct wcsession *WCC = WC; /* This is done to make it run faster; WC is a function */ HashList *List; HashPos *it; - char *UserName; + const char *UserName; long len; time_t now; int bg = 0; @@ -394,7 +394,7 @@ void wholist_section(void) { void *VUser; HashList *List; HashPos *it; - char *UserName; + const char *UserName; long len; char buf[SIZ]; time_t now; -- 2.30.2