Little fix, closing an else
[gedcom-parse.git] / gedcom / gedcom_date.lex
index 5767768fdf0b76e7e97a9ac5b2bddb7bff833992..2350aca58d531f34603bb3991fa03e6d77befbba 100644 (file)
@@ -23,7 +23,7 @@
 
 %{
 #include "date.h"
-#include "gedcom_date.tab.h"
+#include "gedcom_date.tabgen.h"
   
 #define YY_NO_UNPUT
 
@@ -48,6 +48,16 @@ static int token_nr = 0;
     gedcom_date_lval.string = buf[token_nr++]; \
     return TOKEN; \
   }
+
+#define ACTION_UNEXPECTED \
+  { gedcom_date_error(_("Unexpected input")); \
+    return BADTOKEN; \
+  }
+
+#define UNKNOWN_CALENDAR_TYPE \
+  { gedcom_date_error(_("Unknown calendar type")); \
+    return BADTOKEN; \
+  }
 %}
 
 [ \t]+          /* ignore whitespace between tokens */
@@ -56,6 +66,7 @@ static int token_nr = 0;
 @#DJULIAN@      SIMPLE_RETURN(ESC_DATE_JULN)
 @#DHEBREW@      SIMPLE_RETURN(ESC_DATE_HEBR)
 "@#DFRENCH R@"  SIMPLE_RETURN(ESC_DATE_FREN)
+@#.+@           UNKNOWN_CALENDAR_TYPE
      
 FROM            SIMPLE_RETURN(MOD_FROM)
 TO              SIMPLE_RETURN(MOD_TO)  
@@ -118,8 +129,62 @@ COMP            SIMPLE_RETURN(MON_COMP)
 "/"             SIMPLE_RETURN(SLASH)
 [0-9]+          SIMPLE_RETURN(NUMBER)
 
+.               ACTION_UNEXPECTED
+
 %%
 
+int get_date_token(const char* str)
+{
+  int token;
+  YY_BUFFER_STATE buffer;
+
+  token_nr = 0;
+  yy_delete_buffer(YY_CURRENT_BUFFER);
+  buffer = yy_scan_string(str);
+  token = yylex();
+  yy_delete_buffer(buffer);
+  return token;
+}
+
+int get_year_tokens(const char* str, char** year1, char** year2)
+{
+  int token;
+  int num_tokens = 0;
+  YY_BUFFER_STATE buffer;
+
+  token_nr = 0;
+  yy_delete_buffer(YY_CURRENT_BUFFER);
+  buffer = yy_scan_string(str);
+
+  token = yylex();
+  switch (token) {
+    case NUMBER: {
+      *year1 = buf[token_nr - 1];
+      token  = yylex();
+      switch (token) {
+       case SLASH: {
+         token = yylex();
+         switch (token) {
+           case NUMBER:
+             *year2 = buf[token_nr - 1];
+             num_tokens = 2; break;
+           default:
+             num_tokens = 0;
+         }
+         break;
+       }
+       case 0:   num_tokens = 1; break;
+       default:  num_tokens = 0;
+      }
+      break;
+    }
+    case 0:   num_tokens = 0; break;
+    default:  num_tokens = 0;
+  }
+  yy_delete_buffer(buffer);
+  return num_tokens;
+}
+
 int yywrap()
 {
   return 1;
@@ -127,7 +192,7 @@ int yywrap()
 
 static YY_BUFFER_STATE hndl;
 
-void init_gedcom_date_lex(char* string)
+void init_gedcom_date_lex(const char* string)
 {
   token_nr = 0;
   hndl = yy_scan_string(string);