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)); }
1929 subm_subs : /* empty */
1930 | subm_subs subm_sub
1933 subm_sub : subm_name_sect { OCCUR2(NAME, 1, 1) }
1934 | addr_struc_sub /* 0:1 */
1935 | multim_link_sub /* 0:M */
1936 | subm_lang_sect { OCCUR2(LANG, 0, 3) }
1937 | subm_rfn_sect { OCCUR2(RFN, 0, 1) }
1938 | subm_rin_sect { OCCUR2(RIN, 0, 1) }
1939 | change_date_sub /* 0:1 */
1944 subm_name_sect : OPEN DELIM TAG_NAME mand_line_item
1945 { $<ctxt>$ = start_element(ELT_SUBM_NAME,
1947 GEDCOM_MAKE_STRING(val1, $4));
1948 START(NAME, $1, $<ctxt>$)
1953 { end_element(ELT_SUBM_NAME, PARENT, $<ctxt>5,
1954 GEDCOM_MAKE_NULL(val1));
1959 subm_lang_sect : OPEN DELIM TAG_LANG mand_line_item
1960 { $<ctxt>$ = start_element(ELT_SUBM_LANG,
1962 GEDCOM_MAKE_STRING(val1, $4));
1963 START(LANG, $1, $<ctxt>$)
1968 { end_element(ELT_SUBM_LANG, PARENT, $<ctxt>5,
1969 GEDCOM_MAKE_NULL(val1));
1974 subm_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1975 { $<ctxt>$ = start_element(ELT_SUBM_RFN,
1977 GEDCOM_MAKE_STRING(val1, $4));
1978 START(RFN, $1, $<ctxt>$)
1983 { end_element(ELT_SUBM_RFN, PARENT, $<ctxt>5,
1984 GEDCOM_MAKE_NULL(val1));
1989 subm_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1990 { $<ctxt>$ = start_element(ELT_SUBM_RIN,
1992 GEDCOM_MAKE_STRING(val1, $4));
1993 START(RIN, $1, $<ctxt>$)
1998 { end_element(ELT_SUBM_RIN, PARENT, $<ctxt>5,
1999 GEDCOM_MAKE_NULL(val1));
2003 /*********************************************************************/
2004 /**** Substructures ****/
2005 /*********************************************************************/
2007 /* ADDRESS STRUCTURE */
2008 addr_struc_sub : addr_sect { OCCUR2(ADDR, 0, 1) }
2009 | phon_sect { OCCUR2(PHON, 0, 3) }
2012 addr_sect : OPEN DELIM TAG_ADDR mand_line_item
2013 { $<ctxt>$ = start_element(ELT_SUB_ADDR,
2015 GEDCOM_MAKE_STRING(val1, $4));
2016 reset_buffer(&concat_buffer);
2017 safe_buf_append(&concat_buffer, $4);
2018 START(ADDR, $1, $<ctxt>$)
2023 { char* complete = get_buf_string(&concat_buffer);
2024 end_element(ELT_SUB_ADDR, PARENT, $<ctxt>5,
2025 GEDCOM_MAKE_STRING(val1, complete));
2029 addr_subs : /* empty */
2030 | addr_subs addr_sub
2033 addr_sub : addr_cont_sect /* 0:M */
2034 | addr_adr1_sect { OCCUR2(ADR1, 0, 1) }
2035 | addr_adr2_sect { OCCUR2(ADR2, 0, 1) }
2036 | addr_city_sect { OCCUR2(CITY, 0, 1) }
2037 | addr_stae_sect { OCCUR2(STAE, 0, 1) }
2038 | addr_post_sect { OCCUR2(POST, 0, 1) }
2039 | addr_ctry_sect { OCCUR2(CTRY, 0, 1) }
2043 addr_cont_sect : OPEN DELIM TAG_CONT mand_line_item
2044 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CONT,
2046 GEDCOM_MAKE_STRING(val1, $4));
2047 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
2048 safe_buf_append(&concat_buffer, $4);
2049 START(CONT, $1, $<ctxt>$)
2054 { end_element(ELT_SUB_ADDR_CONT, PARENT, $<ctxt>5,
2055 GEDCOM_MAKE_NULL(val1));
2058 addr_adr1_sect : OPEN DELIM TAG_ADR1 mand_line_item
2059 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR1,
2061 GEDCOM_MAKE_STRING(val1, $4));
2062 START(ADR1, $1, $<ctxt>$)
2067 { end_element(ELT_SUB_ADDR_ADR1, PARENT, $<ctxt>5,
2068 GEDCOM_MAKE_NULL(val1));
2071 addr_adr2_sect : OPEN DELIM TAG_ADR2 mand_line_item
2072 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR2,
2074 GEDCOM_MAKE_STRING(val1, $4));
2075 START(ADR2, $1, $<ctxt>$)
2080 { end_element(ELT_SUB_ADDR_ADR2, PARENT, $<ctxt>5,
2081 GEDCOM_MAKE_NULL(val1));
2084 addr_city_sect : OPEN DELIM TAG_CITY mand_line_item
2085 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CITY,
2087 GEDCOM_MAKE_STRING(val1, $4));
2088 START(CITY, $1, $<ctxt>$)
2093 { end_element(ELT_SUB_ADDR_CITY, PARENT, $<ctxt>5,
2094 GEDCOM_MAKE_NULL(val1));
2097 addr_stae_sect : OPEN DELIM TAG_STAE mand_line_item
2098 { $<ctxt>$ = start_element(ELT_SUB_ADDR_STAE,
2100 GEDCOM_MAKE_STRING(val1, $4));
2101 START(STAE, $1, $<ctxt>$)
2106 { end_element(ELT_SUB_ADDR_STAE, PARENT, $<ctxt>5,
2107 GEDCOM_MAKE_NULL(val1));
2110 addr_post_sect : OPEN DELIM TAG_POST mand_line_item
2111 { $<ctxt>$ = start_element(ELT_SUB_ADDR_POST,
2113 GEDCOM_MAKE_STRING(val1, $4));
2114 START(POST, $1, $<ctxt>$)
2119 { end_element(ELT_SUB_ADDR_POST, PARENT, $<ctxt>5,
2120 GEDCOM_MAKE_NULL(val1));
2123 addr_ctry_sect : OPEN DELIM TAG_CTRY mand_line_item
2124 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CTRY,
2126 GEDCOM_MAKE_STRING(val1, $4));
2127 START(CTRY, $1, $<ctxt>$)
2132 { end_element(ELT_SUB_ADDR_CTRY, PARENT, $<ctxt>5,
2133 GEDCOM_MAKE_NULL(val1));
2137 phon_sect : OPEN DELIM TAG_PHON mand_line_item
2138 { $<ctxt>$ = start_element(ELT_SUB_PHON,
2140 GEDCOM_MAKE_STRING(val1, $4));
2141 START(PHON, $1, $<ctxt>$)
2146 { end_element(ELT_SUB_PHON, PARENT, $<ctxt>5,
2147 GEDCOM_MAKE_NULL(val1));
2151 /* ASSOCIATION STRUCTURE */
2152 assoc_struc_sub : asso_sect /* 0:M */
2155 asso_sect : OPEN DELIM TAG_ASSO mand_pointer
2156 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2158 if (xr == NULL) HANDLE_ERROR;
2159 $<ctxt>$ = start_element(ELT_SUB_ASSO,
2161 GEDCOM_MAKE_XREF_PTR(val1, xr));
2162 START(ASSO, $1, $<ctxt>$)
2165 { CHECK2(TYPE,RELA) }
2167 { end_element(ELT_SUB_ASSO, PARENT, $<ctxt>5,
2168 GEDCOM_MAKE_NULL(val1));
2172 asso_subs : /* empty */
2173 | asso_type_sect { OCCUR2(TYPE, 1, 1) }
2174 | asso_rela_sect { OCCUR2(RELA, 1, 1) }
2180 asso_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2181 { $<ctxt>$ = start_element(ELT_SUB_ASSO_TYPE,
2183 GEDCOM_MAKE_STRING(val1, $4));
2184 START(TYPE, $1, $<ctxt>$)
2189 { end_element(ELT_SUB_ASSO_TYPE, PARENT, $<ctxt>5,
2190 GEDCOM_MAKE_NULL(val1));
2194 asso_rela_sect : OPEN DELIM TAG_RELA mand_line_item
2195 { $<ctxt>$ = start_element(ELT_SUB_ASSO_RELA,
2197 GEDCOM_MAKE_STRING(val1, $4));
2198 START(RELA, $1, $<ctxt>$)
2203 { end_element(ELT_SUB_ASSO_RELA, PARENT, $<ctxt>5,
2204 GEDCOM_MAKE_NULL(val1));
2209 change_date_sub : change_date_chan_sect { OCCUR2(CHAN, 0, 1) }
2212 change_date_chan_sect : OPEN DELIM TAG_CHAN
2213 { $<ctxt>$ = start_element(ELT_SUB_CHAN,
2214 PARENT, $1, $3, NULL,
2215 GEDCOM_MAKE_NULL(val1));
2216 START(CHAN, $1, $<ctxt>$)
2218 change_date_chan_subs
2221 { end_element(ELT_SUB_CHAN, PARENT, $<ctxt>4,
2222 GEDCOM_MAKE_NULL(val1));
2226 change_date_chan_subs : /* empty */
2227 | change_date_chan_subs change_date_chan_sub
2230 change_date_chan_sub : change_date_date_sect { OCCUR2(DATE, 1, 1) }
2235 change_date_date_sect : OPEN DELIM TAG_DATE mand_line_item
2236 { struct date_value dv = gedcom_parse_date($4);
2237 $<ctxt>$ = start_element(ELT_SUB_CHAN_DATE,
2239 GEDCOM_MAKE_DATE(val1, dv));
2240 START(DATE, $1, $<ctxt>$) }
2241 change_date_date_subs
2244 { end_element(ELT_SUB_CHAN_DATE, PARENT, $<ctxt>5,
2245 GEDCOM_MAKE_NULL(val1));
2249 change_date_date_subs : /* empty */
2250 | change_date_date_subs change_date_date_sub
2253 change_date_date_sub : change_date_date_time_sect { OCCUR2(TIME, 0, 1) }
2257 change_date_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
2259 = start_element(ELT_SUB_CHAN_TIME,
2261 GEDCOM_MAKE_STRING(val1, $4));
2262 START(TIME, $1, $<ctxt>$)
2267 { end_element(ELT_SUB_CHAN_TIME, PARENT, $<ctxt>5,
2268 GEDCOM_MAKE_NULL(val1));
2272 /* CHILD TO FAMILY LINK */
2273 chi_fam_link_sub : famc_sect /* 0:M */
2276 famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2277 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2279 if (xr == NULL) HANDLE_ERROR;
2280 $<ctxt>$ = start_element(ELT_SUB_FAMC,
2282 GEDCOM_MAKE_XREF_PTR(val1, xr));
2283 START(FAMC, $1, $<ctxt>$)
2288 { end_element(ELT_SUB_FAMC, PARENT, $<ctxt>5,
2289 GEDCOM_MAKE_NULL(val1));
2293 famc_subs : /* empty */
2294 | famc_subs famc_sub
2297 famc_sub : famc_pedi_sect /* 0:M */
2302 famc_pedi_sect : OPEN DELIM TAG_PEDI mand_line_item
2303 { $<ctxt>$ = start_element(ELT_SUB_FAMC_PEDI,
2305 GEDCOM_MAKE_STRING(val1, $4));
2306 START(PEDI, $1, $<ctxt>$)
2311 { end_element(ELT_SUB_FAMC_PEDI, PARENT, $<ctxt>5,
2312 GEDCOM_MAKE_NULL(val1));
2316 /* CONTINUATION SUBSECTIONS */
2317 continuation_sub : cont_sect /* 0:M */
2318 | conc_sect /* 0:M */
2321 cont_sect : OPEN DELIM TAG_CONT opt_line_item
2322 { $<ctxt>$ = start_element(ELT_SUB_CONT,
2324 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2325 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
2326 if (GEDCOM_IS_STRING(&val1))
2327 safe_buf_append(&concat_buffer, $4);
2328 START(CONT, $1, $<ctxt>$)
2333 { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5,
2334 GEDCOM_MAKE_NULL(val1));
2338 conc_sect : OPEN DELIM TAG_CONC mand_line_item
2339 { $<ctxt>$ = start_element(ELT_SUB_CONC,
2341 GEDCOM_MAKE_STRING(val1, $4));
2342 if (compat_mode(C_CONC_NEEDS_SPACE)) {
2343 safe_buf_append(&concat_buffer, " ");
2345 safe_buf_append(&concat_buffer, $4);
2346 START(CONC, $1, $<ctxt>$)
2351 { end_element(ELT_SUB_CONC, PARENT, $<ctxt>5,
2352 GEDCOM_MAKE_NULL(val1));
2357 event_detail_sub : event_detail_type_sect { OCCUR2(TYPE, 0, 1) }
2358 | event_detail_date_sect { OCCUR2(DATE, 0, 1) }
2361 | event_detail_age_sect { OCCUR2(AGE, 0, 1) }
2362 | event_detail_agnc_sect { OCCUR2(AGNC, 0, 1) }
2363 | event_detail_caus_sect { OCCUR2(CAUS, 0, 1) }
2369 event_detail_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2371 = start_element(ELT_SUB_EVT_TYPE,
2373 GEDCOM_MAKE_STRING(val1, $4));
2374 START(TYPE, $1, $<ctxt>$)
2379 { end_element(ELT_SUB_EVT_TYPE, PARENT, $<ctxt>5,
2380 GEDCOM_MAKE_NULL(val1));
2383 event_detail_date_sect : OPEN DELIM TAG_DATE mand_line_item
2384 { struct date_value dv = gedcom_parse_date($4);
2386 = start_element(ELT_SUB_EVT_DATE,
2388 GEDCOM_MAKE_DATE(val1, dv));
2389 START(DATE, $1, $<ctxt>$)
2394 { end_element(ELT_SUB_EVT_DATE, PARENT, $<ctxt>5,
2395 GEDCOM_MAKE_NULL(val1));
2398 event_detail_age_sect : OPEN DELIM TAG_AGE mand_line_item
2399 { struct age_value age = gedcom_parse_age($4);
2401 = start_element(ELT_SUB_EVT_AGE,
2403 GEDCOM_MAKE_AGE(val1, age));
2404 START(AGE, $1, $<ctxt>$)
2409 { end_element(ELT_SUB_EVT_AGE, PARENT, $<ctxt>5,
2410 GEDCOM_MAKE_NULL(val1));
2413 event_detail_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
2415 = start_element(ELT_SUB_EVT_AGNC,
2417 GEDCOM_MAKE_STRING(val1, $4));
2418 START(AGNC, $1, $<ctxt>$)
2423 { end_element(ELT_SUB_EVT_AGNC, PARENT, $<ctxt>5,
2424 GEDCOM_MAKE_NULL(val1));
2427 event_detail_caus_sect : OPEN DELIM TAG_CAUS mand_line_item
2429 = start_element(ELT_SUB_EVT_CAUS,
2431 GEDCOM_MAKE_STRING(val1, $4));
2432 START(CAUS, $1, $<ctxt>$)
2437 { end_element(ELT_SUB_EVT_CAUS, PARENT, $<ctxt>5,
2438 GEDCOM_MAKE_NULL(val1));
2442 /* FAMILY EVENT STRUCTURE */
2443 fam_event_struc_sub : fam_event_sect
2444 | fam_gen_even_sect /* 0:M */
2447 fam_event_sect : OPEN DELIM fam_event_tag opt_value
2449 = start_element(ELT_SUB_FAM_EVT,
2451 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2452 START2($1, $<ctxt>$);
2457 { end_element(ELT_SUB_FAM_EVT, PARENT, $<ctxt>5,
2458 GEDCOM_MAKE_NULL(val1));
2462 fam_event_tag : TAG_ANUL { $$ = $1; START1(ANUL) }
2463 | TAG_CENS { $$ = $1; START1(CENS) }
2464 | TAG_DIV { $$ = $1; START1(DIV) }
2465 | TAG_DIVF { $$ = $1; START1(DIVF) }
2466 | TAG_ENGA { $$ = $1; START1(ENGA) }
2467 | TAG_MARR { $$ = $1; START1(MARR) }
2468 | TAG_MARB { $$ = $1; START1(MARB) }
2469 | TAG_MARC { $$ = $1; START1(MARC) }
2470 | TAG_MARL { $$ = $1; START1(MARL) }
2471 | TAG_MARS { $$ = $1; START1(MARS) }
2474 fam_event_subs : /* empty */
2475 | fam_event_subs fam_event_sub
2478 fam_event_sub : event_detail_sub
2479 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2480 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2484 fam_even_husb_sect : OPEN DELIM TAG_HUSB
2485 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_HUSB,
2486 PARENT, $1, $3, NULL,
2487 GEDCOM_MAKE_NULL(val1));
2488 START(HUSB, $1, $<ctxt>$)
2493 { end_element(ELT_SUB_FAM_EVT_HUSB, PARENT, $<ctxt>4,
2494 GEDCOM_MAKE_NULL(val1));
2498 fam_even_husb_subs : /* empty */
2499 | fam_even_husb_subs fam_even_husb_sub
2502 fam_even_husb_sub : fam_even_age_sect { OCCUR2(AGE, 1, 1) }
2506 fam_even_age_sect : OPEN DELIM TAG_AGE mand_line_item
2507 { struct age_value age = gedcom_parse_age($4);
2508 $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_AGE,
2510 GEDCOM_MAKE_AGE(val1, age));
2511 START(AGE, $1, $<ctxt>$)
2516 { end_element(ELT_SUB_FAM_EVT_AGE, PARENT, $<ctxt>5,
2517 GEDCOM_MAKE_NULL(val1));
2521 fam_even_wife_sect : OPEN DELIM TAG_WIFE
2522 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_WIFE,
2523 PARENT, $1, $3, NULL,
2524 GEDCOM_MAKE_NULL(val1));
2525 START(WIFE, $1, $<ctxt>$)
2530 { end_element(ELT_SUB_FAM_EVT_WIFE, PARENT, $<ctxt>4,
2531 GEDCOM_MAKE_NULL(val1));
2535 fam_gen_even_sect : OPEN DELIM TAG_EVEN
2536 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_EVEN,
2537 PARENT, $1, $3, NULL,
2538 GEDCOM_MAKE_NULL(val1));
2539 START(EVEN, $1, $<ctxt>$)
2544 { end_element(ELT_SUB_FAM_EVT_EVEN, PARENT, $<ctxt>4,
2545 GEDCOM_MAKE_NULL(val1));
2549 fam_gen_even_subs : /* empty */
2550 | fam_gen_even_subs fam_gen_even_sub
2553 fam_gen_even_sub : event_detail_sub
2554 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2555 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2559 /* IDENTIFICATION STRUCTURE */
2560 ident_struc_sub : ident_refn_sect /* 0:M */
2561 | ident_rin_sect { OCCUR2(RIN, 0, 1) }
2564 ident_refn_sect : OPEN DELIM TAG_REFN mand_line_item
2565 { $<ctxt>$ = start_element(ELT_SUB_IDENT_REFN,
2567 GEDCOM_MAKE_STRING(val1, $4));
2568 START(REFN, $1, $<ctxt>$)
2573 { end_element(ELT_SUB_IDENT_REFN, PARENT, $<ctxt>5,
2574 GEDCOM_MAKE_NULL(val1));
2578 ident_refn_subs : /* empty */
2579 | ident_refn_subs ident_refn_sub
2582 ident_refn_sub : ident_refn_type_sect { OCCUR2(TYPE, 0, 1) }
2586 ident_refn_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2588 = start_element(ELT_SUB_IDENT_REFN_TYPE,
2590 GEDCOM_MAKE_STRING(val1, $4));
2591 START(TYPE, $1, $<ctxt>$)
2596 { end_element(ELT_SUB_IDENT_REFN_TYPE, PARENT, $<ctxt>5,
2597 GEDCOM_MAKE_NULL(val1));
2601 ident_rin_sect : OPEN DELIM TAG_RIN mand_line_item
2602 { $<ctxt>$ = start_element(ELT_SUB_IDENT_RIN,
2604 GEDCOM_MAKE_STRING(val1, $4));
2605 START(RIN, $1, $<ctxt>$)
2610 { end_element(ELT_SUB_IDENT_RIN, PARENT, $<ctxt>5,
2611 GEDCOM_MAKE_NULL(val1));
2615 /* INDIVIDUAL ATTRIBUTE STRUCTURE */
2616 indiv_attr_struc_sub : indiv_attr_sect /* 0:M */
2617 | indiv_resi_sect /* 0:M */
2620 indiv_attr_sect : OPEN DELIM indiv_attr_tag mand_line_item
2621 { $<ctxt>$ = start_element(ELT_SUB_INDIV_ATTR,
2623 GEDCOM_MAKE_STRING(val1, $4));
2624 START2($1, $<ctxt>$);
2626 indiv_attr_event_subs
2629 { end_element(ELT_SUB_INDIV_ATTR, PARENT, $<ctxt>5,
2630 GEDCOM_MAKE_NULL(val1));
2634 indiv_attr_tag : TAG_CAST { $$ = $1; START1(CAST) }
2635 | TAG_DSCR { $$ = $1; START1(DSCR) }
2636 | TAG_EDUC { $$ = $1; START1(EDUC) }
2637 | TAG_IDNO { $$ = $1; START1(IDNO) }
2638 | TAG_NATI { $$ = $1; START1(NATI) }
2639 | TAG_NCHI { $$ = $1; START1(NCHI) }
2640 | TAG_NMR { $$ = $1; START1(NMR) }
2641 | TAG_OCCU { $$ = $1; START1(OCCU) }
2642 | TAG_PROP { $$ = $1; START1(PROP) }
2643 | TAG_RELI { $$ = $1; START1(RELI) }
2644 | TAG_SSN { $$ = $1; START1(SSN) }
2645 | TAG_TITL { $$ = $1; START1(TITL) }
2648 indiv_resi_sect : OPEN DELIM TAG_RESI
2649 { $<ctxt>$ = start_element(ELT_SUB_INDIV_RESI,
2650 PARENT, $1, $3, NULL,
2651 GEDCOM_MAKE_NULL(val1));
2652 START(RESI, $1, $<ctxt>$)
2654 indiv_attr_event_subs
2657 { end_element(ELT_SUB_INDIV_RESI, PARENT, $<ctxt>4,
2658 GEDCOM_MAKE_NULL(val1));
2662 indiv_attr_event_subs : /* empty */
2663 | indiv_attr_event_subs indiv_attr_event_sub
2666 indiv_attr_event_sub : event_detail_sub
2670 /* INDIVIDUAL EVENT STRUCTURE */
2671 indiv_even_struc_sub : indiv_birt_sect
2673 | indiv_adop_sect /* 0:M */
2674 | indiv_even_sect /* 0:M */
2677 indiv_birt_sect : OPEN DELIM indiv_birt_tag opt_value
2679 = start_element(ELT_SUB_INDIV_BIRT,
2681 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2682 START2($1, $<ctxt>$);
2687 { end_element(ELT_SUB_INDIV_BIRT, PARENT, $<ctxt>5,
2688 GEDCOM_MAKE_NULL(val1));
2692 indiv_birt_tag : TAG_BIRT { $$ = $1; START1(BIRT) }
2693 | TAG_CHR { $$ = $1; START1(CHR) }
2696 indiv_birt_subs : /* empty */
2697 | indiv_birt_subs indiv_birt_sub
2700 indiv_birt_sub : event_detail_sub
2701 | indiv_birt_famc_sect { OCCUR2(FAMC,0, 1) }
2705 indiv_birt_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2706 { struct xref_value *xr = gedcom_parse_xref($4,
2709 if (xr == NULL) HANDLE_ERROR;
2711 = start_element(ELT_SUB_INDIV_BIRT_FAMC,
2713 GEDCOM_MAKE_XREF_PTR(val1, xr));
2714 START(FAMC, $1, $<ctxt>$)
2719 { end_element(ELT_SUB_INDIV_BIRT_FAMC, PARENT, $<ctxt>5,
2720 GEDCOM_MAKE_NULL(val1));
2724 indiv_gen_sect : OPEN DELIM indiv_gen_tag opt_value
2726 = start_element(ELT_SUB_INDIV_GEN,
2728 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2729 START2($1, $<ctxt>$);
2734 { end_element(ELT_SUB_INDIV_GEN, PARENT, $<ctxt>5,
2735 GEDCOM_MAKE_NULL(val1));
2739 indiv_gen_tag : TAG_DEAT { $$ = $1; START1(DEAT) }
2740 | TAG_BURI { $$ = $1; START1(BURI) }
2741 | TAG_CREM { $$ = $1; START1(CREM) }
2742 | TAG_BAPM { $$ = $1; START1(BAPM) }
2743 | TAG_BARM { $$ = $1; START1(BARM) }
2744 | TAG_BASM { $$ = $1; START1(BASM) }
2745 | TAG_BLES { $$ = $1; START1(BLES) }
2746 | TAG_CHRA { $$ = $1; START1(CHRA) }
2747 | TAG_CONF { $$ = $1; START1(CONF) }
2748 | TAG_FCOM { $$ = $1; START1(FCOM) }
2749 | TAG_ORDN { $$ = $1; START1(ORDN) }
2750 | TAG_NATU { $$ = $1; START1(NATU) }
2751 | TAG_EMIG { $$ = $1; START1(EMIG) }
2752 | TAG_IMMI { $$ = $1; START1(IMMI) }
2753 | TAG_CENS { $$ = $1; START1(CENS) }
2754 | TAG_PROB { $$ = $1; START1(PROB) }
2755 | TAG_WILL { $$ = $1; START1(WILL) }
2756 | TAG_GRAD { $$ = $1; START1(GRAD) }
2757 | TAG_RETI { $$ = $1; START1(RETI) }
2760 indiv_gen_subs : /* empty */
2761 | indiv_gen_subs indiv_gen_sub
2764 indiv_gen_sub : event_detail_sub
2768 indiv_adop_sect : OPEN DELIM TAG_ADOP opt_value
2770 = start_element(ELT_SUB_INDIV_ADOP,
2772 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2773 START(ADOP, $1, $<ctxt>$) }
2777 { end_element(ELT_SUB_INDIV_ADOP, PARENT, $<ctxt>5,
2778 GEDCOM_MAKE_NULL(val1));
2782 indiv_adop_subs : /* empty */
2783 | indiv_adop_subs indiv_adop_sub
2786 indiv_adop_sub : event_detail_sub
2787 | indiv_adop_famc_sect { OCCUR2(FAMC,0, 1) }
2791 indiv_adop_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2792 { struct xref_value *xr = gedcom_parse_xref($4,
2795 if (xr == NULL) HANDLE_ERROR;
2797 = start_element(ELT_SUB_INDIV_ADOP_FAMC,
2799 GEDCOM_MAKE_XREF_PTR(val1, xr));
2800 START(FAMC, $1, $<ctxt>$) }
2801 indiv_adop_famc_subs
2804 { end_element(ELT_SUB_INDIV_ADOP_FAMC, PARENT, $<ctxt>5,
2805 GEDCOM_MAKE_NULL(val1));
2809 indiv_adop_famc_subs : /* empty */
2810 | indiv_adop_famc_subs indiv_adop_famc_sub
2813 indiv_adop_famc_sub : indiv_adop_famc_adop_sect { OCCUR2(ADOP,0, 1) }
2817 indiv_adop_famc_adop_sect : OPEN DELIM TAG_ADOP mand_line_item
2819 = start_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2821 GEDCOM_MAKE_STRING(val1, $4));
2822 START(ADOP, $1, $<ctxt>$) }
2826 { end_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2828 GEDCOM_MAKE_NULL(val1));
2832 indiv_even_sect : OPEN DELIM TAG_EVEN
2833 { $<ctxt>$ = start_element(ELT_SUB_INDIV_EVEN,
2834 PARENT, $1, $3, NULL,
2835 GEDCOM_MAKE_NULL(val1));
2836 START(EVEN, $1, $<ctxt>$) }
2840 { end_element(ELT_SUB_INDIV_EVEN, PARENT, $<ctxt>4,
2841 GEDCOM_MAKE_NULL(val1));
2845 /* LDS INDIVIDUAL ORDINANCE */
2846 lds_indiv_ord_sub : lio_bapl_sect /* 0:M */
2847 | lio_slgc_sect /* 0:M */
2850 lio_bapl_sect : OPEN DELIM lio_bapl_tag
2851 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL,
2852 PARENT, $1, $3, NULL,
2853 GEDCOM_MAKE_NULL(val1));
2854 START2($1, $<ctxt>$);
2859 { end_element(ELT_SUB_LIO_BAPL, PARENT, $<ctxt>4,
2860 GEDCOM_MAKE_NULL(val1));
2864 lio_bapl_tag : TAG_BAPL { $$ = $1; START1(BAPL) }
2865 | TAG_CONL { $$ = $1; START1(CONL) }
2866 | TAG_ENDL { $$ = $1; START1(ENDL) }
2869 lio_bapl_subs : /* empty */
2870 | lio_bapl_subs lio_bapl_sub
2873 lio_bapl_sub : lio_bapl_stat_sect { OCCUR2(STAT, 0, 1) }
2874 | lio_bapl_date_sect { OCCUR2(DATE, 0, 1) }
2875 | lio_bapl_temp_sect { OCCUR2(TEMP, 0, 1) }
2876 | lio_bapl_plac_sect { OCCUR2(PLAC, 0, 1) }
2882 lio_bapl_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2883 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_STAT,
2885 GEDCOM_MAKE_STRING(val1, $4));
2886 START(STAT, $1, $<ctxt>$)
2891 { end_element(ELT_SUB_LIO_BAPL_STAT, PARENT, $<ctxt>5,
2892 GEDCOM_MAKE_NULL(val1));
2895 lio_bapl_date_sect : OPEN DELIM TAG_DATE mand_line_item
2896 { struct date_value dv = gedcom_parse_date($4);
2897 $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_DATE,
2899 GEDCOM_MAKE_DATE(val1, dv));
2900 START(DATE, $1, $<ctxt>$)
2905 { end_element(ELT_SUB_LIO_BAPL_DATE, PARENT, $<ctxt>5,
2906 GEDCOM_MAKE_NULL(val1));
2909 lio_bapl_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2910 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_TEMP,
2912 GEDCOM_MAKE_STRING(val1, $4));
2913 START(TEMP, $1, $<ctxt>$)
2918 { end_element(ELT_SUB_LIO_BAPL_TEMP, PARENT, $<ctxt>5,
2919 GEDCOM_MAKE_NULL(val1));
2922 lio_bapl_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2923 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_PLAC,
2925 GEDCOM_MAKE_STRING(val1, $4));
2926 START(PLAC, $1, $<ctxt>$)
2931 { end_element(ELT_SUB_LIO_BAPL_PLAC, PARENT, $<ctxt>5,
2932 GEDCOM_MAKE_NULL(val1));
2936 lio_slgc_sect : OPEN DELIM TAG_SLGC
2937 { $<ctxt>$ = start_element(ELT_SUB_LIO_SLGC,
2938 PARENT, $1, $3, NULL,
2939 GEDCOM_MAKE_NULL(val1));
2940 START(SLGC, $1, $<ctxt>$)
2943 { if (compat_mode(C_NO_SLGC_FAMC) && ! CHK_COND(FAMC))
2944 compat_generate_slgc_famc_link($<ctxt>4);
2949 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4,
2950 GEDCOM_MAKE_NULL(val1));
2954 lio_slgc_subs : /* empty */
2955 | lio_slgc_subs lio_slgc_sub
2958 lio_slgc_sub : lio_bapl_sub
2959 | lio_slgc_famc_sect { OCCUR2(FAMC, 1, 1) }
2962 lio_slgc_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2963 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2965 if (xr == NULL) HANDLE_ERROR;
2967 = start_element(ELT_SUB_LIO_SLGC_FAMC,
2969 GEDCOM_MAKE_XREF_PTR(val1, xr));
2970 START(FAMC, $1, $<ctxt>$)
2975 { end_element(ELT_SUB_LIO_SLGC_FAMC, PARENT, $<ctxt>5,
2976 GEDCOM_MAKE_NULL(val1));
2980 /* LDS SPOUSE SEALING */
2981 lds_spouse_seal_sub : lss_slgs_sect
2984 lss_slgs_sect : OPEN DELIM TAG_SLGS
2985 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS,
2986 PARENT, $1, $3, NULL,
2987 GEDCOM_MAKE_NULL(val1));
2988 START(SLGS, $1, $<ctxt>$) }
2992 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4,
2993 GEDCOM_MAKE_NULL(val1));
2997 lss_slgs_subs : /* empty */
2998 | lss_slgs_subs lss_slgs_sub
3001 lss_slgs_sub : lss_slgs_stat_sect { OCCUR2(STAT, 0, 1) }
3002 | lss_slgs_date_sect { OCCUR2(DATE, 0, 1) }
3003 | lss_slgs_temp_sect { OCCUR2(TEMP, 0, 1) }
3004 | lss_slgs_plac_sect { OCCUR2(PLAC, 0, 1) }
3010 lss_slgs_stat_sect : OPEN DELIM TAG_STAT mand_line_item
3011 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_STAT,
3013 GEDCOM_MAKE_STRING(val1, $4));
3014 START(STAT, $1, $<ctxt>$)
3019 { end_element(ELT_SUB_LSS_SLGS_STAT, PARENT, $<ctxt>5,
3020 GEDCOM_MAKE_NULL(val1));
3023 lss_slgs_date_sect : OPEN DELIM TAG_DATE mand_line_item
3024 { struct date_value dv = gedcom_parse_date($4);
3025 $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_DATE,
3027 GEDCOM_MAKE_DATE(val1, dv));
3028 START(DATE, $1, $<ctxt>$)
3033 { end_element(ELT_SUB_LSS_SLGS_DATE, PARENT, $<ctxt>5,
3034 GEDCOM_MAKE_NULL(val1));
3037 lss_slgs_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
3038 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_TEMP,
3040 GEDCOM_MAKE_STRING(val1, $4));
3041 START(TEMP, $1, $<ctxt>$)
3046 { end_element(ELT_SUB_LSS_SLGS_TEMP, PARENT, $<ctxt>5,
3047 GEDCOM_MAKE_NULL(val1));
3050 lss_slgs_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3051 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_PLAC,
3053 GEDCOM_MAKE_STRING(val1, $4));
3054 START(PLAC, $1, $<ctxt>$)
3059 { end_element(ELT_SUB_LSS_SLGS_PLAC, PARENT, $<ctxt>5,
3060 GEDCOM_MAKE_NULL(val1));
3064 /* MULTIMEDIA LINK */
3065 multim_link_sub : multim_obje_link_sect
3066 | multim_obje_emb_sect
3069 multim_obje_link_sect : OPEN DELIM TAG_OBJE DELIM POINTER
3070 { struct xref_value *xr = gedcom_parse_xref($5,
3073 if (xr == NULL) HANDLE_ERROR;
3075 = start_element(ELT_SUB_MULTIM_OBJE,
3077 GEDCOM_MAKE_XREF_PTR(val1, xr));
3078 START(OBJE, $1, $<ctxt>$)
3083 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>6,
3084 GEDCOM_MAKE_NULL(val1));
3088 multim_obje_emb_sect : OPEN DELIM TAG_OBJE
3089 { $<ctxt>$ = start_element(ELT_SUB_MULTIM_OBJE,
3090 PARENT, $1, $3, NULL,
3091 GEDCOM_MAKE_NULL(val1));
3092 START(OBJE, $1, $<ctxt>$)
3094 multim_obje_emb_subs
3095 { CHECK2(FORM,FILE) }
3097 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>4,
3098 GEDCOM_MAKE_NULL(val1));
3102 multim_obje_emb_subs : /* empty */
3103 | multim_obje_emb_subs multim_obje_emb_sub
3106 multim_obje_emb_sub : multim_obje_form_sect { OCCUR2(FORM, 1, 1) }
3107 | multim_obje_titl_sect { OCCUR2(TITL, 0, 1) }
3108 | multim_obje_file_sect { OCCUR2(FILE, 1, 1) }
3113 multim_obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
3115 = start_element(ELT_SUB_MULTIM_OBJE_FORM,
3117 GEDCOM_MAKE_STRING(val1, $4));
3118 START(FORM, $1, $<ctxt>$)
3123 { end_element(ELT_SUB_MULTIM_OBJE_FORM,
3125 GEDCOM_MAKE_NULL(val1));
3128 multim_obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
3130 = start_element(ELT_SUB_MULTIM_OBJE_TITL,
3132 GEDCOM_MAKE_STRING(val1, $4));
3133 START(TITL, $1, $<ctxt>$)
3138 { end_element(ELT_SUB_MULTIM_OBJE_TITL,
3140 GEDCOM_MAKE_NULL(val1));
3143 multim_obje_file_sect : OPEN DELIM TAG_FILE mand_line_item
3145 = start_element(ELT_SUB_MULTIM_OBJE_FILE,
3147 GEDCOM_MAKE_STRING(val1, $4));
3148 START(FILE, $1, $<ctxt>$)
3153 { end_element(ELT_SUB_MULTIM_OBJE_FILE,
3155 GEDCOM_MAKE_NULL(val1));
3159 /* NOTE STRUCTURE */
3160 note_struc_sub : note_struc_link_sect /* 0:M */
3161 | note_struc_emb_sect /* 0:M */
3164 note_struc_link_sect : OPEN DELIM TAG_NOTE DELIM POINTER
3165 { struct xref_value *xr = gedcom_parse_xref($5,
3168 if (xr == NULL) HANDLE_ERROR;
3170 = start_element(ELT_SUB_NOTE,
3172 GEDCOM_MAKE_XREF_PTR(val1, xr));
3173 START(NOTE, $1, $<ctxt>$)
3175 note_struc_link_subs
3178 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>6,
3179 GEDCOM_MAKE_NULL(val1));
3183 note_struc_link_subs : /* empty */
3184 | note_struc_link_subs note_struc_link_sub
3187 note_struc_link_sub : source_cit_sub
3191 note_struc_emb_sect : OPEN DELIM TAG_NOTE opt_line_item
3193 = start_element(ELT_SUB_NOTE,
3195 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
3196 reset_buffer(&concat_buffer);
3198 safe_buf_append(&concat_buffer, $4);
3199 START(NOTE, $1, $<ctxt>$)
3204 { char* complete = get_buf_string(&concat_buffer);
3205 end_element(ELT_SUB_NOTE, PARENT, $<ctxt>5,
3206 GEDCOM_MAKE_STRING(val1, complete));
3210 note_struc_emb_subs : /* empty */
3211 | note_struc_emb_subs note_struc_emb_sub
3214 note_struc_emb_sub : continuation_sub
3219 /* PERSONAL NAME STRUCTURE */
3220 pers_name_struc_sub : pers_name_sect /* 0:M */
3223 pers_name_sect : OPEN DELIM TAG_NAME mand_line_item
3224 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME,
3226 GEDCOM_MAKE_STRING(val1, $4));
3227 START(NAME, $1, $<ctxt>$)
3232 { end_element(ELT_SUB_PERS_NAME, PARENT, $<ctxt>5,
3233 GEDCOM_MAKE_NULL(val1));
3237 pers_name_subs : /* empty */
3238 | pers_name_subs pers_name_sub
3241 pers_name_sub : pers_name_npfx_sect { OCCUR2(NPFX, 0, 1) }
3242 | pers_name_givn_sect { OCCUR2(GIVN, 0, 1) }
3243 | pers_name_nick_sect { OCCUR2(NICK, 0, 1) }
3244 | pers_name_spfx_sect { OCCUR2(SPFX, 0, 1) }
3245 | pers_name_surn_sect { OCCUR2(SURN, 0, 1) }
3246 | pers_name_nsfx_sect { OCCUR2(NSFX, 0, 1) }
3252 pers_name_npfx_sect : OPEN DELIM TAG_NPFX mand_line_item
3253 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NPFX,
3255 GEDCOM_MAKE_STRING(val1, $4));
3256 START(NPFX, $1, $<ctxt>$)
3261 { end_element(ELT_SUB_PERS_NAME_NPFX, PARENT, $<ctxt>5,
3262 GEDCOM_MAKE_NULL(val1));
3265 pers_name_givn_sect : OPEN DELIM TAG_GIVN mand_line_item
3266 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_GIVN,
3268 GEDCOM_MAKE_STRING(val1, $4));
3269 START(GIVN, $1, $<ctxt>$)
3274 { end_element(ELT_SUB_PERS_NAME_GIVN, PARENT, $<ctxt>5,
3275 GEDCOM_MAKE_NULL(val1));
3278 pers_name_nick_sect : OPEN DELIM TAG_NICK mand_line_item
3279 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NICK,
3281 GEDCOM_MAKE_STRING(val1, $4));
3282 START(NICK, $1, $<ctxt>$)
3287 { end_element(ELT_SUB_PERS_NAME_NICK, PARENT, $<ctxt>5,
3288 GEDCOM_MAKE_NULL(val1));
3291 pers_name_spfx_sect : OPEN DELIM TAG_SPFX mand_line_item
3292 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SPFX,
3294 GEDCOM_MAKE_STRING(val1, $4));
3295 START(SPFX, $1, $<ctxt>$)
3300 { end_element(ELT_SUB_PERS_NAME_SPFX, PARENT, $<ctxt>5,
3301 GEDCOM_MAKE_NULL(val1));
3304 pers_name_surn_sect : OPEN DELIM TAG_SURN mand_line_item
3305 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SURN,
3307 GEDCOM_MAKE_STRING(val1, $4));
3308 START(SURN, $1, $<ctxt>$)
3313 { end_element(ELT_SUB_PERS_NAME_SURN, PARENT, $<ctxt>5,
3314 GEDCOM_MAKE_NULL(val1));
3317 pers_name_nsfx_sect : OPEN DELIM TAG_NSFX mand_line_item
3318 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NSFX,
3320 GEDCOM_MAKE_STRING(val1, $4));
3321 START(NSFX, $1, $<ctxt>$)
3326 { end_element(ELT_SUB_PERS_NAME_NSFX, PARENT, $<ctxt>5,
3327 GEDCOM_MAKE_NULL(val1));
3331 /* PLACE STRUCTURE */
3332 place_struc_sub : place_struc_plac_sect /* 0:M */
3335 place_struc_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3337 = start_element(ELT_SUB_PLAC,
3339 GEDCOM_MAKE_STRING(val1, $4));
3340 START(PLAC, $1, $<ctxt>$)
3342 place_struc_plac_subs
3345 { end_element(ELT_SUB_PLAC, PARENT, $<ctxt>5,
3346 GEDCOM_MAKE_NULL(val1));
3350 place_struc_plac_subs : /* empty */
3351 | place_struc_plac_subs place_struc_plac_sub
3354 place_struc_plac_sub : place_plac_form_sect { OCCUR2(FORM, 0, 1) }
3360 place_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
3362 = start_element(ELT_SUB_PLAC_FORM,
3364 GEDCOM_MAKE_STRING(val1, $4));
3365 START(FORM, $1, $<ctxt>$)
3370 { end_element(ELT_SUB_PLAC_FORM, PARENT, $<ctxt>5,
3371 GEDCOM_MAKE_NULL(val1));
3375 /* SOURCE_CITATION */
3376 source_cit_sub : source_cit_link_sect /* 0:M */
3377 | source_cit_emb_sect /* 0:M */
3380 source_cit_link_sect : OPEN DELIM TAG_SOUR DELIM POINTER
3381 { struct xref_value *xr = gedcom_parse_xref($5,
3384 if (xr == NULL) HANDLE_ERROR;
3386 = start_element(ELT_SUB_SOUR,
3388 GEDCOM_MAKE_XREF_PTR(val1, xr));
3389 START(SOUR, $1, $<ctxt>$)
3391 source_cit_link_subs
3394 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>6,
3395 GEDCOM_MAKE_NULL(val1));
3399 source_cit_link_subs : /* empty */
3400 | source_cit_link_subs source_cit_link_sub
3403 source_cit_link_sub : source_cit_page_sect { OCCUR2(PAGE, 0, 1) }
3404 | source_cit_even_sect { OCCUR2(EVEN, 0, 1) }
3405 | source_cit_data_sect { OCCUR2(DATA, 0, 1) }
3406 | source_cit_quay_sect { OCCUR2(QUAY, 0, 1) }
3412 source_cit_page_sect : OPEN DELIM TAG_PAGE mand_line_item
3414 = start_element(ELT_SUB_SOUR_PAGE,
3416 GEDCOM_MAKE_STRING(val1, $4));
3417 START(PAGE, $1, $<ctxt>$)
3422 { end_element(ELT_SUB_SOUR_PAGE, PARENT, $<ctxt>5,
3423 GEDCOM_MAKE_NULL(val1));
3427 source_cit_even_sect : OPEN DELIM TAG_EVEN mand_line_item
3429 = start_element(ELT_SUB_SOUR_EVEN,
3431 GEDCOM_MAKE_STRING(val1, $4));
3432 START(EVEN, $1, $<ctxt>$)
3434 source_cit_even_subs
3437 { end_element(ELT_SUB_SOUR_EVEN, PARENT, $<ctxt>5,
3438 GEDCOM_MAKE_NULL(val1));
3442 source_cit_even_subs : /* empty */
3443 | source_cit_even_subs source_cit_even_sub
3446 source_cit_even_sub : source_cit_even_role_sect { OCCUR2(ROLE, 0, 1) }
3450 source_cit_even_role_sect : OPEN DELIM TAG_ROLE mand_line_item
3452 = start_element(ELT_SUB_SOUR_EVEN_ROLE,
3454 GEDCOM_MAKE_STRING(val1, $4));
3455 START(ROLE, $1, $<ctxt>$)
3460 { end_element(ELT_SUB_SOUR_EVEN_ROLE,
3462 GEDCOM_MAKE_NULL(val1));
3466 source_cit_data_sect : OPEN DELIM TAG_DATA
3467 { $<ctxt>$ = start_element(ELT_SUB_SOUR_DATA,
3468 PARENT, $1, $3, NULL,
3469 GEDCOM_MAKE_NULL(val1));
3470 START(DATA, $1, $<ctxt>$)
3472 source_cit_data_subs
3475 { end_element(ELT_SUB_SOUR_DATA, PARENT, $<ctxt>4,
3476 GEDCOM_MAKE_NULL(val1));
3480 source_cit_data_subs : /* empty */
3481 | source_cit_data_subs source_cit_data_sub
3484 source_cit_data_sub : source_cit_data_date_sect { OCCUR2(DATE, 0, 1) }
3485 | source_cit_text_sect /* 0:M */
3489 source_cit_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
3490 { struct date_value dv = gedcom_parse_date($4);
3492 = start_element(ELT_SUB_SOUR_DATA_DATE,
3494 GEDCOM_MAKE_DATE(val1, dv));
3495 START(DATE, $1, $<ctxt>$)
3500 { end_element(ELT_SUB_SOUR_DATA_DATE,
3502 GEDCOM_MAKE_NULL(val1));
3506 source_cit_text_sect : OPEN DELIM TAG_TEXT mand_line_item
3508 = start_element(ELT_SUB_SOUR_TEXT,
3510 GEDCOM_MAKE_STRING(val1, $4));
3511 reset_buffer(&concat_buffer);
3512 safe_buf_append(&concat_buffer, $4);
3513 START(TEXT, $1, $<ctxt>$)
3515 source_cit_text_subs
3518 { char* complete = get_buf_string(&concat_buffer);
3519 end_element(ELT_SUB_SOUR_TEXT, PARENT, $<ctxt>5,
3520 GEDCOM_MAKE_STRING(val1, complete));
3524 source_cit_text_subs : /* empty */
3525 | source_cit_text_subs source_cit_text_sub
3528 source_cit_text_sub : continuation_sub
3532 source_cit_quay_sect : OPEN DELIM TAG_QUAY mand_line_item
3534 = start_element(ELT_SUB_SOUR_QUAY,
3536 GEDCOM_MAKE_STRING(val1, $4));
3537 START(QUAY, $1, $<ctxt>$)
3542 { end_element(ELT_SUB_SOUR_QUAY, PARENT, $<ctxt>5,
3543 GEDCOM_MAKE_NULL(val1));
3547 source_cit_emb_sect : OPEN DELIM TAG_SOUR mand_line_item
3548 { $<ctxt>$ = start_element(ELT_SUB_SOUR,
3550 GEDCOM_MAKE_STRING(val1, $4));
3551 reset_buffer(&concat_buffer);
3552 safe_buf_append(&concat_buffer, $4);
3553 START(SOUR, $1, $<ctxt>$)
3558 { char* complete = get_buf_string(&concat_buffer);
3559 end_element(ELT_SUB_SOUR, PARENT, $<ctxt>5,
3560 GEDCOM_MAKE_STRING(val1, complete));
3564 source_cit_emb_subs : /* empty */
3565 | source_cit_emb_subs source_cit_emb_sub
3568 source_cit_emb_sub : continuation_sub
3569 | source_cit_text_sect /* 0:M */
3574 /* SOURCE REPOSITORY CITATION */
3575 source_repos_cit_sub : source_repos_repo_sect { OCCUR2(REPO, 0, 1) }
3578 source_repos_repo_sect : OPEN DELIM TAG_REPO mand_pointer
3579 { struct xref_value *xr
3580 = gedcom_parse_xref($4, XREF_USED, XREF_REPO);
3581 if (xr == NULL) HANDLE_ERROR;
3583 = start_element(ELT_SUB_REPO,
3585 GEDCOM_MAKE_XREF_PTR(val1, xr));
3586 START(REPO, $1, $<ctxt>$)
3588 source_repos_repo_subs
3591 { end_element(ELT_SUB_REPO, PARENT, $<ctxt>5,
3592 GEDCOM_MAKE_NULL(val1));
3596 source_repos_repo_subs : /* empty */
3597 | source_repos_repo_subs source_repos_repo_sub
3600 source_repos_repo_sub : note_struc_sub
3601 | caln_sect /* 0:M */
3605 caln_sect : OPEN DELIM TAG_CALN mand_line_item
3606 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN,
3608 GEDCOM_MAKE_STRING(val1, $4));
3609 START(CALN, $1, $<ctxt>$)
3614 { end_element(ELT_SUB_REPO_CALN, PARENT, $<ctxt>5,
3615 GEDCOM_MAKE_NULL(val1));
3619 caln_subs : /* empty */
3620 | caln_subs caln_sub
3623 caln_sub : caln_medi_sect { OCCUR2(MEDI, 0, 1) }
3627 caln_medi_sect : OPEN DELIM TAG_MEDI mand_line_item
3628 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN_MEDI,
3630 GEDCOM_MAKE_STRING(val1, $4));
3631 START(MEDI, $1, $<ctxt>$)
3636 { end_element(ELT_SUB_REPO_CALN_MEDI, PARENT, $<ctxt>5,
3637 GEDCOM_MAKE_NULL(val1));
3641 /* SPOUSE TO FAMILY LINK */
3642 spou_fam_link_sub : spou_fam_fams_sect /* 0:M */
3645 spou_fam_fams_sect : OPEN DELIM TAG_FAMS mand_pointer
3646 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
3648 if (xr == NULL) HANDLE_ERROR;
3650 = start_element(ELT_SUB_FAMS,
3652 GEDCOM_MAKE_XREF_PTR(val1, xr));
3653 START(FAMS, $1, $<ctxt>$)
3658 { end_element(ELT_SUB_FAMS, PARENT, $<ctxt>5,
3659 GEDCOM_MAKE_NULL(val1));
3663 spou_fam_fams_subs : /* empty */
3664 | spou_fam_fams_subs spou_fam_fams_sub
3667 spou_fam_fams_sub : note_struc_sub
3671 /*********************************************************************/
3673 /*********************************************************************/
3675 no_std_subs : /* empty */
3676 | no_std_subs no_std_sub
3679 no_std_sub : user_sect /* 0:M */
3682 CLOSE { HANDLE_ERROR }
3685 no_std_rec : user_rec /* 0:M */
3688 CLOSE { HANDLE_ERROR }
3691 user_rec : OPEN DELIM opt_xref USERTAG
3692 { if ($4.string[0] != '_') {
3693 if (compat_mode(C_551_TAGS)
3694 && compat_check_551_tag($4.string, &usertag_buffer)) {
3695 $4.string = get_buf_string(&usertag_buffer);
3698 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3705 { struct xref_value *xr = NULL;
3707 xr = gedcom_parse_xref($3, XREF_DEFINED, XREF_USER);
3708 if (xr == NULL) HANDLE_ERROR;
3710 $<ctxt>$ = start_record(REC_USER,
3712 GEDCOM_MAKE_NULL_OR_XREF_PTR(val1, xr),
3714 START($4, $1, $<ctxt>$)
3719 { end_record(REC_USER, $<ctxt>7, GEDCOM_MAKE_NULL(val1)); }
3721 user_sect : OPEN DELIM opt_xref USERTAG
3722 { if ($4.string[0] != '_') {
3723 if (compat_mode(C_551_TAGS)
3724 && compat_check_551_tag($4.string, &usertag_buffer)) {
3725 $4.string = get_buf_string(&usertag_buffer);
3727 else if (compat_mode(C_SUBM_COMM) &&
3728 compat_check_subm_comm($4.string, get_parenttag(0),
3730 $4.string = get_buf_string(&usertag_buffer);
3733 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3740 { $<ctxt>$ = start_element(ELT_USER, PARENT, $1, $4, $6, &val2);
3741 START($4, $1, $<ctxt>$);
3746 { end_element(ELT_USER, PARENT, $<ctxt>7,
3747 GEDCOM_MAKE_NULL(val1));
3748 if (compat_mode(C_SUBM_COMM))
3749 compat_close_subm_comm();
3753 user_sects : /* empty */ { }
3754 | user_sects user_sect { }
3755 | user_sects gen_sect
3756 { if (compat_mode(C_SUBM_COMM)) {
3759 gedcom_error(_("Standard tag not allowed in user section"));
3765 opt_xref : /* empty */ { $$ = NULL; }
3766 | POINTER DELIM { $$ = $1; }
3769 opt_value : /* empty */ { GEDCOM_MAKE_NULL(val2);
3771 | DELIM POINTER { struct xref_value *xr
3772 = gedcom_parse_xref($2, XREF_USED,
3774 GEDCOM_MAKE_XREF_PTR(val2, xr);
3776 | DELIM line_item { GEDCOM_MAKE_STRING(val2, $2);
3780 mand_pointer : /* empty */ { gedcom_error(_("Missing pointer")); YYERROR; }
3781 | DELIM POINTER { gedcom_debug_print("==Ptr: %s==", $2);
3785 mand_line_item : /* empty */
3786 { if (compat_mode(C_NO_REQUIRED_VALUES)) {
3787 gedcom_debug_print("==Val: ==");
3788 $$ = VALUE_IF_MISSING;
3791 gedcom_error(_("Missing value")); YYERROR;
3794 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3798 opt_line_item : /* empty */ { $$ = NULL; }
3799 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3803 line_item : anychar { size_t i;
3804 reset_buffer(&line_item_buffer);
3805 /* The following also takes care of '@@' */
3806 if (!strncmp($1, "@@", 3))
3807 SAFE_BUF_ADDCHAR(&line_item_buffer, '@')
3809 for (i=0; i < strlen($1); i++)
3810 SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i])
3811 $$ = get_buf_string(&line_item_buffer);
3813 | ESCAPE { size_t i;
3814 reset_buffer(&line_item_buffer);
3815 for (i=0; i < strlen($1); i++)
3816 SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i])
3817 $$ = get_buf_string(&line_item_buffer);
3821 /* The following also takes care of '@@' */
3822 if (!strncmp($2, "@@", 3))
3823 SAFE_BUF_ADDCHAR(&line_item_buffer, '@')
3825 for (i=0; i < strlen($2); i++)
3826 SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i])
3827 $$ = get_buf_string(&line_item_buffer);
3831 for (i=0; i < strlen($2); i++)
3832 SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i])
3833 $$ = get_buf_string(&line_item_buffer);
3835 | line_item error anychar { HANDLE_ERROR; }
3836 | line_item error ESCAPE { HANDLE_ERROR; }
3839 anychar : ANYCHAR { }
3843 error_subs : /* empty */
3844 | error_subs error_sect
3847 error_sect : OPEN DELIM opt_xref anytag opt_value error_subs CLOSE { }
3850 gen_sect : OPEN DELIM opt_xref anystdtag
3851 { if (compat_mode(C_SUBM_COMM)
3852 && compat_check_subm_comm_cont($4.string)) {
3853 /* Will pass here */
3856 INVALID_TAG($4.string);
3860 { if (compat_mode(C_SUBM_COMM)) {
3861 $<ctxt>$ = compat_subm_comm_cont_start(PARENT, $6);
3865 { if (compat_mode(C_SUBM_COMM))
3866 compat_subm_comm_cont_end(PARENT, $<ctxt>7);
3870 gen_rec : gen_rec_top
3874 gen_rec_norm : OPEN DELIM opt_xref anystdtag
3875 { INVALID_TOP_TAG($4.string) }
3876 opt_value opt_sects CLOSE
3880 gen_rec_top : OPEN DELIM anytoptag
3881 { gedcom_error(_("Missing cross-reference")); YYERROR; }
3882 opt_value opt_sects CLOSE
3886 opt_sects : /* empty */ { }
3887 | opt_sects gen_sect { }
3890 anytag : USERTAG { }
3904 anystdtag : TAG_ABBR
4035 /* Functions that handle the counting of subtags */
4037 int* count_arrays[MAXGEDCLEVEL+1];
4038 char tag_stack[MAXGEDCLEVEL+1][MAXSTDTAGLEN+1];
4039 Gedcom_ctxt ctxt_stack[MAXGEDCLEVEL+1];
4041 void push_countarray(int level)
4044 gedcom_debug_print("Push Count level: %d, level: %d", count_level, level);
4045 if (count_level != level + 1) {
4046 gedcom_error(_("Internal error: count level mismatch"));
4049 if (count_level > MAXGEDCLEVEL) {
4050 gedcom_error(_("Internal error: count array overflow"));
4054 gedcom_debug_print("calloc countarray %d", count_level);
4055 count = (int *)calloc(YYNTOKENS, sizeof(int));
4056 if (count == NULL) {
4057 gedcom_error(_("Internal error: count array calloc error"));
4061 count_arrays[count_level] = count;
4066 void set_parenttag(const char* tag)
4068 strncpy(tag_stack[count_level+1], tag, MAXSTDTAGLEN+1);
4071 void set_parentctxt(Gedcom_ctxt ctxt)
4073 ctxt_stack[count_level+1] = ctxt;
4076 char* get_parenttag(int offset)
4078 return tag_stack[count_level - offset];
4081 Gedcom_ctxt get_parentctxt(int offset)
4083 return ctxt_stack[count_level - offset];
4086 int count_tag(int tag)
4088 int *count = count_arrays[count_level];
4089 return ++count[tag - GEDCOMTAGOFFSET];
4092 int check_occurrence(int tag)
4094 int *count = count_arrays[count_level];
4095 return (count[tag - GEDCOMTAGOFFSET] > 0);
4098 void pop_countarray()
4101 gedcom_debug_print("Pop Count level: %d", count_level);
4102 if (count_level < 0) {
4103 gedcom_error(_("Internal error: count array underflow"));
4107 count = count_arrays[count_level];
4108 gedcom_debug_print("free countarray %d", count_level);
4110 count_arrays[count_level] = NULL;
4116 gedcom_debug_print("Cleanup countarrays");
4117 while (count_level > 0) {
4123 void cleanup_concat_buffer()
4125 cleanup_buffer(&concat_buffer);
4128 void cleanup_line_item_buffer()
4130 cleanup_buffer(&line_item_buffer);
4133 void cleanup_usertag_buffer()
4135 cleanup_buffer(&usertag_buffer);
4138 /* Enabling debug mode */
4139 /* level 0: no debugging */
4140 /* level 1: only internal */
4141 /* level 2: also bison */
4144 void gedcom_set_debug_level(int level, FILE* f)
4149 trace_output = stderr;
4151 gedcom_high_level_debug = 1;
4160 int gedcom_debug_print(const char* s, ...)
4163 if (gedcom_high_level_debug) {
4166 res = vfprintf(trace_output, s, ap);
4168 fprintf(trace_output, "\n");
4173 /* Setting the error mechanism */
4174 void gedcom_set_error_handling(Gedcom_err_mech mechanism)
4176 error_mechanism = mechanism;