X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gedcom.y;h=98d36e2345e0fe2ee08e30b3b0232a2017cc72a9;hb=b4557a98f5842835e9e65370fd062b6d65af0b14;hp=68b2f488755b53b04c286bebbc3a0f7ddb522e65;hpb=cf91051d49e34888991303c62de71ab4f0bc6db1;p=gedcom-parse.git diff --git a/gedcom.y b/gedcom.y index 68b2f48..98d36e2 100644 --- a/gedcom.y +++ b/gedcom.y @@ -1,3 +1,12 @@ +/* This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + + (C) 2001 by The Genes Development Team + Original author: Peter Verthez (Peter.Verthez@advalvas.be) +*/ + /* $Id$ */ /* $Name$ */ @@ -122,13 +131,16 @@ %{ #include "gedcom.h" +#include "multilex.h" +#include "encoding.h" int count_level = 0; int fail = 0; int compat_enabled = 1; +int gedcom_high_level_debug = 0; int compatibility = 0; -MECHANISM curr_mechanism=IMMED_FAIL; -char string_buf[MAXGEDCLINELEN+1]; +MECHANISM error_mechanism=IMMED_FAIL; +char string_buf[MAXGEDCLINELEN*4+1]; char *string_buf_ptr; enum _COMPAT { @@ -149,13 +161,13 @@ int compat_mode(int flags); #define HANDLE_ERROR \ { \ - if (curr_mechanism == IMMED_FAIL) { \ + if (error_mechanism == IMMED_FAIL) { \ YYABORT; \ } \ - else if (curr_mechanism == DEFER_FAIL) { \ + else if (error_mechanism == DEFER_FAIL) { \ yyerrok; fail = 1; \ } \ - else if (curr_mechanism == IGNORE_ERRORS) { \ + else if (error_mechanism == IGNORE_ERRORS) { \ yyerrok; \ } \ } @@ -211,13 +223,14 @@ int compat_mode(int flags); %union { char *string; + int number; } %token_table %expect 300 %token BADTOKEN -%token OPEN +%token OPEN %token CLOSE %token ESCAPE %token DELIM @@ -388,13 +401,11 @@ record : fam_rec head_sect : OPEN DELIM TAG_HEAD { START(HEAD) } head_subs - { if (compat_mode(C_FTREE)) { - CHECK3(SOUR, GEDC, CHAR); - } - else { - CHECK4(SOUR, SUBM, GEDC, CHAR); - } - } + { if (compat_mode(C_FTREE)) + CHECK3(SOUR, GEDC, CHAR) + else + CHECK4(SOUR, SUBM, GEDC, CHAR) + } CLOSE { } ; @@ -420,6 +431,7 @@ head_sub : head_sour_sect { OCCUR2(SOUR, 1, 1) } /* HEAD.SOUR */ head_sour_sect : OPEN DELIM TAG_SOUR mand_line_item { set_compatibility($4); + gedcom_debug_print("===Source: '%s'\n", $4); START(SOUR) } head_sour_subs @@ -440,14 +452,17 @@ head_sour_sub : head_sour_vers_sect { OCCUR2(VERS, 0, 1) } head_sour_vers_sect : OPEN DELIM TAG_VERS mand_line_item { START(VERS)} no_std_subs { CHECK0 } CLOSE - { } + { gedcom_debug_print("===Source version: '%s'\n", $4); + } ; head_sour_name_sect : OPEN DELIM TAG_NAME mand_line_item { START(NAME) } no_std_subs { CHECK0 } CLOSE - { } + { gedcom_debug_print("===Source name: '%s'\n", $4); + } ; head_sour_corp_sect : OPEN DELIM TAG_CORP mand_line_item - { START(CORP) } + { gedcom_debug_print("===Source corp name: '%s'\n", $4); + START(CORP) } head_sour_corp_subs { CHECK0 } CLOSE @@ -564,7 +579,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 @@ -2106,10 +2122,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); @@ -2123,8 +2144,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; } } @@ -2375,17 +2401,37 @@ void pop_countarray() } /* Enabling debug mode */ -void gedcom_enable_debug() +/* level 0: no debugging */ +/* level 1: only internal */ +/* level 2: also bison */ +void gedcom_set_debug_level(int level) { + if (level > 0) { + gedcom_high_level_debug = 1; + } + if (level > 1) { #if YYDEBUG != 0 - gedcom_debug = 1; + gedcom_debug = 1; #endif + } +} + +int gedcom_debug_print(char* s, ...) +{ + int res; + if (gedcom_high_level_debug) { + va_list ap; + va_start(ap, s); + res = vfprintf(stderr, s, ap); + va_end(ap); + } + return(res); } /* Setting the error mechanism */ void gedcom_set_error_handling(MECHANISM mechanism) { - curr_mechanism = mechanism; + error_mechanism = mechanism; } /* Compatibility handling */ @@ -2413,3 +2459,4 @@ int compat_mode(int compat_flags) { return (compat_flags & compatibility); } +