X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gom%2Fgom_internal.h;h=b3075501a2541d1c8cc79fbab53904a19a735623;hb=f8536669a2c38054a067bfe1596f90744b6c58da;hp=6950b6064b462cec2695ce7740f508b98f2fb082;hpb=bdf47fdee469d5a1d7ddfd06a0e4b26f3b40b0f4;p=gedcom-parse.git diff --git a/gom/gom_internal.h b/gom/gom_internal.h index 6950b60..b307550 100644 --- a/gom/gom_internal.h +++ b/gom/gom_internal.h @@ -27,15 +27,21 @@ #include #include #include +#ifdef HAVE_CONFIG_H +#include +#endif #include "gom.h" #include "gedcom.h" -#ifdef WITH_DMALLOC -#include -#endif -#define _(string) gettext(string) +#define _(string) dgettext(PACKAGE, string) #define N_(string) (string) +#ifdef __GNUC__ +#define UNUSED __attribute__((unused)) +#else +#define UNUSED +#endif + typedef enum { T_NULL, @@ -64,9 +70,10 @@ 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); -void gom_cast_error(char* file, int line, OBJ_TYPE expected, OBJ_TYPE found); -void gom_no_context(char* file, int line); -void gom_unexpected_context(char* file, int line, OBJ_TYPE found); +void gom_cast_error(const char* file, int line, + OBJ_TYPE expected, OBJ_TYPE found); +void gom_no_context(const char* file, int line); +void gom_unexpected_context(const char* file, int line, OBJ_TYPE found); #define MAKE_GOM_CTXT(CTXT_TYPE, STRUCTTYPE, CTXT_PTR) \ make_gom_ctxt(CTXT_TYPE, T_ ## STRUCTTYPE, CTXT_PTR) @@ -89,21 +96,15 @@ void gom_unexpected_context(char* file, int line, OBJ_TYPE found); #define NO_CONTEXT \ gom_no_context(__FILE__, __LINE__) -void gom_mem_error(char *filename, int line); +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_elt_end(Gedcom_elt elt, Gedcom_ctxt parent, Gedcom_ctxt self, - Gedcom_val parsed_value); -void set_xref_type(struct xref_value *xr, char* str); +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); @@ -151,11 +152,22 @@ void NULL_DESTROY(void* anything); } \ } -#define _REC_PARAMS_ Gedcom_rec rec, int level, Gedcom_val xref, char *tag, \ - char *raw_value, int parsed_tag, Gedcom_val parsed_value +#define _REC_PARAMS_ Gedcom_rec rec UNUSED, int level UNUSED, \ + Gedcom_val xref UNUSED, char *tag UNUSED, \ + 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, Gedcom_ctxt parent, int level, char *tag,\ - char *raw_value, int parsed_tag, Gedcom_val parsed_value +#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_) \ @@ -170,7 +182,7 @@ void NULL_DESTROY(void* anything); } #define GET_REC_BY_XREF(STRUCTTYPE,XREF_TYPE,FUNC_NAME) \ - struct STRUCTTYPE *FUNC_NAME(char *xrefstr) \ + struct STRUCTTYPE *FUNC_NAME(const char *xrefstr) \ { \ struct xref_value* xr = gedcom_get_by_xref(xrefstr); \ if (xr && (xr->type == XREF_TYPE) && xr->object) \ @@ -200,6 +212,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_) \ { \