Open SCAP Library
|
00001 /* 00002 * Copyright 2010 Red Hat Inc., Durham, North Carolina. 00003 * All Rights Reserved. 00004 * 00005 * This library is free software; you can redistribute it and/or 00006 * modify it under the terms of the GNU Lesser General Public 00007 * License as published by the Free Software Foundation; either 00008 * version 2.1 of the License, or (at your option) any later version. 00009 * 00010 * This library is distributed in the hope that it will be useful, 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 * Lesser General Public License for more details. 00014 * 00015 * You should have received a copy of the GNU Lesser General Public 00016 * License along with this library; if not, write to the Free Software 00017 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00018 * 00019 * Authors: 00020 * Lukas Kuklinek <lkuklinek@redhat.com> 00021 */ 00022 00023 #ifndef XCCDF_HELPERS_H_ 00024 #define XCCDF_HELPERS_H_ 00025 00026 #include <assert.h> 00027 00028 #define MACRO_BLOCK(code) do { code } while(false) 00029 #define ASSERT_TYPE(item,t) assert((item)->type & t) 00030 #define ASSERT_BENCHMARK(item) ASSERT_TYPE(item, XCCDF_BENCHMARK) 00031 #define XBENCHMARK(item) ((struct xccdf_benchmark*)item) 00032 #define XPROFILE(item) ((struct xccdf_profile*)item) 00033 #define XGROUP(item) ((struct xccdf_group*)item) 00034 #define XRULE(item) ((struct xccdf_rule*)item) 00035 #define XITEM(item) ((struct xccdf_item*)item) 00036 #define XVALUE(item) ((struct xccdf_value*)item) 00037 #define XRESULT(item) ((struct xccdf_result*)item) 00038 00039 #define XCCDF_STATUS_CURRENT(TYPE) \ 00040 xccdf_status_type_t xccdf_##TYPE##_get_status_current(const struct xccdf_##TYPE* item) {\ 00041 return xccdf_item_get_current_status(XITEM(item)); } 00042 00043 #define XCCDF_TEXT_IGETTER(SNAME,MNAME,MEXP) \ 00044 struct oscap_text_iterator* xccdf_##SNAME##_get_##MNAME(const struct xccdf_##SNAME* item) \ 00045 { return oscap_iterator_new(XITEM(item)->MEXP); } 00046 #define XCCDF_GENERIC_GETTER(RTYPE,TNAME,MEMBER) \ 00047 RTYPE xccdf_##TNAME##_get_##MEMBER(const struct xccdf_##TNAME* item) { return (RTYPE)((item)->MEMBER); } 00048 #define XCCDF_GENERIC_IGETTER(ITYPE,TNAME,MNAME) \ 00049 struct xccdf_##ITYPE##_iterator* xccdf_##TNAME##_get_##MNAME(const struct xccdf_##TNAME* item) \ 00050 { return oscap_iterator_new(item->MNAME); } 00051 #define XCCDF_ABSTRACT_GETTER(RTYPE,TNAME,MNAME,MEMBER) \ 00052 RTYPE xccdf_##TNAME##_get_##MNAME(const struct xccdf_##TNAME* item) { return (RTYPE)(XITEM(item)->MEMBER); } 00053 #define XCCDF_ITERATOR_GETTER(ITYPE,TNAME,MNAME,MEMBER) \ 00054 struct xccdf_##ITYPE##_iterator* xccdf_##TNAME##_get_##MNAME(const struct xccdf_##TNAME* item) \ 00055 { return oscap_iterator_new(XITEM(item)->MEMBER); } 00056 #define XCCDF_SITERATOR_GETTER(TNAME,MNAME,MEMBER) \ 00057 struct oscap_string_iterator* xccdf_##TNAME##_get_##MNAME(const struct xccdf_##TNAME* item) \ 00058 { return oscap_iterator_new(XITEM(item)->MEMBER); } 00059 #define XCCDF_TITERATOR_GETTER(TNAME,MNAME,MEMBER) \ 00060 struct oscap_text_iterator* xccdf_##TNAME##_get_##MNAME(const struct xccdf_##TNAME* item) \ 00061 { return oscap_iterator_new(XITEM(item)->MEMBER); } 00062 #define XCCDF_HTABLE_GETTER(RTYPE,TNAME,MNAME,MEMBER) \ 00063 RTYPE xccdf_##TNAME##_get_##MNAME(const struct xccdf_##TNAME* item, const char* key) \ 00064 { return (RTYPE)oscap_htable_get(XITEM(item)->MEMBER, key); } 00065 #define XCCDF_SIGETTER(TNAME,MNAME) \ 00066 struct oscap_string_iterator* xccdf_##TNAME##_get_##MNAME(const struct xccdf_##TNAME* item) \ 00067 { return oscap_iterator_new(XITEM(item)->sub.TNAME.MNAME); } 00068 00069 #define XCCDF_BENCHMARK_GETTER_A(RTYPE,MNAME,MEMBER) XCCDF_ABSTRACT_GETTER(RTYPE,benchmark,MNAME,MEMBER) 00070 #define XCCDF_BENCHMARK_GETTER_I(RTYPE,MNAME) XCCDF_BENCHMARK_GETTER_A(RTYPE,MNAME,item.MNAME) 00071 #define XCCDF_BENCHMARK_IGETTER_I(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,benchmark,MNAME,item.MNAME) 00072 #define XCCDF_BENCHMARK_GETTER(RTYPE,MNAME) XCCDF_BENCHMARK_GETTER_A(RTYPE,MNAME,sub.benchmark.MNAME) 00073 #define XCCDF_BENCHMARK_IGETTER(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,benchmark,MNAME,sub.benchmark.MNAME) 00074 00075 #define XCCDF_PROFILE_GETTER_A(RTYPE,MNAME,MEMBER) XCCDF_ABSTRACT_GETTER(RTYPE,profile,MNAME,MEMBER) 00076 #define XCCDF_PROFILE_GETTER_I(RTYPE,MNAME) XCCDF_PROFILE_GETTER_A(RTYPE,MNAME,item.MNAME) 00077 #define XCCDF_PROFILE_IGETTER_I(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,profile,MNAME,item.MNAME) 00078 #define XCCDF_PROFILE_GETTER(RTYPE,MNAME) XCCDF_PROFILE_GETTER_A(RTYPE,MNAME,sub.profile.MNAME) 00079 #define XCCDF_PROFILE_IGETTER(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,profile,MNAME,sub.profile.MNAME) 00080 00081 #define XCCDF_RULE_GETTER_A(RTYPE,MNAME,MEMBER) XCCDF_ABSTRACT_GETTER(RTYPE,rule,MNAME,MEMBER) 00082 #define XCCDF_RULE_GETTER_I(RTYPE,MNAME) XCCDF_RULE_GETTER_A(RTYPE,MNAME,item.MNAME) 00083 #define XCCDF_RULE_IGETTER_I(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,rule,MNAME,item.MNAME) 00084 #define XCCDF_RULE_GETTER(RTYPE,MNAME) XCCDF_RULE_GETTER_A(RTYPE,MNAME,sub.rule.MNAME) 00085 #define XCCDF_RULE_IGETTER(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,rule,MNAME,sub.rule.MNAME) 00086 00087 #define XCCDF_GROUP_GETTER_A(RTYPE,MNAME,MEMBER) XCCDF_ABSTRACT_GETTER(RTYPE,group,MNAME,MEMBER) 00088 #define XCCDF_GROUP_GETTER_I(RTYPE,MNAME) XCCDF_GROUP_GETTER_A(RTYPE,MNAME,item.MNAME) 00089 #define XCCDF_GROUP_IGETTER_I(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,group,MNAME,item.MNAME) 00090 #define XCCDF_GROUP_GETTER(RTYPE,MNAME) XCCDF_GROUP_GETTER_A(RTYPE,MNAME,sub.group.MNAME) 00091 #define XCCDF_GROUP_IGETTER(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,group,MNAME,sub.group.MNAME) 00092 00093 #define XCCDF_VALUE_GETTER_A(RTYPE,MNAME,MEMBER) XCCDF_ABSTRACT_GETTER(RTYPE,value,MNAME,MEMBER) 00094 #define XCCDF_VALUE_GETTER_I(RTYPE,MNAME) XCCDF_VALUE_GETTER_A(RTYPE,MNAME,item.MNAME) 00095 #define XCCDF_VALUE_IGETTER_I(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,value,MNAME,item.MNAME) 00096 #define XCCDF_VALUE_GETTER(RTYPE,MNAME) XCCDF_VALUE_GETTER_A(RTYPE,MNAME,sub.value.MNAME) 00097 #define XCCDF_VALUE_IGETTER(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,value,MNAME,sub.value.MNAME) 00098 00099 #define XCCDF_RESULT_GETTER_A(RTYPE,MNAME,MEMBER) XCCDF_ABSTRACT_GETTER(RTYPE,result,MNAME,MEMBER) 00100 #define XCCDF_RESULT_GETTER_I(RTYPE,MNAME) XCCDF_RESULT_GETTER_A(RTYPE,MNAME,item.MNAME) 00101 #define XCCDF_RESULT_IGETTER_I(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,result,MNAME,item.MNAME) 00102 #define XCCDF_RESULT_GETTER(RTYPE,MNAME) XCCDF_RESULT_GETTER_A(RTYPE,MNAME,sub.result.MNAME) 00103 #define XCCDF_RESULT_IGETTER(ITYPE,MNAME) XCCDF_ITERATOR_GETTER(ITYPE,result,MNAME,sub.result.MNAME) 00104 00105 #define XCCDF_SETTER_GENERIC(STYPE,MNAME,MTYPE,FREE,DUP) \ 00106 bool xccdf_##STYPE##_set_##MNAME(struct xccdf_##STYPE* item, MTYPE newval) \ 00107 { FREE(XITEM(item)->sub.STYPE.MNAME); XITEM(item)->sub.STYPE.MNAME = DUP(newval); return true; } 00108 #define XCCDF_SETTER_SIMPLE(STYPE,MNAME,MTYPE) \ 00109 bool xccdf_##STYPE##_set_##MNAME(struct xccdf_##STYPE* item, MTYPE newval) \ 00110 { XITEM(item)->sub.STYPE.MNAME = (newval); return true; } 00111 #define XCCDF_SETTER_STRING(STYPE,MNAME) \ 00112 XCCDF_SETTER_GENERIC(STYPE, MNAME, const char*, oscap_free, oscap_strdup) 00113 #define XCCDF_ACCESSOR_STRING(STYPE,MNAME) \ 00114 XCCDF_SETTER_STRING(STYPE, MNAME) XCCDF_ABSTRACT_GETTER(const char*, STYPE, MNAME, sub.STYPE.MNAME) 00115 #define XCCDF_ACCESSOR_SIMPLE(STYPE,MTYPE,MNAME) \ 00116 XCCDF_SETTER_SIMPLE(STYPE,MNAME,MTYPE) XCCDF_ABSTRACT_GETTER(MTYPE,STYPE,MNAME,sub.STYPE.MNAME) 00117 #define XCCDF_IGETTER(TNAME,ITYPE,MNAME) \ 00118 XCCDF_ITERATOR_GETTER(ITYPE, TNAME, MNAME, sub.TNAME.MNAME) 00119 #define XCCDF_ADDER(STYPE,MNAME,SINGNAME,MTYPE,DUP) \ 00120 bool xccdf_##STYPE##_add_##SINGNAME(struct xccdf_##STYPE* item, MTYPE newval) \ 00121 { return oscap_list_add(XITEM(item)->sub.STYPE.MNAME, DUP(newval)); } 00122 #define XCCDF_LISTMANIP(TNAME,ITYPE,MNAME) \ 00123 XCCDF_IGETTER(TNAME,ITYPE,MNAME) XCCDF_ADDER(TNAME,MNAME,ITYPE,struct xccdf_##ITYPE*,) 00124 #define XCCDF_LISTMANIP_STRING(TNAME,SNAME,MNAME) \ 00125 struct oscap_string_iterator* xccdf_##TNAME##_get_##MNAME(const struct xccdf_##TNAME* item) \ 00126 { return oscap_iterator_new(XITEM(item)->sub.TNAME.MNAME); } \ 00127 XCCDF_ADDER(TNAME,MNAME,SNAME,const char *,oscap_strdup) 00128 #define XCCDF_LISTMANIP_TEXT(TNAME,SNAME,MNAME) \ 00129 struct oscap_text_iterator* xccdf_##TNAME##_get_##MNAME(const struct xccdf_##TNAME* item) \ 00130 { return oscap_iterator_new(XITEM(item)->sub.TNAME.MNAME); } \ 00131 XCCDF_ADDER(TNAME,MNAME,SNAME,struct oscap_text *,) 00132 00133 #define XCCDF_ITEM_GETTER(RTYPE,MNAME) \ 00134 XCCDF_ABSTRACT_GETTER(RTYPE,item,MNAME,item.MNAME) \ 00135 XCCDF_BENCHMARK_GETTER_A(RTYPE,MNAME,item.MNAME) \ 00136 XCCDF_PROFILE_GETTER_A(RTYPE,MNAME,item.MNAME) \ 00137 XCCDF_RULE_GETTER_A(RTYPE,MNAME,item.MNAME) \ 00138 XCCDF_VALUE_GETTER_A(RTYPE,MNAME,item.MNAME) \ 00139 XCCDF_GROUP_GETTER_A(RTYPE,MNAME,item.MNAME) \ 00140 XCCDF_RESULT_GETTER_A(RTYPE,MNAME,item.MNAME) 00141 #define XCCDF_ITEM_IGETTER(RTYPE,MNAME) \ 00142 XCCDF_ITERATOR_GETTER(RTYPE,item,MNAME,item.MNAME) \ 00143 XCCDF_ITERATOR_GETTER(RTYPE,benchmark,MNAME,item.MNAME) \ 00144 XCCDF_ITERATOR_GETTER(RTYPE,profile,MNAME,item.MNAME) \ 00145 XCCDF_ITERATOR_GETTER(RTYPE,rule,MNAME,item.MNAME) \ 00146 XCCDF_ITERATOR_GETTER(RTYPE,value,MNAME,item.MNAME) \ 00147 XCCDF_ITERATOR_GETTER(RTYPE,group,MNAME,item.MNAME) \ 00148 XCCDF_ITERATOR_GETTER(RTYPE,result,MNAME,item.MNAME) 00149 #define XCCDF_ITEM_SIGETTER(MNAME) \ 00150 XCCDF_SITERATOR_GETTER(item,MNAME,item.MNAME) \ 00151 XCCDF_SITERATOR_GETTER(benchmark,MNAME,item.MNAME) \ 00152 XCCDF_SITERATOR_GETTER(profile,MNAME,item.MNAME) \ 00153 XCCDF_SITERATOR_GETTER(rule,MNAME,item.MNAME) \ 00154 XCCDF_SITERATOR_GETTER(value,MNAME,item.MNAME) \ 00155 XCCDF_SITERATOR_GETTER(group,MNAME,item.MNAME) \ 00156 XCCDF_SITERATOR_GETTER(result,MNAME,item.MNAME) 00157 #define XCCDF_ITEM_TIGETTER(MNAME) \ 00158 XCCDF_TITERATOR_GETTER(item,MNAME,item.MNAME) \ 00159 XCCDF_TITERATOR_GETTER(benchmark,MNAME,item.MNAME) \ 00160 XCCDF_TITERATOR_GETTER(profile,MNAME,item.MNAME) \ 00161 XCCDF_TITERATOR_GETTER(rule,MNAME,item.MNAME) \ 00162 XCCDF_TITERATOR_GETTER(value,MNAME,item.MNAME) \ 00163 XCCDF_TITERATOR_GETTER(group,MNAME,item.MNAME) \ 00164 XCCDF_TITERATOR_GETTER(result,MNAME,item.MNAME) 00165 #define XCCDF_FLAG_SETTER(SNAME, FNAME) \ 00166 bool xccdf_##SNAME##_set_##FNAME(struct xccdf_##SNAME *item, bool newval) \ 00167 { assert(item != NULL); XITEM(item)->item.flags.FNAME = newval; return true; } 00168 #define XCCDF_FLAG_GETTER(MNAME) \ 00169 XCCDF_ABSTRACT_GETTER(bool,item,MNAME,item.flags.MNAME) XCCDF_FLAG_SETTER(item,MNAME) \ 00170 XCCDF_BENCHMARK_GETTER_A(bool,MNAME,item.flags.MNAME) XCCDF_FLAG_SETTER(benchmark,MNAME) \ 00171 XCCDF_PROFILE_GETTER_A(bool,MNAME,item.flags.MNAME) XCCDF_FLAG_SETTER(profile,MNAME) \ 00172 XCCDF_RULE_GETTER_A(bool,MNAME,item.flags.MNAME) XCCDF_FLAG_SETTER(rule,MNAME) \ 00173 XCCDF_GROUP_GETTER_A(bool,MNAME,item.flags.MNAME) XCCDF_FLAG_SETTER(group,MNAME) \ 00174 XCCDF_VALUE_GETTER_A(bool,MNAME,item.flags.MNAME) XCCDF_FLAG_SETTER(value,MNAME) \ 00175 XCCDF_RESULT_GETTER_A(bool,MNAME,item.flags.MNAME) XCCDF_FLAG_SETTER(result,MNAME) 00176 00177 #define XCCDF_ITEM_SETTER_ONE(STYPE,MNAME,MTYPE,DUP) \ 00178 bool xccdf_##STYPE##_set_##MNAME(struct xccdf_##STYPE* item, MTYPE newval) \ 00179 { XITEM(item)->item.MNAME = DUP(newval); return true; } 00180 #define XCCDF_ITEM_SETTER_ONEF(STYPE,MNAME,MTYPE,FREE,DUP) \ 00181 bool xccdf_##STYPE##_set_##MNAME(struct xccdf_##STYPE* item, MTYPE newval) \ 00182 { FREE(XITEM(item)->item.MNAME); XITEM(item)->item.MNAME = DUP(newval); return true; } 00183 #define XCCDF_ITEM_SETTER_ONES(STYPE,MNAME) XCCDF_ITEM_SETTER_ONEF(STYPE,MNAME,const char*,oscap_free,oscap_strdup) 00184 #define XCCDF_ITEM_SETTER_SIMPLE(MTYPE,MNAME) XCCDF_ITEM_SETTER_ONE(item,MNAME,MTYPE,) \ 00185 XCCDF_ITEM_SETTER_ONE(benchmark,MNAME,MTYPE,) XCCDF_ITEM_SETTER_ONE(profile,MNAME,MTYPE,) \ 00186 XCCDF_ITEM_SETTER_ONE(rule,MNAME,MTYPE,) XCCDF_ITEM_SETTER_ONE(value,MNAME,MTYPE,) \ 00187 XCCDF_ITEM_SETTER_ONE(group,MNAME,MTYPE,) XCCDF_ITEM_SETTER_ONE(result,MNAME,MTYPE,) 00188 #define XCCDF_ITEM_SETTER_STRING(MNAME) XCCDF_ITEM_SETTER_ONES(item,MNAME) \ 00189 XCCDF_ITEM_SETTER_ONES(benchmark,MNAME) XCCDF_ITEM_SETTER_ONES(profile,MNAME) \ 00190 XCCDF_ITEM_SETTER_ONES(rule,MNAME) XCCDF_ITEM_SETTER_ONES(value,MNAME) \ 00191 XCCDF_ITEM_SETTER_ONES(group,MNAME) XCCDF_ITEM_SETTER_ONES(result,MNAME) 00192 00193 #define XCCDF_ITEM_ADDER_ONE(STYPE,MNAME,SINGNAME,MTYPE,DUP) \ 00194 bool xccdf_##STYPE##_add_##SINGNAME(struct xccdf_##STYPE* item, MTYPE newval) \ 00195 { return oscap_list_add(XITEM(item)->item.MNAME, DUP(newval)); } 00196 #define XCCDF_ITEM_ADDER_ONES(STYPE,MNAME,SINGNAME) XCCDF_ITEM_ADDER_ONE(STYPE,MNAME,SINGNAME,const char*,oscap_strdup) 00197 #define XCCDF_ITEM_ADDER_STRING(MNAMES,MNAME) XCCDF_ITEM_ADDER_ONES(item,MNAME,MNAMES) \ 00198 XCCDF_ITEM_ADDER_ONES(benchmark,MNAME,MNAMES) XCCDF_ITEM_ADDER_ONES(profile,MNAME,MNAMES) \ 00199 XCCDF_ITEM_ADDER_ONES(group,MNAME,MNAMES) XCCDF_ITEM_ADDER_ONES(rule,MNAME,MNAMES) \ 00200 XCCDF_ITEM_ADDER_ONES(value,MNAME,MNAMES) XCCDF_ITEM_ADDER_ONES(result,MNAME,MNAMES) 00201 #define XCCDF_ITEM_ADDER(MTYPE,MNAMES,MNAME) XCCDF_ITEM_ADDER_ONE(item,MNAME,MNAMES,MTYPE,) \ 00202 XCCDF_ITEM_ADDER_ONE(benchmark,MNAME,MNAMES,MTYPE,) XCCDF_ITEM_ADDER_ONE(profile,MNAME,MNAMES,MTYPE,) \ 00203 XCCDF_ITEM_ADDER_ONE(group,MNAME,MNAMES,MTYPE,) XCCDF_ITEM_ADDER_ONE(rule,MNAME,MNAMES,MTYPE,) \ 00204 XCCDF_ITEM_ADDER_ONE(value,MNAME,MNAMES,MTYPE,) XCCDF_ITEM_ADDER_ONE(result,MNAME,MNAMES,MTYPE,) 00205 00206 #define XCCDF_ITEM_ADDER_REG(STYPE, MTYPE, MNAME) \ 00207 bool xccdf_##STYPE##_add_##MTYPE(struct xccdf_##STYPE *STYPE, struct xccdf_##MTYPE *item) \ 00208 { return xccdf_add_item(XITEM(STYPE)->sub.STYPE.MNAME, XITEM(STYPE), XITEM(item), #MTYPE "-"); } 00209 00210 #define XITERATOR(x) ((struct oscap_iterator*)(x)) 00211 #define XCCDF_ITERATOR(n) struct xccdf_##n##_iterator* 00212 #define XCCDF_ITERATOR_FWD(n) struct xccdf_##n##_iterator; 00213 #define XCCDF_ITERATOR_HAS_MORE(n) bool xccdf_##n##_iterator_has_more(XCCDF_ITERATOR(n) it) { return oscap_iterator_has_more(XITERATOR(it)); } 00214 #define XCCDF_ITERATOR_NEXT(t,n) t xccdf_##n##_iterator_next(XCCDF_ITERATOR(n) it) { return oscap_iterator_next(XITERATOR(it)); } 00215 #define XCCDF_ITERATOR_FREE(n) void xccdf_##n##_iterator_free(XCCDF_ITERATOR(n) it) { oscap_iterator_free(XITERATOR(it)); } 00216 #define XCCDF_ITERATOR_RESET(n) void xccdf_##n##_iterator_reset(XCCDF_ITERATOR(n) it) { oscap_iterator_reset(XITERATOR(it)); } 00217 #define XCCDF_ITERATOR_GEN_T(t,n) XCCDF_ITERATOR_FWD(n) XCCDF_ITERATOR_HAS_MORE(n) XCCDF_ITERATOR_RESET(n) XCCDF_ITERATOR_NEXT(t,n) OSCAP_ITERATOR_REMOVE_F(xccdf_##n) XCCDF_ITERATOR_FREE(n) 00218 #define XCCDF_ITERATOR_GEN_S(n) XCCDF_ITERATOR_GEN_T(struct xccdf_##n*,n) 00219 #define XCCDF_ITERATOR_GEN_TEXT(n) XCCDF_ITERATOR_GEN_T(struct oscap_text *,n) 00220 00221 #define XCCDF_FREE_GEN(TYPE) void xccdf_##TYPE##_free(struct xccdf_##TYPE* item) { xccdf_##TYPE##_free_impl((struct xccdf_item *)item); } 00222 00223 #endif