Full callback interface.
[gedcom-parse.git] / interface.c
1 /*  This program is free software; you can redistribute it and/or modify  *
2  *  it under the terms of the GNU General Public License as published by  *
3  *  the Free Software Foundation; either version 2 of the License, or     *
4  *  (at your option) any later version.                                   *
5
6  (C) 2001 by The Genes Development Team
7  Original author: Peter Verthez (Peter.Verthez@advalvas.be)
8 */
9
10 /* $Id$ */
11 /* $Name$ */
12
13 #include "interface.h"
14
15 static Gedcom_rec_start_cb record_start_callback [LAST_REC] = { NULL };
16 static Gedcom_rec_end_cb   record_end_callback   [LAST_REC] = { NULL };
17 static Gedcom_elt_start_cb element_start_callback[LAST_ELT] = { NULL };
18 static Gedcom_elt_end_cb   element_end_callback  [LAST_ELT] = { NULL };
19 static Gedcom_def_cb       default_cb                       = NULL;
20
21 void gedcom_set_default_callback(Gedcom_def_cb func)
22 {
23   default_cb = func;
24 }
25
26 void gedcom_subscribe_to_record(Gedcom_rec rec,
27                                 Gedcom_rec_start_cb cb_start,
28                                 Gedcom_rec_end_cb cb_end)
29 {
30   record_start_callback[rec] = cb_start;
31   record_end_callback[rec]   = cb_end;
32 }
33
34 void gedcom_subscribe_to_element(Gedcom_elt elt,
35                                  Gedcom_elt_start_cb cb_start,
36                                  Gedcom_elt_end_cb cb_end)
37 {
38   element_start_callback[elt] = cb_start;
39   element_end_callback[elt]   = cb_end;
40 }
41
42 Gedcom_ctxt start_record(Gedcom_rec rec,
43                          int level, char *xref, char *tag)
44 {
45   Gedcom_rec_start_cb cb = record_start_callback[rec];
46   if (cb != NULL)
47     return (*cb)(level, xref, tag);
48   else
49     return NULL;
50 }
51
52 void end_record(Gedcom_rec rec, Gedcom_ctxt self)
53 {
54   Gedcom_rec_end_cb cb = record_end_callback[rec];
55   if (cb != NULL)
56     (*cb)(self);
57 }
58
59 Gedcom_ctxt start_element(Gedcom_elt elt, Gedcom_ctxt parent, 
60                           int level, char *tag, char *raw_value,
61                           Gedcom_val parsed_value)
62 {
63   Gedcom_elt_start_cb cb = element_start_callback[elt];
64   Gedcom_ctxt ctxt = parent;
65   if (cb != NULL)
66     ctxt = (*cb)(parent, level, tag, raw_value, parsed_value);
67   else if (default_cb != NULL)
68     (*default_cb)(parent, level, tag, raw_value);
69   return ctxt;
70 }
71
72 void end_element(Gedcom_elt elt, Gedcom_ctxt parent, Gedcom_ctxt self,
73                  Gedcom_val parsed_value)
74 {
75   Gedcom_elt_end_cb cb = element_end_callback[elt];
76   if (cb != NULL)
77     (*cb)(parent, self, parsed_value);
78 }
79