00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00028 #ifndef OSCAP_UTIL_H_
00029 #define OSCAP_UTIL_H_
00030
00031 #include <stdbool.h>
00032 #include "public/alloc.h"
00033
00034 struct oscap_import_source;
00035 struct oscap_export_target;
00036
00037
00038
00039
00040
00041 #define OSCAP_HIDDEN_START _Pragma("GCC visibility push(hidden)")
00042
00043
00044
00045
00046
00047 #define OSCAP_HIDDEN_END _Pragma("GCC visibility pop")
00048
00052 typedef void(*oscap_destruct_func)(void*);
00053
00057 typedef void(*oscap_consumer_func)(void*, void*);
00058
00069 #define OSCAP_GENERIC_GETTER_CONV(RTYPE,CONV,SNAME,MNAME,MEXP) \
00070 RTYPE SNAME##_get_##MNAME(const struct SNAME* item) { return (CONV(item->MEXP)); }
00071
00080 #define OSCAP_GENERIC_GETTER(RTYPE,SNAME,MNAME,MEXP) \
00081 OSCAP_GENERIC_GETTER_CONV(RTYPE,,SNAME,MNAME,MEXP)
00082
00091 #define OSCAP_GENERIC_GETTER_FORCE(RTYPE,SNAME,MNAME,MEXP) \
00092 OSCAP_GENERIC_GETTER_CONV(RTYPE,(RTYPE),SNAME,MNAME,MEXP)
00093
00103 #define OSCAP_GETTER_FORCE(RTYPE,SNAME,MNAME) \
00104 OSCAP_GENERIC_GETTER_FORCE(RTYPE,SNAME,MNAME,MNAME)
00105
00115 #define OSCAP_GETTER(RTYPE,SNAME,MNAME) \
00116 OSCAP_GENERIC_GETTER(RTYPE,SNAME,MNAME,MNAME)
00117
00118
00119
00120 #define ITERATOR_CAST(x) ((struct oscap_iterator*)(x))
00121 #define OSCAP_ITERATOR(n) struct n##_iterator*
00122 #define OSCAP_ITERATOR_FWD(n) struct n##_iterator;
00123 #define OSCAP_ITERATOR_HAS_MORE(n) bool n##_iterator_has_more(OSCAP_ITERATOR(n) it) { return oscap_iterator_has_more(ITERATOR_CAST(it)); }
00124 #define OSCAP_ITERATOR_NEXT(t,n) t n##_iterator_next(OSCAP_ITERATOR(n) it) { return oscap_iterator_next(ITERATOR_CAST(it)); }
00125 #define OSCAP_ITERATOR_FREE(n) void n##_iterator_free(OSCAP_ITERATOR(n) it) { oscap_iterator_free(ITERATOR_CAST(it)); }
00126 #define OSCAP_ITERATOR_GEN_T(t,n) OSCAP_ITERATOR_FWD(n) OSCAP_ITERATOR_HAS_MORE(n) OSCAP_ITERATOR_NEXT(t,n) OSCAP_ITERATOR_FREE(n)
00127 #define OSCAP_ITERATOR_GEN(n) OSCAP_ITERATOR_GEN_T(struct n*,n)
00128
00138 #define OSCAP_IGETTER_CONV(ITYPE,SNAME,MNAME,CONV) \
00139 struct ITYPE##_iterator* SNAME##_get_##MNAME(const struct SNAME* item) \
00140 { return oscap_iterator_new((CONV(item))->MNAME); }
00141
00142
00151 #define OSCAP_IGETTER(ITYPE,SNAME,MNAME) OSCAP_IGETTER_CONV(ITYPE,SNAME,MNAME,)
00152
00158 #define OSCAP_IGETTER_GEN(ITYPE,SNAME,MNAME) OSCAP_IGETTER(ITYPE,SNAME,MNAME) OSCAP_ITERATOR_GEN(ITYPE)
00159
00169 #define OSCAP_HGETTER_EXP(RTYPE,SNAME,MNAME,MEXP) \
00170 RTYPE SNAME##_get_##MNAME(const struct SNAME* item, const char* key) \
00171 { return oscap_htable_get(item->MEXP, key); }
00172
00181 #define OSCAP_HGETTER(RTYPE,SNAME,MNAME) OSCAP_HGETTER_EXP(RTYPE,SNAME,MNAME,MNAME)
00182
00183
00192 #define OSCAP_HGETTER_STRUCT(RTYPE,SNAME,MNAME) OSCAP_HGETTER_EXP(struct RTYPE*,SNAME,MNAME,MNAME)
00193
00194
00195
00196 #define OSCAP_SETTER_HEADER(SNAME, MTYPE, MNAME) bool SNAME##_set_##MNAME(struct SNAME *obj, MTYPE item)
00197
00209 #define OSCAP_SETTER_GENERIC_CHECK(SNAME, MTYPE, MNAME, CHECK, DELETER, ASSIGNER) \
00210 OSCAP_SETTER_HEADER(SNAME, MTYPE, MNAME) \
00211 { if (!(CHECK)) return false; DELETER(obj->MNAME); obj->MNAME = ASSIGNER(item); return true; }
00212
00217 #define OSCAP_SETTER_GENERIC(SNAME, MTYPE, MNAME, DELETER, ASSIGNER) \
00218 OSCAP_SETTER_HEADER(SNAME, MTYPE, MNAME) \
00219 { DELETER(obj->MNAME); obj->MNAME = ASSIGNER(item); return true; }
00220
00225 #define OSCAP_SETTER_GENERIC_NODELETE(SNAME, MTYPE, MNAME, ASSIGNER) \
00226 OSCAP_SETTER_HEADER(SNAME, MTYPE, MNAME) \
00227 { obj->MNAME = ASSIGNER(item); return true; }
00228
00233 #define OSCAP_SETTER_SIMPLE(SNAME, MTYPE, MNAME) \
00234 OSCAP_SETTER_GENERIC_NODELETE(SNAME, MTYPE, MNAME, )
00235
00241 #define OSCAP_SETTER_STRING(SNAME, MNAME) \
00242 OSCAP_SETTER_GENERIC(SNAME, const char *, MNAME, free, oscap_strdup)
00243
00247 #define OSCAP_ACCESSOR_STRING(SNAME, MNAME) \
00248 OSCAP_SETTER_STRING(SNAME, MNAME) OSCAP_GETTER(const char*, SNAME, MNAME)
00249
00253 #define OSCAP_ACCESSOR_SIMPLE(MTYPE, SNAME, MNAME) \
00254 OSCAP_SETTER_SIMPLE(SNAME, MTYPE, MNAME) OSCAP_GETTER(MTYPE, SNAME, MNAME)
00255
00265 #define OSCAP_INSERTER(SNAME, FNAME, MTYPE, MNAME) \
00266 bool SNAME##_add_##FNAME(struct SNAME *obj, struct MTYPE *item) \
00267 { oscap_list_add(obj->MNAME, item); return true; }
00268
00269
00270 #define OSCAP_IGETINS(ITYPE, SNAME, MNAME, FNAME) \
00271 OSCAP_IGETTER(ITYPE, SNAME, MNAME) OSCAP_INSERTER(SNAME, FNAME, ITYPE, MNAME)
00272
00273 #define OSCAP_IGETINS_GEN(ITYPE, SNAME, MNAME, FNAME) \
00274 OSCAP_IGETTER_GEN(ITYPE, SNAME, MNAME) OSCAP_INSERTER(SNAME, FNAME, ITYPE, MNAME)
00275
00283 struct oscap_string_map {
00284 int value;
00285 const char* string;
00286 };
00287
00294 int oscap_string_to_enum(const struct oscap_string_map* map, const char* str);
00295
00302 const char* oscap_enum_to_string(const struct oscap_string_map* map, int val);
00303
00308 char* oscap_strdup(const char *str);
00309
00316 char* oscap_strsep(char** str, const char *delim);
00317
00318
00319
00320
00321 const char* oscap_import_source_get_filename(const struct oscap_import_source * src);
00322 const char* oscap_import_source_get_encoding(const struct oscap_import_source * src);
00323
00324 const char* oscap_export_target_get_filename(const struct oscap_export_target * tgt);
00325 const char* oscap_export_target_get_encoding(const struct oscap_export_target * tgt);
00326 int oscap_export_target_get_indent(const struct oscap_export_target * tgt);
00327 const char* oscap_export_target_get_indent_string(const struct oscap_export_target * tgt);
00328
00329 struct oscap_import_source * oscap_import_source_new(const char * filename, const char * encoding);
00330 void oscap_import_source_free(struct oscap_import_source * src);
00331
00332 struct oscap_export_target * oscap_export_target_new(const char * filename, const char * encoding);
00333 void oscap_export_target_free(struct oscap_export_target * tgt);
00334
00335 #endif
00336