From 8837983610408677c0f6866b9d26f7fa54f60665 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Wilfried=20G=C3=B6esgens?= Date: Thu, 4 Sep 2008 19:06:21 +0000 Subject: [PATCH] * Template debugging: load & parse template on each request --- webcit/subst.c | 64 ++++++++++++++++++++++++++++++++++++---------- webcit/webcit.h | 2 +- webcit/webserver.c | 10 +++++--- 3 files changed, 58 insertions(+), 18 deletions(-) diff --git a/webcit/subst.c b/webcit/subst.c index 76f02e072..6f4efa91e 100644 --- a/webcit/subst.c +++ b/webcit/subst.c @@ -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); diff --git a/webcit/webcit.h b/webcit/webcit.h index 83f404ac6..2d0f29f8b 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -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; diff --git a/webcit/webserver.c b/webcit/webserver.c index aa2b0d001..aa0a23199 100644 --- a/webcit/webserver.c +++ b/webcit/webserver.c @@ -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] " -- 2.39.2