#include "gom.h"
#include "gom_internal.h"
-void gom_default_callback (Gedcom_elt elt, Gedcom_ctxt parent, int level, char* tag,
- char* raw_value, int parsed_tag);
+void gom_default_callback (Gedcom_elt elt, Gedcom_ctxt parent, int level,
+ char* tag, char* raw_value, int parsed_tag);
void gom_cleanup()
{
source_event_subscribe();
source_description_subscribe();
- atexit(gom_cleanup);
+ if (atexit(gom_cleanup) != 0) {
+ gedcom_warning(_("Could not register gom cleanup function"));
+ }
return gedcom_parse_file(file_name);
}
Gom_ctxt make_gom_ctxt(int ctxt_type, OBJ_TYPE obj_type, void *ctxt_ptr)
{
Gom_ctxt ctxt = (Gom_ctxt)malloc(sizeof(struct Gom_ctxt_struct));
- ctxt->ctxt_type = ctxt_type;
- ctxt->obj_type = obj_type;
- ctxt->ctxt_ptr = ctxt_ptr;
+ if (! ctxt)
+ MEMORY_ERROR;
+ else {
+ ctxt->ctxt_type = ctxt_type;
+ ctxt->obj_type = obj_type;
+ ctxt->ctxt_ptr = ctxt_ptr;
+ }
return ctxt;
}
void destroy_gom_ctxt(Gom_ctxt ctxt)
{
- free(ctxt);
+ SAFE_FREE(ctxt);
}
void gom_cast_error(char* file, int line, OBJ_TYPE expected, OBJ_TYPE found)
abort();
}
+void gom_mem_error(char *filename, int line)
+{
+ gedcom_error(_("Could not allocate memory at %s, %d"), filename, line);
+}
+
void gom_unexpected_context(char* file, int line, OBJ_TYPE found)
{
gedcom_warning(_("Internal error: Unexpected context at %s, line %d: %d"),
{
struct date_value* dv_ptr;
dv_ptr = (struct date_value*) malloc(sizeof(struct date_value));
- memcpy(dv_ptr, &dv, sizeof(struct date_value));
+ if (! dv_ptr)
+ MEMORY_ERROR;
+ else {
+ memcpy(dv_ptr, &dv, sizeof(struct date_value));
+ }
return dv_ptr;
}
{
struct age_value* age_ptr;
age_ptr = (struct age_value*) malloc(sizeof(struct age_value));
- memcpy(age_ptr, &age, sizeof(struct age_value));
+ if (! age_ptr)
+ MEMORY_ERROR;
+ else {
+ memcpy(age_ptr, &age, sizeof(struct age_value));
+ }
return age_ptr;
}
#define MAKE_CHAIN_ELT(STRUCTTYPE, FIRSTVAL, VAL) \
{ \
VAL = (struct STRUCTTYPE*) malloc(sizeof(struct STRUCTTYPE)); \
- memset (VAL, 0, sizeof(struct STRUCTTYPE)); \
- LINK_CHAIN_ELT(STRUCTTYPE, FIRSTVAL, VAL) \
+ if (! VAL) \
+ MEMORY_ERROR; \
+ else { \
+ memset (VAL, 0, sizeof(struct STRUCTTYPE)); \
+ LINK_CHAIN_ELT(STRUCTTYPE, FIRSTVAL, VAL) \
+ } \
}
void NULL_DESTROY(void* anything);
char *str = GEDCOM_STRING(parsed_value); \
struct STRUCTTYPE *obj \
= SAFE_CTXT_CAST(STRUCTTYPE, (Gom_ctxt)parent); \
- if (obj) obj->FIELD = strdup(str); \
+ if (obj) { \
+ obj->FIELD = strdup(str); \
+ if (! obj->FIELD) { \
+ MEMORY_ERROR; \
+ return NULL; \
+ } \
+ } \
return (Gedcom_ctxt) MAKE_GOM_CTXT(elt, STRUCTTYPE, obj); \
}
struct date_value dv = GEDCOM_DATE(parsed_value); \
struct STRUCTTYPE *obj \
= SAFE_CTXT_CAST(STRUCTTYPE, (Gom_ctxt)parent); \
- if (obj) obj->FIELD = dup_date(dv); \
+ if (obj) { \
+ obj->FIELD = dup_date(dv); \
+ if (! obj->FIELD) { \
+ MEMORY_ERROR; \
+ return NULL; \
+ } \
+ } \
return (Gedcom_ctxt) MAKE_GOM_CTXT(elt, STRUCTTYPE, obj); \
}
struct age_value age = GEDCOM_AGE(parsed_value); \
struct STRUCTTYPE *obj \
= SAFE_CTXT_CAST(STRUCTTYPE, (Gom_ctxt)parent); \
- if (obj) obj->FIELD = dup_age(age); \
+ if (obj) { \
+ obj->FIELD = dup_age(age); \
+ if (! obj->FIELD) { \
+ MEMORY_ERROR; \
+ return NULL; \
+ } \
+ } \
return (Gedcom_ctxt) MAKE_GOM_CTXT(elt, STRUCTTYPE, obj); \
}