void *load_template(StrBuf *filename, StrBuf *Key, HashList *PutThere);
int EvaluateConditional(StrBuf *Target, WCTemplateToken *Tokens, WCTemplate *pTmpl, void *Context, int Neg, int state, int ContextType);
+typedef struct _SortStruct {
+ StrBuf *Name;
+ StrBuf *PrefPrepend;
+ CompareFunc Forward;
+ CompareFunc Reverse;
+ CompareFunc GroupChange;
+
+ long ContextType;
+}SortStruct;
+
+void DestroySortStruct(void *vSort)
+{
+ SortStruct *Sort = (SortStruct*) vSort;
+ FreeStrBuf(&Sort->Name);
+ FreeStrBuf(&Sort->PrefPrepend);
+ free (Sort);
+}
+
+
void RegisterNS(const char *NSName,
long len,
int nMinArgs,
int AdditionalParams;
int ContextType;
int XPectContextType;
+ int Flags;
RetrieveHashlistFunc GetHash;
HashDestructorFunc Destructor;
SubTemplFunc DoSubTemplate;
SubTemplFunc DoSubTempl,
HashDestructorFunc Destructor,
int ContextType,
- int XPectContextType)
+ int XPectContextType,
+ int Flags)
{
HashIterator *It = (HashIterator*)malloc(sizeof(HashIterator));
It->StaticList = StaticList;
It->Destructor = Destructor;
It->ContextType = ContextType;
It->XPectContextType = XPectContextType;
+ It->Flags = Flags;
Put(Iterators, Name, len, It, NULL);
}
HashIterator *It;
HashList *List;
HashPos *it;
+ SortStruct *SortBy;
+ void *vSortBy;
+ int DetectGroupChange = 0;
int nMembersUsed;
int nMembersCounted = 0;
long len;
const char *Key;
void *vContext;
+ void *vLastContext;
StrBuf *SubBuf;
int oddeven = 0;
else
List = It->StaticList;
+ DetectGroupChange = (It->Flags & IT_FLAG_DETECT_GROUPCHANGE) != 0;
+ if (DetectGroupChange) {
+ const StrBuf *BSort;
+ DetectGroupChange = 0;
+ if (havebstr("SortBy")) {
+ BSort = sbstr("SortBy");
+ if (GetHash(SortHash, SKEY(BSort), &vSortBy) &&
+ (vSortBy != NULL)) {
+ SortBy = (SortStruct*)vSortBy;
+ /** Ok, its us, lets see in which direction we should sort... */
+ if (havebstr("SortOrder")) {
+ int SortOrder;
+ SortOrder = LBSTR("SortOrder");
+ if (SortOrder != 0)
+ DetectGroupChange = 1;
+ }
+ }
+ }
+ }
nMembersUsed = GetCount(List);
SubBuf = NewStrBuf();
it = GetNewHashPos(List, 0);
while (GetNextHashPos(List, it, &len, &Key, &vContext)) {
+ if (DetectGroupChange && nMembersCounted > 0) {
+ if (SortBy->GroupChange(vContext, vLastContext))
+ svputlong("ITERATE:ISGROUPCHANGE", 1);
+ else
+ svputlong("ITERATE:ISGROUPCHANGE", 0);
+ }
svprintf(HKEY("ITERATE:ODDEVEN"), WCS_STRING, "%s",
(oddeven) ? "odd" : "even");
svprintf(HKEY("ITERATE:KEY"), WCS_STRING, "%s", Key);
StrBufAppendBuf(Target, SubBuf, 0);
FlushStrBuf(SubBuf);
oddeven = ~ oddeven;
+ vLastContext = vContext;
}
FreeStrBuf(&SubBuf);
DeleteHashPos(&it);
* Sorting-API
*/
-typedef struct _SortStruct {
- StrBuf *Name;
- StrBuf *PrefPrepend;
- CompareFunc Forward;
- CompareFunc Reverse;
-
- long ContextType;
-}SortStruct;
-
-void DestroySortStruct(void *vSort)
-{
- SortStruct *Sort = (SortStruct*) vSort;
- FreeStrBuf(&Sort->Name);
- FreeStrBuf(&Sort->PrefPrepend);
- free (Sort);
-}
void RegisterSortFunc(const char *name, long len,
const char *prepend, long preplen,
CompareFunc Forward,
CompareFunc Reverse,
+ CompareFunc GroupChange,
long ContextType)
{
SortStruct *NewSort = (SortStruct*) malloc(sizeof(SortStruct));
NewSort->PrefPrepend = NULL;
NewSort->Forward = Forward;
NewSort->Reverse = Reverse;
+ NewSort->GroupChange = GroupChange;
NewSort->ContextType = ContextType;
Put(SortHash, name, len, NewSort, DestroySortStruct);
}