From 4faf7e4b4b91a9c320f7d60299162b09720f1e4a Mon Sep 17 00:00:00 2001
From: =?utf8?q?Rafa=C5=82=20D=C5=82ugo=C5=82=C4=99cki?=
 <rafal@dlugolecki.net.pl>
Date: Mon, 20 Jan 2014 01:38:35 +0100
Subject: [PATCH] Fixed storage dump display. Changed some variables and
 function names to more obvious ones. Code formatting.

---
 src/gedcom/familia_gedcom.c | 166 ++++++++++++++++++++++++------------
 src/memory_stack.c          |   2 +
 src/storage/family.c        |  10 ++-
 src/storage/family.h        |   6 +-
 src/storage/individual.c    |   9 +-
 src/storage/storage.c       |  64 ++++++++------
 6 files changed, 169 insertions(+), 88 deletions(-)

diff --git a/src/gedcom/familia_gedcom.c b/src/gedcom/familia_gedcom.c
index dcb8032..b547857 100644
--- a/src/gedcom/familia_gedcom.c
+++ b/src/gedcom/familia_gedcom.c
@@ -25,7 +25,7 @@ void familia_gedcom_header_end (Gedcom_rec rec, Gedcom_ctxt self)
 }
 
 Gedcom_ctxt familia_gedcom_header_source_start(Gedcom_elt  elt,
-					Gedcom_ctxt parent,
+					Gedcom_ctxt ctxt,
 					int         level,
 					char*       tag,
 					char*       raw_value,
@@ -34,12 +34,12 @@ Gedcom_ctxt familia_gedcom_header_source_start(Gedcom_elt  elt,
 {
 	char *source = GEDCOM_STRING(parsed_value);
 	printf("This file was created by %s\n", source);
-	return parent;
+	return ctxt;
 }
 
 /*
 void familia_gedcom_header_source_end(Gedcom_elt  elt,
-					Gedcom_ctxt parent,
+					Gedcom_ctxt ctxt,
 					Gedcom_ctxt self,
 					Gedcom_val  parsed_value)
 {
@@ -48,7 +48,7 @@ void familia_gedcom_header_source_end(Gedcom_elt  elt,
 */
 
 Gedcom_ctxt familia_gedcom_header_version_start(Gedcom_elt  elt,
-					Gedcom_ctxt parent,
+					Gedcom_ctxt ctxt,
 					int         level,
 					char*       tag,
 					char*       raw_value,
@@ -57,11 +57,11 @@ Gedcom_ctxt familia_gedcom_header_version_start(Gedcom_elt  elt,
 {
 	char *source = GEDCOM_STRING(parsed_value);
 	printf("Program version: %s (l: %d, tag: %s, raw:%s) \n", source, level, tag, raw_value);
-	return parent;
+	return ctxt;
 }
 /*
 void familia_gedcom_header_version_end(Gedcom_elt  elt,
-					Gedcom_ctxt parent,
+					Gedcom_ctxt ctxt,
 					Gedcom_ctxt self,
 					Gedcom_val  parsed_value)
 {
@@ -111,26 +111,26 @@ void familia_gedcom_individual_end (Gedcom_rec rec, Gedcom_ctxt self)
 }
 */
 Gedcom_ctxt familia_gedcom_individual_set_first_name(Gedcom_elt  elt,
-					Gedcom_ctxt parent,
+					Gedcom_ctxt ctxt,
 					int         level,
 					char*       tag,
 					char*       raw_value,
 					int         parsed_tag,
 					Gedcom_val  parsed_value)
 {
-	familia_individual_set_first_name(parent, GEDCOM_STRING(parsed_value));
-	return parent;
+	familia_individual_set_first_name(ctxt, GEDCOM_STRING(parsed_value));
+	return ctxt;
 }
 /*
 void familia_gedcom_individual_first_name_end(Gedcom_elt  elt,
-					Gedcom_ctxt parent,
+					Gedcom_ctxt ctxt,
 					Gedcom_ctxt self,
 					Gedcom_val  parsed_value)
 {
 }
 */
 Gedcom_ctxt familia_gedcom_individual_last_name_start(Gedcom_elt  elt,
-					Gedcom_ctxt parent,
+					Gedcom_ctxt ctxt,
 					int         level,
 					char*       tag,
 					char*       raw_value,
@@ -138,13 +138,13 @@ Gedcom_ctxt familia_gedcom_individual_last_name_start(Gedcom_elt  elt,
 					Gedcom_val  parsed_value)
 {
 	if (GEDCOM_IS_STRING(parsed_value)) {
-		familia_individual_set_last_name(parent, GEDCOM_STRING(parsed_value));
+		familia_individual_set_last_name(ctxt, GEDCOM_STRING(parsed_value));
 	}
-	return parent;
+	return ctxt;
 }
 /*
 void familia_gedcom_individual_last_name_end(Gedcom_elt  elt,
-					Gedcom_ctxt parent,
+					Gedcom_ctxt ctxt,
 					Gedcom_ctxt self,
 					Gedcom_val  parsed_value)
 {
@@ -152,47 +152,113 @@ void familia_gedcom_individual_last_name_end(Gedcom_elt  elt,
 */
 
 Gedcom_ctxt familia_gedcom_individual_add_family(Gedcom_elt  elt,
-					Gedcom_ctxt parent,
+					Gedcom_ctxt ctxt,
 					int         level,
 					char*       tag,
 					char*       raw_value,
 					int         parsed_tag,
 					Gedcom_val  parsed_value)
 {
-	void * object = NULL;
+	void * family = NULL;
 	struct xref_value *xr = GEDCOM_XREF_PTR(parsed_value);
 
-	object = familia_memory_stack_find(xr->string, FS_FAMILY);
-	familia_individual_add_family(parent, object);
+	family = familia_memory_stack_find(xr->string, FS_FAMILY);
+	familia_individual_add_family(ctxt, family);
 
-	return parent;
+	return ctxt;
+}
+
+/**
+ * Set parents for child
+ */
+Gedcom_ctxt familia_gedcom_individual_set_parents(Gedcom_elt  elt,
+					Gedcom_ctxt ctxt,
+					int         level,
+					char*       tag,
+					char*       raw_value,
+					int         parsed_tag,
+					Gedcom_val  parsed_value)
+{
+	void * child = NULL;
+	/* XREF_PTR(FAM) */
+	struct xref_value *xr = GEDCOM_XREF_PTR(parsed_value);
+
+	child = familia_memory_stack_find(xr->string, FS_INDIVIDUAL);
+	familia_individual_set_parents(child, ctxt);
+
+	return ctxt;
 }
 
 /**
  * Adds child to the family
  */
 Gedcom_ctxt familia_gedcom_family_add_child(Gedcom_elt  elt,
-					Gedcom_ctxt parent,
+					Gedcom_ctxt ctxt,
 					int         level,
 					char*       tag,
 					char*       raw_value,
 					int         parsed_tag,
 					Gedcom_val  parsed_value)
 {
-	void * object = NULL;
+	void * family = NULL;
 	/* XREF_PTR(FAM) */
 	struct xref_value *xr = GEDCOM_XREF_PTR(parsed_value);
 
-	object = familia_memory_stack_find(xr->string, FS_FAMILY);
-	/* parent: REC_INDI */
-	familia_family_add_child(object, parent);
+	family = familia_memory_stack_find(xr->string, FS_FAMILY);
+	familia_family_add_child(family, ctxt);
+
+	return ctxt;
+}
+
+/**
+ * Adds first parent to the family
+ * Parent is the first individual in family. It can be e.g. Husband
+ */
+Gedcom_ctxt familia_gedcom_family_set_parent1(Gedcom_elt  elt,
+					Gedcom_ctxt ctxt,
+					int         level,
+					char*       tag,
+					char*       raw_value,
+					int         parsed_tag,
+					Gedcom_val  parsed_value)
+{
+	void * parent = NULL;
+	/* XREF_PTR(INDI) */
+	struct xref_value *xr = GEDCOM_XREF_PTR(parsed_value);
+
+	parent = familia_memory_stack_find(xr->string, FS_FAMILY);
+	/* ctxt: REC_FAM */
+	familia_family_set_parent(ctxt, parent, Individual1);
+
+	return ctxt;
+}
+
+/**
+ * Adds second parent to the family
+ * Parent is the first individual in family. It can be e.g. Wife
+ */
+Gedcom_ctxt familia_gedcom_family_set_parent2(Gedcom_elt  elt,
+					Gedcom_ctxt ctxt,
+					int         level,
+					char*       tag,
+					char*       raw_value,
+					int         parsed_tag,
+					Gedcom_val  parsed_value)
+{
+	void * parent = NULL;
+	/* XREF_PTR(INDI) */
+	struct xref_value *xr = GEDCOM_XREF_PTR(parsed_value);
+
+	parent = familia_memory_stack_find(xr->string, FS_FAMILY);
+	/* ctxt: REC_FAM */
+	familia_family_set_parent(ctxt, parent, Individual2);
 
-	return parent;
+	return ctxt;
 }
 
 /*
 void familia_gedcom_individual_family_end(Gedcom_elt  elt,
-					Gedcom_ctxt parent,
+					Gedcom_ctxt ctxt,
 					Gedcom_ctxt self,
 					Gedcom_val  parsed_value)
 {
@@ -209,33 +275,27 @@ void familia_gedcom_init()
 {
 	gedcom_set_message_handler(familia_gedcom_error);
 
-	gedcom_subscribe_to_record(REC_HEAD,
-				familia_gedcom_header_start,
-				familia_gedcom_header_end);
-	gedcom_subscribe_to_element(ELT_HEAD_SOUR,
-				familia_gedcom_header_source_start,
-				NULL);
-	gedcom_subscribe_to_element(ELT_HEAD_SOUR_VERS,
-				familia_gedcom_header_version_start,
-				NULL);
-	gedcom_subscribe_to_record(REC_FAM,
-				familia_gedcom_family_start,
-				NULL);
-	gedcom_subscribe_to_record(REC_INDI,
-				familia_gedcom_individual_start,
-				NULL);
-	gedcom_subscribe_to_element(ELT_SUB_PERS_NAME,
-				familia_gedcom_individual_set_first_name,
-				NULL);
-	gedcom_subscribe_to_element(ELT_SUB_PERS_NAME_SURN,
-				familia_gedcom_individual_last_name_start,
-				NULL);
-	gedcom_subscribe_to_element(ELT_SUB_FAMS,
-				familia_gedcom_family_add_child,
-				NULL);
-	gedcom_subscribe_to_element(ELT_SUB_FAMC,
-				familia_gedcom_family_add_child,
-				NULL);
+	gedcom_subscribe_to_record(REC_HEAD, familia_gedcom_header_start, familia_gedcom_header_end);
+	/* Create and set family as current (set to ctxt) */
+	gedcom_subscribe_to_record(REC_FAM, familia_gedcom_family_start, NULL);
+	/* Create and set individual as current (set to ctxt) */
+	gedcom_subscribe_to_record(REC_INDI, familia_gedcom_individual_start, NULL);
+	gedcom_subscribe_to_element(ELT_HEAD_SOUR, familia_gedcom_header_source_start, NULL);
+	gedcom_subscribe_to_element(ELT_HEAD_SOUR_VERS, familia_gedcom_header_version_start, NULL);
+	/* Set in current individual first name */
+	gedcom_subscribe_to_element(ELT_SUB_PERS_NAME, familia_gedcom_individual_set_first_name, NULL);
+	/* Set in current individual last name */
+	gedcom_subscribe_to_element(ELT_SUB_PERS_NAME_SURN, familia_gedcom_individual_last_name_start, NULL);
+	/* Add to current individual new family */
+	gedcom_subscribe_to_element(ELT_SUB_FAMS, familia_gedcom_individual_add_family, NULL);
+	/* Set current family as parents to child */
+	gedcom_subscribe_to_element(ELT_FAM_CHIL, familia_gedcom_individual_set_parents, NULL);
+	/* Set current individual new parents */
+	gedcom_subscribe_to_element(ELT_SUB_FAMC, familia_gedcom_family_add_child, NULL);
+	/* Set in current family first parent (e.g. husband) */
+	gedcom_subscribe_to_element(ELT_FAM_HUSB, familia_gedcom_family_set_parent1, NULL);
+	/* Set in current family second parent (e.g. wife) */
+	gedcom_subscribe_to_element(ELT_FAM_WIFE, familia_gedcom_family_set_parent2, NULL);
 
 	familia_memory_stack_init();
 }
diff --git a/src/memory_stack.c b/src/memory_stack.c
index 9e32862..6149315 100644
--- a/src/memory_stack.c
+++ b/src/memory_stack.c
@@ -42,6 +42,8 @@ void familia_memory_stack_init()
 
 	assert(memory_stack == NULL);
 	memory_stack = (struct familia_memory_stack*)malloc(sizeof(struct familia_memory_stack));
+	memory_stack->objects = NULL;
+	memory_stack->objects_no = 0;
 
 	assert(storage != NULL);
 }
diff --git a/src/storage/family.c b/src/storage/family.c
index 1508cd9..6e53a6a 100644
--- a/src/storage/family.c
+++ b/src/storage/family.c
@@ -44,7 +44,7 @@ void familia_family_free(struct familia_family * family)
 	free(family);
 }
 
-void familia_family_set_individual(struct familia_family * family, struct familia_individual * individual, enum FFamilyIndividualIndex index)
+void familia_family_set_parent(struct familia_family * family, struct familia_individual * individual, enum FFamilyIndividualIndex index)
 {
 	switch (index) {
 	case Individual1:
@@ -56,21 +56,23 @@ void familia_family_set_individual(struct familia_family * family, struct famili
 	}
 }
 
-struct familia_individual * familia_family_get_individual(struct familia_family * family, enum FFamilyIndividualIndex index)
+struct familia_individual * familia_family_get_parent(struct familia_family * family, enum FFamilyIndividualIndex index)
 {
 	struct familia_individual * individual = NULL;
 
 	switch (index) {
 	case Individual1:
 		individual = family->individual1;
+		break;
 	case Individual2:
 		individual = family->individual2;
+		break;
 	}
 
 	return individual;
 }
 
-struct familia_individual * familia_family_remove_individual(struct familia_family * family, enum FFamilyIndividualIndex index)
+struct familia_individual * familia_family_remove_parent(struct familia_family * family, enum FFamilyIndividualIndex index)
 {
 	struct familia_individual * individual = NULL;
 
@@ -98,7 +100,7 @@ void familia_family_add_child(struct familia_family * family, struct familia_ind
 		family->children = tmp;
 		family->children[family->children_no] = individual;
 		family->children_no++;
-		familia_individual_set_parents(individual, family);
+/*		familia_individual_set_parents(individual, family);*/
 	}
 	else {
 		debug("There were problems with allocating memory for family children.\n");
diff --git a/src/storage/family.h b/src/storage/family.h
index 50fb19c..adf2dac 100644
--- a/src/storage/family.h
+++ b/src/storage/family.h
@@ -67,14 +67,14 @@ void familia_family_free(struct familia_family * family);
  * @parameter family to set the individual
  * @parameter individual which will be set
  */
-void familia_family_set_individual(struct familia_family * family, struct familia_individual * individual, enum FFamilyIndividualIndex index);
+void familia_family_set_parent(struct familia_family * family, struct familia_individual * individual, enum FFamilyIndividualIndex index);
 
 /**
  * Gets individual from the given family
  * @parameter family to get the individual
  * @parameter individual index of which individual get
  */
-struct familia_individual * familia_family_get_individual(struct familia_family * family, enum FFamilyIndividualIndex index);
+struct familia_individual * familia_family_get_parent(struct familia_family * family, enum FFamilyIndividualIndex index);
 
 /**
  * Removes individual from the given family
@@ -84,7 +84,7 @@ struct familia_individual * familia_family_get_individual(struct familia_family
  * @parameter individual index of which individual to remove
  * @return returns removed individual, NULL if such does not exist.
  */
-struct familia_individual * familia_family_remove_individual(struct familia_family * family, enum FFamilyIndividualIndex index);
+struct familia_individual * familia_family_remove_parent(struct familia_family * family, enum FFamilyIndividualIndex index);
 
 /**
  * Adds new child in the given family
diff --git a/src/storage/individual.c b/src/storage/individual.c
index 856796d..33a0a08 100644
--- a/src/storage/individual.c
+++ b/src/storage/individual.c
@@ -20,6 +20,7 @@ struct familia_individual * familia_individual_new()
 	individual->last_name = NULL;
 	individual->families = NULL;
 	individual->families_no = 0;
+	individual->parents = NULL;
 
 	return individual;
 }
@@ -48,6 +49,10 @@ void familia_individual_free(struct familia_individual * individual)
 		individual->families_no = 0;
 	}
 
+	if (individual->parents) {
+		individual->parents = NULL;
+	}
+
 	free(individual);
 }
 
@@ -74,10 +79,6 @@ void familia_individual_set_first_name(struct familia_individual * individual, c
 
 char * familia_individual_get_first_name(struct familia_individual * individual)
 {
-	if (!individual) {
-		return NULL;
-	}
-
 	return individual->first_name;
 }
 
diff --git a/src/storage/storage.c b/src/storage/storage.c
index 8b00a71..c54e6a0 100644
--- a/src/storage/storage.c
+++ b/src/storage/storage.c
@@ -35,7 +35,7 @@ struct familia_storage * familia_storage_new()
 	storage->families = NULL;
 	storage->families_no = 0;
 
-	_familia_storage_positions_init();
+/*	_familia_storage_positions_init();*/
 
 	return storage;
 }
@@ -64,7 +64,7 @@ void familia_storage_free(struct familia_storage * storage)
 		storage->families_no = 0;
 	}
 
-	_familia_storage_positions_free();
+/*	_familia_storage_positions_free();*/
 }
 
 void familia_storage_add_individual(struct familia_storage * storage, struct familia_individual * individual)
@@ -76,6 +76,7 @@ void familia_storage_add_individual(struct familia_storage * storage, struct fam
 		tmp = realloc(storage->individuals, size * sizeof(struct familia_individual *));
 		
 		if (tmp) {
+			individual->id = storage->individuals_no;
 			storage->individuals = tmp;
 			storage->individuals[storage->individuals_no] = individual;
 			storage->individuals_no++;
@@ -142,6 +143,7 @@ void familia_storage_add_family(struct familia_storage * storage, struct familia
 		tmp = realloc(storage->families, size * sizeof(struct familia_family *));
 		
 		if (tmp) {
+			family->id = storage->families_no;
 			storage->families = tmp;
 			storage->families[storage->families_no] = family;
 			storage->families_no++;
@@ -201,60 +203,74 @@ void familia_storage_remove_family_by_id(struct familia_storage * storage, unsig
 
 void familia_storage_dump_all()
 {
-	int i;
+	unsigned int i;
 	struct familia_storage * storage = NULL;
 	struct familia_family * family = NULL;
 	struct familia_individual * individual = NULL;
+	struct familia_individual * i1 = NULL;
+	struct familia_individual * i2 = NULL;
 	
 	storage = familia_storage_get_current();
 	
 	for (i = 0; i < storage->individuals_no; i++) {
+		struct familia_family * f = NULL;
+
 		individual = storage->individuals[i];
+
 		printf("Individual (%d)\n", individual->id);
 		printf("\t First name: %s\n", individual->first_name);
 		printf("\t Last name: %s\n", individual->last_name);
+
 		if (individual->families_no > 0) {
-			int j;
-			struct familia_family * f = NULL;
-			struct familia_individual * i1 = NULL;
-			struct familia_individual * i2 = NULL;
+			unsigned int j;
 
 			printf("\t Families:\n");
 			for (j = 0; j < individual->families_no; j++) {
 				f = individual->families[j];
-				i1 = familia_family_get_individual(f, Individual1);
-				i2 = familia_family_get_individual(f, Individual2);
+				i1 = familia_family_get_parent(f, Individual1);
+				i2 = familia_family_get_parent(f, Individual2);
 				
-				printf("\t > %s&%s\n", familia_individual_get_first_name(i1), familia_individual_get_first_name(i2));
+				printf("\t > %s&%s\n",
+					i1 ? familia_individual_get_first_name(i1) : "NULL",
+					i2 ? familia_individual_get_first_name(i2) : "NULL");
 			}
-			printf("\t Parents:\n");
-			f = familia_individual_get_parents(individual);
-			i1 = familia_family_get_individual(f, Individual1);
-			i2 = familia_family_get_individual(f, Individual2);
-			
-			printf("\t > %s&%s\n", familia_individual_get_first_name(i1), familia_individual_get_first_name(i2));
+		}
+
+		printf("\t Parents:\n");
+		f = NULL;
+		f = familia_individual_get_parents(individual);
+
+		if (f) {
+			i1 = familia_family_get_parent(f, Individual1);
+			i2 = familia_family_get_parent(f, Individual2);
+		
+			printf("\t > %s&%s\n",
+				i1 ? familia_individual_get_first_name(i1) : "NULL",
+				i2 ? familia_individual_get_first_name(i2) : "NULL");
+		}
+		else {
+			printf("\t (none)\n");
 		}
 	}
 
 
 	for (i = 0; i < storage->families_no; i++) {
-		int j;
-		struct familia_individual * i1 = NULL;
-		struct familia_individual * i2 = NULL;
+		unsigned int j;
 
 		family = storage->families[i];
 
 		printf("Family (%d)\n", family->id);
-		i1 = familia_family_get_individual(family, Individual1);
-		i2 = familia_family_get_individual(family, Individual2);
-		printf("\t First parent: %s\n", familia_individual_get_first_name(i1));
-		printf("\t Second parent: %s\n", familia_individual_get_first_name(i2));
+		i1 = familia_family_get_parent(family, Individual1);
+		printf("\t First parent: %s\n", i1 ? familia_individual_get_first_name(i1) : "NULL");
+
+		i2 = familia_family_get_parent(family, Individual2);
+		printf("\t Second parent: %s\n", i2 ? familia_individual_get_first_name(i2) : "NULL");
 
 		printf("\t Children:\n");
 		if (family->children_no > 0) {
 			for (j = 0; j < family->children_no; j++) {
 				i1 = family->children[j];
-				printf("\t > %s\n", familia_individual_get_first_name(i1));
+				printf("\t > %s\n", i1 ? familia_individual_get_first_name(i1) : "NULL");
 			}
 		}
 	}
-- 
2.30.2