X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gom%2Fgom_internal.h;h=46c42a100815edb60b732c60de7fa25decb014e5;hb=39bb8d4c3317074cfa3e8e92cc12e6160675e246;hp=0ef609bd3dc6414a51a4145b1d891f86940e4611;hpb=a5bd4c3c89f5cb433a615c436947b8b0f44c3661;p=gedcom-parse.git diff --git a/gom/gom_internal.h b/gom/gom_internal.h index 0ef609b..46c42a1 100644 --- a/gom/gom_internal.h +++ b/gom/gom_internal.h @@ -27,10 +27,13 @@ #include #include #include +#ifdef HAVE_CONFIG_H +#include +#endif #include "gom.h" #include "gedcom.h" -#define _(string) gettext(string) +#define _(string) dgettext(PACKAGE, string) #define N_(string) (string) #ifdef __GNUC__ @@ -72,6 +75,10 @@ void gom_cast_error(const char* file, int line, void gom_no_context(const char* file, int line); void gom_unexpected_context(const char* file, int line, OBJ_TYPE found); +int gom_write_xref_list(Gedcom_write_hndl hndl, + Gedcom_elt elt, int tag, int parent_rec_or_elt, + struct xref_list* val); + #define MAKE_GOM_CTXT(CTXT_TYPE, STRUCTTYPE, CTXT_PTR) \ make_gom_ctxt(CTXT_TYPE, T_ ## STRUCTTYPE, CTXT_PTR) @@ -97,20 +104,11 @@ void gom_mem_error(const char *filename, int line); #define MEMORY_ERROR gom_mem_error(__FILE__, __LINE__) -void def_rec_end(Gedcom_rec rec, Gedcom_ctxt self); +void def_rec_end(Gedcom_rec rec, Gedcom_ctxt self, Gedcom_val parsed_value); void def_elt_end(Gedcom_elt elt, Gedcom_ctxt parent, Gedcom_ctxt self, Gedcom_val parsed_value); void set_xref_type(struct xref_value *xr, const char* str); -typedef enum { - WITHOUT_NL, - WITH_NL -} NL_TYPE; - -char* concat_strings(NL_TYPE type, char *str1, const char *str2); -struct date_value* dup_date(struct date_value dv); -struct age_value* dup_age(struct age_value age); - /* Doubly-linked list, but last rec->next is NULL (doesn't go to first rec) */ #define LINK_CHAIN_ELT(STRUCTTYPE, FIRSTVAL, VAL) \ { \ @@ -160,11 +158,18 @@ void NULL_DESTROY(void* anything); char *raw_value UNUSED, int parsed_tag UNUSED, \ Gedcom_val parsed_value UNUSED +#define _REC_END_PARAMS_ Gedcom_rec rec UNUSED, Gedcom_ctxt self UNUSED, \ + Gedcom_val parsed_value UNUSED + #define _ELT_PARAMS_ Gedcom_elt elt UNUSED, Gedcom_ctxt parent UNUSED, \ int level UNUSED, char *tag UNUSED, \ char *raw_value UNUSED, int parsed_tag UNUSED, \ Gedcom_val parsed_value UNUSED +#define _ELT_END_PARAMS_ Gedcom_elt elt UNUSED, Gedcom_ctxt parent UNUSED, \ + Gedcom_ctxt self UNUSED, \ + Gedcom_val parsed_value UNUSED + #define REC_CB(STRUCTTYPE,CB_NAME,FUNC) \ Gedcom_ctxt CB_NAME(_REC_PARAMS_) \ { \ @@ -208,6 +213,46 @@ void NULL_DESTROY(void* anything); return (Gedcom_ctxt)result; \ } +#define STRING_END_CB(STRUCTTYPE,CB_NAME,FIELD) \ + void CB_NAME(_ELT_END_PARAMS_) \ + { \ + Gom_ctxt ctxt = (Gom_ctxt)self; \ + if (! ctxt) \ + NO_CONTEXT; \ + else { \ + struct STRUCTTYPE *obj = SAFE_CTXT_CAST(STRUCTTYPE, ctxt); \ + if (obj) { \ + char *str = GEDCOM_STRING(parsed_value); \ + char *newvalue = strdup(str); \ + if (! newvalue) \ + MEMORY_ERROR; \ + else \ + obj->FIELD = newvalue; \ + } \ + destroy_gom_ctxt(ctxt); \ + } \ + } + +#define STRING_END_REC_CB(STRUCTTYPE,CB_NAME,FIELD) \ + void CB_NAME(_REC_END_PARAMS_) \ + { \ + Gom_ctxt ctxt = (Gom_ctxt)self; \ + if (! ctxt) \ + NO_CONTEXT; \ + else { \ + struct STRUCTTYPE *obj = SAFE_CTXT_CAST(STRUCTTYPE, ctxt); \ + if (obj) { \ + char *str = GEDCOM_STRING(parsed_value); \ + char *newvalue = strdup(str); \ + if (! newvalue) \ + MEMORY_ERROR; \ + else \ + obj->FIELD = newvalue; \ + } \ + destroy_gom_ctxt(ctxt); \ + } \ + } + #define DATE_CB(STRUCTTYPE,CB_NAME,FIELD) \ Gedcom_ctxt CB_NAME(_ELT_PARAMS_) \ { \ @@ -219,7 +264,7 @@ void NULL_DESTROY(void* anything); = SAFE_CTXT_CAST(STRUCTTYPE, (Gom_ctxt)parent); \ if (obj) { \ struct date_value dv = GEDCOM_DATE(parsed_value); \ - obj->FIELD = dup_date(dv); \ + obj->FIELD = gedcom_new_date_value(&dv); \ if (! obj->FIELD) \ MEMORY_ERROR; \ else \ @@ -240,7 +285,7 @@ void NULL_DESTROY(void* anything); = SAFE_CTXT_CAST(STRUCTTYPE, (Gom_ctxt)parent); \ if (obj) { \ struct age_value age = GEDCOM_AGE(parsed_value); \ - obj->FIELD = dup_age(age); \ + obj->FIELD = gedcom_new_age_value(&age); \ if (! obj->FIELD) \ MEMORY_ERROR; \ else \