HashList *Iterators;
HashList *Contitionals;
+int LoadTemplates = 0;
+
#define SV_GETTEXT 1
#define SV_CONDITIONAL 2
#define SV_NEG_CONDITIONAL 3
+#define SV_SUBTEMPL 4
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;
clear_substs (WC);
}
-void FlushPayload(wcsubst *ptr, int reusestrbuf)
+int NeedNewBuf(type)
{
+ switch(type) {
+ case WCS_STRING:
+ case WCS_SERVCMD:
+ case WCS_STRBUF:
+ return 1;
+ case WCS_FUNCTION:
+ case WCS_STRBUF_REF:
+ case WCS_LONG:
+ default:
+ return 0;
+ }
+}
+
+void FlushPayload(wcsubst *ptr, int reusestrbuf, int type)
+{
+ int NeedNew = NeedNewBuf(type);
switch(ptr->wcs_type) {
case WCS_STRING:
case WCS_SERVCMD:
case WCS_STRBUF:
- if (reusestrbuf) {
+ if (reusestrbuf && NeedNew) {
FlushStrBuf(ptr->wcs_value);
}
else {
FreeStrBuf(&ptr->wcs_value);
+ ptr->wcs_value = NULL;
}
break;
case WCS_FUNCTION:
ptr->wcs_function = NULL;
- if (reusestrbuf)
+ if (reusestrbuf && NeedNew)
ptr->wcs_value = NewStrBuf();
break;
case WCS_STRBUF_REF:
ptr->wcs_value = NULL;
- if (reusestrbuf)
+ if (reusestrbuf && NeedNew)
ptr->wcs_value = NewStrBuf();
break;
case WCS_LONG:
- if (reusestrbuf)
- ptr->wcs_value = NewStrBuf();
ptr->lvalue = 0;
+ if (reusestrbuf && NeedNew)
+ ptr->wcs_value = NewStrBuf();
break;
default:
+ if (reusestrbuf && NeedNew)
+ ptr->wcs_value = NewStrBuf();
break;
}
}
void deletevar(void *data)
{
wcsubst *ptr = (wcsubst*)data;
- FlushPayload(ptr, 0);
+ FlushPayload(ptr, 0, ptr->wcs_type);
free(ptr);
}
/*PrintHash(WCC->vars, VarPrintTransition, VarPrintEntry);*/
if (GetHash(WCC->vars, keyname, keylen, &vPtr)) {
ptr = (wcsubst*)vPtr;
- FlushPayload(ptr, keytype);
+ FlushPayload(ptr, keytype, keytype);
ptr->wcs_type = keytype;
}
else /** Otherwise allocate a new one */
/*PrintHash(WCC->vars, VarPrintTransition, VarPrintEntry);*/
if (GetHash(WCC->vars, keyname, keylen, &vPtr)) {
ptr = (wcsubst*)vPtr;
- FlushPayload(ptr, 1);
+ FlushPayload(ptr, 1, keytype);
ptr->wcs_type = keytype;
}
else /** Otherwise allocate a new one */
/*PrintHash(WCC->vars, VarPrintTransition, VarPrintEntry);*/
if (GetHash(WCC->vars, keyname, keylen, &vPtr)) {
ptr = (wcsubst*)vPtr;
- FlushPayload(ptr, 1);
+ FlushPayload(ptr, 1, keytype);
ptr->wcs_type = keytype;
}
else /** Otherwise allocate a new one */
{
ptr = NewSubstVar(keyname, keylen, keytype);
}
- ptr->wcs_value = NewStrBufPlain(Data, -1);
+ StrBufAppendBufPlain(ptr->wcs_value, Data, -1, 0);
}
/**
/*PrintHash(WCC->vars, VarPrintTransition, VarPrintEntry);*/
if (GetHash(WCC->vars, keyname, keylen, &vPtr)) {
ptr = (wcsubst*)vPtr;
- FlushPayload(ptr, 1);
+ FlushPayload(ptr, 1, WCS_LONG);
ptr->wcs_type = WCS_LONG;
}
else /** Otherwise allocate a new one */
/*PrintHash(WCC->vars, VarPrintTransition, VarPrintEntry);*/
if (GetHash(WCC->vars, keyname, keylen, &vPtr)) {
ptr = (wcsubst*)vPtr;
- FlushPayload(ptr, 0);
+ FlushPayload(ptr, 1, WCS_FUNCTION);
ptr->wcs_type = WCS_FUNCTION;
}
else /** Otherwise allocate a new one */
/*PrintHash(WCC->vars, VarPrintTransition, VarPrintEntry);*/
if (GetHash(WCC->vars, keyname, keylen, &vPtr)) {
ptr = (wcsubst*)vPtr;
- FlushPayload(ptr, 0);
+ FlushPayload(ptr, 0, (ref)?WCS_STRBUF_REF:WCS_STRBUF);
ptr->wcs_type = (ref)?WCS_STRBUF_REF:WCS_STRBUF;
}
else /** Otherwise allocate a new one */
void *vVar;
/*if (WCC->vars != NULL) PrintHash(WCC->vars, VarPrintTransition, VarPrintEntry);*/
+ /// TODO: debricated!
if (keyname[0] == '=') {
DoTemplate(keyname+1, keylen - 1, NULL, NULL);
}
}
else {
Parm->lvalue = 0;
- lprintf(1, "Error evaluating template long param [%s]", *pCh);
+ lprintf(1, "Error evaluating template long param [%s]\n", *pCh);
free(Parm);
return NULL;
}
if ((NewToken->nParameters == 1) &&
(*(NewToken->pName) == '_'))
NewToken->Flags = SV_GETTEXT;
+ else if ((NewToken->nParameters == 1) &&
+ (*(NewToken->pName) == '='))
+ NewToken->Flags = SV_SUBTEMPL;
else if ((NewToken->nParameters >= 2) &&
(*(NewToken->pName) == '?'))
NewToken->Flags = SV_CONDITIONAL;
}
free(FreeMe->Tokens);
}
+ FreeStrBuf(&FreeMe->FileName);
FreeStrBuf(&FreeMe->Data);
free(FreeMe);
}
void *vVar;
// much output, since pName is not terminated...
// lprintf(1,"Doing token: %s\n",Token->pName);
- if (Token->Flags == SV_GETTEXT) {
+ switch (Token->Flags) {
+ case SV_GETTEXT:
TmplGettext(Target, Token->nParameters, Token);
- }
- else if (Token->Flags == SV_CONDITIONAL) {
+ break;
+ case SV_CONDITIONAL:
return EvaluateConditional(Token, Context, 1, state);
- }
- else if (Token->Flags == SV_NEG_CONDITIONAL) {
+ break;
+ case SV_NEG_CONDITIONAL:
return EvaluateConditional(Token, Context, 0, state);
- }
- else if (GetHash(GlobalNS, Token->pName, Token->NameEnd, &vVar)) {
- HashHandler *Handler;
- Handler = (HashHandler*) vVar;
- if ((Token->nParameters < Handler->nMinArgs) ||
- (Token->nParameters > Handler->nMaxArgs)) {
- lprintf(1, "Handler [%s] doesn't work with %ld params",
- Token->pName,
- Token->nParameters);
+ break;
+ case SV_SUBTEMPL:
+ if (Token->nParameters == 1)
+ DoTemplate(Token->Params[0]->Start, Token->Params[0]->len, NULL, NULL);
+ break;
+ default:
+ if (GetHash(GlobalNS, Token->pName, Token->NameEnd, &vVar)) {
+ HashHandler *Handler;
+ Handler = (HashHandler*) vVar;
+ if ((Token->nParameters < Handler->nMinArgs) ||
+ (Token->nParameters > Handler->nMaxArgs)) {
+ lprintf(1, "Handler [%s] doesn't work with %ld params",
+ Token->pName,
+ Token->nParameters);
+ }
+ else {
+ Handler->HandlerFunc(Target,
+ Token->nParameters,
+ Token,
+ Context); /*TODO: subset of that */
+
+
+ }
}
else {
- Handler->HandlerFunc(Target,
- Token->nParameters,
- Token,
- Context); /*TODO: subset of that */
-
-
+ print_value_of(Target, Token->pName, Token->NameEnd);
}
}
- else {
- print_value_of(Target, Token->pName, Token->NameEnd);
- }
return 0;
}
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) {
+ lprintf(1, "DBG: ----- loading: [%s] ------ \n", ChrPtr(Tmpl->FileName));
+ 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;
}
+
+void PrintTemplate(void *vTemplate)
+{
+
+
+}
+
+
/**
* \brief Display a variable-substituted template
* \param templatename template file to load
if (!GetHash(StaticLocal, templatename, len, &vTmpl) &&
!GetHash(Static, templatename, len, &vTmpl)) {
printf ("didn't find %s\n", templatename);
+ //print_hash(Static);
return;
}
if (vTmpl == NULL)
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);
FlushStrBuf(SubBuf);
oddeven = ~ oddeven;
}
+ FreeStrBuf(&SubBuf);
DeleteHashPos(&it);
It->Destructor(List);
}
DoTemplate(HKEY("endbox"), Context, Target);
}
+void tmpl_do_tabbed(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context)
+{
+ StrBuf **TabNames;
+ int i, ntabs;
+
+ ntabs = Tokens->nParameters / 2;
+ TabNames = (StrBuf **) malloc(ntabs * sizeof(StrBuf*));
+
+ for (i = 0; i < ntabs; i++) {
+ TabNames[i] = NewStrBuf();
+ DoTemplate(Tokens->Params[i * 2]->Start,
+ Tokens->Params[0]->len,
+ Context,
+ TabNames[i]);
+ }
+
+ StrTabbedDialog(Target, ntabs, TabNames);
+ for (i = 0; i < ntabs; i++) {
+ StrBeginTab(Target, ntabs, i);
+
+ DoTemplate(Tokens->Params[i * 2 + 1]->Start,
+ Tokens->Params[i * 2 + 1]->len,
+ Context,
+ Target);
+ StrEndTab(Target, ntabs, i);
+ }
+}
+
void
InitModule_SUBST
(void)
{
- RegisterNamespace("SERV_PID", 0, 0, tmplput_serv_ip);
- RegisterNamespace("SERV_NODENAME", 0, 0, tmplput_serv_nodename);
- RegisterNamespace("SERV_HUMANNODE", 0, 0, tmplput_serv_humannode);
- RegisterNamespace("SERV_FQDN", 0, 0, tmplput_serv_fqdn);
- RegisterNamespace("SERV_SOFTWARE", 0, 0, tmmplput_serv_software);
- RegisterNamespace("SERV_REV_LEVEL", 0, 0, tmplput_serv_rev_level);
- RegisterNamespace("SERV_BBS_CITY", 0, 0, tmmplput_serv_bbs_city);
+ RegisterNamespace("SERV:PID", 0, 0, tmplput_serv_ip);
+ RegisterNamespace("SERV:NODENAME", 0, 0, tmplput_serv_nodename);
+ RegisterNamespace("SERV:HUMANNODE", 0, 0, tmplput_serv_humannode);
+ RegisterNamespace("SERV:FQDN", 0, 0, tmplput_serv_fqdn);
+ RegisterNamespace("SERV:SOFTWARE", 0, 0, tmmplput_serv_software);
+ RegisterNamespace("SERV:REV_LEVEL", 0, 0, tmplput_serv_rev_level);
+ RegisterNamespace("SERV:BBS_CITY", 0, 0, tmmplput_serv_bbs_city);
+/// RegisterNamespace("SERV:LDAP_SUPP", 0, 0, tmmplput_serv_ldap_enabled);
RegisterNamespace("CURRENT_USER", 0, 0, tmplput_current_user);
RegisterNamespace("CURRENT_ROOM", 0, 0, tmplput_current_room);
RegisterNamespace("ITERATE", 2, 4, tmpl_iterate_subtmpl);
RegisterNamespace("DOBOXED", 1, 2, tmpl_do_boxed);
+ RegisterNamespace("DOTABBED", 2, 100, tmpl_do_tabbed);
RegisterConditional(HKEY("COND:SUBST"), 3, ConditionalVar);
}