1 /* Age manipulation routines.
2 Copyright (C) 2001,2002 The Genes Development Team
3 This file is part of the Gedcom parser library.
4 Contributed by Peter Verthez <Peter.Verthez@advalvas.be>, 2001.
6 The Gedcom parser library is free software; you can redistribute it
7 and/or modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 The Gedcom parser library is distributed in the hope that it will be
12 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with the Gedcom parser library; if not, write to the
18 Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
29 #include "gedcom_internal.h"
32 struct age_value age_s;
33 struct age_value def_age_val;
35 void copy_age(struct age_value *to, struct age_value from)
37 memcpy(to, &from, sizeof(struct age_value));
40 void init_age(struct age_value *age)
42 age->type = AGE_UNRECOGNIZED;
43 age->mod = AGE_NO_MODIFIER;
49 int parse_numeric_age(struct age_value *age, const char *ptr)
53 long int number = strtol(ptr, &endptr, 10);
54 if (errno == ERANGE || number < 0 || number > INT_MAX) {
55 gedcom_error(_("Number out of range in age"));
62 else if (*ptr == 'Y' || *ptr == 'y') {
66 gedcom_error(_("Duplicate year indication in age"));
70 else if (*ptr == 'M' || *ptr == 'm') {
71 if (age->months == -1)
74 gedcom_error(_("Duplicate month indication in age"));
78 else if (*ptr == 'D' || *ptr == 'd') {
82 gedcom_error(_("Duplicate day indication in age"));
87 gedcom_error(_("Unrecognized indication in age: '%s'"), ptr);
91 while (*ptr == ' ') ptr++;
97 struct age_value gedcom_parse_age(const char* line_value)
99 const char *ptr = line_value;
101 init_age(&def_age_val);
104 age_s.mod = AGE_LESS_THAN;
106 while (*ptr == ' ') ptr++;
108 else if (*ptr == '>') {
109 age_s.mod = AGE_GREATER_THAN;
111 while (*ptr == ' ') ptr++;
114 if (isdigit((unsigned char)*ptr)) {
115 int result = parse_numeric_age(&age_s, ptr);
117 age_s.type = AGE_NUMERIC;
120 else if (!strcasecmp(line_value, "CHILD"))
121 age_s.type = AGE_CHILD;
122 else if (!strcasecmp(line_value, "INFANT"))
123 age_s.type = AGE_INFANT;
124 else if (!strcasecmp(line_value, "STILLBORN"))
125 age_s.type = AGE_STILLBORN;
127 gedcom_error(_("Unrecognized age format"));
128 if (age_s.type == AGE_UNRECOGNIZED)
129 strncpy(age_s.phrase, line_value, MAX_PHRASE_LEN + 1);