X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gedcom%2Fgedcom.y;h=3e3667c4d410cbee1c5f2b5fc13bf37b8adcd53c;hb=d563731845efada15183b9be72061203c4e82105;hp=395db23646f78b877c851977832f9e86ad3a25f3;hpb=3fae12a186ba47a970bea1bb2b5ce720f596a26b;p=gedcom-parse.git diff --git a/gedcom/gedcom.y b/gedcom/gedcom.y index 395db23..3e3667c 100644 --- a/gedcom/gedcom.y +++ b/gedcom/gedcom.y @@ -157,13 +157,14 @@ int gedcom_high_level_debug = 0; Gedcom_err_mech error_mechanism = IMMED_FAIL; Gedcom_val_struct val1; Gedcom_val_struct val2; - -char line_item_buf[MAXGEDCLINELEN * UTF_FACTOR + 1]; -char *line_item_buf_ptr; -void cleanup_concat_buffer(); -struct safe_buffer concat_buffer = { NULL, 0, cleanup_concat_buffer }; +void cleanup_line_item_buffer(); +struct safe_buffer line_item_buffer = { NULL, 0, NULL, 0, + cleanup_line_item_buffer }; +void cleanup_concat_buffer(); +struct safe_buffer concat_buffer = { NULL, 0, NULL, 0, cleanup_concat_buffer }; + /* These are defined at the bottom of the file */ void push_countarray(int level); void set_parenttag(const char* tag); @@ -175,9 +176,6 @@ int count_tag(int tag); int check_occurrence(int tag); void clean_up(); -#define CLEAR_BUFFER(BUF) \ - memset(BUF, 0, sizeof(BUF)); - #define HANDLE_ERROR \ { if (error_mechanism == IMMED_FAIL) { \ clean_up(); YYABORT; \ @@ -446,22 +444,24 @@ head_sect : OPEN DELIM TAG_HEAD NULL, GEDCOM_MAKE_NULL(val2)); START(HEAD, $1, $$) } head_subs - { if (compat_mode(C_FTREE)) { - CHECK3(SOUR, GEDC, CHAR); - compat_generate_submitter_link($4); - } - else if (compat_mode(C_LIFELINES)) { - CHECK1(SOUR); + { if (compat_mode(C_NO_SUBMITTER)) compat_generate_submitter_link($4); + else CHK(SUBM); + + if (compat_mode(C_NO_GEDC)) compat_generate_gedcom($4); + else CHK(GEDC); + + if (compat_mode(C_NO_CHAR)) { if (compat_generate_char($4)) HANDLE_ERROR; - } - else - CHECK4(SOUR, SUBM, GEDC, CHAR) + } + else CHK(CHAR); + + CHECK1(SOUR); } CLOSE { end_record(REC_HEAD, $4, GEDCOM_MAKE_NULL(val1)); - if (compat_mode(C_FTREE | C_LIFELINES)) + if (compat_mode(C_NO_SUBMITTER)) compat_generate_submitter(); } ; @@ -473,7 +473,7 @@ head_subs : /* empty */ head_sub : head_sour_sect { OCCUR2(SOUR, 1, 1) } | head_dest_sect { OCCUR2(DEST, 0, 1) } | head_date_sect { OCCUR2(DATE, 0, 1) } - | head_time_sect { if (!compat_mode(C_LIFELINES)) + | head_time_sect { if (!compat_mode(C_HEAD_TIME)) INVALID_TAG("TIME"); OCCUR2(TIME, 0, 1) } | head_subm_sect { OCCUR2(SUBM, 1, 1) } @@ -1076,7 +1076,7 @@ indi_sub : indi_resn_sect { OCCUR2(RESN, 0, 1) } | indi_afn_sect /* 0:M */ | ident_struc_sub /* 0:1 */ | change_date_sub /* 0:1 */ - | ftree_addr_sect { if (!compat_mode(C_FTREE)) + | indi_addr_sect { if (!compat_mode(C_INDI_ADDR)) INVALID_TAG("ADDR"); } | no_std_sub @@ -1214,23 +1214,23 @@ indi_afn_sect : OPEN DELIM TAG_AFN mand_line_item } ; -/* INDI.ADDR (Only for 'ftree' compatibility) */ -ftree_addr_sect : OPEN DELIM TAG_ADDR opt_line_item - { if (compat_mode(C_FTREE)) { +/* INDI.ADDR (Only for compatibility) */ +indi_addr_sect : OPEN DELIM TAG_ADDR opt_line_item + { if (compat_mode(C_INDI_ADDR)) { Gedcom_ctxt par = compat_generate_resi_start(PARENT); START(RESI, $1, par); $$ = start_element(ELT_SUB_ADDR, par, $1 + 1, $3, $4, GEDCOM_MAKE_NULL_OR_STRING(val2, $4)); - START(ADDR, $1, $$); + START(ADDR, $1 + 1, $$); } else { START(ADDR, $1, NULL) } } ftree_addr_subs { CHECK0 } CLOSE - { if (compat_mode(C_FTREE)) { + { if (compat_mode(C_INDI_ADDR)) { Gedcom_ctxt par = PARENT; end_element(ELT_SUB_ADDR, par, $5, GEDCOM_MAKE_NULL(val1)); @@ -1331,7 +1331,6 @@ obje_blob_sect : OPEN DELIM TAG_BLOB PARENT, $1, $3, NULL, GEDCOM_MAKE_NULL(val1)); reset_buffer(&concat_buffer); - safe_buf_append(&concat_buffer, ""); START(BLOB, $1, $$) } obje_blob_subs @@ -1406,7 +1405,7 @@ note_rec : OPEN DELIM POINTER DELIM TAG_NOTE note_line_item ; note_line_item : /* empty */ - { if (!compat_mode(C_FTREE)) { + { if (!compat_mode(C_NOTE_NO_VALUE)) { gedcom_error(_("Missing value")); YYERROR; } else { @@ -1994,7 +1993,7 @@ addr_cont_sect : OPEN DELIM TAG_CONT mand_line_item { $$ = start_element(ELT_SUB_ADDR_CONT, PARENT, $1, $3, $4, GEDCOM_MAKE_STRING(val1, $4)); - safe_buf_append(&concat_buffer, "\n"); + SAFE_BUF_ADDCHAR(&concat_buffer, '\n'); safe_buf_append(&concat_buffer, $4); START(CONT, $1, $$) } @@ -2272,7 +2271,7 @@ cont_sect : OPEN DELIM TAG_CONT mand_line_item { $$ = start_element(ELT_SUB_CONT, PARENT, $1, $3, $4, GEDCOM_MAKE_STRING(val1, $4)); - safe_buf_append(&concat_buffer, "\n"); + SAFE_BUF_ADDCHAR(&concat_buffer, '\n'); safe_buf_append(&concat_buffer, $4); START(CONT, $1, $$) } @@ -3698,7 +3697,7 @@ mand_pointer : /* empty */ { gedcom_error(_("Missing pointer")); YYERROR; } ; mand_line_item : /* empty */ - { if (compat_mode(C_LIFELINES)) { + { if (compat_mode(C_NO_REQUIRED_VALUES)) { /* Lifelines tends to not care about mandatory values */ gedcom_debug_print("==Val: =="); $$ = ""; @@ -3717,38 +3716,36 @@ opt_line_item : /* empty */ { $$ = NULL; } ; line_item : anychar { size_t i; - CLEAR_BUFFER(line_item_buf); - line_item_buf_ptr = line_item_buf; - /* The following also takes care of '@@' */ + reset_buffer(&line_item_buffer); + /* The following also takes care of '@@' */ if (!strncmp($1, "@@", 3)) - *line_item_buf_ptr++ = '@'; + SAFE_BUF_ADDCHAR(&line_item_buffer, '@') else for (i=0; i < strlen($1); i++) - *line_item_buf_ptr++ = $1[i]; - $$ = line_item_buf; + SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i]) + $$ = get_buf_string(&line_item_buffer); } | ESCAPE { size_t i; - CLEAR_BUFFER(line_item_buf); - line_item_buf_ptr = line_item_buf; - for (i=0; i < strlen($1); i++) - *line_item_buf_ptr++ = $1[i]; - $$ = line_item_buf; + reset_buffer(&line_item_buffer); + for (i=0; i < strlen($1); i++) + SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i]) + $$ = get_buf_string(&line_item_buffer); } | line_item anychar { size_t i; /* The following also takes care of '@@' */ if (!strncmp($2, "@@", 3)) - *line_item_buf_ptr++ = '@'; + SAFE_BUF_ADDCHAR(&line_item_buffer, '@') else for (i=0; i < strlen($2); i++) - *line_item_buf_ptr++ = $2[i]; - $$ = line_item_buf; + SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i]) + $$ = get_buf_string(&line_item_buffer); } | line_item ESCAPE { size_t i; for (i=0; i < strlen($2); i++) - *line_item_buf_ptr++ = $2[i]; - $$ = line_item_buf; + SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i]) + $$ = get_buf_string(&line_item_buffer); } | line_item error anychar { HANDLE_ERROR; } | line_item error ESCAPE { HANDLE_ERROR; } @@ -4029,6 +4026,11 @@ void cleanup_concat_buffer() cleanup_buffer(&concat_buffer); } +void cleanup_line_item_buffer() +{ + cleanup_buffer(&line_item_buffer); +} + /* Enabling debug mode */ /* level 0: no debugging */ /* level 1: only internal */