X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gedcom%2Fgedcom_date.lex;h=bba60ef5f4f15f36bca44e3bc025dd2f6a74a579;hb=40e4118ee4f9f8e5ed89e61dac21b6d6a43b1135;hp=5767768fdf0b76e7e97a9ac5b2bddb7bff833992;hpb=35f77ce6bd3ccc27047eda0b3ef8d74c7a86c3d7;p=gedcom-parse.git diff --git a/gedcom/gedcom_date.lex b/gedcom/gedcom_date.lex index 5767768..bba60ef 100644 --- a/gedcom/gedcom_date.lex +++ b/gedcom/gedcom_date.lex @@ -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,59 @@ 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; + 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]; + return 2; + } + default: return 0; + } + break; + } + case 0: return 1; + default: return 0; + } + break; + } + case 0: return 0; + default: return 0; + } +} + int yywrap() { return 1; @@ -127,7 +189,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);