Moved to include subdirectory.
[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 "gedcom_internal.h"
14 #include "interface.h"
15
16 static Gedcom_rec_start_cb record_start_callback [LAST_REC] = { NULL };
17 static Gedcom_rec_end_cb   record_end_callback   [LAST_REC] = { NULL };
18 static Gedcom_elt_start_cb element_start_callback[LAST_ELT] = { NULL };
19 static Gedcom_elt_end_cb   element_end_callback  [LAST_ELT] = { NULL };
20 static Gedcom_def_cb       default_cb                       = NULL;
21
22 void gedcom_set_default_callback(Gedcom_def_cb func)
23 {
24   default_cb = func;
25 }
26
27 void gedcom_subscribe_to_record(Gedcom_rec rec,
28                                 Gedcom_rec_start_cb cb_start,
29                                 Gedcom_rec_end_cb cb_end)
30 {
31   record_start_callback[rec] = cb_start;
32   record_end_callback[rec]   = cb_end;
33 }
34
35 void gedcom_subscribe_to_element(Gedcom_elt elt,
36                                  Gedcom_elt_start_cb cb_start,
37                                  Gedcom_elt_end_cb cb_end)
38 {
39   element_start_callback[elt] = cb_start;
40   element_end_callback[elt]   = cb_end;
41 }
42
43 Gedcom_ctxt start_record(Gedcom_rec rec,
44                          int level, char *xref, char *tag)
45 {
46   Gedcom_rec_start_cb cb = record_start_callback[rec];
47   if (cb != NULL)
48     return (*cb)(level, xref, tag);
49   else
50     return NULL;
51 }
52
53 void end_record(Gedcom_rec rec, Gedcom_ctxt self)
54 {
55   Gedcom_rec_end_cb cb = record_end_callback[rec];
56   if (cb != NULL)
57     (*cb)(self);
58 }
59
60 Gedcom_ctxt start_element(Gedcom_elt elt, Gedcom_ctxt parent, 
61                           int level, char *tag, char *raw_value,
62                           Gedcom_val parsed_value)
63 {
64   Gedcom_elt_start_cb cb = element_start_callback[elt];
65   Gedcom_ctxt ctxt = parent;
66   if (cb != NULL)
67     ctxt = (*cb)(parent, level, tag, raw_value, parsed_value);
68   else if (default_cb != NULL)
69     (*default_cb)(parent, level, tag, raw_value);
70   return ctxt;
71 }
72
73 void end_element(Gedcom_elt elt, Gedcom_ctxt parent, Gedcom_ctxt self,
74                  Gedcom_val parsed_value)
75 {
76   Gedcom_elt_end_cb cb = element_end_callback[elt];
77   if (cb != NULL)
78     (*cb)(parent, self, parsed_value);
79 }
80