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;
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;
}
free(FreeMe->Tokens);
}
+ FreeStrBuf(&FreeMe->FileName);
FreeStrBuf(&FreeMe->Data);
free(FreeMe);
}
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);
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
NewTemplate = (WCTemplate *) malloc(sizeof(WCTemplate));
NewTemplate->Data = NewStrBufPlain(NULL, statbuf.st_size);
+ NewTemplate->FileName = NULL;
NewTemplate->nTokensUsed = 0;
NewTemplate->TokenSpace = 0;
NewTemplate->Tokens = NULL;
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;
}
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);
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.
/* 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':
freopen(tracefile, "w", stderr);
freopen(tracefile, "r", stdin);
break;
+ case 'T':
+ LoadTemplates = atoi(optarg);
+ break;
case 'x':
verbosity = atoi(optarg);
break;
fprintf(stderr, "usage: webcit "
"[-i ip_addr] [-p http_port] "
"[-t tracefile] [-c] [-f] "
+ "[-T Templatedebuglevel] "
"[-d] "
#ifdef HAVE_OPENSSL
"[-s] "