Definition of SUB_MAKEFUNC, SUB_ADDFUNC and SUB_DELETEFUNC.
[gedcom-parse.git] / gom / user_ref.c
1 /* User reference number sub-structure in the gedcom object model.
2    Copyright (C) 2002 The Genes Development Team
3    This file is part of the Gedcom parser library.
4    Contributed by Peter Verthez <Peter.Verthez@advalvas.be>, 2002.
5
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.
10
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.
15
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
19    02111-1307 USA.  */
20
21 /* $Id$ */
22 /* $Name$ */
23
24 #include <stdlib.h>
25 #include <string.h>
26 #include "user_ref.h"
27 #include "family.h"
28 #include "individual.h"
29 #include "multimedia.h"
30 #include "note.h"
31 #include "repository.h"
32 #include "source.h"
33 #include "user_rec.h"
34 #include "gom.h"
35 #include "gedcom.h"
36 #include "gom_internal.h"
37
38 Gedcom_ctxt sub_user_ref_start(_ELT_PARAMS_)
39 {
40   Gom_ctxt ctxt = (Gom_ctxt)parent;
41   Gom_ctxt result = NULL;
42
43   if (! ctxt)
44     NO_CONTEXT;
45   else {
46     struct user_ref_number *refn
47       = (struct user_ref_number *)malloc(sizeof(struct user_ref_number));
48
49     if (! refn)
50       MEMORY_ERROR;
51     else {
52       memset (refn, 0, sizeof(struct user_ref_number));
53       refn->value = strdup(GEDCOM_STRING(parsed_value));
54       if (! refn->value) {
55         MEMORY_ERROR;
56         free(refn);
57       }
58       else {
59         switch (ctxt->ctxt_type) {
60           case REC_FAM:
61             ADDFUNC2(family,user_ref_number)(ctxt, refn); break;
62           case REC_INDI:
63             ADDFUNC2(individual,user_ref_number)(ctxt, refn); break;
64           case REC_OBJE:
65             ADDFUNC2(multimedia,user_ref_number)(ctxt, refn); break;
66           case REC_NOTE:
67             ADDFUNC2(note,user_ref_number)(ctxt, refn); break;
68           case REC_REPO:
69             ADDFUNC2(repository,user_ref_number)(ctxt, refn); break;
70           case REC_SOUR:
71             ADDFUNC2(source,user_ref_number)(ctxt, refn); break;
72           default:
73             UNEXPECTED_CONTEXT(ctxt->ctxt_type);
74         }
75         
76         result = MAKE_GOM_CTXT(elt, user_ref_number, refn);
77       }
78     }
79   }
80
81   return (Gedcom_ctxt)result;
82 }
83
84 DEFINE_STRING_CB(user_ref_number, sub_user_ref_type_start, type)
85
86 DEFINE_ADDFUNC2(user_ref_number, user_data, extra)
87      
88 Gedcom_ctxt sub_user_rin_start(_ELT_PARAMS_)
89 {
90   Gom_ctxt ctxt = (Gom_ctxt)parent;
91   Gom_ctxt result = NULL;
92   
93   if (! ctxt)
94     NO_CONTEXT;
95   else {
96     char *str = GEDCOM_STRING(parsed_value);
97
98     switch (ctxt->ctxt_type) {
99       case REC_FAM:
100         ADDFUNC2_STR(family,record_id)(ctxt, str); break;
101       case REC_INDI:
102         ADDFUNC2_STR(individual,record_id)(ctxt, str); break;
103       case REC_OBJE:
104         ADDFUNC2_STR(multimedia,record_id)(ctxt, str); break;
105       case REC_NOTE:
106         ADDFUNC2_STR(note,record_id)(ctxt, str); break;
107       case REC_REPO:
108         ADDFUNC2_STR(repository,record_id)(ctxt, str); break;
109       case REC_SOUR:
110         ADDFUNC2_STR(source,record_id)(ctxt, str); break;
111       default:
112         UNEXPECTED_CONTEXT(ctxt->ctxt_type);
113     }
114     result = make_gom_ctxt(elt, ctxt->obj_type, ctxt->ctxt_ptr);
115   }
116   return (Gedcom_ctxt)result;
117 }
118
119 void user_ref_subscribe()
120 {
121   gedcom_subscribe_to_element(ELT_SUB_IDENT_REFN, sub_user_ref_start,
122                               def_elt_end);
123   gedcom_subscribe_to_element(ELT_SUB_IDENT_REFN_TYPE, sub_user_ref_type_start,
124                               def_elt_end);
125   gedcom_subscribe_to_element(ELT_SUB_IDENT_RIN, sub_user_rin_start,
126                               def_elt_end);
127 }
128
129 void CLEANFUNC(user_ref_number)(struct user_ref_number* refn)
130 {
131   if (refn) {
132     SAFE_FREE(refn->value);
133     SAFE_FREE(refn->type);
134     DESTROY_CHAIN_ELTS(user_data, refn->extra);
135   }
136 }
137
138 int write_user_refs(Gedcom_write_hndl hndl, int parent,
139                     struct user_ref_number *refn)
140 {
141   int result = 0;
142   struct user_ref_number* obj;
143
144   if (!refn) return 1;
145
146   for (obj = refn; obj; obj = obj->next) {
147     result |= gedcom_write_element_str(hndl, ELT_SUB_IDENT_REFN, 0,
148                                        parent, obj->value);
149     if (obj->type)
150       result |= gedcom_write_element_str(hndl, ELT_SUB_IDENT_REFN_TYPE, 0,
151                                          ELT_SUB_IDENT_REFN, obj->type);
152     if (obj->extra)
153       result |= write_user_data(hndl, obj->extra);    
154   }
155
156   return result;
157 }