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
24 /* WARNING: THIS PARSER RELIES HEAVILY ON SOME FEATURES OF BISON.
25 DON'T TRY TO USE IT WITH YACC, IT WON'T WORK...
28 /* Design of the parser:
30 In general, a GEDCOM file contains records, each consisting of a line
31 (which we'll call a section), hierarchically containing other lines
32 (subsections of the section).
34 This means that in general we have:
36 A 'record' is a 'section' (sect) containing 'subsections' (subs)
37 Each 'subsection' (sub) is again a specific 'section' (sect)
39 In parser notation, this means:
43 sect : <some prefix> subs <some suffix>
45 subs : <empty> | subs sub
47 sub : sect_a | sect_b | ...
49 This pattern is repeated throughout the parser for the different types of
53 Cardinality of the subsections:
54 -------------------------------
55 Note that in the above, the order of the subsections is of no importance.
56 Indeed, this is the case in the GEDCOM grammar. However, this also makes
57 it difficult to check whether there are not too many subsections of a
58 specific type, or whether a mandatory subsection is indeed there.
60 Suppose there is a section A that can contain 0 or 1 B section and
63 This can be expressed in parser notation as follows:
65 A : CC | BCC | CBC | CCB
67 So, cardinality is indeed expressable. However, as the number of subsection
68 types and the limits grow bigger (and even theoretically limitless), listing
69 all possible permutations becomes quickly unfeasible.
71 Much simpler is to say:
74 subs : <empty> | subs sub
77 and then check the cardinality in the semantic actions, which is the
78 solution chosen in the parser below, using the following macros:
81 Make a new context for the <parent> tag to count child tags in
83 - OCCUR2(<child>, <min>, <max>)
84 Express that the <child> tag should occur at least <min> times and
85 at most <max> tags within its parent
87 What this actually does is the following. It increments the counter
88 for that tag and then checks whether the maximum is exceeded. If so,
89 then a parser error is produced. The minimum is not actually checked
90 by this macro, but it makes the statements more declarative.
92 - OCCUR1(<child>, <min>)
93 Express that the <child> tag should occur at least <min> times within
94 its parent (no upper limit)
96 Actually, this only increments the counter for the tag, but it looks
97 very like the previous macro.
99 If the minimum is 0, it is not necessary to express this constraint.
101 - CHECKn(<child1>, ..., <childn>)
102 This closes the context for the parent tag and checks whether the
103 given <child> tags did effectively occur within the parent (i.e.
104 these are the tags that were mandatory).
106 Since the <min> values above are always 0 or 1 in GEDCOM, this is
107 sufficient. All sub-tags that declare a minimum of 1 in the OCCUR
108 macros should be listed in this macro here.
110 The macros CHECK0 to CHECK4 are defined like this (the first one
111 has no arguments and is only used to close the parent context; note
112 that this is necessary for correct functioning).
116 Only sections that have subsections need to use these macros. This can
117 be done like this (the OPEN and CHECK macros are used as mid-rule
118 actions around the subsections):
120 head_sect : OPEN DELIM TAG_HEAD
124 CLOSE { <semantic actions> }
130 head_sub : head_sour_sect { OCCUR2(SOUR, 1, 1) }
131 | head_dest_sect { OCCUR2(DEST, 0, 1) }
132 | head_date_sect { OCCUR2(DATE, 0, 1) }
138 - The syntax analysis doesn't handle the contents of the line values;
139 this is done in the semantic analysis.
144 #include "gedcom_internal.h"
145 #include "multilex.h"
146 #include "encoding.h"
147 #include "interface.h"
156 int gedcom_high_level_debug = 0;
157 Gedcom_err_mech error_mechanism = IMMED_FAIL;
158 Gedcom_val_struct val1;
159 Gedcom_val_struct val2;
161 void cleanup_line_item_buffer();
162 struct safe_buffer line_item_buffer = { NULL, 0, NULL, 0,
163 cleanup_line_item_buffer };
165 void cleanup_concat_buffer();
166 struct safe_buffer concat_buffer = { NULL, 0, NULL, 0, cleanup_concat_buffer };
168 void cleanup_usertag_buffer();
169 struct safe_buffer usertag_buffer = { NULL, 0, NULL, 0,
170 cleanup_usertag_buffer};
172 /* These are defined at the bottom of the file */
173 void push_countarray(int level);
174 void set_parenttag(const char* tag);
175 char* get_parenttag(int offset);
176 void set_parentctxt(Gedcom_ctxt ctxt);
177 Gedcom_ctxt get_parentctxt(int offset);
178 void pop_countarray();
179 int count_tag(int tag);
180 int check_occurrence(int tag);
183 #define HANDLE_ERROR \
184 { if (error_mechanism == IMMED_FAIL) { \
185 clean_up(); YYABORT; \
187 else if (error_mechanism == DEFER_FAIL) { \
190 else if (error_mechanism == IGNORE_ERRORS) { \
194 #define START1(PARENTTAG) \
195 { set_parenttag(#PARENTTAG); \
197 #define START2(LEVEL,PARENTCTXT) \
198 { set_parentctxt(PARENTCTXT); \
200 push_countarray(LEVEL); \
202 #define START(PARENTTAG,LEVEL,PARENTCTXT) \
203 { START1(PARENTTAG); \
204 START2(LEVEL,PARENTCTXT); \
208 #define GRANDPARENT(OFF) \
211 { if (!check_occurrence(TAG_##TAG)) { \
212 char* parenttag = get_parenttag(0); \
213 gedcom_error(_("The tag '%s' is mandatory within '%s', but missing"),\
218 #define CHK_COND(TAG) \
219 check_occurrence(TAG_##TAG)
221 { pop_countarray(); \
225 #define CHECK1(TAG1) { CHK(TAG1); POP; }
226 #define CHECK2(TAG1,TAG2) \
227 { CHK(TAG1); CHK(TAG2); POP; }
228 #define CHECK3(TAG1,TAG2,TAG3) \
229 { CHK(TAG1); CHK(TAG2); CHK(TAG3); POP; }
230 #define CHECK4(TAG1,TAG2,TAG3,TAG4) \
231 { CHK(TAG1); CHK(TAG2); CHK(TAG3); CHK(TAG4); POP; }
232 #define OCCUR1(CHILDTAG, MIN) { count_tag(TAG_##CHILDTAG); }
233 #define OCCUR2(CHILDTAG, MIN, MAX) \
234 { int num = count_tag(TAG_##CHILDTAG); \
236 char* parenttag = get_parenttag(0); \
237 gedcom_error(_("The tag '%s' can maximally occur %d time(s) within '%s'"), \
238 #CHILDTAG, MAX, parenttag); \
242 #define INVALID_TAG(CHILDTAG) \
243 { char* parenttag = get_parenttag(0); \
244 gedcom_error(_("The tag '%s' is not a valid tag within '%s'"), \
245 CHILDTAG, parenttag); \
248 #define INVALID_TOP_TAG(CHILDTAG) \
249 { gedcom_error(_("The tag '%s' is not a valid top-level tag"), \
259 struct tag_struct tag;
266 %token <string> BADTOKEN
268 %token <string> CLOSE
269 %token <string> ESCAPE
270 %token <string> DELIM
271 %token <string> ANYCHAR
272 %token <string> POINTER
274 %token <tag> TAG_ABBR
275 %token <tag> TAG_ADDR
276 %token <tag> TAG_ADR1
277 %token <tag> TAG_ADR2
278 %token <tag> TAG_ADOP
281 %token <tag> TAG_AGNC
282 %token <tag> TAG_ALIA
283 %token <tag> TAG_ANCE
284 %token <tag> TAG_ANCI
285 %token <tag> TAG_ANUL
286 %token <tag> TAG_ASSO
287 %token <tag> TAG_AUTH
288 %token <tag> TAG_BAPL
289 %token <tag> TAG_BAPM
290 %token <tag> TAG_BARM
291 %token <tag> TAG_BASM
292 %token <tag> TAG_BIRT
293 %token <tag> TAG_BLES
294 %token <tag> TAG_BLOB
295 %token <tag> TAG_BURI
296 %token <tag> TAG_CALN
297 %token <tag> TAG_CAST
298 %token <tag> TAG_CAUS
299 %token <tag> TAG_CENS
300 %token <tag> TAG_CHAN
301 %token <tag> TAG_CHAR
302 %token <tag> TAG_CHIL
304 %token <tag> TAG_CHRA
305 %token <tag> TAG_CITY
306 %token <tag> TAG_CONC
307 %token <tag> TAG_CONF
308 %token <tag> TAG_CONL
309 %token <tag> TAG_CONT
310 %token <tag> TAG_COPR
311 %token <tag> TAG_CORP
312 %token <tag> TAG_CREM
313 %token <tag> TAG_CTRY
314 %token <tag> TAG_DATA
315 %token <tag> TAG_DATE
316 %token <tag> TAG_DEAT
317 %token <tag> TAG_DESC
318 %token <tag> TAG_DESI
319 %token <tag> TAG_DEST
321 %token <tag> TAG_DIVF
322 %token <tag> TAG_DSCR
323 %token <tag> TAG_EDUC
324 %token <tag> TAG_EMIG
325 %token <tag> TAG_ENDL
326 %token <tag> TAG_ENGA
327 %token <tag> TAG_EVEN
329 %token <tag> TAG_FAMC
330 %token <tag> TAG_FAMF
331 %token <tag> TAG_FAMS
332 %token <tag> TAG_FCOM
333 %token <tag> TAG_FILE
334 %token <tag> TAG_FORM
335 %token <tag> TAG_GEDC
336 %token <tag> TAG_GIVN
337 %token <tag> TAG_GRAD
338 %token <tag> TAG_HEAD
339 %token <tag> TAG_HUSB
340 %token <tag> TAG_IDNO
341 %token <tag> TAG_IMMI
342 %token <tag> TAG_INDI
343 %token <tag> TAG_LANG
344 %token <tag> TAG_LEGA
345 %token <tag> TAG_MARB
346 %token <tag> TAG_MARC
347 %token <tag> TAG_MARL
348 %token <tag> TAG_MARR
349 %token <tag> TAG_MARS
350 %token <tag> TAG_MEDI
351 %token <tag> TAG_NAME
352 %token <tag> TAG_NATI
353 %token <tag> TAG_NATU
354 %token <tag> TAG_NCHI
355 %token <tag> TAG_NICK
357 %token <tag> TAG_NOTE
358 %token <tag> TAG_NPFX
359 %token <tag> TAG_NSFX
360 %token <tag> TAG_OBJE
361 %token <tag> TAG_OCCU
362 %token <tag> TAG_ORDI
363 %token <tag> TAG_ORDN
364 %token <tag> TAG_PAGE
365 %token <tag> TAG_PEDI
366 %token <tag> TAG_PHON
367 %token <tag> TAG_PLAC
368 %token <tag> TAG_POST
369 %token <tag> TAG_PROB
370 %token <tag> TAG_PROP
371 %token <tag> TAG_PUBL
372 %token <tag> TAG_QUAY
373 %token <tag> TAG_REFN
374 %token <tag> TAG_RELA
375 %token <tag> TAG_RELI
376 %token <tag> TAG_REPO
377 %token <tag> TAG_RESI
378 %token <tag> TAG_RESN
379 %token <tag> TAG_RETI
382 %token <tag> TAG_ROLE
384 %token <tag> TAG_SLGC
385 %token <tag> TAG_SLGS
386 %token <tag> TAG_SOUR
387 %token <tag> TAG_SPFX
389 %token <tag> TAG_STAE
390 %token <tag> TAG_STAT
391 %token <tag> TAG_SUBM
392 %token <tag> TAG_SUBN
393 %token <tag> TAG_SURN
394 %token <tag> TAG_TEMP
395 %token <tag> TAG_TEXT
396 %token <tag> TAG_TIME
397 %token <tag> TAG_TITL
398 %token <tag> TAG_TRLR
399 %token <tag> TAG_TYPE
400 %token <tag> TAG_VERS
401 %token <tag> TAG_WIFE
402 %token <tag> TAG_WILL
404 %type <tag> anystdtag
405 %type <tag> anytoptag
406 %type <tag> fam_event_tag
407 %type <tag> indiv_attr_tag
408 %type <tag> indiv_birt_tag
409 %type <tag> indiv_gen_tag
410 %type <tag> lio_bapl_tag
411 %type <string> line_item
412 %type <string> mand_line_item
413 %type <string> mand_pointer
414 %type <string> note_line_item
415 %type <string> anychar
416 %type <string> opt_xref
417 %type <string> opt_value
418 %type <string> opt_line_item
419 %type <ctxt> head_sect
423 file : head_sect records trlr_sect
424 { if (fail == 1) YYABORT; }
429 records : /* empty */
444 /*********************************************************************/
446 /*********************************************************************/
447 head_sect : OPEN DELIM TAG_HEAD
448 { $<ctxt>$ = start_record(REC_HEAD, $1, GEDCOM_MAKE_NULL(val1),
450 NULL, GEDCOM_MAKE_NULL(val2));
451 START(HEAD, $1, $<ctxt>$) }
453 { if (compat_mode(C_NO_SUBMITTER) && ! CHK_COND(SUBM))
454 compat_generate_submitter_link($<ctxt>4);
457 if (compat_mode(C_NO_GEDC) && ! CHK_COND(GEDC))
458 compat_generate_gedcom($<ctxt>4);
461 if (compat_mode(C_NO_CHAR) && ! CHK_COND(CHAR)) {
462 if (compat_generate_char($<ctxt>4)) HANDLE_ERROR;
469 { end_record(REC_HEAD, $<ctxt>4, GEDCOM_MAKE_NULL(val1));
470 if (compat_mode(C_NO_SUBMITTER))
471 compat_generate_submitter();
475 head_subs : /* empty */
479 head_sub : head_sour_sect { OCCUR2(SOUR, 1, 1) }
480 | head_dest_sect { OCCUR2(DEST, 0, 1) }
481 | head_date_sect { OCCUR2(DATE, 0, 1) }
482 | head_time_sect { if (!compat_mode(C_HEAD_TIME))
485 | head_subm_sect { OCCUR2(SUBM, 1, 1) }
486 | head_subn_sect { OCCUR2(SUBN, 0, 1) }
487 | head_file_sect { OCCUR2(FILE, 0, 1) }
488 | head_copr_sect { OCCUR2(COPR, 0, 1) }
489 | head_gedc_sect { OCCUR2(GEDC, 1, 1) }
490 | head_char_sect { OCCUR2(CHAR, 1, 1) }
491 | head_lang_sect { OCCUR2(LANG, 0, 1) }
492 | head_plac_sect { OCCUR2(PLAC, 0, 1) }
493 | head_note_sect { OCCUR2(NOTE, 0, 1) }
498 head_sour_sect : OPEN DELIM TAG_SOUR mand_line_item
499 { set_compatibility_program($4);
500 $<ctxt>$ = start_element(ELT_HEAD_SOUR, PARENT,
502 GEDCOM_MAKE_STRING(val1, $4));
503 START(SOUR, $1, $<ctxt>$)
508 { compute_compatibility();
509 end_element(ELT_HEAD_SOUR, PARENT, $<ctxt>5,
510 GEDCOM_MAKE_NULL(val1)); }
513 head_sour_subs : /* empty */
514 | head_sour_subs head_sour_sub
517 head_sour_sub : head_sour_vers_sect { OCCUR2(VERS, 0, 1) }
518 | head_sour_name_sect { OCCUR2(NAME, 0, 1) }
519 | head_sour_corp_sect { OCCUR2(CORP, 0, 1) }
520 | head_sour_data_sect { OCCUR2(DATA, 0, 1) }
524 head_sour_vers_sect : OPEN DELIM TAG_VERS mand_line_item
525 { set_compatibility_version($4);
526 $<ctxt>$ = start_element(ELT_HEAD_SOUR_VERS, PARENT,
528 GEDCOM_MAKE_STRING(val1, $4));
529 START(VERS, $1, $<ctxt>$)
534 { end_element(ELT_HEAD_SOUR_VERS,
535 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
538 head_sour_name_sect : OPEN DELIM TAG_NAME mand_line_item
539 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_NAME, PARENT,
541 GEDCOM_MAKE_STRING(val1, $4));
542 START(NAME, $1, $<ctxt>$)
547 { end_element(ELT_HEAD_SOUR_NAME,
548 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
551 head_sour_corp_sect : OPEN DELIM TAG_CORP mand_line_item
552 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_CORP, PARENT,
554 GEDCOM_MAKE_STRING(val1, $4));
555 START(CORP, $1, $<ctxt>$)
560 { end_element(ELT_HEAD_SOUR_CORP,
561 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
565 head_sour_corp_subs : /* empty */
566 | head_sour_corp_subs head_sour_corp_sub
569 head_sour_corp_sub : addr_struc_sub /* 0:1 */
573 head_sour_data_sect : OPEN DELIM TAG_DATA mand_line_item
574 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_DATA, PARENT,
576 GEDCOM_MAKE_STRING(val1, $4));
577 START(DATA, $1, $<ctxt>$)
582 { end_element(ELT_HEAD_SOUR_DATA,
583 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
587 head_sour_data_subs : /* empty */
588 | head_sour_data_subs head_sour_data_sub
591 head_sour_data_sub : head_sour_data_date_sect { OCCUR2(DATE, 0, 1) }
592 | head_sour_data_copr_sect { OCCUR2(COPR, 0, 1) }
596 head_sour_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
597 { struct date_value dv = gedcom_parse_date($4);
599 = start_element(ELT_HEAD_SOUR_DATA_DATE,
601 GEDCOM_MAKE_DATE(val1, dv));
602 START(DATE, $1, $<ctxt>$)
607 { end_element(ELT_HEAD_SOUR_DATA_DATE,
609 GEDCOM_MAKE_NULL(val1));
612 head_sour_data_copr_sect : OPEN DELIM TAG_COPR mand_line_item
614 = start_element(ELT_HEAD_SOUR_DATA_COPR,
616 GEDCOM_MAKE_STRING(val1, $4));
617 START(COPR, $1, $<ctxt>$)
622 { end_element(ELT_HEAD_SOUR_DATA_COPR,
624 GEDCOM_MAKE_NULL(val1));
629 head_dest_sect : OPEN DELIM TAG_DEST mand_line_item
630 { $<ctxt>$ = start_element(ELT_HEAD_DEST,
632 GEDCOM_MAKE_STRING(val1, $4));
633 START(DEST, $1, $<ctxt>$)
638 { end_element(ELT_HEAD_DEST,
639 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
644 head_date_sect : OPEN DELIM TAG_DATE mand_line_item
645 { struct date_value dv = gedcom_parse_date($4);
646 $<ctxt>$ = start_element(ELT_HEAD_DATE,
648 GEDCOM_MAKE_DATE(val1, dv));
649 START(DATE, $1, $<ctxt>$)
654 { end_element(ELT_HEAD_DATE,
655 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
659 head_date_subs : /* empty */
660 | head_date_subs head_date_sub
663 head_date_sub : head_date_time_sect { OCCUR2(TIME, 0, 1) }
667 head_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
668 { $<ctxt>$ = start_element(ELT_HEAD_DATE_TIME,
670 GEDCOM_MAKE_STRING(val1, $4));
671 START(TIME, $1, $<ctxt>$)
676 { end_element(ELT_HEAD_DATE_TIME,
677 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
681 /* HEAD.TIME (Only for compatibility) */
682 /* Just ignore the time... */
683 head_time_sect : OPEN DELIM TAG_TIME opt_line_item CLOSE
684 { gedcom_warning(_("Header change time lost in the compatibility"));
689 head_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
690 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
692 if (xr == NULL) HANDLE_ERROR;
693 $<ctxt>$ = start_element(ELT_HEAD_SUBM,
695 GEDCOM_MAKE_XREF_PTR(val1, xr));
696 START(SUBM, $1, $<ctxt>$)
701 { end_element(ELT_HEAD_SUBM,
702 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
706 head_subn_sect : OPEN DELIM TAG_SUBN mand_pointer
707 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
709 if (xr == NULL) HANDLE_ERROR;
710 $<ctxt>$ = start_element(ELT_HEAD_SUBN,
712 GEDCOM_MAKE_XREF_PTR(val1, xr));
713 START(SUBN, $1, $<ctxt>$)
718 { end_element(ELT_HEAD_SUBN,
719 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
723 head_file_sect : OPEN DELIM TAG_FILE mand_line_item
724 { $<ctxt>$ = start_element(ELT_HEAD_FILE,
726 GEDCOM_MAKE_STRING(val1, $4));
727 START(FILE, $1, $<ctxt>$)
732 { end_element(ELT_HEAD_FILE, PARENT, $<ctxt>5,
733 GEDCOM_MAKE_NULL(val1));
737 head_copr_sect : OPEN DELIM TAG_COPR mand_line_item
738 { $<ctxt>$ = start_element(ELT_HEAD_COPR,
740 GEDCOM_MAKE_STRING(val1, $4));
741 START(COPR, $1, $<ctxt>$)
746 { end_element(ELT_HEAD_COPR, PARENT, $<ctxt>5,
747 GEDCOM_MAKE_NULL(val1));
751 head_gedc_sect : OPEN DELIM TAG_GEDC
752 { $<ctxt>$ = start_element(ELT_HEAD_GEDC,
753 PARENT, $1, $3, NULL,
754 GEDCOM_MAKE_NULL(val1));
755 START(GEDC, $1, $<ctxt>$)
758 { if (compat_mode(C_NO_GEDC_FORM) && ! CHK_COND(FORM))
759 compat_generate_gedcom_form($<ctxt>4);
766 { end_element(ELT_HEAD_GEDC, PARENT, $<ctxt>4,
767 GEDCOM_MAKE_NULL(val1));
771 head_gedc_subs : /* empty */
772 | head_gedc_subs head_gedc_sub
775 head_gedc_sub : head_gedc_vers_sect { OCCUR2(VERS, 1, 1) }
776 | head_gedc_form_sect { OCCUR2(FORM, 1, 1) }
779 head_gedc_vers_sect : OPEN DELIM TAG_VERS mand_line_item
780 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_VERS,
782 GEDCOM_MAKE_STRING(val1, $4));
783 START(VERS, $1, $<ctxt>$)
788 { end_element(ELT_HEAD_GEDC_VERS,
789 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
792 head_gedc_form_sect : OPEN DELIM TAG_FORM mand_line_item
793 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_FORM,
795 GEDCOM_MAKE_STRING(val1, $4));
796 START(FORM, $1, $<ctxt>$)
801 { end_element(ELT_HEAD_GEDC_FORM,
802 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
807 head_char_sect : OPEN DELIM TAG_CHAR mand_line_item
808 { /* Don't allow to continue if conversion context couldn't
810 if (open_conv_to_internal($4) == 0) HANDLE_ERROR;
811 $<ctxt>$ = start_element(ELT_HEAD_CHAR,
813 GEDCOM_MAKE_STRING(val1, $4));
814 START(CHAR, $1, $<ctxt>$)
819 { end_element(ELT_HEAD_CHAR, PARENT, $<ctxt>5,
820 GEDCOM_MAKE_NULL(val1));
824 head_char_subs : /* empty */
825 | head_char_subs head_char_sub
828 head_char_sub : head_char_vers_sect { OCCUR2(VERS, 0, 1) }
831 head_char_vers_sect : OPEN DELIM TAG_VERS mand_line_item
832 { $<ctxt>$ = start_element(ELT_HEAD_CHAR_VERS,
834 GEDCOM_MAKE_STRING(val1, $4));
835 START(VERS, $1, $<ctxt>$)
840 { end_element(ELT_HEAD_CHAR_VERS,
841 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
846 head_lang_sect : OPEN DELIM TAG_LANG mand_line_item
847 { $<ctxt>$ = start_element(ELT_HEAD_LANG,
849 GEDCOM_MAKE_STRING(val1, $4));
850 START(LANG, $1, $<ctxt>$)
855 { end_element(ELT_HEAD_LANG, PARENT, $<ctxt>5,
856 GEDCOM_MAKE_NULL(val1));
860 head_plac_sect : OPEN DELIM TAG_PLAC
861 { $<ctxt>$ = start_element(ELT_HEAD_PLAC,
862 PARENT, $1, $3, NULL,
863 GEDCOM_MAKE_NULL(val1));
864 START(PLAC, $1, $<ctxt>$)
869 { end_element(ELT_HEAD_PLAC, PARENT, $<ctxt>4,
870 GEDCOM_MAKE_NULL(val1));
874 head_plac_subs : /* empty */
875 | head_plac_subs head_plac_sub
878 head_plac_sub : head_plac_form_sect { OCCUR2(FORM, 1, 1) }
881 head_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
882 { $<ctxt>$ = start_element(ELT_HEAD_PLAC_FORM,
884 GEDCOM_MAKE_STRING(val1, $4));
885 START(FORM, $1, $<ctxt>$)
890 { end_element(ELT_HEAD_PLAC_FORM,
891 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
896 head_note_sect : OPEN DELIM TAG_NOTE mand_line_item
897 { $<ctxt>$ = start_element(ELT_HEAD_NOTE,
899 GEDCOM_MAKE_STRING(val1, $4));
900 reset_buffer(&concat_buffer);
901 safe_buf_append(&concat_buffer, $4);
902 START(NOTE, $1, $<ctxt>$)
907 { char* complete = get_buf_string(&concat_buffer);
908 end_element(ELT_HEAD_NOTE, PARENT, $<ctxt>5,
909 GEDCOM_MAKE_STRING(val1, complete));
913 head_note_subs : /* empty */
914 | head_note_subs head_note_sub
917 head_note_sub : continuation_sub /* 0:M */
921 /*********************************************************************/
923 /*********************************************************************/
924 /* Don't need callbacks here, there is no information... */
925 trlr_sect : OPEN DELIM TAG_TRLR CLOSE { }
928 /*********************************************************************/
929 /**** Family record ****/
930 /*********************************************************************/
931 fam_rec : OPEN DELIM POINTER DELIM TAG_FAM
932 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
934 if (xr == NULL) HANDLE_ERROR;
935 $<ctxt>$ = start_record(REC_FAM,
936 $1, GEDCOM_MAKE_XREF_PTR(val1, xr),
938 NULL, GEDCOM_MAKE_NULL(val2));
939 START(FAM, $1, $<ctxt>$) }
943 { end_record(REC_FAM, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
946 fam_subs : /* empty */
950 fam_sub : fam_event_struc_sub /* 0:M */
951 | fam_husb_sect { OCCUR2(HUSB, 0, 1) }
952 | fam_wife_sect { OCCUR2(WIFE, 0, 1) }
953 | fam_chil_sect /* 0:M */
954 | fam_nchi_sect { OCCUR2(NCHI, 0, 1) }
955 | fam_subm_sect /* 0:M */
956 | lds_spouse_seal_sub /* 0:M */
957 | source_cit_sub /* 0:M */
958 | multim_link_sub /* 0:M */
959 | note_struc_sub /* 0:M */
960 | ident_struc_sub /* 0:1 */
961 | change_date_sub /* 0:1 */
966 fam_husb_sect : OPEN DELIM TAG_HUSB mand_pointer
967 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
969 if (xr == NULL) HANDLE_ERROR;
970 $<ctxt>$ = start_element(ELT_FAM_HUSB,
972 GEDCOM_MAKE_XREF_PTR(val1, xr));
973 START(HUSB, $1, $<ctxt>$)
978 { end_element(ELT_FAM_HUSB, PARENT, $<ctxt>5,
979 GEDCOM_MAKE_NULL(val1));
984 fam_wife_sect : OPEN DELIM TAG_WIFE mand_pointer
985 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
987 if (xr == NULL) HANDLE_ERROR;
988 $<ctxt>$ = start_element(ELT_FAM_WIFE,
990 GEDCOM_MAKE_XREF_PTR(val1, xr));
991 START(WIFE, $1, $<ctxt>$)
996 { end_element(ELT_FAM_WIFE, PARENT, $<ctxt>5,
997 GEDCOM_MAKE_NULL(val1));
1002 fam_chil_sect : OPEN DELIM TAG_CHIL mand_pointer
1003 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1005 if (xr == NULL) HANDLE_ERROR;
1006 $<ctxt>$ = start_element(ELT_FAM_CHIL,
1008 GEDCOM_MAKE_XREF_PTR(val1, xr));
1009 START(CHIL, $1, $<ctxt>$)
1014 { end_element(ELT_FAM_CHIL, PARENT, $<ctxt>5,
1015 GEDCOM_MAKE_NULL(val1));
1020 fam_nchi_sect : OPEN DELIM TAG_NCHI mand_line_item
1021 { $<ctxt>$ = start_element(ELT_FAM_NCHI,
1023 GEDCOM_MAKE_STRING(val1, $4));
1024 START(NCHI, $1, $<ctxt>$)
1029 { end_element(ELT_FAM_NCHI, PARENT, $<ctxt>5,
1030 GEDCOM_MAKE_NULL(val1));
1035 fam_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1036 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1038 if (xr == NULL) HANDLE_ERROR;
1039 $<ctxt>$ = start_element(ELT_FAM_SUBM,
1041 GEDCOM_MAKE_XREF_PTR(val1, xr));
1042 START(SUBM, $1, $<ctxt>$)
1047 { end_element(ELT_FAM_SUBM, PARENT, $<ctxt>5,
1048 GEDCOM_MAKE_NULL(val1));
1052 /*********************************************************************/
1053 /**** Individual record ****/
1054 /*********************************************************************/
1055 indiv_rec : OPEN DELIM POINTER DELIM TAG_INDI
1056 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1058 if (xr == NULL) HANDLE_ERROR;
1059 $<ctxt>$ = start_record(REC_INDI,
1060 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1061 NULL, GEDCOM_MAKE_NULL(val2));
1062 START(INDI, $1, $<ctxt>$) }
1066 { end_record(REC_INDI, $<ctxt>6, GEDCOM_MAKE_NULL(val1));
1067 if (compat_mode(C_NO_SLGC_FAMC))
1068 compat_generate_slgc_famc_fam();
1072 indi_subs : /* empty */
1073 | indi_subs indi_sub
1076 indi_sub : indi_resn_sect { OCCUR2(RESN, 0, 1) }
1077 | pers_name_struc_sub /* 0:M */
1078 | indi_sex_sect { OCCUR2(SEX, 0, 1) }
1079 | indiv_even_struc_sub /* 0:M */
1080 | indiv_attr_struc_sub /* 0:M */
1081 | lds_indiv_ord_sub /* 0:M */
1082 | chi_fam_link_sub /* 0:M */
1083 | spou_fam_link_sub /* 0:M */
1084 | indi_subm_sect /* 0:M */
1085 | assoc_struc_sub /* 0:M */
1086 | indi_alia_sect /* 0:M */
1087 | indi_anci_sect /* 0:M */
1088 | indi_desi_sect /* 0:M */
1089 | source_cit_sub /* 0:M */
1090 | multim_link_sub /* 0:M */
1091 | note_struc_sub /* 0:M */
1092 | indi_rfn_sect { OCCUR2(RFN, 0, 1) }
1093 | indi_afn_sect /* 0:M */
1094 | ident_struc_sub /* 0:1 */
1095 | change_date_sub /* 0:1 */
1096 | indi_addr_sect { if (!compat_mode(C_INDI_ADDR))
1097 INVALID_TAG("ADDR");
1103 indi_resn_sect : OPEN DELIM TAG_RESN mand_line_item
1104 { $<ctxt>$ = start_element(ELT_INDI_RESN,
1106 GEDCOM_MAKE_STRING(val1, $4));
1107 START(RESN, $1, $<ctxt>$)
1112 { end_element(ELT_INDI_RESN, PARENT, $<ctxt>5,
1113 GEDCOM_MAKE_NULL(val1));
1118 indi_sex_sect : OPEN DELIM TAG_SEX mand_line_item
1119 { $<ctxt>$ = start_element(ELT_INDI_SEX,
1121 GEDCOM_MAKE_STRING(val1, $4));
1122 START(SEX, $1, $<ctxt>$)
1127 { end_element(ELT_INDI_SEX, PARENT, $<ctxt>5,
1128 GEDCOM_MAKE_NULL(val1));
1133 indi_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1134 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1136 if (xr == NULL) HANDLE_ERROR;
1137 $<ctxt>$ = start_element(ELT_INDI_SUBM,
1139 GEDCOM_MAKE_XREF_PTR(val1, xr));
1140 START(SUBM, $1, $<ctxt>$)
1145 { end_element(ELT_INDI_SUBM, PARENT, $<ctxt>5,
1146 GEDCOM_MAKE_NULL(val1));
1151 indi_alia_sect : OPEN DELIM TAG_ALIA mand_pointer
1152 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1154 if (xr == NULL) HANDLE_ERROR;
1155 $<ctxt>$ = start_element(ELT_INDI_ALIA,
1157 GEDCOM_MAKE_XREF_PTR(val1, xr));
1158 START(ALIA, $1, $<ctxt>$)
1163 { end_element(ELT_INDI_ALIA, PARENT, $<ctxt>5,
1164 GEDCOM_MAKE_NULL(val1));
1169 indi_anci_sect : OPEN DELIM TAG_ANCI mand_pointer
1170 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1172 if (xr == NULL) HANDLE_ERROR;
1173 $<ctxt>$ = start_element(ELT_INDI_ANCI,
1175 GEDCOM_MAKE_XREF_PTR(val1, xr));
1176 START(ANCI, $1, $<ctxt>$)
1181 { end_element(ELT_INDI_ANCI, PARENT, $<ctxt>5,
1182 GEDCOM_MAKE_NULL(val1));
1187 indi_desi_sect : OPEN DELIM TAG_DESI mand_pointer
1188 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1190 if (xr == NULL) HANDLE_ERROR;
1191 $<ctxt>$ = start_element(ELT_INDI_DESI,
1193 GEDCOM_MAKE_XREF_PTR(val1, xr));
1194 START(DESI, $1, $<ctxt>$)
1199 { end_element(ELT_INDI_DESI, PARENT, $<ctxt>5,
1200 GEDCOM_MAKE_NULL(val1));
1205 indi_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1206 { $<ctxt>$ = start_element(ELT_INDI_RFN,
1208 GEDCOM_MAKE_STRING(val1, $4));
1209 START(RFN, $1, $<ctxt>$)
1214 { end_element(ELT_INDI_RFN, PARENT, $<ctxt>5,
1215 GEDCOM_MAKE_NULL(val1));
1220 indi_afn_sect : OPEN DELIM TAG_AFN mand_line_item
1221 { $<ctxt>$ = start_element(ELT_INDI_AFN,
1223 GEDCOM_MAKE_STRING(val1, $4));
1224 START(AFN, $1, $<ctxt>$)
1229 { end_element(ELT_INDI_AFN, PARENT, $<ctxt>5,
1230 GEDCOM_MAKE_NULL(val1));
1234 /* INDI.ADDR (Only for compatibility) */
1235 indi_addr_sect : OPEN DELIM TAG_ADDR opt_line_item
1236 { if (compat_mode(C_INDI_ADDR)) {
1237 Gedcom_ctxt par = compat_generate_resi_start(PARENT);
1238 START(RESI, $1, par);
1240 = start_element(ELT_SUB_ADDR,
1241 par, $1 + 1, $3, $4,
1242 GEDCOM_MAKE_NULL_OR_STRING(val2, $4));
1243 reset_buffer(&concat_buffer);
1244 safe_buf_append(&concat_buffer, $4);
1245 START(ADDR, $1 + 1, $<ctxt>$);
1247 else { START(ADDR, $1, NULL) }
1252 { if (compat_mode(C_INDI_ADDR)) {
1253 Gedcom_ctxt par = PARENT;
1254 char* complete = get_buf_string(&concat_buffer);
1255 end_element(ELT_SUB_ADDR, par, $<ctxt>5,
1256 GEDCOM_MAKE_STRING(val1, complete));
1258 compat_generate_resi_end(PARENT, par);
1263 ftree_addr_subs : /* empty */
1264 | ftree_addr_subs ftree_addr_sub
1267 ftree_addr_sub : continuation_sub
1268 | ftree_addr_phon_sect
1272 ftree_addr_phon_sect : OPEN DELIM TAG_PHON mand_line_item
1274 = start_element(ELT_SUB_PHON,
1275 GRANDPARENT(1), $1, $3, $4,
1276 GEDCOM_MAKE_STRING(val1, $4));
1277 START(PHON, $1, $<ctxt>$)
1282 { end_element(ELT_SUB_PHON, GRANDPARENT(1),
1283 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1287 /*********************************************************************/
1288 /**** Multimedia record ****/
1289 /*********************************************************************/
1290 multim_rec : OPEN DELIM POINTER DELIM TAG_OBJE
1291 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1293 if (xr == NULL) HANDLE_ERROR;
1294 $<ctxt>$ = start_record(REC_OBJE,
1295 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1296 NULL, GEDCOM_MAKE_NULL(val2));
1297 START(OBJE, $1, $<ctxt>$) }
1299 { CHECK2(FORM, BLOB) }
1301 { end_record(REC_OBJE, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1304 obje_subs : /* empty */
1305 | obje_subs obje_sub
1308 obje_sub : obje_form_sect { OCCUR2(FORM, 1, 1) }
1309 | obje_titl_sect { OCCUR2(TITL, 0, 1) }
1310 | note_struc_sub /* 0:M */
1311 | obje_blob_sect { OCCUR2(BLOB, 1, 1) }
1312 | obje_obje_sect { OCCUR2(OBJE, 0, 1) }
1313 | ident_struc_sub /* 0:1 */
1314 | change_date_sub /* 0:1 */
1319 obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
1320 { $<ctxt>$ = start_element(ELT_OBJE_FORM,
1322 GEDCOM_MAKE_STRING(val1, $4));
1323 START(FORM, $1, $<ctxt>$)
1328 { end_element(ELT_OBJE_FORM, PARENT, $<ctxt>5,
1329 GEDCOM_MAKE_NULL(val1));
1334 obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1335 { $<ctxt>$ = start_element(ELT_OBJE_TITL,
1337 GEDCOM_MAKE_STRING(val1, $4));
1338 START(TITL, $1, $<ctxt>$)
1343 { end_element(ELT_OBJE_TITL, PARENT, $<ctxt>5,
1344 GEDCOM_MAKE_NULL(val1));
1349 obje_blob_sect : OPEN DELIM TAG_BLOB
1350 { $<ctxt>$ = start_element(ELT_OBJE_BLOB,
1351 PARENT, $1, $3, NULL,
1352 GEDCOM_MAKE_NULL(val1));
1353 reset_buffer(&concat_buffer);
1354 START(BLOB, $1, $<ctxt>$)
1359 { char* complete = get_buf_string(&concat_buffer);
1360 end_element(ELT_OBJE_BLOB, PARENT, $<ctxt>4,
1361 GEDCOM_MAKE_STRING(val1, complete));
1365 obje_blob_subs : /* empty */
1366 | obje_blob_subs obje_blob_sub
1369 obje_blob_sub : obje_blob_cont_sect { OCCUR1(CONT, 1) }
1373 obje_blob_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1374 { $<ctxt>$ = start_element(ELT_OBJE_BLOB_CONT,
1376 GEDCOM_MAKE_STRING(val1, $4));
1377 safe_buf_append(&concat_buffer, $4);
1378 START(CONT, $1, $<ctxt>$)
1383 { end_element(ELT_OBJE_BLOB_CONT, PARENT,
1384 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1389 obje_obje_sect : OPEN DELIM TAG_OBJE mand_pointer
1390 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1392 if (xr == NULL) HANDLE_ERROR;
1393 $<ctxt>$ = start_element(ELT_OBJE_OBJE,
1395 GEDCOM_MAKE_XREF_PTR(val1, xr));
1396 START(OBJE, $1, $<ctxt>$)
1401 { end_element(ELT_OBJE_OBJE, PARENT, $<ctxt>5,
1402 GEDCOM_MAKE_NULL(val1));
1406 /*********************************************************************/
1407 /**** Note record ****/
1408 /*********************************************************************/
1409 note_rec : OPEN DELIM POINTER DELIM TAG_NOTE note_line_item
1410 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1412 if (xr == NULL) HANDLE_ERROR;
1413 $<ctxt>$ = start_record(REC_NOTE,
1414 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1415 $6, GEDCOM_MAKE_STRING(val2, $6));
1416 reset_buffer(&concat_buffer);
1417 safe_buf_append(&concat_buffer, $6);
1418 START(NOTE, $1, $<ctxt>$) }
1422 { char* complete = get_buf_string(&concat_buffer);
1423 end_record(REC_NOTE, $<ctxt>7,
1424 GEDCOM_MAKE_STRING(val1, complete)); }
1427 note_line_item : /* empty */
1428 { if (!compat_mode(C_NOTE_NO_VALUE)) {
1429 gedcom_error(_("Missing value")); YYERROR;
1432 $$ = VALUE_IF_MISSING;
1436 { gedcom_debug_print("==Val: %s==", $2);
1440 note_subs : /* empty */
1441 | note_subs note_sub
1444 note_sub : continuation_sub /* 0:M */
1445 | source_cit_sub /* 0:M */
1446 | ident_struc_sub /* 0:1 */
1447 | change_date_sub /* 0:1 */
1448 | note_note_sect { if (!compat_mode(C_NOTE_NOTE))
1449 INVALID_TAG("NOTE");
1454 /* Same actions as cont_sect, for compatibility */
1455 note_note_sect : OPEN DELIM TAG_NOTE opt_line_item
1456 { $3.string = "CONT";
1457 $3.value = TAG_CONT;
1458 $<ctxt>$ = start_element(ELT_SUB_CONT,
1460 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
1461 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
1462 if (GEDCOM_IS_STRING(&val1))
1463 safe_buf_append(&concat_buffer, $4);
1464 START(CONT, $1, $<ctxt>$)
1469 { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5,
1470 GEDCOM_MAKE_NULL(val1));
1474 /*********************************************************************/
1475 /**** Repository record ****/
1476 /*********************************************************************/
1477 repos_rec : OPEN DELIM POINTER DELIM TAG_REPO
1478 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1480 if (xr == NULL) HANDLE_ERROR;
1481 $<ctxt>$ = start_record(REC_REPO,
1482 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1483 NULL, GEDCOM_MAKE_NULL(val2));
1484 START(REPO, $1, $<ctxt>$) }
1488 { end_record(REC_REPO, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1491 repo_subs : /* empty */
1492 | repo_subs repo_sub
1495 repo_sub : repo_name_sect { OCCUR2(NAME, 0, 1) }
1496 | addr_struc_sub /* 0:1 */
1497 | note_struc_sub /* 0:M */
1498 | ident_struc_sub /* 0:1 */
1499 | change_date_sub /* 0:1 */
1504 repo_name_sect : OPEN DELIM TAG_NAME mand_line_item
1505 { $<ctxt>$ = start_element(ELT_REPO_NAME,
1507 GEDCOM_MAKE_STRING(val1, $4));
1508 START(NAME, $1, $<ctxt>$)
1513 { end_element(ELT_REPO_NAME, PARENT, $<ctxt>5,
1514 GEDCOM_MAKE_NULL(val1));
1518 /*********************************************************************/
1519 /**** Source record ****/
1520 /*********************************************************************/
1521 source_rec : OPEN DELIM POINTER DELIM TAG_SOUR
1522 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1524 if (xr == NULL) HANDLE_ERROR;
1525 $<ctxt>$ = start_record(REC_SOUR,
1526 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1527 NULL, GEDCOM_MAKE_NULL(val2));
1528 START(SOUR, $1, $<ctxt>$) }
1532 { end_record(REC_SOUR, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1535 sour_subs : /* empty */
1536 | sour_subs sour_sub
1539 sour_sub : sour_data_sect { OCCUR2(DATA, 0, 1) }
1540 | sour_auth_sect { OCCUR2(AUTH, 0, 1) }
1541 | sour_titl_sect { OCCUR2(TITL, 0, 1) }
1542 | sour_abbr_sect { OCCUR2(ABBR, 0, 1) }
1543 | sour_publ_sect { OCCUR2(PUBL, 0, 1) }
1544 | sour_text_sect { OCCUR2(TEXT, 0, 1) }
1545 | source_repos_cit_sub /* 0:1 */
1546 | multim_link_sub /* 0:M */
1547 | note_struc_sub /* 0:M */
1548 | ident_struc_sub /* 0:1 */
1549 | change_date_sub /* 0:1 */
1554 sour_data_sect : OPEN DELIM TAG_DATA
1555 { $<ctxt>$ = start_element(ELT_SOUR_DATA,
1556 PARENT, $1, $3, NULL,
1557 GEDCOM_MAKE_NULL(val1));
1558 START(DATA, $1, $<ctxt>$)
1563 { end_element(ELT_SOUR_DATA, PARENT, $<ctxt>4,
1564 GEDCOM_MAKE_NULL(val1));
1568 sour_data_subs : /* empty */
1569 | sour_data_subs sour_data_sub
1572 sour_data_sub : sour_data_even_sect /* 0:M */
1573 | sour_data_agnc_sect { OCCUR2(AGNC, 0, 1) }
1574 | note_struc_sub /* 0:M */
1578 sour_data_even_sect : OPEN DELIM TAG_EVEN mand_line_item
1579 { $<ctxt>$ = start_element(ELT_SOUR_DATA_EVEN,
1581 GEDCOM_MAKE_STRING(val1, $4));
1582 START(EVEN, $1, $<ctxt>$)
1587 { end_element(ELT_SOUR_DATA_EVEN, PARENT,
1588 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1592 sour_data_even_subs : /* empty */
1593 | sour_data_even_subs sour_data_even_sub
1596 sour_data_even_sub : sour_data_even_date_sect { OCCUR2(DATE, 0, 1) }
1597 | sour_data_even_plac_sect { OCCUR2(PLAC, 0, 1) }
1601 sour_data_even_date_sect : OPEN DELIM TAG_DATE mand_line_item
1602 { struct date_value dv = gedcom_parse_date($4);
1604 = start_element(ELT_SOUR_DATA_EVEN_DATE,
1606 GEDCOM_MAKE_DATE(val1, dv));
1607 START(DATE, $1, $<ctxt>$)
1612 { end_element(ELT_SOUR_DATA_EVEN_DATE, PARENT,
1613 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1617 sour_data_even_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
1619 = start_element(ELT_SOUR_DATA_EVEN_PLAC,
1621 GEDCOM_MAKE_STRING(val1, $4));
1622 START(PLAC, $1, $<ctxt>$)
1627 { end_element(ELT_SOUR_DATA_EVEN_PLAC, PARENT,
1628 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1632 sour_data_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
1633 { $<ctxt>$ = start_element(ELT_SOUR_DATA_AGNC,
1635 GEDCOM_MAKE_STRING(val1, $4));
1636 START(AGNC, $1, $<ctxt>$)
1641 { end_element(ELT_SOUR_DATA_AGNC, PARENT,
1642 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1647 sour_auth_sect : OPEN DELIM TAG_AUTH mand_line_item
1648 { $<ctxt>$ = start_element(ELT_SOUR_AUTH,
1650 GEDCOM_MAKE_STRING(val1, $4));
1651 reset_buffer(&concat_buffer);
1652 safe_buf_append(&concat_buffer, $4);
1653 START(AUTH, $1, $<ctxt>$)
1658 { char* complete = get_buf_string(&concat_buffer);
1659 end_element(ELT_SOUR_AUTH, PARENT, $<ctxt>5,
1660 GEDCOM_MAKE_STRING(val1, complete));
1664 sour_auth_subs : /* empty */
1665 | sour_auth_subs sour_auth_sub
1668 sour_auth_sub : continuation_sub /* 0:M */
1673 sour_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1674 { $<ctxt>$ = start_element(ELT_SOUR_TITL,
1676 GEDCOM_MAKE_STRING(val1, $4));
1677 reset_buffer(&concat_buffer);
1678 safe_buf_append(&concat_buffer, $4);
1679 START(TITL, $1, $<ctxt>$)
1684 { char* complete = get_buf_string(&concat_buffer);
1685 end_element(ELT_SOUR_TITL, PARENT, $<ctxt>5,
1686 GEDCOM_MAKE_STRING(val1, complete));
1690 sour_titl_subs : /* empty */
1691 | sour_titl_subs sour_titl_sub
1694 sour_titl_sub : continuation_sub /* 0:M */
1699 sour_abbr_sect : OPEN DELIM TAG_ABBR mand_line_item
1700 { $<ctxt>$ = start_element(ELT_SOUR_ABBR,
1702 GEDCOM_MAKE_STRING(val1, $4));
1703 START(ABBR, $1, $<ctxt>$)
1708 { end_element(ELT_SOUR_ABBR, PARENT, $<ctxt>5,
1709 GEDCOM_MAKE_NULL(val1));
1714 sour_publ_sect : OPEN DELIM TAG_PUBL mand_line_item
1715 { $<ctxt>$ = start_element(ELT_SOUR_PUBL,
1717 GEDCOM_MAKE_STRING(val1, $4));
1718 reset_buffer(&concat_buffer);
1719 safe_buf_append(&concat_buffer, $4);
1720 START(PUBL, $1, $<ctxt>$)
1725 { char* complete = get_buf_string(&concat_buffer);
1726 end_element(ELT_SOUR_PUBL, PARENT, $<ctxt>5,
1727 GEDCOM_MAKE_STRING(val1, complete));
1731 sour_publ_subs : /* empty */
1732 | sour_publ_subs sour_publ_sub
1735 sour_publ_sub : continuation_sub /* 0:M */
1740 sour_text_sect : OPEN DELIM TAG_TEXT mand_line_item
1741 { $<ctxt>$ = start_element(ELT_SOUR_TEXT,
1743 GEDCOM_MAKE_STRING(val1, $4));
1744 reset_buffer(&concat_buffer);
1745 safe_buf_append(&concat_buffer, $4);
1746 START(TEXT, $1, $<ctxt>$)
1751 { char* complete = get_buf_string(&concat_buffer);
1752 end_element(ELT_SOUR_TEXT, PARENT, $<ctxt>5,
1753 GEDCOM_MAKE_STRING(val1, complete));
1757 sour_text_subs : /* empty */
1758 | sour_text_subs sour_text_sub
1761 sour_text_sub : continuation_sub /* 0:M */
1765 /*********************************************************************/
1766 /**** Submission record ****/
1767 /*********************************************************************/
1768 submis_rec : OPEN DELIM POINTER DELIM TAG_SUBN
1769 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1771 if (xr == NULL) HANDLE_ERROR;
1772 $<ctxt>$ = start_record(REC_SUBN,
1773 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1774 NULL, GEDCOM_MAKE_NULL(val2));
1775 START(SUBN, $1, $<ctxt>$) }
1779 { end_record(REC_SUBN, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1782 subn_subs : /* empty */
1783 | subn_subs subn_sub
1786 subn_sub : subn_subm_sect { OCCUR2(SUBM, 0, 1) }
1787 | subn_famf_sect { OCCUR2(FAMF, 0, 1) }
1788 | subn_temp_sect { OCCUR2(TEMP, 0, 1) }
1789 | subn_ance_sect { OCCUR2(ANCE, 0, 1) }
1790 | subn_desc_sect { OCCUR2(DESC, 0, 1) }
1791 | subn_ordi_sect { OCCUR2(ORDI, 0, 1) }
1792 | subn_rin_sect { OCCUR2(RIN, 0, 1) }
1797 subn_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1798 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1800 if (xr == NULL) HANDLE_ERROR;
1801 $<ctxt>$ = start_element(ELT_SUBN_SUBM,
1803 GEDCOM_MAKE_XREF_PTR(val1, xr));
1804 START(SUBM, $1, $<ctxt>$)
1809 { end_element(ELT_SUBN_SUBM, PARENT, $<ctxt>5,
1810 GEDCOM_MAKE_NULL(val1));
1815 subn_famf_sect : OPEN DELIM TAG_FAMF mand_line_item
1816 { $<ctxt>$ = start_element(ELT_SUBN_FAMF,
1818 GEDCOM_MAKE_STRING(val1, $4));
1819 START(FAMF, $1, $<ctxt>$)
1824 { end_element(ELT_SUBN_FAMF, PARENT, $<ctxt>5,
1825 GEDCOM_MAKE_NULL(val1));
1830 subn_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
1831 { $<ctxt>$ = start_element(ELT_SUBN_TEMP,
1833 GEDCOM_MAKE_STRING(val1, $4));
1834 START(TEMP, $1, $<ctxt>$)
1839 { end_element(ELT_SUBN_TEMP, PARENT, $<ctxt>5,
1840 GEDCOM_MAKE_NULL(val1));
1845 subn_ance_sect : OPEN DELIM TAG_ANCE mand_line_item
1846 { $<ctxt>$ = start_element(ELT_SUBN_ANCE,
1848 GEDCOM_MAKE_STRING(val1, $4));
1849 START(ANCE, $1, $<ctxt>$)
1854 { end_element(ELT_SUBN_ANCE, PARENT, $<ctxt>5,
1855 GEDCOM_MAKE_NULL(val1));
1860 subn_desc_sect : OPEN DELIM TAG_DESC mand_line_item
1861 { $<ctxt>$ = start_element(ELT_SUBN_DESC,
1863 GEDCOM_MAKE_STRING(val1, $4));
1864 START(DESC, $1, $<ctxt>$)
1869 { end_element(ELT_SUBN_DESC, PARENT, $<ctxt>5,
1870 GEDCOM_MAKE_NULL(val1));
1875 subn_ordi_sect : OPEN DELIM TAG_ORDI mand_line_item
1876 { $<ctxt>$ = start_element(ELT_SUBN_ORDI,
1878 GEDCOM_MAKE_STRING(val1, $4));
1879 START(ORDI, $1, $<ctxt>$)
1884 { end_element(ELT_SUBN_ORDI, PARENT, $<ctxt>5,
1885 GEDCOM_MAKE_NULL(val1));
1890 subn_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1891 { $<ctxt>$ = start_element(ELT_SUBN_RIN,
1893 GEDCOM_MAKE_STRING(val1, $4));
1894 START(RIN, $1, $<ctxt>$)
1899 { end_element(ELT_SUBN_RIN, PARENT, $<ctxt>5,
1900 GEDCOM_MAKE_NULL(val1));
1904 /*********************************************************************/
1905 /**** Submitter record ****/
1906 /*********************************************************************/
1907 submit_rec : OPEN DELIM POINTER DELIM TAG_SUBM
1908 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1910 if (xr == NULL) HANDLE_ERROR;
1911 $<ctxt>$ = start_record(REC_SUBM,
1912 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1913 NULL, GEDCOM_MAKE_NULL(val2));
1914 START(SUBM, $1, $<ctxt>$) }
1918 { end_record(REC_SUBM, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1921 subm_subs : /* empty */
1922 | subm_subs subm_sub
1925 subm_sub : subm_name_sect { OCCUR2(NAME, 1, 1) }
1926 | addr_struc_sub /* 0:1 */
1927 | multim_link_sub /* 0:M */
1928 | subm_lang_sect { OCCUR2(LANG, 0, 3) }
1929 | subm_rfn_sect { OCCUR2(RFN, 0, 1) }
1930 | subm_rin_sect { OCCUR2(RIN, 0, 1) }
1931 | change_date_sub /* 0:1 */
1936 subm_name_sect : OPEN DELIM TAG_NAME mand_line_item
1937 { $<ctxt>$ = start_element(ELT_SUBM_NAME,
1939 GEDCOM_MAKE_STRING(val1, $4));
1940 START(NAME, $1, $<ctxt>$)
1945 { end_element(ELT_SUBM_NAME, PARENT, $<ctxt>5,
1946 GEDCOM_MAKE_NULL(val1));
1951 subm_lang_sect : OPEN DELIM TAG_LANG mand_line_item
1952 { $<ctxt>$ = start_element(ELT_SUBM_LANG,
1954 GEDCOM_MAKE_STRING(val1, $4));
1955 START(LANG, $1, $<ctxt>$)
1960 { end_element(ELT_SUBM_LANG, PARENT, $<ctxt>5,
1961 GEDCOM_MAKE_NULL(val1));
1966 subm_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1967 { $<ctxt>$ = start_element(ELT_SUBM_RFN,
1969 GEDCOM_MAKE_STRING(val1, $4));
1970 START(RFN, $1, $<ctxt>$)
1975 { end_element(ELT_SUBM_RFN, PARENT, $<ctxt>5,
1976 GEDCOM_MAKE_NULL(val1));
1981 subm_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1982 { $<ctxt>$ = start_element(ELT_SUBM_RIN,
1984 GEDCOM_MAKE_STRING(val1, $4));
1985 START(RIN, $1, $<ctxt>$)
1990 { end_element(ELT_SUBM_RIN, PARENT, $<ctxt>5,
1991 GEDCOM_MAKE_NULL(val1));
1995 /*********************************************************************/
1996 /**** Substructures ****/
1997 /*********************************************************************/
1999 /* ADDRESS STRUCTURE */
2000 addr_struc_sub : addr_sect { OCCUR2(ADDR, 0, 1) }
2001 | phon_sect { OCCUR2(PHON, 0, 3) }
2004 addr_sect : OPEN DELIM TAG_ADDR mand_line_item
2005 { $<ctxt>$ = start_element(ELT_SUB_ADDR,
2007 GEDCOM_MAKE_STRING(val1, $4));
2008 reset_buffer(&concat_buffer);
2009 safe_buf_append(&concat_buffer, $4);
2010 START(ADDR, $1, $<ctxt>$)
2015 { char* complete = get_buf_string(&concat_buffer);
2016 end_element(ELT_SUB_ADDR, PARENT, $<ctxt>5,
2017 GEDCOM_MAKE_STRING(val1, complete));
2021 addr_subs : /* empty */
2022 | addr_subs addr_sub
2025 addr_sub : addr_cont_sect /* 0:M */
2026 | addr_adr1_sect { OCCUR2(ADR1, 0, 1) }
2027 | addr_adr2_sect { OCCUR2(ADR2, 0, 1) }
2028 | addr_city_sect { OCCUR2(CITY, 0, 1) }
2029 | addr_stae_sect { OCCUR2(STAE, 0, 1) }
2030 | addr_post_sect { OCCUR2(POST, 0, 1) }
2031 | addr_ctry_sect { OCCUR2(CTRY, 0, 1) }
2035 addr_cont_sect : OPEN DELIM TAG_CONT mand_line_item
2036 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CONT,
2038 GEDCOM_MAKE_STRING(val1, $4));
2039 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
2040 safe_buf_append(&concat_buffer, $4);
2041 START(CONT, $1, $<ctxt>$)
2046 { end_element(ELT_SUB_ADDR_CONT, PARENT, $<ctxt>5,
2047 GEDCOM_MAKE_NULL(val1));
2050 addr_adr1_sect : OPEN DELIM TAG_ADR1 mand_line_item
2051 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR1,
2053 GEDCOM_MAKE_STRING(val1, $4));
2054 START(ADR1, $1, $<ctxt>$)
2059 { end_element(ELT_SUB_ADDR_ADR1, PARENT, $<ctxt>5,
2060 GEDCOM_MAKE_NULL(val1));
2063 addr_adr2_sect : OPEN DELIM TAG_ADR2 mand_line_item
2064 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR2,
2066 GEDCOM_MAKE_STRING(val1, $4));
2067 START(ADR2, $1, $<ctxt>$)
2072 { end_element(ELT_SUB_ADDR_ADR2, PARENT, $<ctxt>5,
2073 GEDCOM_MAKE_NULL(val1));
2076 addr_city_sect : OPEN DELIM TAG_CITY mand_line_item
2077 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CITY,
2079 GEDCOM_MAKE_STRING(val1, $4));
2080 START(CITY, $1, $<ctxt>$)
2085 { end_element(ELT_SUB_ADDR_CITY, PARENT, $<ctxt>5,
2086 GEDCOM_MAKE_NULL(val1));
2089 addr_stae_sect : OPEN DELIM TAG_STAE mand_line_item
2090 { $<ctxt>$ = start_element(ELT_SUB_ADDR_STAE,
2092 GEDCOM_MAKE_STRING(val1, $4));
2093 START(STAE, $1, $<ctxt>$)
2098 { end_element(ELT_SUB_ADDR_STAE, PARENT, $<ctxt>5,
2099 GEDCOM_MAKE_NULL(val1));
2102 addr_post_sect : OPEN DELIM TAG_POST mand_line_item
2103 { $<ctxt>$ = start_element(ELT_SUB_ADDR_POST,
2105 GEDCOM_MAKE_STRING(val1, $4));
2106 START(POST, $1, $<ctxt>$)
2111 { end_element(ELT_SUB_ADDR_POST, PARENT, $<ctxt>5,
2112 GEDCOM_MAKE_NULL(val1));
2115 addr_ctry_sect : OPEN DELIM TAG_CTRY mand_line_item
2116 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CTRY,
2118 GEDCOM_MAKE_STRING(val1, $4));
2119 START(CTRY, $1, $<ctxt>$)
2124 { end_element(ELT_SUB_ADDR_CTRY, PARENT, $<ctxt>5,
2125 GEDCOM_MAKE_NULL(val1));
2129 phon_sect : OPEN DELIM TAG_PHON mand_line_item
2130 { $<ctxt>$ = start_element(ELT_SUB_PHON,
2132 GEDCOM_MAKE_STRING(val1, $4));
2133 START(PHON, $1, $<ctxt>$)
2138 { end_element(ELT_SUB_PHON, PARENT, $<ctxt>5,
2139 GEDCOM_MAKE_NULL(val1));
2143 /* ASSOCIATION STRUCTURE */
2144 assoc_struc_sub : asso_sect /* 0:M */
2147 asso_sect : OPEN DELIM TAG_ASSO mand_pointer
2148 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2150 if (xr == NULL) HANDLE_ERROR;
2151 $<ctxt>$ = start_element(ELT_SUB_ASSO,
2153 GEDCOM_MAKE_XREF_PTR(val1, xr));
2154 START(ASSO, $1, $<ctxt>$)
2157 { CHECK2(TYPE,RELA) }
2159 { end_element(ELT_SUB_ASSO, PARENT, $<ctxt>5,
2160 GEDCOM_MAKE_NULL(val1));
2164 asso_subs : /* empty */
2165 | asso_type_sect { OCCUR2(TYPE, 1, 1) }
2166 | asso_rela_sect { OCCUR2(RELA, 1, 1) }
2172 asso_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2173 { $<ctxt>$ = start_element(ELT_SUB_ASSO_TYPE,
2175 GEDCOM_MAKE_STRING(val1, $4));
2176 START(TYPE, $1, $<ctxt>$)
2181 { end_element(ELT_SUB_ASSO_TYPE, PARENT, $<ctxt>5,
2182 GEDCOM_MAKE_NULL(val1));
2186 asso_rela_sect : OPEN DELIM TAG_RELA mand_line_item
2187 { $<ctxt>$ = start_element(ELT_SUB_ASSO_RELA,
2189 GEDCOM_MAKE_STRING(val1, $4));
2190 START(RELA, $1, $<ctxt>$)
2195 { end_element(ELT_SUB_ASSO_RELA, PARENT, $<ctxt>5,
2196 GEDCOM_MAKE_NULL(val1));
2201 change_date_sub : change_date_chan_sect { OCCUR2(CHAN, 0, 1) }
2204 change_date_chan_sect : OPEN DELIM TAG_CHAN
2205 { $<ctxt>$ = start_element(ELT_SUB_CHAN,
2206 PARENT, $1, $3, NULL,
2207 GEDCOM_MAKE_NULL(val1));
2208 START(CHAN, $1, $<ctxt>$)
2210 change_date_chan_subs
2213 { end_element(ELT_SUB_CHAN, PARENT, $<ctxt>4,
2214 GEDCOM_MAKE_NULL(val1));
2218 change_date_chan_subs : /* empty */
2219 | change_date_chan_subs change_date_chan_sub
2222 change_date_chan_sub : change_date_date_sect { OCCUR2(DATE, 1, 1) }
2227 change_date_date_sect : OPEN DELIM TAG_DATE mand_line_item
2228 { struct date_value dv = gedcom_parse_date($4);
2229 $<ctxt>$ = start_element(ELT_SUB_CHAN_DATE,
2231 GEDCOM_MAKE_DATE(val1, dv));
2232 START(DATE, $1, $<ctxt>$) }
2233 change_date_date_subs
2236 { end_element(ELT_SUB_CHAN_DATE, PARENT, $<ctxt>5,
2237 GEDCOM_MAKE_NULL(val1));
2241 change_date_date_subs : /* empty */
2242 | change_date_date_subs change_date_date_sub
2245 change_date_date_sub : change_date_date_time_sect { OCCUR2(TIME, 0, 1) }
2249 change_date_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
2251 = start_element(ELT_SUB_CHAN_TIME,
2253 GEDCOM_MAKE_STRING(val1, $4));
2254 START(TIME, $1, $<ctxt>$)
2259 { end_element(ELT_SUB_CHAN_TIME, PARENT, $<ctxt>5,
2260 GEDCOM_MAKE_NULL(val1));
2264 /* CHILD TO FAMILY LINK */
2265 chi_fam_link_sub : famc_sect /* 0:M */
2268 famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2269 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2271 if (xr == NULL) HANDLE_ERROR;
2272 $<ctxt>$ = start_element(ELT_SUB_FAMC,
2274 GEDCOM_MAKE_XREF_PTR(val1, xr));
2275 START(FAMC, $1, $<ctxt>$)
2280 { end_element(ELT_SUB_FAMC, PARENT, $<ctxt>5,
2281 GEDCOM_MAKE_NULL(val1));
2285 famc_subs : /* empty */
2286 | famc_subs famc_sub
2289 famc_sub : famc_pedi_sect /* 0:M */
2294 famc_pedi_sect : OPEN DELIM TAG_PEDI mand_line_item
2295 { $<ctxt>$ = start_element(ELT_SUB_FAMC_PEDI,
2297 GEDCOM_MAKE_STRING(val1, $4));
2298 START(PEDI, $1, $<ctxt>$)
2303 { end_element(ELT_SUB_FAMC_PEDI, PARENT, $<ctxt>5,
2304 GEDCOM_MAKE_NULL(val1));
2308 /* CONTINUATION SUBSECTIONS */
2309 continuation_sub : cont_sect /* 0:M */
2310 | conc_sect /* 0:M */
2313 cont_sect : OPEN DELIM TAG_CONT opt_line_item
2314 { $<ctxt>$ = start_element(ELT_SUB_CONT,
2316 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2317 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
2318 if (GEDCOM_IS_STRING(&val1))
2319 safe_buf_append(&concat_buffer, $4);
2320 START(CONT, $1, $<ctxt>$)
2325 { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5,
2326 GEDCOM_MAKE_NULL(val1));
2330 conc_sect : OPEN DELIM TAG_CONC mand_line_item
2331 { $<ctxt>$ = start_element(ELT_SUB_CONC,
2333 GEDCOM_MAKE_STRING(val1, $4));
2334 if (compat_mode(C_CONC_NEEDS_SPACE)) {
2335 safe_buf_append(&concat_buffer, " ");
2337 safe_buf_append(&concat_buffer, $4);
2338 START(CONC, $1, $<ctxt>$)
2343 { end_element(ELT_SUB_CONC, PARENT, $<ctxt>5,
2344 GEDCOM_MAKE_NULL(val1));
2349 event_detail_sub : event_detail_type_sect { OCCUR2(TYPE, 0, 1) }
2350 | event_detail_date_sect { OCCUR2(DATE, 0, 1) }
2353 | event_detail_age_sect { OCCUR2(AGE, 0, 1) }
2354 | event_detail_agnc_sect { OCCUR2(AGNC, 0, 1) }
2355 | event_detail_caus_sect { OCCUR2(CAUS, 0, 1) }
2361 event_detail_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2363 = start_element(ELT_SUB_EVT_TYPE,
2365 GEDCOM_MAKE_STRING(val1, $4));
2366 START(TYPE, $1, $<ctxt>$)
2371 { end_element(ELT_SUB_EVT_TYPE, PARENT, $<ctxt>5,
2372 GEDCOM_MAKE_NULL(val1));
2375 event_detail_date_sect : OPEN DELIM TAG_DATE mand_line_item
2376 { struct date_value dv = gedcom_parse_date($4);
2378 = start_element(ELT_SUB_EVT_DATE,
2380 GEDCOM_MAKE_DATE(val1, dv));
2381 START(DATE, $1, $<ctxt>$)
2386 { end_element(ELT_SUB_EVT_DATE, PARENT, $<ctxt>5,
2387 GEDCOM_MAKE_NULL(val1));
2390 event_detail_age_sect : OPEN DELIM TAG_AGE mand_line_item
2391 { struct age_value age = gedcom_parse_age($4);
2393 = start_element(ELT_SUB_EVT_AGE,
2395 GEDCOM_MAKE_AGE(val1, age));
2396 START(AGE, $1, $<ctxt>$)
2401 { end_element(ELT_SUB_EVT_AGE, PARENT, $<ctxt>5,
2402 GEDCOM_MAKE_NULL(val1));
2405 event_detail_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
2407 = start_element(ELT_SUB_EVT_AGNC,
2409 GEDCOM_MAKE_STRING(val1, $4));
2410 START(AGNC, $1, $<ctxt>$)
2415 { end_element(ELT_SUB_EVT_AGNC, PARENT, $<ctxt>5,
2416 GEDCOM_MAKE_NULL(val1));
2419 event_detail_caus_sect : OPEN DELIM TAG_CAUS mand_line_item
2421 = start_element(ELT_SUB_EVT_CAUS,
2423 GEDCOM_MAKE_STRING(val1, $4));
2424 START(CAUS, $1, $<ctxt>$)
2429 { end_element(ELT_SUB_EVT_CAUS, PARENT, $<ctxt>5,
2430 GEDCOM_MAKE_NULL(val1));
2434 /* FAMILY EVENT STRUCTURE */
2435 fam_event_struc_sub : fam_event_sect
2436 | fam_gen_even_sect /* 0:M */
2439 fam_event_sect : OPEN DELIM fam_event_tag opt_value
2441 = start_element(ELT_SUB_FAM_EVT,
2443 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2444 START2($1, $<ctxt>$);
2449 { end_element(ELT_SUB_FAM_EVT, PARENT, $<ctxt>5,
2450 GEDCOM_MAKE_NULL(val1));
2454 fam_event_tag : TAG_ANUL { $$ = $1; START1(ANUL) }
2455 | TAG_CENS { $$ = $1; START1(CENS) }
2456 | TAG_DIV { $$ = $1; START1(DIV) }
2457 | TAG_DIVF { $$ = $1; START1(DIVF) }
2458 | TAG_ENGA { $$ = $1; START1(ENGA) }
2459 | TAG_MARR { $$ = $1; START1(MARR) }
2460 | TAG_MARB { $$ = $1; START1(MARB) }
2461 | TAG_MARC { $$ = $1; START1(MARC) }
2462 | TAG_MARL { $$ = $1; START1(MARL) }
2463 | TAG_MARS { $$ = $1; START1(MARS) }
2466 fam_event_subs : /* empty */
2467 | fam_event_subs fam_event_sub
2470 fam_event_sub : event_detail_sub
2471 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2472 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2476 fam_even_husb_sect : OPEN DELIM TAG_HUSB
2477 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_HUSB,
2478 PARENT, $1, $3, NULL,
2479 GEDCOM_MAKE_NULL(val1));
2480 START(HUSB, $1, $<ctxt>$)
2485 { end_element(ELT_SUB_FAM_EVT_HUSB, PARENT, $<ctxt>4,
2486 GEDCOM_MAKE_NULL(val1));
2490 fam_even_husb_subs : /* empty */
2491 | fam_even_husb_subs fam_even_husb_sub
2494 fam_even_husb_sub : fam_even_age_sect { OCCUR2(AGE, 1, 1) }
2498 fam_even_age_sect : OPEN DELIM TAG_AGE mand_line_item
2499 { struct age_value age = gedcom_parse_age($4);
2500 $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_AGE,
2502 GEDCOM_MAKE_AGE(val1, age));
2503 START(AGE, $1, $<ctxt>$)
2508 { end_element(ELT_SUB_FAM_EVT_AGE, PARENT, $<ctxt>5,
2509 GEDCOM_MAKE_NULL(val1));
2513 fam_even_wife_sect : OPEN DELIM TAG_WIFE
2514 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_WIFE,
2515 PARENT, $1, $3, NULL,
2516 GEDCOM_MAKE_NULL(val1));
2517 START(WIFE, $1, $<ctxt>$)
2522 { end_element(ELT_SUB_FAM_EVT_WIFE, PARENT, $<ctxt>4,
2523 GEDCOM_MAKE_NULL(val1));
2527 fam_gen_even_sect : OPEN DELIM TAG_EVEN
2528 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_EVEN,
2529 PARENT, $1, $3, NULL,
2530 GEDCOM_MAKE_NULL(val1));
2531 START(EVEN, $1, $<ctxt>$)
2536 { end_element(ELT_SUB_FAM_EVT_EVEN, PARENT, $<ctxt>4,
2537 GEDCOM_MAKE_NULL(val1));
2541 fam_gen_even_subs : /* empty */
2542 | fam_gen_even_subs fam_gen_even_sub
2545 fam_gen_even_sub : event_detail_sub
2546 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2547 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2551 /* IDENTIFICATION STRUCTURE */
2552 ident_struc_sub : ident_refn_sect /* 0:M */
2553 | ident_rin_sect { OCCUR2(RIN, 0, 1) }
2556 ident_refn_sect : OPEN DELIM TAG_REFN mand_line_item
2557 { $<ctxt>$ = start_element(ELT_SUB_IDENT_REFN,
2559 GEDCOM_MAKE_STRING(val1, $4));
2560 START(REFN, $1, $<ctxt>$)
2565 { end_element(ELT_SUB_IDENT_REFN, PARENT, $<ctxt>5,
2566 GEDCOM_MAKE_NULL(val1));
2570 ident_refn_subs : /* empty */
2571 | ident_refn_subs ident_refn_sub
2574 ident_refn_sub : ident_refn_type_sect { OCCUR2(TYPE, 0, 1) }
2578 ident_refn_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2580 = start_element(ELT_SUB_IDENT_REFN_TYPE,
2582 GEDCOM_MAKE_STRING(val1, $4));
2583 START(TYPE, $1, $<ctxt>$)
2588 { end_element(ELT_SUB_IDENT_REFN_TYPE, PARENT, $<ctxt>5,
2589 GEDCOM_MAKE_NULL(val1));
2593 ident_rin_sect : OPEN DELIM TAG_RIN mand_line_item
2594 { $<ctxt>$ = start_element(ELT_SUB_IDENT_RIN,
2596 GEDCOM_MAKE_STRING(val1, $4));
2597 START(RIN, $1, $<ctxt>$)
2602 { end_element(ELT_SUB_IDENT_RIN, PARENT, $<ctxt>5,
2603 GEDCOM_MAKE_NULL(val1));
2607 /* INDIVIDUAL ATTRIBUTE STRUCTURE */
2608 indiv_attr_struc_sub : indiv_attr_sect /* 0:M */
2609 | indiv_resi_sect /* 0:M */
2612 indiv_attr_sect : OPEN DELIM indiv_attr_tag mand_line_item
2613 { $<ctxt>$ = start_element(ELT_SUB_INDIV_ATTR,
2615 GEDCOM_MAKE_STRING(val1, $4));
2616 START2($1, $<ctxt>$);
2618 indiv_attr_event_subs
2621 { end_element(ELT_SUB_INDIV_ATTR, PARENT, $<ctxt>5,
2622 GEDCOM_MAKE_NULL(val1));
2626 indiv_attr_tag : TAG_CAST { $$ = $1; START1(CAST) }
2627 | TAG_DSCR { $$ = $1; START1(DSCR) }
2628 | TAG_EDUC { $$ = $1; START1(EDUC) }
2629 | TAG_IDNO { $$ = $1; START1(IDNO) }
2630 | TAG_NATI { $$ = $1; START1(NATI) }
2631 | TAG_NCHI { $$ = $1; START1(NCHI) }
2632 | TAG_NMR { $$ = $1; START1(NMR) }
2633 | TAG_OCCU { $$ = $1; START1(OCCU) }
2634 | TAG_PROP { $$ = $1; START1(PROP) }
2635 | TAG_RELI { $$ = $1; START1(RELI) }
2636 | TAG_SSN { $$ = $1; START1(SSN) }
2637 | TAG_TITL { $$ = $1; START1(TITL) }
2640 indiv_resi_sect : OPEN DELIM TAG_RESI
2641 { $<ctxt>$ = start_element(ELT_SUB_INDIV_RESI,
2642 PARENT, $1, $3, NULL,
2643 GEDCOM_MAKE_NULL(val1));
2644 START(RESI, $1, $<ctxt>$)
2646 indiv_attr_event_subs
2649 { end_element(ELT_SUB_INDIV_RESI, PARENT, $<ctxt>4,
2650 GEDCOM_MAKE_NULL(val1));
2654 indiv_attr_event_subs : /* empty */
2655 | indiv_attr_event_subs indiv_attr_event_sub
2658 indiv_attr_event_sub : event_detail_sub
2662 /* INDIVIDUAL EVENT STRUCTURE */
2663 indiv_even_struc_sub : indiv_birt_sect
2665 | indiv_adop_sect /* 0:M */
2666 | indiv_even_sect /* 0:M */
2669 indiv_birt_sect : OPEN DELIM indiv_birt_tag opt_value
2671 = start_element(ELT_SUB_INDIV_BIRT,
2673 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2674 START2($1, $<ctxt>$);
2679 { end_element(ELT_SUB_INDIV_BIRT, PARENT, $<ctxt>5,
2680 GEDCOM_MAKE_NULL(val1));
2684 indiv_birt_tag : TAG_BIRT { $$ = $1; START1(BIRT) }
2685 | TAG_CHR { $$ = $1; START1(CHR) }
2688 indiv_birt_subs : /* empty */
2689 | indiv_birt_subs indiv_birt_sub
2692 indiv_birt_sub : event_detail_sub
2693 | indiv_birt_famc_sect { OCCUR2(FAMC,0, 1) }
2697 indiv_birt_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2698 { struct xref_value *xr = gedcom_parse_xref($4,
2701 if (xr == NULL) HANDLE_ERROR;
2703 = start_element(ELT_SUB_INDIV_BIRT_FAMC,
2705 GEDCOM_MAKE_XREF_PTR(val1, xr));
2706 START(FAMC, $1, $<ctxt>$)
2711 { end_element(ELT_SUB_INDIV_BIRT_FAMC, PARENT, $<ctxt>5,
2712 GEDCOM_MAKE_NULL(val1));
2716 indiv_gen_sect : OPEN DELIM indiv_gen_tag opt_value
2718 = start_element(ELT_SUB_INDIV_GEN,
2720 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2721 START2($1, $<ctxt>$);
2726 { end_element(ELT_SUB_INDIV_GEN, PARENT, $<ctxt>5,
2727 GEDCOM_MAKE_NULL(val1));
2731 indiv_gen_tag : TAG_DEAT { $$ = $1; START1(DEAT) }
2732 | TAG_BURI { $$ = $1; START1(BURI) }
2733 | TAG_CREM { $$ = $1; START1(CREM) }
2734 | TAG_BAPM { $$ = $1; START1(BAPM) }
2735 | TAG_BARM { $$ = $1; START1(BARM) }
2736 | TAG_BASM { $$ = $1; START1(BASM) }
2737 | TAG_BLES { $$ = $1; START1(BLES) }
2738 | TAG_CHRA { $$ = $1; START1(CHRA) }
2739 | TAG_CONF { $$ = $1; START1(CONF) }
2740 | TAG_FCOM { $$ = $1; START1(FCOM) }
2741 | TAG_ORDN { $$ = $1; START1(ORDN) }
2742 | TAG_NATU { $$ = $1; START1(NATU) }
2743 | TAG_EMIG { $$ = $1; START1(EMIG) }
2744 | TAG_IMMI { $$ = $1; START1(IMMI) }
2745 | TAG_CENS { $$ = $1; START1(CENS) }
2746 | TAG_PROB { $$ = $1; START1(PROB) }
2747 | TAG_WILL { $$ = $1; START1(WILL) }
2748 | TAG_GRAD { $$ = $1; START1(GRAD) }
2749 | TAG_RETI { $$ = $1; START1(RETI) }
2752 indiv_gen_subs : /* empty */
2753 | indiv_gen_subs indiv_gen_sub
2756 indiv_gen_sub : event_detail_sub
2760 indiv_adop_sect : OPEN DELIM TAG_ADOP opt_value
2762 = start_element(ELT_SUB_INDIV_ADOP,
2764 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2765 START(ADOP, $1, $<ctxt>$) }
2769 { end_element(ELT_SUB_INDIV_ADOP, PARENT, $<ctxt>5,
2770 GEDCOM_MAKE_NULL(val1));
2774 indiv_adop_subs : /* empty */
2775 | indiv_adop_subs indiv_adop_sub
2778 indiv_adop_sub : event_detail_sub
2779 | indiv_adop_famc_sect { OCCUR2(FAMC,0, 1) }
2783 indiv_adop_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2784 { struct xref_value *xr = gedcom_parse_xref($4,
2787 if (xr == NULL) HANDLE_ERROR;
2789 = start_element(ELT_SUB_INDIV_ADOP_FAMC,
2791 GEDCOM_MAKE_XREF_PTR(val1, xr));
2792 START(FAMC, $1, $<ctxt>$) }
2793 indiv_adop_famc_subs
2796 { end_element(ELT_SUB_INDIV_ADOP_FAMC, PARENT, $<ctxt>5,
2797 GEDCOM_MAKE_NULL(val1));
2801 indiv_adop_famc_subs : /* empty */
2802 | indiv_adop_famc_subs indiv_adop_famc_sub
2805 indiv_adop_famc_sub : indiv_adop_famc_adop_sect { OCCUR2(ADOP,0, 1) }
2809 indiv_adop_famc_adop_sect : OPEN DELIM TAG_ADOP mand_line_item
2811 = start_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2813 GEDCOM_MAKE_STRING(val1, $4));
2814 START(ADOP, $1, $<ctxt>$) }
2818 { end_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2820 GEDCOM_MAKE_NULL(val1));
2824 indiv_even_sect : OPEN DELIM TAG_EVEN
2825 { $<ctxt>$ = start_element(ELT_SUB_INDIV_EVEN,
2826 PARENT, $1, $3, NULL,
2827 GEDCOM_MAKE_NULL(val1));
2828 START(EVEN, $1, $<ctxt>$) }
2832 { end_element(ELT_SUB_INDIV_EVEN, PARENT, $<ctxt>4,
2833 GEDCOM_MAKE_NULL(val1));
2837 /* LDS INDIVIDUAL ORDINANCE */
2838 lds_indiv_ord_sub : lio_bapl_sect /* 0:M */
2839 | lio_slgc_sect /* 0:M */
2842 lio_bapl_sect : OPEN DELIM lio_bapl_tag
2843 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL,
2844 PARENT, $1, $3, NULL,
2845 GEDCOM_MAKE_NULL(val1));
2846 START2($1, $<ctxt>$);
2851 { end_element(ELT_SUB_LIO_BAPL, PARENT, $<ctxt>4,
2852 GEDCOM_MAKE_NULL(val1));
2856 lio_bapl_tag : TAG_BAPL { $$ = $1; START1(BAPL) }
2857 | TAG_CONL { $$ = $1; START1(CONL) }
2858 | TAG_ENDL { $$ = $1; START1(ENDL) }
2861 lio_bapl_subs : /* empty */
2862 | lio_bapl_subs lio_bapl_sub
2865 lio_bapl_sub : lio_bapl_stat_sect { OCCUR2(STAT, 0, 1) }
2866 | lio_bapl_date_sect { OCCUR2(DATE, 0, 1) }
2867 | lio_bapl_temp_sect { OCCUR2(TEMP, 0, 1) }
2868 | lio_bapl_plac_sect { OCCUR2(PLAC, 0, 1) }
2874 lio_bapl_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2875 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_STAT,
2877 GEDCOM_MAKE_STRING(val1, $4));
2878 START(STAT, $1, $<ctxt>$)
2883 { end_element(ELT_SUB_LIO_BAPL_STAT, PARENT, $<ctxt>5,
2884 GEDCOM_MAKE_NULL(val1));
2887 lio_bapl_date_sect : OPEN DELIM TAG_DATE mand_line_item
2888 { struct date_value dv = gedcom_parse_date($4);
2889 $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_DATE,
2891 GEDCOM_MAKE_DATE(val1, dv));
2892 START(DATE, $1, $<ctxt>$)
2897 { end_element(ELT_SUB_LIO_BAPL_DATE, PARENT, $<ctxt>5,
2898 GEDCOM_MAKE_NULL(val1));
2901 lio_bapl_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2902 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_TEMP,
2904 GEDCOM_MAKE_STRING(val1, $4));
2905 START(TEMP, $1, $<ctxt>$)
2910 { end_element(ELT_SUB_LIO_BAPL_TEMP, PARENT, $<ctxt>5,
2911 GEDCOM_MAKE_NULL(val1));
2914 lio_bapl_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2915 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_PLAC,
2917 GEDCOM_MAKE_STRING(val1, $4));
2918 START(PLAC, $1, $<ctxt>$)
2923 { end_element(ELT_SUB_LIO_BAPL_PLAC, PARENT, $<ctxt>5,
2924 GEDCOM_MAKE_NULL(val1));
2928 lio_slgc_sect : OPEN DELIM TAG_SLGC
2929 { $<ctxt>$ = start_element(ELT_SUB_LIO_SLGC,
2930 PARENT, $1, $3, NULL,
2931 GEDCOM_MAKE_NULL(val1));
2932 START(SLGC, $1, $<ctxt>$)
2935 { if (compat_mode(C_NO_SLGC_FAMC) && ! CHK_COND(FAMC))
2936 compat_generate_slgc_famc_link($<ctxt>4);
2941 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4,
2942 GEDCOM_MAKE_NULL(val1));
2946 lio_slgc_subs : /* empty */
2947 | lio_slgc_subs lio_slgc_sub
2950 lio_slgc_sub : lio_bapl_sub
2951 | lio_slgc_famc_sect { OCCUR2(FAMC, 1, 1) }
2954 lio_slgc_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2955 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2957 if (xr == NULL) HANDLE_ERROR;
2959 = start_element(ELT_SUB_LIO_SLGC_FAMC,
2961 GEDCOM_MAKE_XREF_PTR(val1, xr));
2962 START(FAMC, $1, $<ctxt>$)
2967 { end_element(ELT_SUB_LIO_SLGC_FAMC, PARENT, $<ctxt>5,
2968 GEDCOM_MAKE_NULL(val1));
2972 /* LDS SPOUSE SEALING */
2973 lds_spouse_seal_sub : lss_slgs_sect
2976 lss_slgs_sect : OPEN DELIM TAG_SLGS
2977 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS,
2978 PARENT, $1, $3, NULL,
2979 GEDCOM_MAKE_NULL(val1));
2980 START(SLGS, $1, $<ctxt>$) }
2984 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4,
2985 GEDCOM_MAKE_NULL(val1));
2989 lss_slgs_subs : /* empty */
2990 | lss_slgs_subs lss_slgs_sub
2993 lss_slgs_sub : lss_slgs_stat_sect { OCCUR2(STAT, 0, 1) }
2994 | lss_slgs_date_sect { OCCUR2(DATE, 0, 1) }
2995 | lss_slgs_temp_sect { OCCUR2(TEMP, 0, 1) }
2996 | lss_slgs_plac_sect { OCCUR2(PLAC, 0, 1) }
3002 lss_slgs_stat_sect : OPEN DELIM TAG_STAT mand_line_item
3003 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_STAT,
3005 GEDCOM_MAKE_STRING(val1, $4));
3006 START(STAT, $1, $<ctxt>$)
3011 { end_element(ELT_SUB_LSS_SLGS_STAT, PARENT, $<ctxt>5,
3012 GEDCOM_MAKE_NULL(val1));
3015 lss_slgs_date_sect : OPEN DELIM TAG_DATE mand_line_item
3016 { struct date_value dv = gedcom_parse_date($4);
3017 $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_DATE,
3019 GEDCOM_MAKE_DATE(val1, dv));
3020 START(DATE, $1, $<ctxt>$)
3025 { end_element(ELT_SUB_LSS_SLGS_DATE, PARENT, $<ctxt>5,
3026 GEDCOM_MAKE_NULL(val1));
3029 lss_slgs_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
3030 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_TEMP,
3032 GEDCOM_MAKE_STRING(val1, $4));
3033 START(TEMP, $1, $<ctxt>$)
3038 { end_element(ELT_SUB_LSS_SLGS_TEMP, PARENT, $<ctxt>5,
3039 GEDCOM_MAKE_NULL(val1));
3042 lss_slgs_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3043 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_PLAC,
3045 GEDCOM_MAKE_STRING(val1, $4));
3046 START(PLAC, $1, $<ctxt>$)
3051 { end_element(ELT_SUB_LSS_SLGS_PLAC, PARENT, $<ctxt>5,
3052 GEDCOM_MAKE_NULL(val1));
3056 /* MULTIMEDIA LINK */
3057 multim_link_sub : multim_obje_link_sect
3058 | multim_obje_emb_sect
3061 multim_obje_link_sect : OPEN DELIM TAG_OBJE DELIM POINTER
3062 { struct xref_value *xr = gedcom_parse_xref($5,
3065 if (xr == NULL) HANDLE_ERROR;
3067 = start_element(ELT_SUB_MULTIM_OBJE,
3069 GEDCOM_MAKE_XREF_PTR(val1, xr));
3070 START(OBJE, $1, $<ctxt>$)
3075 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>6,
3076 GEDCOM_MAKE_NULL(val1));
3080 multim_obje_emb_sect : OPEN DELIM TAG_OBJE
3081 { $<ctxt>$ = start_element(ELT_SUB_MULTIM_OBJE,
3082 PARENT, $1, $3, NULL,
3083 GEDCOM_MAKE_NULL(val1));
3084 START(OBJE, $1, $<ctxt>$)
3086 multim_obje_emb_subs
3087 { CHECK2(FORM,FILE) }
3089 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>4,
3090 GEDCOM_MAKE_NULL(val1));
3094 multim_obje_emb_subs : /* empty */
3095 | multim_obje_emb_subs multim_obje_emb_sub
3098 multim_obje_emb_sub : multim_obje_form_sect { OCCUR2(FORM, 1, 1) }
3099 | multim_obje_titl_sect { OCCUR2(TITL, 0, 1) }
3100 | multim_obje_file_sect { OCCUR2(FILE, 1, 1) }
3105 multim_obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
3107 = start_element(ELT_SUB_MULTIM_OBJE_FORM,
3109 GEDCOM_MAKE_STRING(val1, $4));
3110 START(FORM, $1, $<ctxt>$)
3115 { end_element(ELT_SUB_MULTIM_OBJE_FORM,
3117 GEDCOM_MAKE_NULL(val1));
3120 multim_obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
3122 = start_element(ELT_SUB_MULTIM_OBJE_TITL,
3124 GEDCOM_MAKE_STRING(val1, $4));
3125 START(TITL, $1, $<ctxt>$)
3130 { end_element(ELT_SUB_MULTIM_OBJE_TITL,
3132 GEDCOM_MAKE_NULL(val1));
3135 multim_obje_file_sect : OPEN DELIM TAG_FILE mand_line_item
3137 = start_element(ELT_SUB_MULTIM_OBJE_FILE,
3139 GEDCOM_MAKE_STRING(val1, $4));
3140 START(FILE, $1, $<ctxt>$)
3145 { end_element(ELT_SUB_MULTIM_OBJE_FILE,
3147 GEDCOM_MAKE_NULL(val1));
3151 /* NOTE STRUCTURE */
3152 note_struc_sub : note_struc_link_sect /* 0:M */
3153 | note_struc_emb_sect /* 0:M */
3156 note_struc_link_sect : OPEN DELIM TAG_NOTE DELIM POINTER
3157 { struct xref_value *xr = gedcom_parse_xref($5,
3160 if (xr == NULL) HANDLE_ERROR;
3162 = start_element(ELT_SUB_NOTE,
3164 GEDCOM_MAKE_XREF_PTR(val1, xr));
3165 START(NOTE, $1, $<ctxt>$)
3167 note_struc_link_subs
3170 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>6,
3171 GEDCOM_MAKE_NULL(val1));
3175 note_struc_link_subs : /* empty */
3176 | note_struc_link_subs note_struc_link_sub
3179 note_struc_link_sub : source_cit_sub
3183 note_struc_emb_sect : OPEN DELIM TAG_NOTE opt_line_item
3185 = start_element(ELT_SUB_NOTE,
3187 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
3188 reset_buffer(&concat_buffer);
3190 safe_buf_append(&concat_buffer, $4);
3191 START(NOTE, $1, $<ctxt>$)
3196 { char* complete = get_buf_string(&concat_buffer);
3197 end_element(ELT_SUB_NOTE, PARENT, $<ctxt>5,
3198 GEDCOM_MAKE_STRING(val1, complete));
3202 note_struc_emb_subs : /* empty */
3203 | note_struc_emb_subs note_struc_emb_sub
3206 note_struc_emb_sub : continuation_sub
3211 /* PERSONAL NAME STRUCTURE */
3212 pers_name_struc_sub : pers_name_sect /* 0:M */
3215 pers_name_sect : OPEN DELIM TAG_NAME mand_line_item
3216 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME,
3218 GEDCOM_MAKE_STRING(val1, $4));
3219 START(NAME, $1, $<ctxt>$)
3224 { end_element(ELT_SUB_PERS_NAME, PARENT, $<ctxt>5,
3225 GEDCOM_MAKE_NULL(val1));
3229 pers_name_subs : /* empty */
3230 | pers_name_subs pers_name_sub
3233 pers_name_sub : pers_name_npfx_sect { OCCUR2(NPFX, 0, 1) }
3234 | pers_name_givn_sect { OCCUR2(GIVN, 0, 1) }
3235 | pers_name_nick_sect { OCCUR2(NICK, 0, 1) }
3236 | pers_name_spfx_sect { OCCUR2(SPFX, 0, 1) }
3237 | pers_name_surn_sect { OCCUR2(SURN, 0, 1) }
3238 | pers_name_nsfx_sect { OCCUR2(NSFX, 0, 1) }
3244 pers_name_npfx_sect : OPEN DELIM TAG_NPFX mand_line_item
3245 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NPFX,
3247 GEDCOM_MAKE_STRING(val1, $4));
3248 START(NPFX, $1, $<ctxt>$)
3253 { end_element(ELT_SUB_PERS_NAME_NPFX, PARENT, $<ctxt>5,
3254 GEDCOM_MAKE_NULL(val1));
3257 pers_name_givn_sect : OPEN DELIM TAG_GIVN mand_line_item
3258 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_GIVN,
3260 GEDCOM_MAKE_STRING(val1, $4));
3261 START(GIVN, $1, $<ctxt>$)
3266 { end_element(ELT_SUB_PERS_NAME_GIVN, PARENT, $<ctxt>5,
3267 GEDCOM_MAKE_NULL(val1));
3270 pers_name_nick_sect : OPEN DELIM TAG_NICK mand_line_item
3271 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NICK,
3273 GEDCOM_MAKE_STRING(val1, $4));
3274 START(NICK, $1, $<ctxt>$)
3279 { end_element(ELT_SUB_PERS_NAME_NICK, PARENT, $<ctxt>5,
3280 GEDCOM_MAKE_NULL(val1));
3283 pers_name_spfx_sect : OPEN DELIM TAG_SPFX mand_line_item
3284 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SPFX,
3286 GEDCOM_MAKE_STRING(val1, $4));
3287 START(SPFX, $1, $<ctxt>$)
3292 { end_element(ELT_SUB_PERS_NAME_SPFX, PARENT, $<ctxt>5,
3293 GEDCOM_MAKE_NULL(val1));
3296 pers_name_surn_sect : OPEN DELIM TAG_SURN mand_line_item
3297 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SURN,
3299 GEDCOM_MAKE_STRING(val1, $4));
3300 START(SURN, $1, $<ctxt>$)
3305 { end_element(ELT_SUB_PERS_NAME_SURN, PARENT, $<ctxt>5,
3306 GEDCOM_MAKE_NULL(val1));
3309 pers_name_nsfx_sect : OPEN DELIM TAG_NSFX mand_line_item
3310 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NSFX,
3312 GEDCOM_MAKE_STRING(val1, $4));
3313 START(NSFX, $1, $<ctxt>$)
3318 { end_element(ELT_SUB_PERS_NAME_NSFX, PARENT, $<ctxt>5,
3319 GEDCOM_MAKE_NULL(val1));
3323 /* PLACE STRUCTURE */
3324 place_struc_sub : place_struc_plac_sect /* 0:M */
3327 place_struc_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3329 = start_element(ELT_SUB_PLAC,
3331 GEDCOM_MAKE_STRING(val1, $4));
3332 START(PLAC, $1, $<ctxt>$)
3334 place_struc_plac_subs
3337 { end_element(ELT_SUB_PLAC, PARENT, $<ctxt>5,
3338 GEDCOM_MAKE_NULL(val1));
3342 place_struc_plac_subs : /* empty */
3343 | place_struc_plac_subs place_struc_plac_sub
3346 place_struc_plac_sub : place_plac_form_sect { OCCUR2(FORM, 0, 1) }
3352 place_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
3354 = start_element(ELT_SUB_PLAC_FORM,
3356 GEDCOM_MAKE_STRING(val1, $4));
3357 START(FORM, $1, $<ctxt>$)
3362 { end_element(ELT_SUB_PLAC_FORM, PARENT, $<ctxt>5,
3363 GEDCOM_MAKE_NULL(val1));
3367 /* SOURCE_CITATION */
3368 source_cit_sub : source_cit_link_sect /* 0:M */
3369 | source_cit_emb_sect /* 0:M */
3372 source_cit_link_sect : OPEN DELIM TAG_SOUR DELIM POINTER
3373 { struct xref_value *xr = gedcom_parse_xref($5,
3376 if (xr == NULL) HANDLE_ERROR;
3378 = start_element(ELT_SUB_SOUR,
3380 GEDCOM_MAKE_XREF_PTR(val1, xr));
3381 START(SOUR, $1, $<ctxt>$)
3383 source_cit_link_subs
3386 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>6,
3387 GEDCOM_MAKE_NULL(val1));
3391 source_cit_link_subs : /* empty */
3392 | source_cit_link_subs source_cit_link_sub
3395 source_cit_link_sub : source_cit_page_sect { OCCUR2(PAGE, 0, 1) }
3396 | source_cit_even_sect { OCCUR2(EVEN, 0, 1) }
3397 | source_cit_data_sect { OCCUR2(DATA, 0, 1) }
3398 | source_cit_quay_sect { OCCUR2(QUAY, 0, 1) }
3404 source_cit_page_sect : OPEN DELIM TAG_PAGE mand_line_item
3406 = start_element(ELT_SUB_SOUR_PAGE,
3408 GEDCOM_MAKE_STRING(val1, $4));
3409 START(PAGE, $1, $<ctxt>$)
3414 { end_element(ELT_SUB_SOUR_PAGE, PARENT, $<ctxt>5,
3415 GEDCOM_MAKE_NULL(val1));
3419 source_cit_even_sect : OPEN DELIM TAG_EVEN mand_line_item
3421 = start_element(ELT_SUB_SOUR_EVEN,
3423 GEDCOM_MAKE_STRING(val1, $4));
3424 START(EVEN, $1, $<ctxt>$)
3426 source_cit_even_subs
3429 { end_element(ELT_SUB_SOUR_EVEN, PARENT, $<ctxt>5,
3430 GEDCOM_MAKE_NULL(val1));
3434 source_cit_even_subs : /* empty */
3435 | source_cit_even_subs source_cit_even_sub
3438 source_cit_even_sub : source_cit_even_role_sect { OCCUR2(ROLE, 0, 1) }
3442 source_cit_even_role_sect : OPEN DELIM TAG_ROLE mand_line_item
3444 = start_element(ELT_SUB_SOUR_EVEN_ROLE,
3446 GEDCOM_MAKE_STRING(val1, $4));
3447 START(ROLE, $1, $<ctxt>$)
3452 { end_element(ELT_SUB_SOUR_EVEN_ROLE,
3454 GEDCOM_MAKE_NULL(val1));
3458 source_cit_data_sect : OPEN DELIM TAG_DATA
3459 { $<ctxt>$ = start_element(ELT_SUB_SOUR_DATA,
3460 PARENT, $1, $3, NULL,
3461 GEDCOM_MAKE_NULL(val1));
3462 START(DATA, $1, $<ctxt>$)
3464 source_cit_data_subs
3467 { end_element(ELT_SUB_SOUR_DATA, PARENT, $<ctxt>4,
3468 GEDCOM_MAKE_NULL(val1));
3472 source_cit_data_subs : /* empty */
3473 | source_cit_data_subs source_cit_data_sub
3476 source_cit_data_sub : source_cit_data_date_sect { OCCUR2(DATE, 0, 1) }
3477 | source_cit_text_sect /* 0:M */
3481 source_cit_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
3482 { struct date_value dv = gedcom_parse_date($4);
3484 = start_element(ELT_SUB_SOUR_DATA_DATE,
3486 GEDCOM_MAKE_DATE(val1, dv));
3487 START(DATE, $1, $<ctxt>$)
3492 { end_element(ELT_SUB_SOUR_DATA_DATE,
3494 GEDCOM_MAKE_NULL(val1));
3498 source_cit_text_sect : OPEN DELIM TAG_TEXT mand_line_item
3500 = start_element(ELT_SUB_SOUR_TEXT,
3502 GEDCOM_MAKE_STRING(val1, $4));
3503 reset_buffer(&concat_buffer);
3504 safe_buf_append(&concat_buffer, $4);
3505 START(TEXT, $1, $<ctxt>$)
3507 source_cit_text_subs
3510 { char* complete = get_buf_string(&concat_buffer);
3511 end_element(ELT_SUB_SOUR_TEXT, PARENT, $<ctxt>5,
3512 GEDCOM_MAKE_STRING(val1, complete));
3516 source_cit_text_subs : /* empty */
3517 | source_cit_text_subs source_cit_text_sub
3520 source_cit_text_sub : continuation_sub
3524 source_cit_quay_sect : OPEN DELIM TAG_QUAY mand_line_item
3526 = start_element(ELT_SUB_SOUR_QUAY,
3528 GEDCOM_MAKE_STRING(val1, $4));
3529 START(QUAY, $1, $<ctxt>$)
3534 { end_element(ELT_SUB_SOUR_QUAY, PARENT, $<ctxt>5,
3535 GEDCOM_MAKE_NULL(val1));
3539 source_cit_emb_sect : OPEN DELIM TAG_SOUR mand_line_item
3540 { $<ctxt>$ = start_element(ELT_SUB_SOUR,
3542 GEDCOM_MAKE_STRING(val1, $4));
3543 reset_buffer(&concat_buffer);
3544 safe_buf_append(&concat_buffer, $4);
3545 START(SOUR, $1, $<ctxt>$)
3550 { char* complete = get_buf_string(&concat_buffer);
3551 end_element(ELT_SUB_SOUR, PARENT, $<ctxt>5,
3552 GEDCOM_MAKE_STRING(val1, complete));
3556 source_cit_emb_subs : /* empty */
3557 | source_cit_emb_subs source_cit_emb_sub
3560 source_cit_emb_sub : continuation_sub
3561 | source_cit_text_sect /* 0:M */
3566 /* SOURCE REPOSITORY CITATION */
3567 source_repos_cit_sub : source_repos_repo_sect { OCCUR2(REPO, 0, 1) }
3570 source_repos_repo_sect : OPEN DELIM TAG_REPO mand_pointer
3571 { struct xref_value *xr
3572 = gedcom_parse_xref($4, XREF_USED, XREF_REPO);
3573 if (xr == NULL) HANDLE_ERROR;
3575 = start_element(ELT_SUB_REPO,
3577 GEDCOM_MAKE_XREF_PTR(val1, xr));
3578 START(REPO, $1, $<ctxt>$)
3580 source_repos_repo_subs
3583 { end_element(ELT_SUB_REPO, PARENT, $<ctxt>5,
3584 GEDCOM_MAKE_NULL(val1));
3588 source_repos_repo_subs : /* empty */
3589 | source_repos_repo_subs source_repos_repo_sub
3592 source_repos_repo_sub : note_struc_sub
3593 | caln_sect /* 0:M */
3597 caln_sect : OPEN DELIM TAG_CALN mand_line_item
3598 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN,
3600 GEDCOM_MAKE_STRING(val1, $4));
3601 START(CALN, $1, $<ctxt>$)
3606 { end_element(ELT_SUB_REPO_CALN, PARENT, $<ctxt>5,
3607 GEDCOM_MAKE_NULL(val1));
3611 caln_subs : /* empty */
3612 | caln_subs caln_sub
3615 caln_sub : caln_medi_sect { OCCUR2(MEDI, 0, 1) }
3619 caln_medi_sect : OPEN DELIM TAG_MEDI mand_line_item
3620 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN_MEDI,
3622 GEDCOM_MAKE_STRING(val1, $4));
3623 START(MEDI, $1, $<ctxt>$)
3628 { end_element(ELT_SUB_REPO_CALN_MEDI, PARENT, $<ctxt>5,
3629 GEDCOM_MAKE_NULL(val1));
3633 /* SPOUSE TO FAMILY LINK */
3634 spou_fam_link_sub : spou_fam_fams_sect /* 0:M */
3637 spou_fam_fams_sect : OPEN DELIM TAG_FAMS mand_pointer
3638 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
3640 if (xr == NULL) HANDLE_ERROR;
3642 = start_element(ELT_SUB_FAMS,
3644 GEDCOM_MAKE_XREF_PTR(val1, xr));
3645 START(FAMS, $1, $<ctxt>$)
3650 { end_element(ELT_SUB_FAMS, PARENT, $<ctxt>5,
3651 GEDCOM_MAKE_NULL(val1));
3655 spou_fam_fams_subs : /* empty */
3656 | spou_fam_fams_subs spou_fam_fams_sub
3659 spou_fam_fams_sub : note_struc_sub
3663 /*********************************************************************/
3665 /*********************************************************************/
3667 no_std_subs : /* empty */
3668 | no_std_subs no_std_sub
3671 no_std_sub : user_sect /* 0:M */
3674 CLOSE { HANDLE_ERROR }
3677 no_std_rec : user_rec /* 0:M */
3680 CLOSE { HANDLE_ERROR }
3683 user_rec : OPEN DELIM opt_xref USERTAG
3684 { if ($4.string[0] != '_') {
3685 if (compat_mode(C_551_TAGS)
3686 && compat_check_551_tag($4.string, &usertag_buffer)) {
3687 $4.string = get_buf_string(&usertag_buffer);
3690 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3697 { struct xref_value *xr = NULL;
3699 xr = gedcom_parse_xref($3, XREF_DEFINED, XREF_USER);
3700 if (xr == NULL) HANDLE_ERROR;
3702 $<ctxt>$ = start_record(REC_USER,
3704 GEDCOM_MAKE_NULL_OR_XREF_PTR(val1, xr),
3706 START($4, $1, $<ctxt>$)
3711 { end_record(REC_USER, $<ctxt>7, GEDCOM_MAKE_NULL(val1)); }
3713 user_sect : OPEN DELIM opt_xref USERTAG
3714 { if ($4.string[0] != '_') {
3715 if (compat_mode(C_551_TAGS)
3716 && compat_check_551_tag($4.string, &usertag_buffer)) {
3717 $4.string = get_buf_string(&usertag_buffer);
3719 else if (compat_mode(C_SUBM_COMM) &&
3720 compat_check_subm_comm($4.string, get_parenttag(0),
3722 $4.string = get_buf_string(&usertag_buffer);
3725 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3732 { $<ctxt>$ = start_element(ELT_USER, PARENT, $1, $4, $6, &val2);
3733 START($4, $1, $<ctxt>$);
3738 { end_element(ELT_USER, PARENT, $<ctxt>7,
3739 GEDCOM_MAKE_NULL(val1));
3740 if (compat_mode(C_SUBM_COMM))
3741 compat_close_subm_comm();
3745 user_sects : /* empty */ { }
3746 | user_sects user_sect { }
3747 | user_sects gen_sect
3748 { if (compat_mode(C_SUBM_COMM)) {
3751 gedcom_error(_("Standard tag not allowed in user section"));
3757 opt_xref : /* empty */ { $$ = NULL; }
3758 | POINTER DELIM { $$ = $1; }
3761 opt_value : /* empty */ { GEDCOM_MAKE_NULL(val2);
3763 | DELIM POINTER { struct xref_value *xr
3764 = gedcom_parse_xref($2, XREF_USED,
3766 GEDCOM_MAKE_XREF_PTR(val2, xr);
3768 | DELIM line_item { GEDCOM_MAKE_STRING(val2, $2);
3772 mand_pointer : /* empty */ { gedcom_error(_("Missing pointer")); YYERROR; }
3773 | DELIM POINTER { gedcom_debug_print("==Ptr: %s==", $2);
3777 mand_line_item : /* empty */
3778 { if (compat_mode(C_NO_REQUIRED_VALUES)) {
3779 gedcom_debug_print("==Val: ==");
3780 $$ = VALUE_IF_MISSING;
3783 gedcom_error(_("Missing value")); YYERROR;
3786 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3790 opt_line_item : /* empty */ { $$ = NULL; }
3791 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3795 line_item : anychar { size_t i;
3796 reset_buffer(&line_item_buffer);
3797 /* The following also takes care of '@@' */
3798 if (!strncmp($1, "@@", 3))
3799 SAFE_BUF_ADDCHAR(&line_item_buffer, '@')
3801 for (i=0; i < strlen($1); i++)
3802 SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i])
3803 $$ = get_buf_string(&line_item_buffer);
3805 | ESCAPE { size_t i;
3806 reset_buffer(&line_item_buffer);
3807 for (i=0; i < strlen($1); i++)
3808 SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i])
3809 $$ = get_buf_string(&line_item_buffer);
3813 /* The following also takes care of '@@' */
3814 if (!strncmp($2, "@@", 3))
3815 SAFE_BUF_ADDCHAR(&line_item_buffer, '@')
3817 for (i=0; i < strlen($2); i++)
3818 SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i])
3819 $$ = get_buf_string(&line_item_buffer);
3823 for (i=0; i < strlen($2); i++)
3824 SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i])
3825 $$ = get_buf_string(&line_item_buffer);
3827 | line_item error anychar { HANDLE_ERROR; }
3828 | line_item error ESCAPE { HANDLE_ERROR; }
3831 anychar : ANYCHAR { }
3835 error_subs : /* empty */
3836 | error_subs error_sect
3839 error_sect : OPEN DELIM opt_xref anytag opt_value error_subs CLOSE { }
3842 gen_sect : OPEN DELIM opt_xref anystdtag
3843 { if (compat_mode(C_SUBM_COMM)
3844 && compat_check_subm_comm_cont($4.string)) {
3845 /* Will pass here */
3848 INVALID_TAG($4.string);
3852 { if (compat_mode(C_SUBM_COMM)) {
3853 $<ctxt>$ = compat_subm_comm_cont_start(PARENT, $6);
3857 { if (compat_mode(C_SUBM_COMM))
3858 compat_subm_comm_cont_end(PARENT, $<ctxt>7);
3862 gen_rec : gen_rec_top
3866 gen_rec_norm : OPEN DELIM opt_xref anystdtag
3867 { INVALID_TOP_TAG($4.string) }
3868 opt_value opt_sects CLOSE
3872 gen_rec_top : OPEN DELIM anytoptag
3873 { gedcom_error(_("Missing cross-reference")); YYERROR; }
3874 opt_value opt_sects CLOSE
3878 opt_sects : /* empty */ { }
3879 | opt_sects gen_sect { }
3882 anytag : USERTAG { }
3896 anystdtag : TAG_ABBR
4027 /* Functions that handle the counting of subtags */
4029 int* count_arrays[MAXGEDCLEVEL+1];
4030 char tag_stack[MAXGEDCLEVEL+1][MAXSTDTAGLEN+1];
4031 Gedcom_ctxt ctxt_stack[MAXGEDCLEVEL+1];
4033 void push_countarray(int level)
4036 gedcom_debug_print("Push Count level: %d, level: %d", count_level, level);
4037 if (count_level != level + 1) {
4038 gedcom_error(_("Internal error: count level mismatch"));
4041 if (count_level > MAXGEDCLEVEL) {
4042 gedcom_error(_("Internal error: count array overflow"));
4046 gedcom_debug_print("calloc countarray %d", count_level);
4047 count = (int *)calloc(YYNTOKENS, sizeof(int));
4048 if (count == NULL) {
4049 gedcom_error(_("Internal error: count array calloc error"));
4053 count_arrays[count_level] = count;
4058 void set_parenttag(const char* tag)
4060 strncpy(tag_stack[count_level+1], tag, MAXSTDTAGLEN+1);
4063 void set_parentctxt(Gedcom_ctxt ctxt)
4065 ctxt_stack[count_level+1] = ctxt;
4068 char* get_parenttag(int offset)
4070 return tag_stack[count_level - offset];
4073 Gedcom_ctxt get_parentctxt(int offset)
4075 return ctxt_stack[count_level - offset];
4078 int count_tag(int tag)
4080 int *count = count_arrays[count_level];
4081 return ++count[tag - GEDCOMTAGOFFSET];
4084 int check_occurrence(int tag)
4086 int *count = count_arrays[count_level];
4087 return (count[tag - GEDCOMTAGOFFSET] > 0);
4090 void pop_countarray()
4093 gedcom_debug_print("Pop Count level: %d", count_level);
4094 if (count_level < 0) {
4095 gedcom_error(_("Internal error: count array underflow"));
4099 count = count_arrays[count_level];
4100 gedcom_debug_print("free countarray %d", count_level);
4102 count_arrays[count_level] = NULL;
4108 gedcom_debug_print("Cleanup countarrays");
4109 while (count_level > 0) {
4115 void cleanup_concat_buffer()
4117 cleanup_buffer(&concat_buffer);
4120 void cleanup_line_item_buffer()
4122 cleanup_buffer(&line_item_buffer);
4125 void cleanup_usertag_buffer()
4127 cleanup_buffer(&usertag_buffer);
4130 /* Enabling debug mode */
4131 /* level 0: no debugging */
4132 /* level 1: only internal */
4133 /* level 2: also bison */
4136 void gedcom_set_debug_level(int level, FILE* f)
4141 trace_output = stderr;
4143 gedcom_high_level_debug = 1;
4152 int gedcom_debug_print(const char* s, ...)
4155 if (gedcom_high_level_debug) {
4158 res = vfprintf(trace_output, s, ap);
4160 fprintf(trace_output, "\n");
4165 /* Setting the error mechanism */
4166 void gedcom_set_error_handling(Gedcom_err_mech mechanism)
4168 error_mechanism = mechanism;