X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gom%2Fgom_internal.h;h=3c604a2eb653ce4656b3adda2c92a39c9acceb58;hb=473f146038f88434e3edd070dfa42390bd0df60f;hp=baa11955bded95dc81924fea3cce9d748f1f24d0;hpb=bb2090762d3ae9355a04286c33b78d24736b783c;p=gedcom-parse.git diff --git a/gom/gom_internal.h b/gom/gom_internal.h index baa1195..3c604a2 100644 --- a/gom/gom_internal.h +++ b/gom/gom_internal.h @@ -52,25 +52,20 @@ typedef enum { T_address, T_event, T_place, T_source_citation, T_text, T_note_sub, T_multimedia_link, T_lds_event, T_user_ref_number, T_change_date, T_personal_name, T_family_link, T_pedigree, - T_association, T_source_event, T_source_description -} OBJ_TYPE; - -/* Assumptions for context: - - In case of error, NULL is passed as context - - If not NULL, the ctxt_ptr of the context is not NULL also - - UNEXPECTED_CONTEXT is not treated as an error, but as a warning -*/ + T_association, T_source_event, T_source_description, -struct Gom_ctxt_struct { - int ctxt_type; - OBJ_TYPE obj_type; - void* ctxt_ptr; -}; + T_LAST +} OBJ_TYPE; +struct Gom_ctxt_struct; typedef struct Gom_ctxt_struct *Gom_ctxt; Gom_ctxt make_gom_ctxt(int ctxt_type, OBJ_TYPE obj_type, void *ctxt_ptr); -void destroy_gom_ctxt(Gom_ctxt ctxt); +Gom_ctxt dup_gom_ctxt(Gom_ctxt ctxt, int ctxt_type); +void* safe_ctxt_cast(Gom_ctxt ctxt, OBJ_TYPE type, const char* file, int line); +int ctxt_type(Gom_ctxt ctxt); +OBJ_TYPE ctxt_obj_type(Gom_ctxt ctxt); + void gom_cast_error(const char* file, int line, OBJ_TYPE expected, OBJ_TYPE found); void gom_no_context(const char* file, int line); @@ -88,10 +83,7 @@ int gom_write_xref_list(Gedcom_write_hndl hndl, make_gom_ctxt(CTXT_TYPE, T_ ## STRUCTTYPE, CTXT_PTR) #define SAFE_CTXT_CAST(STRUCTTYPE, VAL) \ - (((VAL)->obj_type == T_ ## STRUCTTYPE) ? \ - (VAL)->ctxt_ptr : \ - (gom_cast_error(__FILE__, __LINE__, T_ ## STRUCTTYPE, (VAL)->obj_type), \ - (VAL)->ctxt_ptr)) + safe_ctxt_cast(VAL, T_ ## STRUCTTYPE, __FILE__, __LINE__) #define SAFE_FREE(PTR) \ if (PTR) { \