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, -1);
+ 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 */
Template->Tokens[(Template->nTokensUsed)++] = NewToken;
}
-TemplateParam *GetNextParamter(StrBuf *Buf, const char **pCh, const char *pe)
+TemplateParam *GetNextParameter(StrBuf *Buf, const char **pCh, const char *pe)
{
const char *pch = *pCh;
const char *pchs, *pche;
NewToken->NameEnd = pch - NewToken->pName;
pch ++;
while (pch < pTmplEnd - 1) {
- Param = GetNextParamter(Buf, &pch, pTmplEnd - 1);
+ Param = GetNextParameter(Buf, &pch, pTmplEnd - 1);
if (Param != NULL) {
NewToken->HaveParameters = 1;
if (NewToken->nParameters > MAXPARAM) {
lprintf(1, "Only %ld Tokens supported!\n", MAXPARAM);
+ free(Param);
return NULL;
}
NewToken->Params[NewToken->nParameters++] = Param;
return NewToken;
}
+void FreeToken(WCTemplateToken **Token)
+{
+ int i;
+ if ((*Token)->HaveParameters)
+ for (i = 0; i < (*Token)->nParameters; i++)
+ free((*Token)->Params[i]);
+ free(*Token);
+ *Token = NULL;
+}
+
+
+
void FreeWCTemplate(void *vFreeMe)
{
int i;
if (FreeMe->TokenSpace > 0) {
for (i = 0; i < FreeMe->nTokensUsed; i ++) {
- free(FreeMe->Tokens[i]);
+ FreeToken(&FreeMe->Tokens[i]);
}
free(FreeMe->Tokens);
}
+ FreeStrBuf(&FreeMe->Data);
free(FreeMe);
}
FlushStrBuf(SubBuf);
oddeven = ~ oddeven;
}
+ FreeStrBuf(&SubBuf);
DeleteHashPos(&it);
It->Destructor(List);
}