Keep parsed values in date if parse was OK, but no valid date.
[gedcom-parse.git] / gedcom / age.c
index 8518411252cd952b0e6ff6c221ca12fed190ee27..705a237ef05730ff99486581e8ff2671eb921043 100644 (file)
 #include <errno.h>
 #include <limits.h>
 #include "gedcom_internal.h"
+#include "buffer.h"
 #include "age.h"
 
 struct age_value age_s;
 struct age_value def_age_val;
 
+void cleanup_age_buffer();
+struct safe_buffer age_buffer = { NULL, 0, NULL, 0, cleanup_age_buffer };
+
+void cleanup_age_buffer()
+{
+  cleanup_buffer(&age_buffer);
+}
+
 void copy_age(struct age_value *to, struct age_value from)
 {
   memcpy(to, &from, sizeof(struct age_value));
@@ -94,6 +103,21 @@ int parse_numeric_age(struct age_value *age, const char *ptr)
   return 0;
 }
 
+struct age_value* gedcom_new_age_value(const struct age_value* copy_from)
+{
+  struct age_value* age_ptr;
+  age_ptr = (struct age_value*) malloc(sizeof(struct age_value));
+  if (! age_ptr)
+    MEMORY_ERROR;
+  else {
+    if (copy_from)
+      memcpy(age_ptr, copy_from, sizeof(struct age_value));
+    else 
+      init_age(age_ptr);
+  }
+  return age_ptr;
+}
+
 struct age_value gedcom_parse_age(const char* line_value)
 {
   const char *ptr = line_value;
@@ -111,7 +135,7 @@ struct age_value gedcom_parse_age(const char* line_value)
     while (*ptr == ' ') ptr++;
   }
 
-  if (isdigit(*ptr)) {
+  if (isdigit((unsigned char)*ptr)) {
     int result = parse_numeric_age(&age_s, ptr);
     if (result == 0) {
       age_s.type = AGE_NUMERIC;
@@ -130,3 +154,51 @@ struct age_value gedcom_parse_age(const char* line_value)
   return age_s;
 }
 
+char* gedcom_age_to_string(const struct age_value* val)
+{
+  int num = 0;
+  reset_buffer(&age_buffer);
+
+  switch (val->mod) {
+    case AGE_LESS_THAN:
+      safe_buf_append(&age_buffer, "<"); break;
+    case AGE_GREATER_THAN:
+      safe_buf_append(&age_buffer, ">"); break;
+    default:
+      break;
+  }
+
+  switch (val->type) {
+    case AGE_UNRECOGNIZED:
+      reset_buffer(&age_buffer);
+      safe_buf_append(&age_buffer, val->phrase); break;
+    case AGE_CHILD:
+      safe_buf_append(&age_buffer, "CHILD"); break;
+    case AGE_INFANT:
+      safe_buf_append(&age_buffer, "INFANT"); break;
+    case AGE_STILLBORN:
+      safe_buf_append(&age_buffer, "STILLBORN"); break;
+    case AGE_NUMERIC:
+      if (val->years != -1) {
+       num = 1;
+       safe_buf_append(&age_buffer, "%dy", val->years);
+      }
+      if (val->months != -1) {
+       if (num)
+         safe_buf_append(&age_buffer, " ");
+       num = 1;
+       safe_buf_append(&age_buffer, "%dm", val->months);
+      }
+      if (val->days != -1) {
+       if (num)
+         safe_buf_append(&age_buffer, " ");
+       num = 1;
+       safe_buf_append(&age_buffer, "%dd", val->days);
+      }
+      break;
+    default:
+      break;
+  }
+  
+  return get_buf_string(&age_buffer);
+}