* Template debugging: load & parse template on each request
authorWilfried Göesgens <willi@citadel.org>
Thu, 4 Sep 2008 19:06:21 +0000 (19:06 +0000)
committerWilfried Göesgens <willi@citadel.org>
Thu, 4 Sep 2008 19:06:21 +0000 (19:06 +0000)
webcit/subst.c
webcit/webcit.h
webcit/webserver.c

index 76f02e0726d38b88c3044d1aee949e67f3980583..6f4efa91ef4e447a4c4777e3c07c99642fa04a16 100644 (file)
@@ -31,12 +31,15 @@ HashList *GlobalNS;
 HashList *Iterators;
 HashList *Contitionals;
 
+int LoadTemplates = 0;
+
 #define SV_GETTEXT 1
 #define SV_CONDITIONAL 2
 #define SV_NEG_CONDITIONAL 3
 
 typedef struct _WCTemplate {
        StrBuf *Data;
+       StrBuf *FileName;
        int nTokensUsed;
        int TokenSpace;
        WCTemplateToken **Tokens;
@@ -48,6 +51,8 @@ typedef struct _HashHandler {
        WCHandlerFunc HandlerFunc;
 }HashHandler;
 
+void *load_template(StrBuf *filename, StrBuf *Key, HashList *PutThere);
+
 void RegisterNS(const char *NSName, long len, int nMinArgs, int nMaxArgs, WCHandlerFunc HandlerFunc)
 {
        HashHandler *NewHandler;
@@ -642,6 +647,7 @@ void FreeWCTemplate(void *vFreeMe)
                }
                free(FreeMe->Tokens);
        }
+       FreeStrBuf(&FreeMe->FileName);
        FreeStrBuf(&FreeMe->Data);
        free(FreeMe);
 }
@@ -722,17 +728,22 @@ int EvaluateToken(StrBuf *Target, WCTemplateToken *Token, void *Context, int sta
 
 void ProcessTemplate(WCTemplate *Tmpl, StrBuf *Target, void *Context)
 {
+       WCTemplate *pTmpl = Tmpl;
        int done = 0;
        int i, state;
        const char *pData, *pS;
        long len;
 
-       pS = pData = ChrPtr(Tmpl->Data);
-       len = StrLength(Tmpl->Data);
+       if (LoadTemplates != 0) {
+               pTmpl = load_template(Tmpl->FileName, NULL, NULL);
+       }
+
+       pS = pData = ChrPtr(pTmpl->Data);
+       len = StrLength(pTmpl->Data);
        i = 0;
        state = 0;
        while (!done) {
-               if (i >= Tmpl->nTokensUsed) {
+               if (i >= pTmpl->nTokensUsed) {
                        StrBufAppendBufPlain(Target, 
                                             pData, 
                                             len - (pData - pS), 0);
@@ -741,28 +752,48 @@ void ProcessTemplate(WCTemplate *Tmpl, StrBuf *Target, void *Context)
                else {
                        StrBufAppendBufPlain(
                                Target, pData, 
-                               Tmpl->Tokens[i]->pTokenStart - pData, 0);
-                       state = EvaluateToken(Target, Tmpl->Tokens[i], Context, state);
-                       while ((state != 0) && (i+1 < Tmpl->nTokensUsed)) {
+                               pTmpl->Tokens[i]->pTokenStart - pData, 0);
+                       state = EvaluateToken(Target, pTmpl->Tokens[i], Context, state);
+                       while ((state != 0) && (i+1 < pTmpl->nTokensUsed)) {
                        /* condition told us to skip till its end condition */
                                i++;
-                               if ((Tmpl->Tokens[i]->Flags == SV_CONDITIONAL) ||
-                                   (Tmpl->Tokens[i]->Flags == SV_NEG_CONDITIONAL)) {
-                                       if (state == EvaluateConditional(Tmpl->Tokens[i], 
+                               if ((pTmpl->Tokens[i]->Flags == SV_CONDITIONAL) ||
+                                   (pTmpl->Tokens[i]->Flags == SV_NEG_CONDITIONAL)) {
+                                       if (state == EvaluateConditional(pTmpl->Tokens[i], 
                                                                         Context, 
-                                                                        Tmpl->Tokens[i]->Flags,
+                                                                        pTmpl->Tokens[i]->Flags,
                                                                         state))
                                                state = 0;
                                }
                        }
-                       pData = Tmpl->Tokens[i++]->pTokenEnd + 1;
-                       if (i > Tmpl->nTokensUsed)
+                       pData = pTmpl->Tokens[i++]->pTokenEnd + 1;
+                       if (i > pTmpl->nTokensUsed)
                                done = 1;
                }
        }
+       if (LoadTemplates != 0) {
+               FreeWCTemplate(pTmpl);
+       }
 }
 
 
+/**
+ * \brief Display a variable-substituted template
+ * \param templatename template file to load
+ */
+void *prepare_template(StrBuf *filename, StrBuf *Key, HashList *PutThere)
+{
+       WCTemplate *NewTemplate;
+       NewTemplate = (WCTemplate *) malloc(sizeof(WCTemplate));
+       NewTemplate->Data = NULL;
+       NewTemplate->FileName = NewStrBufDup(filename);
+       NewTemplate->nTokensUsed = 0;
+       NewTemplate->TokenSpace = 0;
+       NewTemplate->Tokens = NULL;
+
+       Put(PutThere, ChrPtr(Key), StrLength(Key), NewTemplate, FreeWCTemplate);
+       return NewTemplate;
+}
 
 /**
  * \brief Display a variable-substituted template
@@ -791,6 +822,7 @@ void *load_template(StrBuf *filename, StrBuf *Key, HashList *PutThere)
 
        NewTemplate = (WCTemplate *) malloc(sizeof(WCTemplate));
        NewTemplate->Data = NewStrBufPlain(NULL, statbuf.st_size);
+       NewTemplate->FileName = NULL;
        NewTemplate->nTokensUsed = 0;
        NewTemplate->TokenSpace = 0;
        NewTemplate->Tokens = NULL;
@@ -835,7 +867,8 @@ void *load_template(StrBuf *filename, StrBuf *Key, HashList *PutThere)
                            NewTemplateSubstitute(NewTemplate->Data, pS, pts, pte));
                pch ++;
        }
-       Put(PutThere, ChrPtr(Key), StrLength(Key), NewTemplate, FreeWCTemplate);
+       if (LoadTemplates == 0)
+               Put(PutThere, ChrPtr(Key), StrLength(Key), NewTemplate, FreeWCTemplate);
        return NewTemplate;
 }
 
@@ -915,7 +948,10 @@ int LoadTemplateDir(const char *DirName, HashList *wireless, HashList *big)
 
 
                printf("%s %d %s\n",ChrPtr(FileName), IsMobile, ChrPtr(Tag));
-               load_template(FileName, Tag, (IsMobile)?wireless:big);          
+               if (LoadTemplates == 0)
+                       load_template(FileName, Tag, (IsMobile)?wireless:big);
+               else
+                       prepare_template(FileName, Tag, (IsMobile)?wireless:big);
        }
        closedir(filedir);
        FreeStrBuf(&FileName);
index 83f404ac659e87f6d993520797893439ce48497b..2d0f29f8b5215bbdfdc2c4bb827d32beb4ba47c5 100644 (file)
@@ -274,7 +274,7 @@ typedef struct _wcsubst {
 
 #define TYPE_STR   1
 #define TYPE_LONG  2
-#define MAXPARAM  10
+#define MAXPARAM  20
 typedef struct _TemplateParam {
        const char *Start;
        int Type;
index aa2b0d0012e48e4586a9628c087fccb39c32514d..aa0a23199d000400f01ee6e78cffa0e714683750 100644 (file)
@@ -587,7 +587,7 @@ const char foobuf[32];
 const char *nix(void *vptr) {snprintf(foobuf, 32, "%0x", (long) vptr); return foobuf;}
 #endif 
 void InitTemplateCache(void);
-
+extern int LoadTemplates;
 extern void LoadZoneFiles(void);
 /*
  * \brief Here's where it all begins.
@@ -645,9 +645,9 @@ int main(int argc, char **argv)
 
        /* Parse command line */
 #ifdef HAVE_OPENSSL
-       while ((a = getopt(argc, argv, "h:i:p:t:x:dD:cfs")) != EOF)
+       while ((a = getopt(argc, argv, "h:i:p:t:T:x:dD:cfs")) != EOF)
 #else
-       while ((a = getopt(argc, argv, "h:i:p:t:x:dD:cf")) != EOF)
+       while ((a = getopt(argc, argv, "h:i:p:t:T:x:dD:cf")) != EOF)
 #endif
                switch (a) {
                case 'h':
@@ -684,6 +684,9 @@ int main(int argc, char **argv)
                        freopen(tracefile, "w", stderr);
                        freopen(tracefile, "r", stdin);
                        break;
+               case 'T':
+                       LoadTemplates = atoi(optarg);
+                       break;
                case 'x':
                        verbosity = atoi(optarg);
                        break;
@@ -712,6 +715,7 @@ int main(int argc, char **argv)
                        fprintf(stderr, "usage: webcit "
                                "[-i ip_addr] [-p http_port] "
                                "[-t tracefile] [-c] [-f] "
+                               "[-T Templatedebuglevel] "
                                "[-d] "
 #ifdef HAVE_OPENSSL
                                "[-s] "