+#include "webserver.h"
+
+extern void output_static(const char* What);
+
+extern char* static_dirs[];
+
+typedef struct _FileListStruct {
+ StrBuf *Filename;
+ long FileSize;
+ StrBuf *MimeType;
+ StrBuf *Comment;
+ int IsPic;
+ int Sequence;
+} FileListStruct;
+
+void FreeFiles(void *vFile)
+{
+ FileListStruct *F = (FileListStruct*) vFile;
+ FreeStrBuf(&F->Filename);
+ FreeStrBuf(&F->MimeType);
+ FreeStrBuf(&F->Comment);
+ free(F);
+}
+
+/* -------------------------------------------------------------------------------- */
+void tmplput_FILE_NAME(StrBuf *Target, WCTemplputParams *TP)
+{
+ FileListStruct *F = (FileListStruct*) CTX;
+ StrBufAppendTemplate(Target, TP, F->Filename, 0);
+}
+void tmplput_FILE_SIZE(StrBuf *Target, WCTemplputParams *TP)
+{
+ FileListStruct *F = (FileListStruct*) CTX;
+ StrBufAppendPrintf(Target, "%ld", F->FileSize);
+}
+void tmplput_FILEMIMETYPE(StrBuf *Target, WCTemplputParams *TP)
+{
+ FileListStruct *F = (FileListStruct*) CTX;
+ StrBufAppendTemplate(Target, TP, F->MimeType, 0);
+}
+void tmplput_FILE_COMMENT(StrBuf *Target, WCTemplputParams *TP)
+{
+ FileListStruct *F = (FileListStruct*) CTX;
+ StrBufAppendTemplate(Target, TP, F->Comment, 0);
+}
+
+/* -------------------------------------------------------------------------------- */
+
+int Conditional_FILE_ISPIC(StrBuf *Target, WCTemplputParams *TP)
+{
+ FileListStruct *F = (FileListStruct*) CTX;
+ return F->IsPic;
+}
+
+/* -------------------------------------------------------------------------------- */
+int CompareFilelistByMime(const void *vFile1, const void *vFile2)
+{
+ FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+ FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
+
+ if (File1->IsPic != File2->IsPic)
+ return File1->IsPic > File2->IsPic;
+ return strcasecmp(ChrPtr(File1->MimeType), ChrPtr(File2->MimeType));
+}
+int CompareFilelistByMimeRev(const void *vFile1, const void *vFile2)
+{
+ FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+ FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
+ if (File1->IsPic != File2->IsPic)
+ return File1->IsPic < File2->IsPic;
+ return strcasecmp(ChrPtr(File2->MimeType), ChrPtr(File1->MimeType));
+}
+int GroupchangeFilelistByMime(const void *vFile1, const void *vFile2)
+{
+ FileListStruct *File1 = (FileListStruct*) vFile1;
+ FileListStruct *File2 = (FileListStruct*) vFile2;
+
+ if (File1->IsPic != File2->IsPic)
+ return File1->IsPic > File2->IsPic;
+ return strcasecmp(ChrPtr(File1->MimeType), ChrPtr(File2->MimeType)) != 0;
+}
+
+
+int CompareFilelistByName(const void *vFile1, const void *vFile2)
+{
+ FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+ FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
+
+ if (File1->IsPic != File2->IsPic)
+ return File1->IsPic > File2->IsPic;
+ return strcasecmp(ChrPtr(File1->Filename), ChrPtr(File2->Filename));
+}
+int CompareFilelistByNameRev(const void *vFile1, const void *vFile2)
+{
+ FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+ FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
+ if (File1->IsPic != File2->IsPic)
+ return File1->IsPic < File2->IsPic;
+ return strcasecmp(ChrPtr(File2->Filename), ChrPtr(File1->Filename));
+}
+int GroupchangeFilelistByName(const void *vFile1, const void *vFile2)
+{
+ FileListStruct *File1 = (FileListStruct*) vFile1;
+ FileListStruct *File2 = (FileListStruct*) vFile2;
+
+ return ChrPtr(File1->Filename)[0] != ChrPtr(File2->Filename)[0];
+}
+
+
+int CompareFilelistBySize(const void *vFile1, const void *vFile2)
+{
+ FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+ FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
+ if (File1->FileSize == File2->FileSize)
+ return 0;
+ return (File1->FileSize > File2->FileSize);
+}
+int CompareFilelistBySizeRev(const void *vFile1, const void *vFile2)
+{
+ FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+ FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
+ if (File1->FileSize == File2->FileSize)
+ return 0;
+ return (File1->FileSize < File2->FileSize);
+}
+int GroupchangeFilelistBySize(const void *vFile1, const void *vFile2)
+{
+ return 0;
+}
+
+
+int CompareFilelistByComment(const void *vFile1, const void *vFile2)
+{
+ FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+ FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
+ return strcasecmp(ChrPtr(File1->Comment), ChrPtr(File2->Comment));
+}
+int CompareFilelistByCommentRev(const void *vFile1, const void *vFile2)
+{
+ FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+ FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
+ return strcasecmp(ChrPtr(File2->Comment), ChrPtr(File1->Comment));
+}
+int GroupchangeFilelistByComment(const void *vFile1, const void *vFile2)
+{
+ FileListStruct *File1 = (FileListStruct*) vFile1;
+ FileListStruct *File2 = (FileListStruct*) vFile2;
+ return ChrPtr(File1->Comment)[9] != ChrPtr(File2->Comment)[0];
+}
+
+
+int CompareFilelistBySequence(const void *vFile1, const void *vFile2)
+{
+ FileListStruct *File1 = (FileListStruct*) GetSearchPayload(vFile1);
+ FileListStruct *File2 = (FileListStruct*) GetSearchPayload(vFile2);
+ return (File2->Sequence > File1->Sequence);
+}
+int GroupchangeFilelistBySequence(const void *vFile1, const void *vFile2)
+{
+ return 0;
+}