X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gedcom%2Fgedcom_date.lex;h=2350aca58d531f34603bb3991fa03e6d77befbba;hb=eb6f3993afd2330bf4ae536bc8679d791b681dc4;hp=5767768fdf0b76e7e97a9ac5b2bddb7bff833992;hpb=35f77ce6bd3ccc27047eda0b3ef8d74c7a86c3d7;p=gedcom-parse.git diff --git a/gedcom/gedcom_date.lex b/gedcom/gedcom_date.lex index 5767768..2350aca 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,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);