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;
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) {
+ 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);
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("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);
}