X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gom%2Ffunc_template.h;h=c25fb11f52a37a10bcba235ca264da7184c4fede;hb=a32bee3a7c3792af75f2772dd6501fb9429ca749;hp=24e1ea69a3711b71816d30e6b16ab2e2f950eda1;hpb=869f88fb45d803d918ccf2602ddca1d0fc425de8;p=gedcom-parse.git diff --git a/gom/func_template.h b/gom/func_template.h index 24e1ea6..c25fb11 100644 --- a/gom/func_template.h +++ b/gom/func_template.h @@ -29,11 +29,11 @@ #define DESTROYFUNC(STRUCTTYPE) destroy_ ## STRUCTTYPE ## _record #define GETXREFFUNC(STRUCTTYPE) gom_get_ ## STRUCTTYPE ## _by_xref #define CLEANFUNC(STRUCTTYPE) STRUCTTYPE ## _cleanup -#define ADDFUNC(STRUCTTYPE) gom_add_ ## STRUCTTYPE -#define SUB_ADDFUNC(STRUCTTYPE) gom_add_ ## STRUCTTYPE +#define ADDFUNC(STRUCTTYPE) gom_new_ ## STRUCTTYPE +#define SUB_SETFUNC(STRUCTTYPE) gom_set_new_ ## STRUCTTYPE +#define UNREFALLFUNC(STRUCTTYPE) STRUCTTYPE ## _unref_all #define DELETEFUNC(STRUCTTYPE) gom_delete_ ## STRUCTTYPE #define SUB_DELETEFUNC(STRUCTTYPE) gom_delete_ ## STRUCTTYPE -#define MAKELINKFUNC(STRUCTTYPE) gom_make_ ## STRUCTTYPE ## _link #define ADDFUNC2(T1,T2) T1 ## _add_ ## T2 #define ADDFUNC2_TOVAR(T1,T2,F) T1 ## _add_ ## T2 ## _to_ ## F #define ADDFUNC2_NOLIST(T1,T2) ADDFUNC2(T1,T2) @@ -49,6 +49,9 @@ #define DECLARE_CLEANFUNC(STRUCTTYPE) \ void CLEANFUNC(STRUCTTYPE)(struct STRUCTTYPE* obj) +#define DECLARE_UNREFALLFUNC(STRUCTTYPE) \ + void UNREFALLFUNC(STRUCTTYPE)(struct STRUCTTYPE* obj) + #define DECLARE_ADDFUNC2(STRUCTTYPE,T2) \ void ADDFUNC2(STRUCTTYPE,T2)(Gom_ctxt ctxt, struct T2* obj) @@ -75,9 +78,9 @@ } \ else { \ VAL->next = NULL; \ - FIRSTVAL->previous->next = VAL; \ - VAL->previous = FIRSTVAL->previous; \ - FIRSTVAL->previous = VAL; \ + (FIRSTVAL)->previous->next = VAL; \ + VAL->previous = (FIRSTVAL)->previous; \ + (FIRSTVAL)->previous = VAL; \ } \ } @@ -90,6 +93,8 @@ VAL->previous->next = VAL->next; \ if (VAL->next) \ VAL->next->previous = VAL->previous; \ + else if (FIRSTVAL) \ + (FIRSTVAL)->previous = VAL->previous; \ } #define MAKE_CHAIN_ELT(STRUCTTYPE, FIRSTVAL, VAL) \ @@ -108,6 +113,7 @@ if (FIRSTVAL) { \ struct STRUCTTYPE *runner, *next; \ runner = FIRSTVAL; \ + FIRSTVAL = NULL; \ while (runner) { \ next = runner->next; \ CLEANFUNC(STRUCTTYPE)(runner); \ @@ -143,12 +149,12 @@ } #define DEFINE_DESTROYFUNC(STRUCTTYPE,FIRSTVAL) \ - void CLEANFUNC(STRUCTTYPE)(struct STRUCTTYPE* obj); \ + DECLARE_CLEANFUNC(STRUCTTYPE); \ void DESTROYFUNC(STRUCTTYPE)(struct STRUCTTYPE* obj) { \ if (obj) { \ CLEANFUNC(STRUCTTYPE)(obj); \ UNLINK_CHAIN_ELT(STRUCTTYPE, FIRSTVAL, obj); \ - free(obj); \ + SAFE_FREE(obj); \ } \ } @@ -182,8 +188,8 @@ return obj; \ } -#define DEFINE_SUB_ADDFUNC(STRUCTTYPE) \ - struct STRUCTTYPE *SUB_ADDFUNC(STRUCTTYPE)(struct STRUCTTYPE** addto) \ +#define DEFINE_SUB_SETFUNC(STRUCTTYPE) \ + struct STRUCTTYPE *SUB_SETFUNC(STRUCTTYPE)(struct STRUCTTYPE** addto) \ { \ struct STRUCTTYPE *obj = NULL; \ if (addto && ! *addto) { \ @@ -194,13 +200,16 @@ } #define DEFINE_DELETEFUNC(STRUCTTYPE) \ + DECLARE_UNREFALLFUNC(STRUCTTYPE); \ int DELETEFUNC(STRUCTTYPE)(struct STRUCTTYPE* obj) \ { \ int result = 1; \ if (obj) { \ result = gedcom_delete_xref(obj->xrefstr); \ - if (result == 0) \ + if (result == 0) { \ + UNREFALLFUNC(STRUCTTYPE)(obj); \ DESTROYFUNC(STRUCTTYPE)(obj); \ + } \ } \ return result; \ } @@ -210,24 +219,14 @@ { \ int result = 1; \ if (obj && *obj) { \ + UNREFALLFUNC(STRUCTTYPE)(*obj); \ CLEANFUNC(STRUCTTYPE)(*obj); \ - free(*obj); \ - *obj = NULL; \ + SAFE_FREE(*obj); \ result = 0; \ } \ return result; \ } -#define DEFINE_MAKELINKFUNC(STRUCTTYPE,XREF_TYPE) \ - struct xref_value* MAKELINKFUNC(STRUCTTYPE)(struct STRUCTTYPE* obj) \ - { \ - struct xref_value* xr = NULL; \ - if (obj && obj->xrefstr) { \ - xr = gedcom_get_by_xref(obj->xrefstr); \ - } \ - return xr; \ - } - #define DEFINE_ADDFUNC2(STRUCTTYPE,T2,FIELD) \ void ADDFUNC2(STRUCTTYPE,T2)(Gom_ctxt ctxt, struct T2* addobj) \ { \