#include <stdlib.h>
#include <string.h>
#include <libintl.h>
+#include <time.h>
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
#include "gom.h"
#include "gedcom.h"
-#ifdef WITH_DMALLOC
-#include <dmalloc.h>
-#endif
-#define _(string) gettext(string)
+#define _(string) dgettext(PACKAGE, string)
#define N_(string) (string)
#ifdef __GNUC__
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)
#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);
+int update_date(struct date_value** dv, struct tm* tm_ptr);
+int update_time(char** tv, struct tm* tm_ptr);
/* Doubly-linked list, but last rec->next is NULL (doesn't go to first rec) */
#define LINK_CHAIN_ELT(STRUCTTYPE, FIRSTVAL, VAL) \
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_) \
{ \
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_) \
{ \
= 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 \
= 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 \