+
+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);
+}
+