* cleaneup allocation
authorWilfried Göesgens <willi@citadel.org>
Sun, 31 Aug 2008 20:59:38 +0000 (20:59 +0000)
committerWilfried Göesgens <willi@citadel.org>
Sun, 31 Aug 2008 20:59:38 +0000 (20:59 +0000)
webcit/preferences.c
webcit/subst.c

index c48916f31e92459c6478e02f42db8974ffa9d033..49f430b733583ab13353550a07328adc04fb8d56 100644 (file)
@@ -659,6 +659,7 @@ void set_preferences(void)
        encBuf = NewStrBuf();
        StrBufEUid_escapize(encBuf, buf);
        set_preference("signature", encBuf, 1);
+       FreeStrBuf(&buf);
 
        display_main_menu();
 }
index a71896f9297d831a2e40ef08ae1c30f89b098369..18360c270ca8e7e0b4f75fe924bf398af135ade0 100644 (file)
@@ -107,36 +107,55 @@ void clear_local_substs(void) {
        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;
        }
 }
@@ -147,7 +166,7 @@ void FlushPayload(wcsubst *ptr, int reusestrbuf)
 void deletevar(void *data)
 {
        wcsubst *ptr = (wcsubst*)data;
-       FlushPayload(ptr, 0);
+       FlushPayload(ptr, 0, ptr->wcs_type);
        free(ptr);      
 }
 
@@ -203,7 +222,7 @@ void SVPRINTF(char *keyname, int keytype, const char *format,...)
        /*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 */
@@ -238,7 +257,7 @@ void svprintf(char *keyname, size_t keylen, int keytype, const char *format,...)
        /*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 */
@@ -273,14 +292,14 @@ void SVPut(char *keyname, size_t keylen, int keytype, char *Data)
        /*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);
 }
 
 /**
@@ -304,7 +323,7 @@ void SVPutLong(char *keyname, size_t keylen, long Data)
        /*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 */
@@ -332,7 +351,7 @@ void SVCallback(char *keyname, size_t keylen, var_callback_fptr fcn_ptr)
        /*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 */
@@ -362,7 +381,7 @@ void SVPUTBuf(const char *keyname, int keylen, StrBuf *Buf, int ref)
        /*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 */
@@ -1006,6 +1025,7 @@ void tmpl_iterate_subtmpl(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, vo
                FlushStrBuf(SubBuf);
                oddeven = ~ oddeven;
        }
+       FreeStrBuf(&SubBuf);
        DeleteHashPos(&it);
        It->Destructor(List);
 }