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 if (compat_mode(C_HEAD_TIME))
650 compat_save_head_date_context($<ctxt>$);
651 START(DATE, $1, $<ctxt>$)
656 { end_element(ELT_HEAD_DATE,
657 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
661 head_date_subs : /* empty */
662 | head_date_subs head_date_sub
665 head_date_sub : head_date_time_sect { OCCUR2(TIME, 0, 1) }
669 head_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
670 { $<ctxt>$ = start_element(ELT_HEAD_DATE_TIME,
672 GEDCOM_MAKE_STRING(val1, $4));
673 START(TIME, $1, $<ctxt>$)
678 { end_element(ELT_HEAD_DATE_TIME,
679 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
683 /* HEAD.TIME (Only for compatibility) */
684 head_time_sect : OPEN DELIM TAG_TIME opt_line_item
685 { if (compat_mode(C_HEAD_TIME)) {
686 $<ctxt>$ = compat_generate_head_time_start($1, $3, $4);
690 { if (compat_mode (C_HEAD_TIME)) {
691 compat_generate_head_time_end($<ctxt>5);
697 head_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
698 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
700 if (xr == NULL) HANDLE_ERROR;
701 $<ctxt>$ = start_element(ELT_HEAD_SUBM,
703 GEDCOM_MAKE_XREF_PTR(val1, xr));
704 START(SUBM, $1, $<ctxt>$)
709 { end_element(ELT_HEAD_SUBM,
710 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
714 head_subn_sect : OPEN DELIM TAG_SUBN mand_pointer
715 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
717 if (xr == NULL) HANDLE_ERROR;
718 $<ctxt>$ = start_element(ELT_HEAD_SUBN,
720 GEDCOM_MAKE_XREF_PTR(val1, xr));
721 START(SUBN, $1, $<ctxt>$)
726 { end_element(ELT_HEAD_SUBN,
727 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
731 head_file_sect : OPEN DELIM TAG_FILE mand_line_item
732 { $<ctxt>$ = start_element(ELT_HEAD_FILE,
734 GEDCOM_MAKE_STRING(val1, $4));
735 START(FILE, $1, $<ctxt>$)
740 { end_element(ELT_HEAD_FILE, PARENT, $<ctxt>5,
741 GEDCOM_MAKE_NULL(val1));
745 head_copr_sect : OPEN DELIM TAG_COPR mand_line_item
746 { $<ctxt>$ = start_element(ELT_HEAD_COPR,
748 GEDCOM_MAKE_STRING(val1, $4));
749 START(COPR, $1, $<ctxt>$)
754 { end_element(ELT_HEAD_COPR, PARENT, $<ctxt>5,
755 GEDCOM_MAKE_NULL(val1));
759 head_gedc_sect : OPEN DELIM TAG_GEDC
760 { $<ctxt>$ = start_element(ELT_HEAD_GEDC,
761 PARENT, $1, $3, NULL,
762 GEDCOM_MAKE_NULL(val1));
763 START(GEDC, $1, $<ctxt>$)
766 { if (compat_mode(C_NO_GEDC_FORM) && ! CHK_COND(FORM))
767 compat_generate_gedcom_form($<ctxt>4);
774 { end_element(ELT_HEAD_GEDC, PARENT, $<ctxt>4,
775 GEDCOM_MAKE_NULL(val1));
779 head_gedc_subs : /* empty */
780 | head_gedc_subs head_gedc_sub
783 head_gedc_sub : head_gedc_vers_sect { OCCUR2(VERS, 1, 1) }
784 | head_gedc_form_sect { OCCUR2(FORM, 1, 1) }
787 head_gedc_vers_sect : OPEN DELIM TAG_VERS mand_line_item
788 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_VERS,
790 GEDCOM_MAKE_STRING(val1, $4));
791 START(VERS, $1, $<ctxt>$)
796 { end_element(ELT_HEAD_GEDC_VERS,
797 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
800 head_gedc_form_sect : OPEN DELIM TAG_FORM mand_line_item
801 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_FORM,
803 GEDCOM_MAKE_STRING(val1, $4));
804 START(FORM, $1, $<ctxt>$)
809 { end_element(ELT_HEAD_GEDC_FORM,
810 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
815 head_char_sect : OPEN DELIM TAG_CHAR mand_line_item
816 { /* Don't allow to continue if conversion context couldn't
818 if (open_conv_to_internal($4) == 0) HANDLE_ERROR;
819 $<ctxt>$ = start_element(ELT_HEAD_CHAR,
821 GEDCOM_MAKE_STRING(val1, $4));
822 START(CHAR, $1, $<ctxt>$)
827 { end_element(ELT_HEAD_CHAR, PARENT, $<ctxt>5,
828 GEDCOM_MAKE_NULL(val1));
832 head_char_subs : /* empty */
833 | head_char_subs head_char_sub
836 head_char_sub : head_char_vers_sect { OCCUR2(VERS, 0, 1) }
839 head_char_vers_sect : OPEN DELIM TAG_VERS mand_line_item
840 { $<ctxt>$ = start_element(ELT_HEAD_CHAR_VERS,
842 GEDCOM_MAKE_STRING(val1, $4));
843 START(VERS, $1, $<ctxt>$)
848 { end_element(ELT_HEAD_CHAR_VERS,
849 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
854 head_lang_sect : OPEN DELIM TAG_LANG mand_line_item
855 { $<ctxt>$ = start_element(ELT_HEAD_LANG,
857 GEDCOM_MAKE_STRING(val1, $4));
858 START(LANG, $1, $<ctxt>$)
863 { end_element(ELT_HEAD_LANG, PARENT, $<ctxt>5,
864 GEDCOM_MAKE_NULL(val1));
868 head_plac_sect : OPEN DELIM TAG_PLAC
869 { $<ctxt>$ = start_element(ELT_HEAD_PLAC,
870 PARENT, $1, $3, NULL,
871 GEDCOM_MAKE_NULL(val1));
872 START(PLAC, $1, $<ctxt>$)
877 { end_element(ELT_HEAD_PLAC, PARENT, $<ctxt>4,
878 GEDCOM_MAKE_NULL(val1));
882 head_plac_subs : /* empty */
883 | head_plac_subs head_plac_sub
886 head_plac_sub : head_plac_form_sect { OCCUR2(FORM, 1, 1) }
889 head_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
890 { $<ctxt>$ = start_element(ELT_HEAD_PLAC_FORM,
892 GEDCOM_MAKE_STRING(val1, $4));
893 START(FORM, $1, $<ctxt>$)
898 { end_element(ELT_HEAD_PLAC_FORM,
899 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
904 head_note_sect : OPEN DELIM TAG_NOTE mand_line_item
905 { $<ctxt>$ = start_element(ELT_HEAD_NOTE,
907 GEDCOM_MAKE_STRING(val1, $4));
908 reset_buffer(&concat_buffer);
909 safe_buf_append(&concat_buffer, $4);
910 START(NOTE, $1, $<ctxt>$)
915 { char* complete = get_buf_string(&concat_buffer);
916 end_element(ELT_HEAD_NOTE, PARENT, $<ctxt>5,
917 GEDCOM_MAKE_STRING(val1, complete));
921 head_note_subs : /* empty */
922 | head_note_subs head_note_sub
925 head_note_sub : continuation_sub /* 0:M */
929 /*********************************************************************/
931 /*********************************************************************/
932 /* Don't need callbacks here, there is no information... */
933 trlr_sect : OPEN DELIM TAG_TRLR CLOSE { }
936 /*********************************************************************/
937 /**** Family record ****/
938 /*********************************************************************/
939 fam_rec : OPEN DELIM POINTER DELIM TAG_FAM
940 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
942 if (xr == NULL) HANDLE_ERROR;
943 $<ctxt>$ = start_record(REC_FAM,
944 $1, GEDCOM_MAKE_XREF_PTR(val1, xr),
946 NULL, GEDCOM_MAKE_NULL(val2));
947 START(FAM, $1, $<ctxt>$) }
951 { end_record(REC_FAM, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
954 fam_subs : /* empty */
958 fam_sub : fam_event_struc_sub /* 0:M */
959 | fam_husb_sect { OCCUR2(HUSB, 0, 1) }
960 | fam_wife_sect { OCCUR2(WIFE, 0, 1) }
961 | fam_chil_sect /* 0:M */
962 | fam_nchi_sect { OCCUR2(NCHI, 0, 1) }
963 | fam_subm_sect /* 0:M */
964 | lds_spouse_seal_sub /* 0:M */
965 | source_cit_sub /* 0:M */
966 | multim_link_sub /* 0:M */
967 | note_struc_sub /* 0:M */
968 | ident_struc_sub /* 0:1 */
969 | change_date_sub /* 0:1 */
974 fam_husb_sect : OPEN DELIM TAG_HUSB mand_pointer
975 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
977 if (xr == NULL) HANDLE_ERROR;
978 $<ctxt>$ = start_element(ELT_FAM_HUSB,
980 GEDCOM_MAKE_XREF_PTR(val1, xr));
981 START(HUSB, $1, $<ctxt>$)
986 { end_element(ELT_FAM_HUSB, PARENT, $<ctxt>5,
987 GEDCOM_MAKE_NULL(val1));
992 fam_wife_sect : OPEN DELIM TAG_WIFE mand_pointer
993 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
995 if (xr == NULL) HANDLE_ERROR;
996 $<ctxt>$ = start_element(ELT_FAM_WIFE,
998 GEDCOM_MAKE_XREF_PTR(val1, xr));
999 START(WIFE, $1, $<ctxt>$)
1004 { end_element(ELT_FAM_WIFE, PARENT, $<ctxt>5,
1005 GEDCOM_MAKE_NULL(val1));
1010 fam_chil_sect : OPEN DELIM TAG_CHIL mand_pointer
1011 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1013 if (xr == NULL) HANDLE_ERROR;
1014 $<ctxt>$ = start_element(ELT_FAM_CHIL,
1016 GEDCOM_MAKE_XREF_PTR(val1, xr));
1017 START(CHIL, $1, $<ctxt>$)
1022 { end_element(ELT_FAM_CHIL, PARENT, $<ctxt>5,
1023 GEDCOM_MAKE_NULL(val1));
1028 fam_nchi_sect : OPEN DELIM TAG_NCHI mand_line_item
1029 { $<ctxt>$ = start_element(ELT_FAM_NCHI,
1031 GEDCOM_MAKE_STRING(val1, $4));
1032 START(NCHI, $1, $<ctxt>$)
1037 { end_element(ELT_FAM_NCHI, PARENT, $<ctxt>5,
1038 GEDCOM_MAKE_NULL(val1));
1043 fam_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1044 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1046 if (xr == NULL) HANDLE_ERROR;
1047 $<ctxt>$ = start_element(ELT_FAM_SUBM,
1049 GEDCOM_MAKE_XREF_PTR(val1, xr));
1050 START(SUBM, $1, $<ctxt>$)
1055 { end_element(ELT_FAM_SUBM, PARENT, $<ctxt>5,
1056 GEDCOM_MAKE_NULL(val1));
1060 /*********************************************************************/
1061 /**** Individual record ****/
1062 /*********************************************************************/
1063 indiv_rec : OPEN DELIM POINTER DELIM TAG_INDI
1064 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1066 if (xr == NULL) HANDLE_ERROR;
1067 $<ctxt>$ = start_record(REC_INDI,
1068 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1069 NULL, GEDCOM_MAKE_NULL(val2));
1070 START(INDI, $1, $<ctxt>$) }
1074 { end_record(REC_INDI, $<ctxt>6, GEDCOM_MAKE_NULL(val1));
1075 if (compat_mode(C_NO_SLGC_FAMC))
1076 compat_generate_slgc_famc_fam();
1080 indi_subs : /* empty */
1081 | indi_subs indi_sub
1084 indi_sub : indi_resn_sect { OCCUR2(RESN, 0, 1) }
1085 | pers_name_struc_sub /* 0:M */
1086 | indi_sex_sect { OCCUR2(SEX, 0, 1) }
1087 | indiv_even_struc_sub /* 0:M */
1088 | indiv_attr_struc_sub /* 0:M */
1089 | lds_indiv_ord_sub /* 0:M */
1090 | chi_fam_link_sub /* 0:M */
1091 | spou_fam_link_sub /* 0:M */
1092 | indi_subm_sect /* 0:M */
1093 | assoc_struc_sub /* 0:M */
1094 | indi_alia_sect /* 0:M */
1095 | indi_anci_sect /* 0:M */
1096 | indi_desi_sect /* 0:M */
1097 | source_cit_sub /* 0:M */
1098 | multim_link_sub /* 0:M */
1099 | note_struc_sub /* 0:M */
1100 | indi_rfn_sect { OCCUR2(RFN, 0, 1) }
1101 | indi_afn_sect /* 0:M */
1102 | ident_struc_sub /* 0:1 */
1103 | change_date_sub /* 0:1 */
1104 | indi_addr_sect { if (!compat_mode(C_INDI_ADDR))
1105 INVALID_TAG("ADDR");
1111 indi_resn_sect : OPEN DELIM TAG_RESN mand_line_item
1112 { $<ctxt>$ = start_element(ELT_INDI_RESN,
1114 GEDCOM_MAKE_STRING(val1, $4));
1115 START(RESN, $1, $<ctxt>$)
1120 { end_element(ELT_INDI_RESN, PARENT, $<ctxt>5,
1121 GEDCOM_MAKE_NULL(val1));
1126 indi_sex_sect : OPEN DELIM TAG_SEX mand_line_item
1127 { $<ctxt>$ = start_element(ELT_INDI_SEX,
1129 GEDCOM_MAKE_STRING(val1, $4));
1130 START(SEX, $1, $<ctxt>$)
1135 { end_element(ELT_INDI_SEX, PARENT, $<ctxt>5,
1136 GEDCOM_MAKE_NULL(val1));
1141 indi_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1142 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1144 if (xr == NULL) HANDLE_ERROR;
1145 $<ctxt>$ = start_element(ELT_INDI_SUBM,
1147 GEDCOM_MAKE_XREF_PTR(val1, xr));
1148 START(SUBM, $1, $<ctxt>$)
1153 { end_element(ELT_INDI_SUBM, PARENT, $<ctxt>5,
1154 GEDCOM_MAKE_NULL(val1));
1159 indi_alia_sect : OPEN DELIM TAG_ALIA mand_pointer
1160 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1162 if (xr == NULL) HANDLE_ERROR;
1163 $<ctxt>$ = start_element(ELT_INDI_ALIA,
1165 GEDCOM_MAKE_XREF_PTR(val1, xr));
1166 START(ALIA, $1, $<ctxt>$)
1171 { end_element(ELT_INDI_ALIA, PARENT, $<ctxt>5,
1172 GEDCOM_MAKE_NULL(val1));
1177 indi_anci_sect : OPEN DELIM TAG_ANCI mand_pointer
1178 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1180 if (xr == NULL) HANDLE_ERROR;
1181 $<ctxt>$ = start_element(ELT_INDI_ANCI,
1183 GEDCOM_MAKE_XREF_PTR(val1, xr));
1184 START(ANCI, $1, $<ctxt>$)
1189 { end_element(ELT_INDI_ANCI, PARENT, $<ctxt>5,
1190 GEDCOM_MAKE_NULL(val1));
1195 indi_desi_sect : OPEN DELIM TAG_DESI mand_pointer
1196 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1198 if (xr == NULL) HANDLE_ERROR;
1199 $<ctxt>$ = start_element(ELT_INDI_DESI,
1201 GEDCOM_MAKE_XREF_PTR(val1, xr));
1202 START(DESI, $1, $<ctxt>$)
1207 { end_element(ELT_INDI_DESI, PARENT, $<ctxt>5,
1208 GEDCOM_MAKE_NULL(val1));
1213 indi_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1214 { $<ctxt>$ = start_element(ELT_INDI_RFN,
1216 GEDCOM_MAKE_STRING(val1, $4));
1217 START(RFN, $1, $<ctxt>$)
1222 { end_element(ELT_INDI_RFN, PARENT, $<ctxt>5,
1223 GEDCOM_MAKE_NULL(val1));
1228 indi_afn_sect : OPEN DELIM TAG_AFN mand_line_item
1229 { $<ctxt>$ = start_element(ELT_INDI_AFN,
1231 GEDCOM_MAKE_STRING(val1, $4));
1232 START(AFN, $1, $<ctxt>$)
1237 { end_element(ELT_INDI_AFN, PARENT, $<ctxt>5,
1238 GEDCOM_MAKE_NULL(val1));
1242 /* INDI.ADDR (Only for compatibility) */
1243 indi_addr_sect : OPEN DELIM TAG_ADDR opt_line_item
1244 { if (compat_mode(C_INDI_ADDR)) {
1245 Gedcom_ctxt par = compat_generate_resi_start(PARENT);
1246 START(RESI, $1, par);
1248 = start_element(ELT_SUB_ADDR,
1249 par, $1 + 1, $3, $4,
1250 GEDCOM_MAKE_NULL_OR_STRING(val2, $4));
1251 reset_buffer(&concat_buffer);
1252 safe_buf_append(&concat_buffer, $4);
1253 START(ADDR, $1 + 1, $<ctxt>$);
1255 else { START(ADDR, $1, NULL) }
1260 { if (compat_mode(C_INDI_ADDR)) {
1261 Gedcom_ctxt par = PARENT;
1262 char* complete = get_buf_string(&concat_buffer);
1263 end_element(ELT_SUB_ADDR, par, $<ctxt>5,
1264 GEDCOM_MAKE_STRING(val1, complete));
1266 compat_generate_resi_end(PARENT, par);
1271 ftree_addr_subs : /* empty */
1272 | ftree_addr_subs ftree_addr_sub
1275 ftree_addr_sub : continuation_sub
1276 | ftree_addr_phon_sect
1280 ftree_addr_phon_sect : OPEN DELIM TAG_PHON mand_line_item
1282 = start_element(ELT_SUB_PHON,
1283 GRANDPARENT(1), $1, $3, $4,
1284 GEDCOM_MAKE_STRING(val1, $4));
1285 START(PHON, $1, $<ctxt>$)
1290 { end_element(ELT_SUB_PHON, GRANDPARENT(1),
1291 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1295 /*********************************************************************/
1296 /**** Multimedia record ****/
1297 /*********************************************************************/
1298 multim_rec : OPEN DELIM POINTER DELIM TAG_OBJE
1299 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1301 if (xr == NULL) HANDLE_ERROR;
1302 $<ctxt>$ = start_record(REC_OBJE,
1303 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1304 NULL, GEDCOM_MAKE_NULL(val2));
1305 START(OBJE, $1, $<ctxt>$) }
1307 { CHECK2(FORM, BLOB) }
1309 { end_record(REC_OBJE, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1312 obje_subs : /* empty */
1313 | obje_subs obje_sub
1316 obje_sub : obje_form_sect { OCCUR2(FORM, 1, 1) }
1317 | obje_titl_sect { OCCUR2(TITL, 0, 1) }
1318 | note_struc_sub /* 0:M */
1319 | obje_blob_sect { OCCUR2(BLOB, 1, 1) }
1320 | obje_obje_sect { OCCUR2(OBJE, 0, 1) }
1321 | ident_struc_sub /* 0:1 */
1322 | change_date_sub /* 0:1 */
1327 obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
1328 { $<ctxt>$ = start_element(ELT_OBJE_FORM,
1330 GEDCOM_MAKE_STRING(val1, $4));
1331 START(FORM, $1, $<ctxt>$)
1336 { end_element(ELT_OBJE_FORM, PARENT, $<ctxt>5,
1337 GEDCOM_MAKE_NULL(val1));
1342 obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1343 { $<ctxt>$ = start_element(ELT_OBJE_TITL,
1345 GEDCOM_MAKE_STRING(val1, $4));
1346 START(TITL, $1, $<ctxt>$)
1351 { end_element(ELT_OBJE_TITL, PARENT, $<ctxt>5,
1352 GEDCOM_MAKE_NULL(val1));
1357 obje_blob_sect : OPEN DELIM TAG_BLOB
1358 { $<ctxt>$ = start_element(ELT_OBJE_BLOB,
1359 PARENT, $1, $3, NULL,
1360 GEDCOM_MAKE_NULL(val1));
1361 reset_buffer(&concat_buffer);
1362 START(BLOB, $1, $<ctxt>$)
1367 { char* complete = get_buf_string(&concat_buffer);
1368 end_element(ELT_OBJE_BLOB, PARENT, $<ctxt>4,
1369 GEDCOM_MAKE_STRING(val1, complete));
1373 obje_blob_subs : /* empty */
1374 | obje_blob_subs obje_blob_sub
1377 obje_blob_sub : obje_blob_cont_sect { OCCUR1(CONT, 1) }
1381 obje_blob_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1382 { $<ctxt>$ = start_element(ELT_OBJE_BLOB_CONT,
1384 GEDCOM_MAKE_STRING(val1, $4));
1385 safe_buf_append(&concat_buffer, $4);
1386 START(CONT, $1, $<ctxt>$)
1391 { end_element(ELT_OBJE_BLOB_CONT, PARENT,
1392 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1397 obje_obje_sect : OPEN DELIM TAG_OBJE mand_pointer
1398 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1400 if (xr == NULL) HANDLE_ERROR;
1401 $<ctxt>$ = start_element(ELT_OBJE_OBJE,
1403 GEDCOM_MAKE_XREF_PTR(val1, xr));
1404 START(OBJE, $1, $<ctxt>$)
1409 { end_element(ELT_OBJE_OBJE, PARENT, $<ctxt>5,
1410 GEDCOM_MAKE_NULL(val1));
1414 /*********************************************************************/
1415 /**** Note record ****/
1416 /*********************************************************************/
1417 note_rec : OPEN DELIM POINTER DELIM TAG_NOTE note_line_item
1418 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1420 if (xr == NULL) HANDLE_ERROR;
1421 $<ctxt>$ = start_record(REC_NOTE,
1422 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1423 $6, GEDCOM_MAKE_STRING(val2, $6));
1424 reset_buffer(&concat_buffer);
1425 safe_buf_append(&concat_buffer, $6);
1426 START(NOTE, $1, $<ctxt>$) }
1430 { char* complete = get_buf_string(&concat_buffer);
1431 end_record(REC_NOTE, $<ctxt>7,
1432 GEDCOM_MAKE_STRING(val1, complete)); }
1435 note_line_item : /* empty */
1436 { if (!compat_mode(C_NOTE_NO_VALUE)) {
1437 gedcom_error(_("Missing value")); YYERROR;
1440 $$ = VALUE_IF_MISSING;
1444 { gedcom_debug_print("==Val: %s==", $2);
1448 note_subs : /* empty */
1449 | note_subs note_sub
1452 note_sub : continuation_sub /* 0:M */
1453 | source_cit_sub /* 0:M */
1454 | ident_struc_sub /* 0:1 */
1455 | change_date_sub /* 0:1 */
1456 | note_note_sect { if (!compat_mode(C_NOTE_NOTE))
1457 INVALID_TAG("NOTE");
1462 /* Same actions as cont_sect, for compatibility */
1463 note_note_sect : OPEN DELIM TAG_NOTE opt_line_item
1464 { $3.string = "CONT";
1465 $3.value = TAG_CONT;
1466 $<ctxt>$ = start_element(ELT_SUB_CONT,
1468 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
1469 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
1470 if (GEDCOM_IS_STRING(&val1))
1471 safe_buf_append(&concat_buffer, $4);
1472 START(CONT, $1, $<ctxt>$)
1477 { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5,
1478 GEDCOM_MAKE_NULL(val1));
1482 /*********************************************************************/
1483 /**** Repository record ****/
1484 /*********************************************************************/
1485 repos_rec : OPEN DELIM POINTER DELIM TAG_REPO
1486 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1488 if (xr == NULL) HANDLE_ERROR;
1489 $<ctxt>$ = start_record(REC_REPO,
1490 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1491 NULL, GEDCOM_MAKE_NULL(val2));
1492 START(REPO, $1, $<ctxt>$) }
1496 { end_record(REC_REPO, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1499 repo_subs : /* empty */
1500 | repo_subs repo_sub
1503 repo_sub : repo_name_sect { OCCUR2(NAME, 0, 1) }
1504 | addr_struc_sub /* 0:1 */
1505 | note_struc_sub /* 0:M */
1506 | ident_struc_sub /* 0:1 */
1507 | change_date_sub /* 0:1 */
1512 repo_name_sect : OPEN DELIM TAG_NAME mand_line_item
1513 { $<ctxt>$ = start_element(ELT_REPO_NAME,
1515 GEDCOM_MAKE_STRING(val1, $4));
1516 START(NAME, $1, $<ctxt>$)
1521 { end_element(ELT_REPO_NAME, PARENT, $<ctxt>5,
1522 GEDCOM_MAKE_NULL(val1));
1526 /*********************************************************************/
1527 /**** Source record ****/
1528 /*********************************************************************/
1529 source_rec : OPEN DELIM POINTER DELIM TAG_SOUR
1530 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1532 if (xr == NULL) HANDLE_ERROR;
1533 $<ctxt>$ = start_record(REC_SOUR,
1534 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1535 NULL, GEDCOM_MAKE_NULL(val2));
1536 START(SOUR, $1, $<ctxt>$) }
1540 { end_record(REC_SOUR, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1543 sour_subs : /* empty */
1544 | sour_subs sour_sub
1547 sour_sub : sour_data_sect { OCCUR2(DATA, 0, 1) }
1548 | sour_auth_sect { OCCUR2(AUTH, 0, 1) }
1549 | sour_titl_sect { OCCUR2(TITL, 0, 1) }
1550 | sour_abbr_sect { OCCUR2(ABBR, 0, 1) }
1551 | sour_publ_sect { OCCUR2(PUBL, 0, 1) }
1552 | sour_text_sect { OCCUR2(TEXT, 0, 1) }
1553 | source_repos_cit_sub /* 0:1 */
1554 | multim_link_sub /* 0:M */
1555 | note_struc_sub /* 0:M */
1556 | ident_struc_sub /* 0:1 */
1557 | change_date_sub /* 0:1 */
1562 sour_data_sect : OPEN DELIM TAG_DATA
1563 { $<ctxt>$ = start_element(ELT_SOUR_DATA,
1564 PARENT, $1, $3, NULL,
1565 GEDCOM_MAKE_NULL(val1));
1566 START(DATA, $1, $<ctxt>$)
1571 { end_element(ELT_SOUR_DATA, PARENT, $<ctxt>4,
1572 GEDCOM_MAKE_NULL(val1));
1576 sour_data_subs : /* empty */
1577 | sour_data_subs sour_data_sub
1580 sour_data_sub : sour_data_even_sect /* 0:M */
1581 | sour_data_agnc_sect { OCCUR2(AGNC, 0, 1) }
1582 | note_struc_sub /* 0:M */
1586 sour_data_even_sect : OPEN DELIM TAG_EVEN mand_line_item
1587 { $<ctxt>$ = start_element(ELT_SOUR_DATA_EVEN,
1589 GEDCOM_MAKE_STRING(val1, $4));
1590 START(EVEN, $1, $<ctxt>$)
1595 { end_element(ELT_SOUR_DATA_EVEN, PARENT,
1596 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1600 sour_data_even_subs : /* empty */
1601 | sour_data_even_subs sour_data_even_sub
1604 sour_data_even_sub : sour_data_even_date_sect { OCCUR2(DATE, 0, 1) }
1605 | sour_data_even_plac_sect { OCCUR2(PLAC, 0, 1) }
1609 sour_data_even_date_sect : OPEN DELIM TAG_DATE mand_line_item
1610 { struct date_value dv = gedcom_parse_date($4);
1612 = start_element(ELT_SOUR_DATA_EVEN_DATE,
1614 GEDCOM_MAKE_DATE(val1, dv));
1615 START(DATE, $1, $<ctxt>$)
1620 { end_element(ELT_SOUR_DATA_EVEN_DATE, PARENT,
1621 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1625 sour_data_even_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
1627 = start_element(ELT_SOUR_DATA_EVEN_PLAC,
1629 GEDCOM_MAKE_STRING(val1, $4));
1630 START(PLAC, $1, $<ctxt>$)
1635 { end_element(ELT_SOUR_DATA_EVEN_PLAC, PARENT,
1636 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1640 sour_data_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
1641 { $<ctxt>$ = start_element(ELT_SOUR_DATA_AGNC,
1643 GEDCOM_MAKE_STRING(val1, $4));
1644 START(AGNC, $1, $<ctxt>$)
1649 { end_element(ELT_SOUR_DATA_AGNC, PARENT,
1650 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1655 sour_auth_sect : OPEN DELIM TAG_AUTH mand_line_item
1656 { $<ctxt>$ = start_element(ELT_SOUR_AUTH,
1658 GEDCOM_MAKE_STRING(val1, $4));
1659 reset_buffer(&concat_buffer);
1660 safe_buf_append(&concat_buffer, $4);
1661 START(AUTH, $1, $<ctxt>$)
1666 { char* complete = get_buf_string(&concat_buffer);
1667 end_element(ELT_SOUR_AUTH, PARENT, $<ctxt>5,
1668 GEDCOM_MAKE_STRING(val1, complete));
1672 sour_auth_subs : /* empty */
1673 | sour_auth_subs sour_auth_sub
1676 sour_auth_sub : continuation_sub /* 0:M */
1681 sour_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1682 { $<ctxt>$ = start_element(ELT_SOUR_TITL,
1684 GEDCOM_MAKE_STRING(val1, $4));
1685 reset_buffer(&concat_buffer);
1686 safe_buf_append(&concat_buffer, $4);
1687 START(TITL, $1, $<ctxt>$)
1692 { char* complete = get_buf_string(&concat_buffer);
1693 end_element(ELT_SOUR_TITL, PARENT, $<ctxt>5,
1694 GEDCOM_MAKE_STRING(val1, complete));
1698 sour_titl_subs : /* empty */
1699 | sour_titl_subs sour_titl_sub
1702 sour_titl_sub : continuation_sub /* 0:M */
1707 sour_abbr_sect : OPEN DELIM TAG_ABBR mand_line_item
1708 { $<ctxt>$ = start_element(ELT_SOUR_ABBR,
1710 GEDCOM_MAKE_STRING(val1, $4));
1711 START(ABBR, $1, $<ctxt>$)
1716 { end_element(ELT_SOUR_ABBR, PARENT, $<ctxt>5,
1717 GEDCOM_MAKE_NULL(val1));
1722 sour_publ_sect : OPEN DELIM TAG_PUBL mand_line_item
1723 { $<ctxt>$ = start_element(ELT_SOUR_PUBL,
1725 GEDCOM_MAKE_STRING(val1, $4));
1726 reset_buffer(&concat_buffer);
1727 safe_buf_append(&concat_buffer, $4);
1728 START(PUBL, $1, $<ctxt>$)
1733 { char* complete = get_buf_string(&concat_buffer);
1734 end_element(ELT_SOUR_PUBL, PARENT, $<ctxt>5,
1735 GEDCOM_MAKE_STRING(val1, complete));
1739 sour_publ_subs : /* empty */
1740 | sour_publ_subs sour_publ_sub
1743 sour_publ_sub : continuation_sub /* 0:M */
1748 sour_text_sect : OPEN DELIM TAG_TEXT mand_line_item
1749 { $<ctxt>$ = start_element(ELT_SOUR_TEXT,
1751 GEDCOM_MAKE_STRING(val1, $4));
1752 reset_buffer(&concat_buffer);
1753 safe_buf_append(&concat_buffer, $4);
1754 START(TEXT, $1, $<ctxt>$)
1759 { char* complete = get_buf_string(&concat_buffer);
1760 end_element(ELT_SOUR_TEXT, PARENT, $<ctxt>5,
1761 GEDCOM_MAKE_STRING(val1, complete));
1765 sour_text_subs : /* empty */
1766 | sour_text_subs sour_text_sub
1769 sour_text_sub : continuation_sub /* 0:M */
1773 /*********************************************************************/
1774 /**** Submission record ****/
1775 /*********************************************************************/
1776 submis_rec : OPEN DELIM POINTER DELIM TAG_SUBN
1777 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1779 if (xr == NULL) HANDLE_ERROR;
1780 $<ctxt>$ = start_record(REC_SUBN,
1781 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1782 NULL, GEDCOM_MAKE_NULL(val2));
1783 START(SUBN, $1, $<ctxt>$) }
1787 { end_record(REC_SUBN, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1790 subn_subs : /* empty */
1791 | subn_subs subn_sub
1794 subn_sub : subn_subm_sect { OCCUR2(SUBM, 0, 1) }
1795 | subn_famf_sect { OCCUR2(FAMF, 0, 1) }
1796 | subn_temp_sect { OCCUR2(TEMP, 0, 1) }
1797 | subn_ance_sect { OCCUR2(ANCE, 0, 1) }
1798 | subn_desc_sect { OCCUR2(DESC, 0, 1) }
1799 | subn_ordi_sect { OCCUR2(ORDI, 0, 1) }
1800 | subn_rin_sect { OCCUR2(RIN, 0, 1) }
1805 subn_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1806 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1808 if (xr == NULL) HANDLE_ERROR;
1809 $<ctxt>$ = start_element(ELT_SUBN_SUBM,
1811 GEDCOM_MAKE_XREF_PTR(val1, xr));
1812 START(SUBM, $1, $<ctxt>$)
1817 { end_element(ELT_SUBN_SUBM, PARENT, $<ctxt>5,
1818 GEDCOM_MAKE_NULL(val1));
1823 subn_famf_sect : OPEN DELIM TAG_FAMF mand_line_item
1824 { $<ctxt>$ = start_element(ELT_SUBN_FAMF,
1826 GEDCOM_MAKE_STRING(val1, $4));
1827 START(FAMF, $1, $<ctxt>$)
1832 { end_element(ELT_SUBN_FAMF, PARENT, $<ctxt>5,
1833 GEDCOM_MAKE_NULL(val1));
1838 subn_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
1839 { $<ctxt>$ = start_element(ELT_SUBN_TEMP,
1841 GEDCOM_MAKE_STRING(val1, $4));
1842 START(TEMP, $1, $<ctxt>$)
1847 { end_element(ELT_SUBN_TEMP, PARENT, $<ctxt>5,
1848 GEDCOM_MAKE_NULL(val1));
1853 subn_ance_sect : OPEN DELIM TAG_ANCE mand_line_item
1854 { $<ctxt>$ = start_element(ELT_SUBN_ANCE,
1856 GEDCOM_MAKE_STRING(val1, $4));
1857 START(ANCE, $1, $<ctxt>$)
1862 { end_element(ELT_SUBN_ANCE, PARENT, $<ctxt>5,
1863 GEDCOM_MAKE_NULL(val1));
1868 subn_desc_sect : OPEN DELIM TAG_DESC mand_line_item
1869 { $<ctxt>$ = start_element(ELT_SUBN_DESC,
1871 GEDCOM_MAKE_STRING(val1, $4));
1872 START(DESC, $1, $<ctxt>$)
1877 { end_element(ELT_SUBN_DESC, PARENT, $<ctxt>5,
1878 GEDCOM_MAKE_NULL(val1));
1883 subn_ordi_sect : OPEN DELIM TAG_ORDI mand_line_item
1884 { $<ctxt>$ = start_element(ELT_SUBN_ORDI,
1886 GEDCOM_MAKE_STRING(val1, $4));
1887 START(ORDI, $1, $<ctxt>$)
1892 { end_element(ELT_SUBN_ORDI, PARENT, $<ctxt>5,
1893 GEDCOM_MAKE_NULL(val1));
1898 subn_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1899 { $<ctxt>$ = start_element(ELT_SUBN_RIN,
1901 GEDCOM_MAKE_STRING(val1, $4));
1902 START(RIN, $1, $<ctxt>$)
1907 { end_element(ELT_SUBN_RIN, PARENT, $<ctxt>5,
1908 GEDCOM_MAKE_NULL(val1));
1912 /*********************************************************************/
1913 /**** Submitter record ****/
1914 /*********************************************************************/
1915 submit_rec : OPEN DELIM POINTER DELIM TAG_SUBM
1916 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1918 if (xr == NULL) HANDLE_ERROR;
1919 $<ctxt>$ = start_record(REC_SUBM,
1920 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1921 NULL, GEDCOM_MAKE_NULL(val2));
1922 START(SUBM, $1, $<ctxt>$) }
1926 { end_record(REC_SUBM, $<ctxt>6, GEDCOM_MAKE_NULL(val1));
1927 if (compat_mode(C_SUBM_CTRY))
1928 compat_free_ctry_parent_context();
1932 subm_subs : /* empty */
1933 | subm_subs subm_sub
1936 subm_sub : subm_name_sect { OCCUR2(NAME, 1, 1) }
1937 | addr_struc_sub /* 0:1 */
1938 | multim_link_sub /* 0:M */
1939 | subm_lang_sect { OCCUR2(LANG, 0, 3) }
1940 | subm_rfn_sect { OCCUR2(RFN, 0, 1) }
1941 | subm_rin_sect { OCCUR2(RIN, 0, 1) }
1942 | change_date_sub /* 0:1 */
1943 | subm_ctry_sect { if (!compat_mode(C_SUBM_CTRY))
1944 INVALID_TAG("CTRY");
1945 OCCUR2(CTRY, 0, 1) }
1950 subm_name_sect : OPEN DELIM TAG_NAME mand_line_item
1951 { $<ctxt>$ = start_element(ELT_SUBM_NAME,
1953 GEDCOM_MAKE_STRING(val1, $4));
1954 START(NAME, $1, $<ctxt>$)
1959 { end_element(ELT_SUBM_NAME, PARENT, $<ctxt>5,
1960 GEDCOM_MAKE_NULL(val1));
1965 subm_lang_sect : OPEN DELIM TAG_LANG mand_line_item
1966 { $<ctxt>$ = start_element(ELT_SUBM_LANG,
1968 GEDCOM_MAKE_STRING(val1, $4));
1969 START(LANG, $1, $<ctxt>$)
1974 { end_element(ELT_SUBM_LANG, PARENT, $<ctxt>5,
1975 GEDCOM_MAKE_NULL(val1));
1980 subm_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1981 { $<ctxt>$ = start_element(ELT_SUBM_RFN,
1983 GEDCOM_MAKE_STRING(val1, $4));
1984 START(RFN, $1, $<ctxt>$)
1989 { end_element(ELT_SUBM_RFN, PARENT, $<ctxt>5,
1990 GEDCOM_MAKE_NULL(val1));
1995 subm_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1996 { $<ctxt>$ = start_element(ELT_SUBM_RIN,
1998 GEDCOM_MAKE_STRING(val1, $4));
1999 START(RIN, $1, $<ctxt>$)
2004 { end_element(ELT_SUBM_RIN, PARENT, $<ctxt>5,
2005 GEDCOM_MAKE_NULL(val1));
2009 /* SUBM.CTRY (Only for compatibility) */
2010 subm_ctry_sect : OPEN DELIM TAG_CTRY opt_line_item
2011 { if (compat_mode(C_SUBM_CTRY)) {
2012 $<ctxt>$ = compat_generate_addr_ctry_start($1, $3, $4);
2016 { if (compat_mode (C_SUBM_CTRY)) {
2017 compat_generate_addr_ctry_end($<ctxt>5);
2022 /*********************************************************************/
2023 /**** Substructures ****/
2024 /*********************************************************************/
2026 /* ADDRESS STRUCTURE */
2027 addr_struc_sub : addr_sect { OCCUR2(ADDR, 0, 1) }
2028 | phon_sect { OCCUR2(PHON, 0, 3) }
2031 addr_sect : OPEN DELIM TAG_ADDR mand_line_item
2032 { $<ctxt>$ = start_element(ELT_SUB_ADDR,
2034 GEDCOM_MAKE_STRING(val1, $4));
2035 reset_buffer(&concat_buffer);
2036 safe_buf_append(&concat_buffer, $4);
2037 START(ADDR, $1, $<ctxt>$);
2038 if (compat_mode(C_SUBM_CTRY))
2039 compat_save_ctry_parent_context($<ctxt>$);
2044 { char* complete = get_buf_string(&concat_buffer);
2045 end_element(ELT_SUB_ADDR, PARENT, $<ctxt>5,
2046 GEDCOM_MAKE_STRING(val1, complete));
2050 addr_subs : /* empty */
2051 | addr_subs addr_sub
2054 addr_sub : addr_cont_sect /* 0:M */
2055 | addr_adr1_sect { OCCUR2(ADR1, 0, 1) }
2056 | addr_adr2_sect { OCCUR2(ADR2, 0, 1) }
2057 | addr_city_sect { OCCUR2(CITY, 0, 1) }
2058 | addr_stae_sect { OCCUR2(STAE, 0, 1) }
2059 | addr_post_sect { OCCUR2(POST, 0, 1) }
2060 | addr_ctry_sect { OCCUR2(CTRY, 0, 1) }
2064 addr_cont_sect : OPEN DELIM TAG_CONT mand_line_item
2065 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CONT,
2067 GEDCOM_MAKE_STRING(val1, $4));
2068 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
2069 safe_buf_append(&concat_buffer, $4);
2070 START(CONT, $1, $<ctxt>$)
2075 { end_element(ELT_SUB_ADDR_CONT, PARENT, $<ctxt>5,
2076 GEDCOM_MAKE_NULL(val1));
2079 addr_adr1_sect : OPEN DELIM TAG_ADR1 mand_line_item
2080 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR1,
2082 GEDCOM_MAKE_STRING(val1, $4));
2083 START(ADR1, $1, $<ctxt>$)
2088 { end_element(ELT_SUB_ADDR_ADR1, PARENT, $<ctxt>5,
2089 GEDCOM_MAKE_NULL(val1));
2092 addr_adr2_sect : OPEN DELIM TAG_ADR2 mand_line_item
2093 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR2,
2095 GEDCOM_MAKE_STRING(val1, $4));
2096 START(ADR2, $1, $<ctxt>$)
2101 { end_element(ELT_SUB_ADDR_ADR2, PARENT, $<ctxt>5,
2102 GEDCOM_MAKE_NULL(val1));
2105 addr_city_sect : OPEN DELIM TAG_CITY mand_line_item
2106 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CITY,
2108 GEDCOM_MAKE_STRING(val1, $4));
2109 START(CITY, $1, $<ctxt>$)
2114 { end_element(ELT_SUB_ADDR_CITY, PARENT, $<ctxt>5,
2115 GEDCOM_MAKE_NULL(val1));
2118 addr_stae_sect : OPEN DELIM TAG_STAE mand_line_item
2119 { $<ctxt>$ = start_element(ELT_SUB_ADDR_STAE,
2121 GEDCOM_MAKE_STRING(val1, $4));
2122 START(STAE, $1, $<ctxt>$)
2127 { end_element(ELT_SUB_ADDR_STAE, PARENT, $<ctxt>5,
2128 GEDCOM_MAKE_NULL(val1));
2131 addr_post_sect : OPEN DELIM TAG_POST mand_line_item
2132 { $<ctxt>$ = start_element(ELT_SUB_ADDR_POST,
2134 GEDCOM_MAKE_STRING(val1, $4));
2135 START(POST, $1, $<ctxt>$)
2140 { end_element(ELT_SUB_ADDR_POST, PARENT, $<ctxt>5,
2141 GEDCOM_MAKE_NULL(val1));
2144 addr_ctry_sect : OPEN DELIM TAG_CTRY mand_line_item
2145 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CTRY,
2147 GEDCOM_MAKE_STRING(val1, $4));
2148 START(CTRY, $1, $<ctxt>$)
2153 { end_element(ELT_SUB_ADDR_CTRY, PARENT, $<ctxt>5,
2154 GEDCOM_MAKE_NULL(val1));
2158 phon_sect : OPEN DELIM TAG_PHON mand_line_item
2159 { $<ctxt>$ = start_element(ELT_SUB_PHON,
2161 GEDCOM_MAKE_STRING(val1, $4));
2162 START(PHON, $1, $<ctxt>$)
2167 { end_element(ELT_SUB_PHON, PARENT, $<ctxt>5,
2168 GEDCOM_MAKE_NULL(val1));
2172 /* ASSOCIATION STRUCTURE */
2173 assoc_struc_sub : asso_sect /* 0:M */
2176 asso_sect : OPEN DELIM TAG_ASSO mand_pointer
2177 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2179 if (xr == NULL) HANDLE_ERROR;
2180 $<ctxt>$ = start_element(ELT_SUB_ASSO,
2182 GEDCOM_MAKE_XREF_PTR(val1, xr));
2183 START(ASSO, $1, $<ctxt>$)
2186 { CHECK2(TYPE,RELA) }
2188 { end_element(ELT_SUB_ASSO, PARENT, $<ctxt>5,
2189 GEDCOM_MAKE_NULL(val1));
2193 asso_subs : /* empty */
2194 | asso_type_sect { OCCUR2(TYPE, 1, 1) }
2195 | asso_rela_sect { OCCUR2(RELA, 1, 1) }
2201 asso_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2202 { $<ctxt>$ = start_element(ELT_SUB_ASSO_TYPE,
2204 GEDCOM_MAKE_STRING(val1, $4));
2205 START(TYPE, $1, $<ctxt>$)
2210 { end_element(ELT_SUB_ASSO_TYPE, PARENT, $<ctxt>5,
2211 GEDCOM_MAKE_NULL(val1));
2215 asso_rela_sect : OPEN DELIM TAG_RELA mand_line_item
2216 { $<ctxt>$ = start_element(ELT_SUB_ASSO_RELA,
2218 GEDCOM_MAKE_STRING(val1, $4));
2219 START(RELA, $1, $<ctxt>$)
2224 { end_element(ELT_SUB_ASSO_RELA, PARENT, $<ctxt>5,
2225 GEDCOM_MAKE_NULL(val1));
2230 change_date_sub : change_date_chan_sect { OCCUR2(CHAN, 0, 1) }
2233 change_date_chan_sect : OPEN DELIM TAG_CHAN
2234 { $<ctxt>$ = start_element(ELT_SUB_CHAN,
2235 PARENT, $1, $3, NULL,
2236 GEDCOM_MAKE_NULL(val1));
2237 START(CHAN, $1, $<ctxt>$)
2239 change_date_chan_subs
2242 { end_element(ELT_SUB_CHAN, PARENT, $<ctxt>4,
2243 GEDCOM_MAKE_NULL(val1));
2247 change_date_chan_subs : /* empty */
2248 | change_date_chan_subs change_date_chan_sub
2251 change_date_chan_sub : change_date_date_sect { OCCUR2(DATE, 1, 1) }
2256 change_date_date_sect : OPEN DELIM TAG_DATE mand_line_item
2257 { struct date_value dv = gedcom_parse_date($4);
2258 $<ctxt>$ = start_element(ELT_SUB_CHAN_DATE,
2260 GEDCOM_MAKE_DATE(val1, dv));
2261 START(DATE, $1, $<ctxt>$) }
2262 change_date_date_subs
2265 { end_element(ELT_SUB_CHAN_DATE, PARENT, $<ctxt>5,
2266 GEDCOM_MAKE_NULL(val1));
2270 change_date_date_subs : /* empty */
2271 | change_date_date_subs change_date_date_sub
2274 change_date_date_sub : change_date_date_time_sect { OCCUR2(TIME, 0, 1) }
2278 change_date_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
2280 = start_element(ELT_SUB_CHAN_TIME,
2282 GEDCOM_MAKE_STRING(val1, $4));
2283 START(TIME, $1, $<ctxt>$)
2288 { end_element(ELT_SUB_CHAN_TIME, PARENT, $<ctxt>5,
2289 GEDCOM_MAKE_NULL(val1));
2293 /* CHILD TO FAMILY LINK */
2294 chi_fam_link_sub : famc_sect /* 0:M */
2297 famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2298 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2300 if (xr == NULL) HANDLE_ERROR;
2301 $<ctxt>$ = start_element(ELT_SUB_FAMC,
2303 GEDCOM_MAKE_XREF_PTR(val1, xr));
2304 START(FAMC, $1, $<ctxt>$)
2309 { end_element(ELT_SUB_FAMC, PARENT, $<ctxt>5,
2310 GEDCOM_MAKE_NULL(val1));
2314 famc_subs : /* empty */
2315 | famc_subs famc_sub
2318 famc_sub : famc_pedi_sect /* 0:M */
2323 famc_pedi_sect : OPEN DELIM TAG_PEDI mand_line_item
2324 { $<ctxt>$ = start_element(ELT_SUB_FAMC_PEDI,
2326 GEDCOM_MAKE_STRING(val1, $4));
2327 START(PEDI, $1, $<ctxt>$)
2332 { end_element(ELT_SUB_FAMC_PEDI, PARENT, $<ctxt>5,
2333 GEDCOM_MAKE_NULL(val1));
2337 /* CONTINUATION SUBSECTIONS */
2338 continuation_sub : cont_sect /* 0:M */
2339 | conc_sect /* 0:M */
2342 cont_sect : OPEN DELIM TAG_CONT opt_line_item
2343 { $<ctxt>$ = start_element(ELT_SUB_CONT,
2345 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2346 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
2347 if (GEDCOM_IS_STRING(&val1))
2348 safe_buf_append(&concat_buffer, $4);
2349 START(CONT, $1, $<ctxt>$)
2354 { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5,
2355 GEDCOM_MAKE_NULL(val1));
2359 conc_sect : OPEN DELIM TAG_CONC mand_line_item
2360 { $<ctxt>$ = start_element(ELT_SUB_CONC,
2362 GEDCOM_MAKE_STRING(val1, $4));
2363 if (compat_mode(C_CONC_NEEDS_SPACE)) {
2364 safe_buf_append(&concat_buffer, " ");
2366 safe_buf_append(&concat_buffer, $4);
2367 START(CONC, $1, $<ctxt>$)
2372 { end_element(ELT_SUB_CONC, PARENT, $<ctxt>5,
2373 GEDCOM_MAKE_NULL(val1));
2378 event_detail_sub : event_detail_type_sect { OCCUR2(TYPE, 0, 1) }
2379 | event_detail_date_sect { OCCUR2(DATE, 0, 1) }
2382 | event_detail_age_sect { OCCUR2(AGE, 0, 1) }
2383 | event_detail_agnc_sect { OCCUR2(AGNC, 0, 1) }
2384 | event_detail_caus_sect { OCCUR2(CAUS, 0, 1) }
2390 event_detail_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2392 = start_element(ELT_SUB_EVT_TYPE,
2394 GEDCOM_MAKE_STRING(val1, $4));
2395 START(TYPE, $1, $<ctxt>$)
2400 { end_element(ELT_SUB_EVT_TYPE, PARENT, $<ctxt>5,
2401 GEDCOM_MAKE_NULL(val1));
2404 event_detail_date_sect : OPEN DELIM TAG_DATE mand_line_item
2405 { struct date_value dv = gedcom_parse_date($4);
2407 = start_element(ELT_SUB_EVT_DATE,
2409 GEDCOM_MAKE_DATE(val1, dv));
2410 START(DATE, $1, $<ctxt>$)
2415 { end_element(ELT_SUB_EVT_DATE, PARENT, $<ctxt>5,
2416 GEDCOM_MAKE_NULL(val1));
2419 event_detail_age_sect : OPEN DELIM TAG_AGE mand_line_item
2420 { struct age_value age = gedcom_parse_age($4);
2422 = start_element(ELT_SUB_EVT_AGE,
2424 GEDCOM_MAKE_AGE(val1, age));
2425 START(AGE, $1, $<ctxt>$)
2430 { end_element(ELT_SUB_EVT_AGE, PARENT, $<ctxt>5,
2431 GEDCOM_MAKE_NULL(val1));
2434 event_detail_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
2436 = start_element(ELT_SUB_EVT_AGNC,
2438 GEDCOM_MAKE_STRING(val1, $4));
2439 START(AGNC, $1, $<ctxt>$)
2444 { end_element(ELT_SUB_EVT_AGNC, PARENT, $<ctxt>5,
2445 GEDCOM_MAKE_NULL(val1));
2448 event_detail_caus_sect : OPEN DELIM TAG_CAUS mand_line_item
2450 = start_element(ELT_SUB_EVT_CAUS,
2452 GEDCOM_MAKE_STRING(val1, $4));
2453 START(CAUS, $1, $<ctxt>$)
2458 { end_element(ELT_SUB_EVT_CAUS, PARENT, $<ctxt>5,
2459 GEDCOM_MAKE_NULL(val1));
2463 /* FAMILY EVENT STRUCTURE */
2464 fam_event_struc_sub : fam_event_sect
2465 | fam_gen_even_sect /* 0:M */
2468 fam_event_sect : OPEN DELIM fam_event_tag opt_value
2470 = start_element(ELT_SUB_FAM_EVT,
2472 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2473 START2($1, $<ctxt>$);
2478 { end_element(ELT_SUB_FAM_EVT, PARENT, $<ctxt>5,
2479 GEDCOM_MAKE_NULL(val1));
2483 fam_event_tag : TAG_ANUL { $$ = $1; START1(ANUL) }
2484 | TAG_CENS { $$ = $1; START1(CENS) }
2485 | TAG_DIV { $$ = $1; START1(DIV) }
2486 | TAG_DIVF { $$ = $1; START1(DIVF) }
2487 | TAG_ENGA { $$ = $1; START1(ENGA) }
2488 | TAG_MARR { $$ = $1; START1(MARR) }
2489 | TAG_MARB { $$ = $1; START1(MARB) }
2490 | TAG_MARC { $$ = $1; START1(MARC) }
2491 | TAG_MARL { $$ = $1; START1(MARL) }
2492 | TAG_MARS { $$ = $1; START1(MARS) }
2495 fam_event_subs : /* empty */
2496 | fam_event_subs fam_event_sub
2499 fam_event_sub : event_detail_sub
2500 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2501 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2505 fam_even_husb_sect : OPEN DELIM TAG_HUSB
2506 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_HUSB,
2507 PARENT, $1, $3, NULL,
2508 GEDCOM_MAKE_NULL(val1));
2509 START(HUSB, $1, $<ctxt>$)
2514 { end_element(ELT_SUB_FAM_EVT_HUSB, PARENT, $<ctxt>4,
2515 GEDCOM_MAKE_NULL(val1));
2519 fam_even_husb_subs : /* empty */
2520 | fam_even_husb_subs fam_even_husb_sub
2523 fam_even_husb_sub : fam_even_age_sect { OCCUR2(AGE, 1, 1) }
2527 fam_even_age_sect : OPEN DELIM TAG_AGE mand_line_item
2528 { struct age_value age = gedcom_parse_age($4);
2529 $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_AGE,
2531 GEDCOM_MAKE_AGE(val1, age));
2532 START(AGE, $1, $<ctxt>$)
2537 { end_element(ELT_SUB_FAM_EVT_AGE, PARENT, $<ctxt>5,
2538 GEDCOM_MAKE_NULL(val1));
2542 fam_even_wife_sect : OPEN DELIM TAG_WIFE
2543 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_WIFE,
2544 PARENT, $1, $3, NULL,
2545 GEDCOM_MAKE_NULL(val1));
2546 START(WIFE, $1, $<ctxt>$)
2551 { end_element(ELT_SUB_FAM_EVT_WIFE, PARENT, $<ctxt>4,
2552 GEDCOM_MAKE_NULL(val1));
2556 fam_gen_even_sect : OPEN DELIM TAG_EVEN
2557 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_EVEN,
2558 PARENT, $1, $3, NULL,
2559 GEDCOM_MAKE_NULL(val1));
2560 START(EVEN, $1, $<ctxt>$)
2565 { end_element(ELT_SUB_FAM_EVT_EVEN, PARENT, $<ctxt>4,
2566 GEDCOM_MAKE_NULL(val1));
2570 fam_gen_even_subs : /* empty */
2571 | fam_gen_even_subs fam_gen_even_sub
2574 fam_gen_even_sub : event_detail_sub
2575 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2576 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2580 /* IDENTIFICATION STRUCTURE */
2581 ident_struc_sub : ident_refn_sect /* 0:M */
2582 | ident_rin_sect { OCCUR2(RIN, 0, 1) }
2585 ident_refn_sect : OPEN DELIM TAG_REFN mand_line_item
2586 { $<ctxt>$ = start_element(ELT_SUB_IDENT_REFN,
2588 GEDCOM_MAKE_STRING(val1, $4));
2589 START(REFN, $1, $<ctxt>$)
2594 { end_element(ELT_SUB_IDENT_REFN, PARENT, $<ctxt>5,
2595 GEDCOM_MAKE_NULL(val1));
2599 ident_refn_subs : /* empty */
2600 | ident_refn_subs ident_refn_sub
2603 ident_refn_sub : ident_refn_type_sect { OCCUR2(TYPE, 0, 1) }
2607 ident_refn_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2609 = start_element(ELT_SUB_IDENT_REFN_TYPE,
2611 GEDCOM_MAKE_STRING(val1, $4));
2612 START(TYPE, $1, $<ctxt>$)
2617 { end_element(ELT_SUB_IDENT_REFN_TYPE, PARENT, $<ctxt>5,
2618 GEDCOM_MAKE_NULL(val1));
2622 ident_rin_sect : OPEN DELIM TAG_RIN mand_line_item
2623 { $<ctxt>$ = start_element(ELT_SUB_IDENT_RIN,
2625 GEDCOM_MAKE_STRING(val1, $4));
2626 START(RIN, $1, $<ctxt>$)
2631 { end_element(ELT_SUB_IDENT_RIN, PARENT, $<ctxt>5,
2632 GEDCOM_MAKE_NULL(val1));
2636 /* INDIVIDUAL ATTRIBUTE STRUCTURE */
2637 indiv_attr_struc_sub : indiv_attr_sect /* 0:M */
2638 | indiv_resi_sect /* 0:M */
2641 indiv_attr_sect : OPEN DELIM indiv_attr_tag mand_line_item
2642 { $<ctxt>$ = start_element(ELT_SUB_INDIV_ATTR,
2644 GEDCOM_MAKE_STRING(val1, $4));
2645 START2($1, $<ctxt>$);
2647 indiv_attr_event_subs
2650 { end_element(ELT_SUB_INDIV_ATTR, PARENT, $<ctxt>5,
2651 GEDCOM_MAKE_NULL(val1));
2655 indiv_attr_tag : TAG_CAST { $$ = $1; START1(CAST) }
2656 | TAG_DSCR { $$ = $1; START1(DSCR) }
2657 | TAG_EDUC { $$ = $1; START1(EDUC) }
2658 | TAG_IDNO { $$ = $1; START1(IDNO) }
2659 | TAG_NATI { $$ = $1; START1(NATI) }
2660 | TAG_NCHI { $$ = $1; START1(NCHI) }
2661 | TAG_NMR { $$ = $1; START1(NMR) }
2662 | TAG_OCCU { $$ = $1; START1(OCCU) }
2663 | TAG_PROP { $$ = $1; START1(PROP) }
2664 | TAG_RELI { $$ = $1; START1(RELI) }
2665 | TAG_SSN { $$ = $1; START1(SSN) }
2666 | TAG_TITL { $$ = $1; START1(TITL) }
2669 indiv_resi_sect : OPEN DELIM TAG_RESI
2670 { $<ctxt>$ = start_element(ELT_SUB_INDIV_RESI,
2671 PARENT, $1, $3, NULL,
2672 GEDCOM_MAKE_NULL(val1));
2673 START(RESI, $1, $<ctxt>$)
2675 indiv_attr_event_subs
2678 { end_element(ELT_SUB_INDIV_RESI, PARENT, $<ctxt>4,
2679 GEDCOM_MAKE_NULL(val1));
2683 indiv_attr_event_subs : /* empty */
2684 | indiv_attr_event_subs indiv_attr_event_sub
2687 indiv_attr_event_sub : event_detail_sub
2691 /* INDIVIDUAL EVENT STRUCTURE */
2692 indiv_even_struc_sub : indiv_birt_sect
2694 | indiv_adop_sect /* 0:M */
2695 | indiv_even_sect /* 0:M */
2698 indiv_birt_sect : OPEN DELIM indiv_birt_tag opt_value
2700 = start_element(ELT_SUB_INDIV_BIRT,
2702 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2703 START2($1, $<ctxt>$);
2708 { end_element(ELT_SUB_INDIV_BIRT, PARENT, $<ctxt>5,
2709 GEDCOM_MAKE_NULL(val1));
2713 indiv_birt_tag : TAG_BIRT { $$ = $1; START1(BIRT) }
2714 | TAG_CHR { $$ = $1; START1(CHR) }
2717 indiv_birt_subs : /* empty */
2718 | indiv_birt_subs indiv_birt_sub
2721 indiv_birt_sub : event_detail_sub
2722 | indiv_birt_famc_sect { OCCUR2(FAMC,0, 1) }
2726 indiv_birt_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2727 { struct xref_value *xr = gedcom_parse_xref($4,
2730 if (xr == NULL) HANDLE_ERROR;
2732 = start_element(ELT_SUB_INDIV_BIRT_FAMC,
2734 GEDCOM_MAKE_XREF_PTR(val1, xr));
2735 START(FAMC, $1, $<ctxt>$)
2740 { end_element(ELT_SUB_INDIV_BIRT_FAMC, PARENT, $<ctxt>5,
2741 GEDCOM_MAKE_NULL(val1));
2745 indiv_gen_sect : OPEN DELIM indiv_gen_tag opt_value
2747 = start_element(ELT_SUB_INDIV_GEN,
2749 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2750 START2($1, $<ctxt>$);
2755 { end_element(ELT_SUB_INDIV_GEN, PARENT, $<ctxt>5,
2756 GEDCOM_MAKE_NULL(val1));
2760 indiv_gen_tag : TAG_DEAT { $$ = $1; START1(DEAT) }
2761 | TAG_BURI { $$ = $1; START1(BURI) }
2762 | TAG_CREM { $$ = $1; START1(CREM) }
2763 | TAG_BAPM { $$ = $1; START1(BAPM) }
2764 | TAG_BARM { $$ = $1; START1(BARM) }
2765 | TAG_BASM { $$ = $1; START1(BASM) }
2766 | TAG_BLES { $$ = $1; START1(BLES) }
2767 | TAG_CHRA { $$ = $1; START1(CHRA) }
2768 | TAG_CONF { $$ = $1; START1(CONF) }
2769 | TAG_FCOM { $$ = $1; START1(FCOM) }
2770 | TAG_ORDN { $$ = $1; START1(ORDN) }
2771 | TAG_NATU { $$ = $1; START1(NATU) }
2772 | TAG_EMIG { $$ = $1; START1(EMIG) }
2773 | TAG_IMMI { $$ = $1; START1(IMMI) }
2774 | TAG_CENS { $$ = $1; START1(CENS) }
2775 | TAG_PROB { $$ = $1; START1(PROB) }
2776 | TAG_WILL { $$ = $1; START1(WILL) }
2777 | TAG_GRAD { $$ = $1; START1(GRAD) }
2778 | TAG_RETI { $$ = $1; START1(RETI) }
2781 indiv_gen_subs : /* empty */
2782 | indiv_gen_subs indiv_gen_sub
2785 indiv_gen_sub : event_detail_sub
2789 indiv_adop_sect : OPEN DELIM TAG_ADOP opt_value
2791 = start_element(ELT_SUB_INDIV_ADOP,
2793 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2794 START(ADOP, $1, $<ctxt>$) }
2798 { end_element(ELT_SUB_INDIV_ADOP, PARENT, $<ctxt>5,
2799 GEDCOM_MAKE_NULL(val1));
2803 indiv_adop_subs : /* empty */
2804 | indiv_adop_subs indiv_adop_sub
2807 indiv_adop_sub : event_detail_sub
2808 | indiv_adop_famc_sect { OCCUR2(FAMC,0, 1) }
2812 indiv_adop_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2813 { struct xref_value *xr = gedcom_parse_xref($4,
2816 if (xr == NULL) HANDLE_ERROR;
2818 = start_element(ELT_SUB_INDIV_ADOP_FAMC,
2820 GEDCOM_MAKE_XREF_PTR(val1, xr));
2821 START(FAMC, $1, $<ctxt>$) }
2822 indiv_adop_famc_subs
2825 { end_element(ELT_SUB_INDIV_ADOP_FAMC, PARENT, $<ctxt>5,
2826 GEDCOM_MAKE_NULL(val1));
2830 indiv_adop_famc_subs : /* empty */
2831 | indiv_adop_famc_subs indiv_adop_famc_sub
2834 indiv_adop_famc_sub : indiv_adop_famc_adop_sect { OCCUR2(ADOP,0, 1) }
2838 indiv_adop_famc_adop_sect : OPEN DELIM TAG_ADOP mand_line_item
2840 = start_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2842 GEDCOM_MAKE_STRING(val1, $4));
2843 START(ADOP, $1, $<ctxt>$) }
2847 { end_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2849 GEDCOM_MAKE_NULL(val1));
2853 indiv_even_sect : OPEN DELIM TAG_EVEN
2854 { $<ctxt>$ = start_element(ELT_SUB_INDIV_EVEN,
2855 PARENT, $1, $3, NULL,
2856 GEDCOM_MAKE_NULL(val1));
2857 START(EVEN, $1, $<ctxt>$) }
2861 { end_element(ELT_SUB_INDIV_EVEN, PARENT, $<ctxt>4,
2862 GEDCOM_MAKE_NULL(val1));
2866 /* LDS INDIVIDUAL ORDINANCE */
2867 lds_indiv_ord_sub : lio_bapl_sect /* 0:M */
2868 | lio_slgc_sect /* 0:M */
2871 lio_bapl_sect : OPEN DELIM lio_bapl_tag
2872 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL,
2873 PARENT, $1, $3, NULL,
2874 GEDCOM_MAKE_NULL(val1));
2875 START2($1, $<ctxt>$);
2880 { end_element(ELT_SUB_LIO_BAPL, PARENT, $<ctxt>4,
2881 GEDCOM_MAKE_NULL(val1));
2885 lio_bapl_tag : TAG_BAPL { $$ = $1; START1(BAPL) }
2886 | TAG_CONL { $$ = $1; START1(CONL) }
2887 | TAG_ENDL { $$ = $1; START1(ENDL) }
2890 lio_bapl_subs : /* empty */
2891 | lio_bapl_subs lio_bapl_sub
2894 lio_bapl_sub : lio_bapl_stat_sect { OCCUR2(STAT, 0, 1) }
2895 | lio_bapl_date_sect { OCCUR2(DATE, 0, 1) }
2896 | lio_bapl_temp_sect { OCCUR2(TEMP, 0, 1) }
2897 | lio_bapl_plac_sect { OCCUR2(PLAC, 0, 1) }
2903 lio_bapl_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2904 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_STAT,
2906 GEDCOM_MAKE_STRING(val1, $4));
2907 START(STAT, $1, $<ctxt>$)
2912 { end_element(ELT_SUB_LIO_BAPL_STAT, PARENT, $<ctxt>5,
2913 GEDCOM_MAKE_NULL(val1));
2916 lio_bapl_date_sect : OPEN DELIM TAG_DATE mand_line_item
2917 { struct date_value dv = gedcom_parse_date($4);
2918 $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_DATE,
2920 GEDCOM_MAKE_DATE(val1, dv));
2921 START(DATE, $1, $<ctxt>$)
2926 { end_element(ELT_SUB_LIO_BAPL_DATE, PARENT, $<ctxt>5,
2927 GEDCOM_MAKE_NULL(val1));
2930 lio_bapl_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2931 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_TEMP,
2933 GEDCOM_MAKE_STRING(val1, $4));
2934 START(TEMP, $1, $<ctxt>$)
2939 { end_element(ELT_SUB_LIO_BAPL_TEMP, PARENT, $<ctxt>5,
2940 GEDCOM_MAKE_NULL(val1));
2943 lio_bapl_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2944 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_PLAC,
2946 GEDCOM_MAKE_STRING(val1, $4));
2947 START(PLAC, $1, $<ctxt>$)
2952 { end_element(ELT_SUB_LIO_BAPL_PLAC, PARENT, $<ctxt>5,
2953 GEDCOM_MAKE_NULL(val1));
2957 lio_slgc_sect : OPEN DELIM TAG_SLGC
2958 { $<ctxt>$ = start_element(ELT_SUB_LIO_SLGC,
2959 PARENT, $1, $3, NULL,
2960 GEDCOM_MAKE_NULL(val1));
2961 START(SLGC, $1, $<ctxt>$)
2964 { if (compat_mode(C_NO_SLGC_FAMC) && ! CHK_COND(FAMC))
2965 compat_generate_slgc_famc_link($<ctxt>4);
2970 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4,
2971 GEDCOM_MAKE_NULL(val1));
2975 lio_slgc_subs : /* empty */
2976 | lio_slgc_subs lio_slgc_sub
2979 lio_slgc_sub : lio_bapl_sub
2980 | lio_slgc_famc_sect { OCCUR2(FAMC, 1, 1) }
2983 lio_slgc_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2984 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2986 if (xr == NULL) HANDLE_ERROR;
2988 = start_element(ELT_SUB_LIO_SLGC_FAMC,
2990 GEDCOM_MAKE_XREF_PTR(val1, xr));
2991 START(FAMC, $1, $<ctxt>$)
2996 { end_element(ELT_SUB_LIO_SLGC_FAMC, PARENT, $<ctxt>5,
2997 GEDCOM_MAKE_NULL(val1));
3001 /* LDS SPOUSE SEALING */
3002 lds_spouse_seal_sub : lss_slgs_sect
3005 lss_slgs_sect : OPEN DELIM TAG_SLGS
3006 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS,
3007 PARENT, $1, $3, NULL,
3008 GEDCOM_MAKE_NULL(val1));
3009 START(SLGS, $1, $<ctxt>$) }
3013 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4,
3014 GEDCOM_MAKE_NULL(val1));
3018 lss_slgs_subs : /* empty */
3019 | lss_slgs_subs lss_slgs_sub
3022 lss_slgs_sub : lss_slgs_stat_sect { OCCUR2(STAT, 0, 1) }
3023 | lss_slgs_date_sect { OCCUR2(DATE, 0, 1) }
3024 | lss_slgs_temp_sect { OCCUR2(TEMP, 0, 1) }
3025 | lss_slgs_plac_sect { OCCUR2(PLAC, 0, 1) }
3031 lss_slgs_stat_sect : OPEN DELIM TAG_STAT mand_line_item
3032 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_STAT,
3034 GEDCOM_MAKE_STRING(val1, $4));
3035 START(STAT, $1, $<ctxt>$)
3040 { end_element(ELT_SUB_LSS_SLGS_STAT, PARENT, $<ctxt>5,
3041 GEDCOM_MAKE_NULL(val1));
3044 lss_slgs_date_sect : OPEN DELIM TAG_DATE mand_line_item
3045 { struct date_value dv = gedcom_parse_date($4);
3046 $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_DATE,
3048 GEDCOM_MAKE_DATE(val1, dv));
3049 START(DATE, $1, $<ctxt>$)
3054 { end_element(ELT_SUB_LSS_SLGS_DATE, PARENT, $<ctxt>5,
3055 GEDCOM_MAKE_NULL(val1));
3058 lss_slgs_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
3059 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_TEMP,
3061 GEDCOM_MAKE_STRING(val1, $4));
3062 START(TEMP, $1, $<ctxt>$)
3067 { end_element(ELT_SUB_LSS_SLGS_TEMP, PARENT, $<ctxt>5,
3068 GEDCOM_MAKE_NULL(val1));
3071 lss_slgs_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3072 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_PLAC,
3074 GEDCOM_MAKE_STRING(val1, $4));
3075 START(PLAC, $1, $<ctxt>$)
3080 { end_element(ELT_SUB_LSS_SLGS_PLAC, PARENT, $<ctxt>5,
3081 GEDCOM_MAKE_NULL(val1));
3085 /* MULTIMEDIA LINK */
3086 multim_link_sub : multim_obje_link_sect
3087 | multim_obje_emb_sect
3090 multim_obje_link_sect : OPEN DELIM TAG_OBJE DELIM POINTER
3091 { struct xref_value *xr = gedcom_parse_xref($5,
3094 if (xr == NULL) HANDLE_ERROR;
3096 = start_element(ELT_SUB_MULTIM_OBJE,
3098 GEDCOM_MAKE_XREF_PTR(val1, xr));
3099 START(OBJE, $1, $<ctxt>$)
3104 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>6,
3105 GEDCOM_MAKE_NULL(val1));
3109 multim_obje_emb_sect : OPEN DELIM TAG_OBJE
3110 { $<ctxt>$ = start_element(ELT_SUB_MULTIM_OBJE,
3111 PARENT, $1, $3, NULL,
3112 GEDCOM_MAKE_NULL(val1));
3113 START(OBJE, $1, $<ctxt>$)
3115 multim_obje_emb_subs
3116 { CHECK2(FORM,FILE) }
3118 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>4,
3119 GEDCOM_MAKE_NULL(val1));
3123 multim_obje_emb_subs : /* empty */
3124 | multim_obje_emb_subs multim_obje_emb_sub
3127 multim_obje_emb_sub : multim_obje_form_sect { OCCUR2(FORM, 1, 1) }
3128 | multim_obje_titl_sect { OCCUR2(TITL, 0, 1) }
3129 | multim_obje_file_sect { OCCUR2(FILE, 1, 1) }
3134 multim_obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
3136 = start_element(ELT_SUB_MULTIM_OBJE_FORM,
3138 GEDCOM_MAKE_STRING(val1, $4));
3139 START(FORM, $1, $<ctxt>$)
3144 { end_element(ELT_SUB_MULTIM_OBJE_FORM,
3146 GEDCOM_MAKE_NULL(val1));
3149 multim_obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
3151 = start_element(ELT_SUB_MULTIM_OBJE_TITL,
3153 GEDCOM_MAKE_STRING(val1, $4));
3154 START(TITL, $1, $<ctxt>$)
3159 { end_element(ELT_SUB_MULTIM_OBJE_TITL,
3161 GEDCOM_MAKE_NULL(val1));
3164 multim_obje_file_sect : OPEN DELIM TAG_FILE mand_line_item
3166 = start_element(ELT_SUB_MULTIM_OBJE_FILE,
3168 GEDCOM_MAKE_STRING(val1, $4));
3169 START(FILE, $1, $<ctxt>$)
3174 { end_element(ELT_SUB_MULTIM_OBJE_FILE,
3176 GEDCOM_MAKE_NULL(val1));
3180 /* NOTE STRUCTURE */
3181 note_struc_sub : note_struc_link_sect /* 0:M */
3182 | note_struc_emb_sect /* 0:M */
3185 note_struc_link_sect : OPEN DELIM TAG_NOTE DELIM POINTER
3186 { struct xref_value *xr = gedcom_parse_xref($5,
3189 if (xr == NULL) HANDLE_ERROR;
3191 = start_element(ELT_SUB_NOTE,
3193 GEDCOM_MAKE_XREF_PTR(val1, xr));
3194 START(NOTE, $1, $<ctxt>$)
3196 note_struc_link_subs
3199 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>6,
3200 GEDCOM_MAKE_NULL(val1));
3204 note_struc_link_subs : /* empty */
3205 | note_struc_link_subs note_struc_link_sub
3208 note_struc_link_sub : source_cit_sub
3212 note_struc_emb_sect : OPEN DELIM TAG_NOTE opt_line_item
3214 if (compat_mode(C_NOTE_TOO_LONG))
3215 str = compat_long_line_get_prefix($4);
3217 = start_element(ELT_SUB_NOTE,
3218 PARENT, $1, $3, str,
3219 GEDCOM_MAKE_NULL_OR_STRING(val1, str));
3220 reset_buffer(&concat_buffer);
3222 safe_buf_append(&concat_buffer, $4);
3223 START(NOTE, $1, $<ctxt>$);
3224 if (compat_mode(C_NOTE_TOO_LONG))
3225 compat_long_line_finish($<ctxt>$, $1);
3230 { char* complete = get_buf_string(&concat_buffer);
3231 end_element(ELT_SUB_NOTE, PARENT, $<ctxt>5,
3232 GEDCOM_MAKE_STRING(val1, complete));
3236 note_struc_emb_subs : /* empty */
3237 | note_struc_emb_subs note_struc_emb_sub
3240 note_struc_emb_sub : continuation_sub
3245 /* PERSONAL NAME STRUCTURE */
3246 pers_name_struc_sub : pers_name_sect /* 0:M */
3249 pers_name_sect : OPEN DELIM TAG_NAME mand_line_item
3250 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME,
3252 GEDCOM_MAKE_STRING(val1, $4));
3253 START(NAME, $1, $<ctxt>$)
3258 { end_element(ELT_SUB_PERS_NAME, PARENT, $<ctxt>5,
3259 GEDCOM_MAKE_NULL(val1));
3263 pers_name_subs : /* empty */
3264 | pers_name_subs pers_name_sub
3267 pers_name_sub : pers_name_npfx_sect { OCCUR2(NPFX, 0, 1) }
3268 | pers_name_givn_sect { OCCUR2(GIVN, 0, 1) }
3269 | pers_name_nick_sect { OCCUR2(NICK, 0, 1) }
3270 | pers_name_spfx_sect { OCCUR2(SPFX, 0, 1) }
3271 | pers_name_surn_sect { OCCUR2(SURN, 0, 1) }
3272 | pers_name_nsfx_sect { OCCUR2(NSFX, 0, 1) }
3278 pers_name_npfx_sect : OPEN DELIM TAG_NPFX mand_line_item
3279 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NPFX,
3281 GEDCOM_MAKE_STRING(val1, $4));
3282 START(NPFX, $1, $<ctxt>$)
3287 { end_element(ELT_SUB_PERS_NAME_NPFX, PARENT, $<ctxt>5,
3288 GEDCOM_MAKE_NULL(val1));
3291 pers_name_givn_sect : OPEN DELIM TAG_GIVN mand_line_item
3292 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_GIVN,
3294 GEDCOM_MAKE_STRING(val1, $4));
3295 START(GIVN, $1, $<ctxt>$)
3300 { end_element(ELT_SUB_PERS_NAME_GIVN, PARENT, $<ctxt>5,
3301 GEDCOM_MAKE_NULL(val1));
3304 pers_name_nick_sect : OPEN DELIM TAG_NICK mand_line_item
3305 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NICK,
3307 GEDCOM_MAKE_STRING(val1, $4));
3308 START(NICK, $1, $<ctxt>$)
3313 { end_element(ELT_SUB_PERS_NAME_NICK, PARENT, $<ctxt>5,
3314 GEDCOM_MAKE_NULL(val1));
3317 pers_name_spfx_sect : OPEN DELIM TAG_SPFX mand_line_item
3318 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SPFX,
3320 GEDCOM_MAKE_STRING(val1, $4));
3321 START(SPFX, $1, $<ctxt>$)
3326 { end_element(ELT_SUB_PERS_NAME_SPFX, PARENT, $<ctxt>5,
3327 GEDCOM_MAKE_NULL(val1));
3330 pers_name_surn_sect : OPEN DELIM TAG_SURN mand_line_item
3331 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SURN,
3333 GEDCOM_MAKE_STRING(val1, $4));
3334 START(SURN, $1, $<ctxt>$)
3339 { end_element(ELT_SUB_PERS_NAME_SURN, PARENT, $<ctxt>5,
3340 GEDCOM_MAKE_NULL(val1));
3343 pers_name_nsfx_sect : OPEN DELIM TAG_NSFX mand_line_item
3344 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NSFX,
3346 GEDCOM_MAKE_STRING(val1, $4));
3347 START(NSFX, $1, $<ctxt>$)
3352 { end_element(ELT_SUB_PERS_NAME_NSFX, PARENT, $<ctxt>5,
3353 GEDCOM_MAKE_NULL(val1));
3357 /* PLACE STRUCTURE */
3358 place_struc_sub : place_struc_plac_sect /* 0:M */
3361 place_struc_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3363 = start_element(ELT_SUB_PLAC,
3365 GEDCOM_MAKE_STRING(val1, $4));
3366 START(PLAC, $1, $<ctxt>$)
3368 place_struc_plac_subs
3371 { end_element(ELT_SUB_PLAC, PARENT, $<ctxt>5,
3372 GEDCOM_MAKE_NULL(val1));
3376 place_struc_plac_subs : /* empty */
3377 | place_struc_plac_subs place_struc_plac_sub
3380 place_struc_plac_sub : place_plac_form_sect { OCCUR2(FORM, 0, 1) }
3386 place_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
3388 = start_element(ELT_SUB_PLAC_FORM,
3390 GEDCOM_MAKE_STRING(val1, $4));
3391 START(FORM, $1, $<ctxt>$)
3396 { end_element(ELT_SUB_PLAC_FORM, PARENT, $<ctxt>5,
3397 GEDCOM_MAKE_NULL(val1));
3401 /* SOURCE_CITATION */
3402 source_cit_sub : source_cit_link_sect /* 0:M */
3403 | source_cit_emb_sect /* 0:M */
3406 source_cit_link_sect : OPEN DELIM TAG_SOUR DELIM POINTER
3407 { struct xref_value *xr = gedcom_parse_xref($5,
3410 if (xr == NULL) HANDLE_ERROR;
3412 = start_element(ELT_SUB_SOUR,
3414 GEDCOM_MAKE_XREF_PTR(val1, xr));
3415 START(SOUR, $1, $<ctxt>$)
3417 source_cit_link_subs
3420 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>6,
3421 GEDCOM_MAKE_NULL(val1));
3425 source_cit_link_subs : /* empty */
3426 | source_cit_link_subs source_cit_link_sub
3429 source_cit_link_sub : source_cit_page_sect { OCCUR2(PAGE, 0, 1) }
3430 | source_cit_even_sect { OCCUR2(EVEN, 0, 1) }
3431 | source_cit_data_sect { OCCUR2(DATA, 0, 1) }
3432 | source_cit_quay_sect { OCCUR2(QUAY, 0, 1) }
3438 source_cit_page_sect : OPEN DELIM TAG_PAGE mand_line_item
3440 = start_element(ELT_SUB_SOUR_PAGE,
3442 GEDCOM_MAKE_STRING(val1, $4));
3443 START(PAGE, $1, $<ctxt>$)
3448 { end_element(ELT_SUB_SOUR_PAGE, PARENT, $<ctxt>5,
3449 GEDCOM_MAKE_NULL(val1));
3453 source_cit_even_sect : OPEN DELIM TAG_EVEN mand_line_item
3455 = start_element(ELT_SUB_SOUR_EVEN,
3457 GEDCOM_MAKE_STRING(val1, $4));
3458 START(EVEN, $1, $<ctxt>$)
3460 source_cit_even_subs
3463 { end_element(ELT_SUB_SOUR_EVEN, PARENT, $<ctxt>5,
3464 GEDCOM_MAKE_NULL(val1));
3468 source_cit_even_subs : /* empty */
3469 | source_cit_even_subs source_cit_even_sub
3472 source_cit_even_sub : source_cit_even_role_sect { OCCUR2(ROLE, 0, 1) }
3476 source_cit_even_role_sect : OPEN DELIM TAG_ROLE mand_line_item
3478 = start_element(ELT_SUB_SOUR_EVEN_ROLE,
3480 GEDCOM_MAKE_STRING(val1, $4));
3481 START(ROLE, $1, $<ctxt>$)
3486 { end_element(ELT_SUB_SOUR_EVEN_ROLE,
3488 GEDCOM_MAKE_NULL(val1));
3492 source_cit_data_sect : OPEN DELIM TAG_DATA
3493 { $<ctxt>$ = start_element(ELT_SUB_SOUR_DATA,
3494 PARENT, $1, $3, NULL,
3495 GEDCOM_MAKE_NULL(val1));
3496 START(DATA, $1, $<ctxt>$)
3498 source_cit_data_subs
3501 { end_element(ELT_SUB_SOUR_DATA, PARENT, $<ctxt>4,
3502 GEDCOM_MAKE_NULL(val1));
3506 source_cit_data_subs : /* empty */
3507 | source_cit_data_subs source_cit_data_sub
3510 source_cit_data_sub : source_cit_data_date_sect { OCCUR2(DATE, 0, 1) }
3511 | source_cit_text_sect /* 0:M */
3515 source_cit_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
3516 { struct date_value dv = gedcom_parse_date($4);
3518 = start_element(ELT_SUB_SOUR_DATA_DATE,
3520 GEDCOM_MAKE_DATE(val1, dv));
3521 START(DATE, $1, $<ctxt>$)
3526 { end_element(ELT_SUB_SOUR_DATA_DATE,
3528 GEDCOM_MAKE_NULL(val1));
3532 source_cit_text_sect : OPEN DELIM TAG_TEXT mand_line_item
3534 = start_element(ELT_SUB_SOUR_TEXT,
3536 GEDCOM_MAKE_STRING(val1, $4));
3537 reset_buffer(&concat_buffer);
3538 safe_buf_append(&concat_buffer, $4);
3539 START(TEXT, $1, $<ctxt>$)
3541 source_cit_text_subs
3544 { char* complete = get_buf_string(&concat_buffer);
3545 end_element(ELT_SUB_SOUR_TEXT, PARENT, $<ctxt>5,
3546 GEDCOM_MAKE_STRING(val1, complete));
3550 source_cit_text_subs : /* empty */
3551 | source_cit_text_subs source_cit_text_sub
3554 source_cit_text_sub : continuation_sub
3558 source_cit_quay_sect : OPEN DELIM TAG_QUAY mand_line_item
3560 = start_element(ELT_SUB_SOUR_QUAY,
3562 GEDCOM_MAKE_STRING(val1, $4));
3563 START(QUAY, $1, $<ctxt>$)
3568 { end_element(ELT_SUB_SOUR_QUAY, PARENT, $<ctxt>5,
3569 GEDCOM_MAKE_NULL(val1));
3573 source_cit_emb_sect : OPEN DELIM TAG_SOUR mand_line_item
3574 { $<ctxt>$ = start_element(ELT_SUB_SOUR,
3576 GEDCOM_MAKE_STRING(val1, $4));
3577 reset_buffer(&concat_buffer);
3578 safe_buf_append(&concat_buffer, $4);
3579 START(SOUR, $1, $<ctxt>$)
3584 { char* complete = get_buf_string(&concat_buffer);
3585 end_element(ELT_SUB_SOUR, PARENT, $<ctxt>5,
3586 GEDCOM_MAKE_STRING(val1, complete));
3590 source_cit_emb_subs : /* empty */
3591 | source_cit_emb_subs source_cit_emb_sub
3594 source_cit_emb_sub : continuation_sub
3595 | source_cit_text_sect /* 0:M */
3600 /* SOURCE REPOSITORY CITATION */
3601 source_repos_cit_sub : source_repos_repo_sect { OCCUR2(REPO, 0, 1) }
3604 source_repos_repo_sect : OPEN DELIM TAG_REPO mand_pointer
3605 { struct xref_value *xr
3606 = gedcom_parse_xref($4, XREF_USED, XREF_REPO);
3607 if (xr == NULL) HANDLE_ERROR;
3609 = start_element(ELT_SUB_REPO,
3611 GEDCOM_MAKE_XREF_PTR(val1, xr));
3612 START(REPO, $1, $<ctxt>$)
3614 source_repos_repo_subs
3617 { end_element(ELT_SUB_REPO, PARENT, $<ctxt>5,
3618 GEDCOM_MAKE_NULL(val1));
3622 source_repos_repo_subs : /* empty */
3623 | source_repos_repo_subs source_repos_repo_sub
3626 source_repos_repo_sub : note_struc_sub
3627 | caln_sect /* 0:M */
3631 caln_sect : OPEN DELIM TAG_CALN mand_line_item
3632 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN,
3634 GEDCOM_MAKE_STRING(val1, $4));
3635 START(CALN, $1, $<ctxt>$)
3640 { end_element(ELT_SUB_REPO_CALN, PARENT, $<ctxt>5,
3641 GEDCOM_MAKE_NULL(val1));
3645 caln_subs : /* empty */
3646 | caln_subs caln_sub
3649 caln_sub : caln_medi_sect { OCCUR2(MEDI, 0, 1) }
3653 caln_medi_sect : OPEN DELIM TAG_MEDI mand_line_item
3654 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN_MEDI,
3656 GEDCOM_MAKE_STRING(val1, $4));
3657 START(MEDI, $1, $<ctxt>$)
3662 { end_element(ELT_SUB_REPO_CALN_MEDI, PARENT, $<ctxt>5,
3663 GEDCOM_MAKE_NULL(val1));
3667 /* SPOUSE TO FAMILY LINK */
3668 spou_fam_link_sub : spou_fam_fams_sect /* 0:M */
3671 spou_fam_fams_sect : OPEN DELIM TAG_FAMS mand_pointer
3672 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
3674 if (xr == NULL) HANDLE_ERROR;
3676 = start_element(ELT_SUB_FAMS,
3678 GEDCOM_MAKE_XREF_PTR(val1, xr));
3679 START(FAMS, $1, $<ctxt>$)
3684 { end_element(ELT_SUB_FAMS, PARENT, $<ctxt>5,
3685 GEDCOM_MAKE_NULL(val1));
3689 spou_fam_fams_subs : /* empty */
3690 | spou_fam_fams_subs spou_fam_fams_sub
3693 spou_fam_fams_sub : note_struc_sub
3697 /*********************************************************************/
3699 /*********************************************************************/
3701 no_std_subs : /* empty */
3702 | no_std_subs no_std_sub
3705 no_std_sub : user_sect /* 0:M */
3708 CLOSE { HANDLE_ERROR }
3711 no_std_rec : user_rec /* 0:M */
3714 CLOSE { HANDLE_ERROR }
3717 user_rec : OPEN DELIM opt_xref USERTAG
3718 { if ($4.string[0] != '_') {
3719 if (compat_mode(C_551_TAGS)
3720 && compat_check_551_tag($4.string, &usertag_buffer)) {
3721 $4.string = get_buf_string(&usertag_buffer);
3724 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3731 { struct xref_value *xr = NULL;
3733 xr = gedcom_parse_xref($3, XREF_DEFINED, XREF_USER);
3734 if (xr == NULL) HANDLE_ERROR;
3736 $<ctxt>$ = start_record(REC_USER,
3738 GEDCOM_MAKE_NULL_OR_XREF_PTR(val1, xr),
3740 START($4, $1, $<ctxt>$)
3745 { end_record(REC_USER, $<ctxt>7, GEDCOM_MAKE_NULL(val1)); }
3747 user_sect : OPEN DELIM opt_xref USERTAG
3748 { if ($4.string[0] != '_') {
3749 if (compat_mode(C_551_TAGS)
3750 && compat_check_551_tag($4.string, &usertag_buffer)) {
3751 $4.string = get_buf_string(&usertag_buffer);
3753 else if (compat_mode(C_SUBM_COMM) &&
3754 compat_check_subm_comm($4.string, get_parenttag(0),
3756 $4.string = get_buf_string(&usertag_buffer);
3759 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3766 { $<ctxt>$ = start_element(ELT_USER, PARENT, $1, $4, $6, &val2);
3767 START($4, $1, $<ctxt>$);
3772 { end_element(ELT_USER, PARENT, $<ctxt>7,
3773 GEDCOM_MAKE_NULL(val1));
3774 if (compat_mode(C_SUBM_COMM))
3775 compat_close_subm_comm();
3779 user_sects : /* empty */ { }
3780 | user_sects user_sect { }
3781 | user_sects gen_sect
3782 { if (compat_mode(C_SUBM_COMM)) {
3785 gedcom_error(_("Standard tag not allowed in user section"));
3791 opt_xref : /* empty */ { $$ = NULL; }
3792 | POINTER DELIM { $$ = $1; }
3795 opt_value : /* empty */ { GEDCOM_MAKE_NULL(val2);
3797 | DELIM POINTER { struct xref_value *xr
3798 = gedcom_parse_xref($2, XREF_USED,
3800 GEDCOM_MAKE_XREF_PTR(val2, xr);
3802 | DELIM line_item { GEDCOM_MAKE_STRING(val2, $2);
3806 mand_pointer : /* empty */ { gedcom_error(_("Missing pointer")); YYERROR; }
3807 | DELIM POINTER { gedcom_debug_print("==Ptr: %s==", $2);
3811 mand_line_item : /* empty */
3812 { if (compat_mode(C_NO_REQUIRED_VALUES)) {
3813 gedcom_debug_print("==Val: ==");
3814 $$ = VALUE_IF_MISSING;
3817 gedcom_error(_("Missing value")); YYERROR;
3820 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3824 opt_line_item : /* empty */ { $$ = NULL; }
3825 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3829 line_item : anychar { size_t i;
3830 reset_buffer(&line_item_buffer);
3831 /* The following also takes care of '@@' */
3832 if (!strncmp($1, "@@", 3))
3833 SAFE_BUF_ADDCHAR(&line_item_buffer, '@')
3835 for (i=0; i < strlen($1); i++)
3836 SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i])
3837 $$ = get_buf_string(&line_item_buffer);
3839 | ESCAPE { size_t i;
3840 reset_buffer(&line_item_buffer);
3841 for (i=0; i < strlen($1); i++)
3842 SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i])
3843 $$ = get_buf_string(&line_item_buffer);
3847 /* The following also takes care of '@@' */
3848 if (!strncmp($2, "@@", 3))
3849 SAFE_BUF_ADDCHAR(&line_item_buffer, '@')
3851 for (i=0; i < strlen($2); i++)
3852 SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i])
3853 $$ = get_buf_string(&line_item_buffer);
3857 for (i=0; i < strlen($2); i++)
3858 SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i])
3859 $$ = get_buf_string(&line_item_buffer);
3861 | line_item error anychar { HANDLE_ERROR; }
3862 | line_item error ESCAPE { HANDLE_ERROR; }
3865 anychar : ANYCHAR { }
3869 error_subs : /* empty */
3870 | error_subs error_sect
3873 error_sect : OPEN DELIM opt_xref anytag opt_value error_subs CLOSE { }
3876 gen_sect : OPEN DELIM opt_xref anystdtag
3877 { if (compat_mode(C_SUBM_COMM)
3878 && compat_check_subm_comm_cont($4.string)) {
3879 /* Will pass here */
3882 INVALID_TAG($4.string);
3886 { if (compat_mode(C_SUBM_COMM)) {
3887 $<ctxt>$ = compat_subm_comm_cont_start(PARENT, $6);
3891 { if (compat_mode(C_SUBM_COMM))
3892 compat_subm_comm_cont_end(PARENT, $<ctxt>7);
3896 gen_rec : gen_rec_top
3900 gen_rec_norm : OPEN DELIM opt_xref anystdtag
3901 { INVALID_TOP_TAG($4.string) }
3902 opt_value opt_sects CLOSE
3906 gen_rec_top : OPEN DELIM anytoptag
3907 { gedcom_error(_("Missing cross-reference")); YYERROR; }
3908 opt_value opt_sects CLOSE
3912 opt_sects : /* empty */ { }
3913 | opt_sects gen_sect { }
3916 anytag : USERTAG { }
3930 anystdtag : TAG_ABBR
4061 /* Functions that handle the counting of subtags */
4063 int* count_arrays[MAXGEDCLEVEL+1];
4064 char tag_stack[MAXGEDCLEVEL+1][MAXSTDTAGLEN+1];
4065 Gedcom_ctxt ctxt_stack[MAXGEDCLEVEL+1];
4067 void push_countarray(int level)
4070 gedcom_debug_print("Push Count level: %d, level: %d", count_level, level);
4071 if (count_level != level + 1) {
4072 gedcom_error(_("Internal error: count level mismatch"));
4075 if (count_level > MAXGEDCLEVEL) {
4076 gedcom_error(_("Internal error: count array overflow"));
4080 gedcom_debug_print("calloc countarray %d", count_level);
4081 count = (int *)calloc(YYNTOKENS, sizeof(int));
4082 if (count == NULL) {
4083 gedcom_error(_("Internal error: count array calloc error"));
4087 count_arrays[count_level] = count;
4092 void set_parenttag(const char* tag)
4094 strncpy(tag_stack[count_level+1], tag, MAXSTDTAGLEN+1);
4097 void set_parentctxt(Gedcom_ctxt ctxt)
4099 ctxt_stack[count_level+1] = ctxt;
4102 char* get_parenttag(int offset)
4104 return tag_stack[count_level - offset];
4107 Gedcom_ctxt get_parentctxt(int offset)
4109 return ctxt_stack[count_level - offset];
4112 int count_tag(int tag)
4114 int *count = count_arrays[count_level];
4115 return ++count[tag - GEDCOMTAGOFFSET];
4118 int check_occurrence(int tag)
4120 int *count = count_arrays[count_level];
4121 return (count[tag - GEDCOMTAGOFFSET] > 0);
4124 void pop_countarray()
4127 gedcom_debug_print("Pop Count level: %d", count_level);
4128 if (count_level < 0) {
4129 gedcom_error(_("Internal error: count array underflow"));
4133 count = count_arrays[count_level];
4134 gedcom_debug_print("free countarray %d", count_level);
4136 count_arrays[count_level] = NULL;
4142 gedcom_debug_print("Cleanup countarrays");
4143 while (count_level > 0) {
4149 void cleanup_concat_buffer()
4151 cleanup_buffer(&concat_buffer);
4154 void cleanup_line_item_buffer()
4156 cleanup_buffer(&line_item_buffer);
4159 void cleanup_usertag_buffer()
4161 cleanup_buffer(&usertag_buffer);
4164 /* Enabling debug mode */
4165 /* level 0: no debugging */
4166 /* level 1: only internal */
4167 /* level 2: also bison */
4170 void gedcom_set_debug_level(int level, FILE* f)
4175 trace_output = stderr;
4177 gedcom_high_level_debug = 1;
4186 int gedcom_debug_print(const char* s, ...)
4189 if (gedcom_high_level_debug) {
4192 res = vfprintf(trace_output, s, ap);
4194 fprintf(trace_output, "\n");
4199 /* Setting the error mechanism */
4200 void gedcom_set_error_handling(Gedcom_err_mech mechanism)
4202 error_mechanism = mechanism;