Use of gedcom_lex_common.c.
[gedcom-parse.git] / gedcom.y
index 68b2f488755b53b04c286bebbc3a0f7ddb522e65..98d36e2345e0fe2ee08e30b3b0232a2017cc72a9 100644 (file)
--- 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$ */
 
 
 %{
 #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 <string> BADTOKEN
-%token <string> OPEN
+%token <number> OPEN
 %token <string> CLOSE
 %token <string> ESCAPE
 %token <string> 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);
 }
+