X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gedcom.y;h=b54286cb2aa35625fececb788d9a7e08415fb30a;hb=4012b465c1da160fb69850f1314bc7b18386c7ec;hp=b455587196502464fb3ac9da71f9b519f2099b7f;hpb=5356ba5bd357175eadbccfdb632a139010019da0;p=gedcom-parse.git diff --git a/gedcom.y b/gedcom.y index b455587..b54286c 100644 --- a/gedcom.y +++ b/gedcom.y @@ -122,6 +122,8 @@ %{ #include "gedcom.h" +#include "multilex.h" +#include "encoding.h" int count_level = 0; int fail = 0; @@ -129,7 +131,7 @@ int compat_enabled = 1; int gedcom_high_level_debug = 0; int compatibility = 0; MECHANISM error_mechanism=IMMED_FAIL; -char string_buf[MAXGEDCLINELEN+1]; +char string_buf[MAXGEDCLINELEN*4+1]; char *string_buf_ptr; enum _COMPAT { @@ -567,7 +569,8 @@ head_gedc_form_sect : OPEN DELIM TAG_FORM mand_line_item /* HEAD.CHAR */ head_char_sect : OPEN DELIM TAG_CHAR mand_line_item - { START(CHAR) } + { if (open_conv_to_internal($4) == 0) YYERROR; + START(CHAR) } head_char_subs { CHECK0 } CLOSE @@ -2109,10 +2112,15 @@ opt_line_item : /* empty */ { } | DELIM line_item { } ; -line_item : anychar { CLEAR_BUFFER(string_buf); +line_item : anychar { size_t i; + CLEAR_BUFFER(string_buf); string_buf_ptr = string_buf; /* The following also takes care of '@@' */ - *string_buf_ptr++ = $1[0]; + if (!strncmp($1, "@@", 3)) + *string_buf_ptr++ = '@'; + else + for (i=0; i < strlen($1); i++) + *string_buf_ptr++ = $1[i]; $$ = string_buf; } | ESCAPE { CLEAR_BUFFER(string_buf); @@ -2126,8 +2134,13 @@ line_item : anychar { CLEAR_BUFFER(string_buf); YYERROR; } else { + size_t i; /* The following also takes care of '@@' */ - *string_buf_ptr++ = $2[0]; + if (!strncmp($2, "@@", 3)) + *string_buf_ptr++ = '@'; + else + for (i=0; i < strlen($2); i++) + *string_buf_ptr++ = $2[i]; $$ = string_buf; } } @@ -2436,3 +2449,4 @@ int compat_mode(int compat_flags) { return (compat_flags & compatibility); } +