diff options
author | Dave Davenport <qball@gmpclient.org> | 2017-01-08 16:09:24 +0100 |
---|---|---|
committer | Dave Davenport <qball@gmpclient.org> | 2017-01-08 16:09:24 +0100 |
commit | c57e7348d2e34c7eb27fafa73b40602725ea315a (patch) | |
tree | 3db8e06a1a46941fcd94244db658d35a73768e5a /lexer | |
parent | 6318e5024b155d5b7383d9352ba56e464f91b3b7 (diff) |
Add some better error message. Allow -theme-str option to override part of theme
Diffstat (limited to 'lexer')
-rw-r--r-- | lexer/theme-lexer.l | 43 | ||||
-rw-r--r-- | lexer/theme-parser.y | 22 |
2 files changed, 52 insertions, 13 deletions
diff --git a/lexer/theme-lexer.l b/lexer/theme-lexer.l index 5a946cae..9711147f 100644 --- a/lexer/theme-lexer.l +++ b/lexer/theme-lexer.l @@ -1,5 +1,4 @@ -%option noyywrap nounput -%option never-interactive +%option noyywrap nounput never-interactive %option bison-locations %{ @@ -13,6 +12,37 @@ GQueue *queue = NULL; %} %{ +int str_len = 0; +char *input_str = NULL; + +#define YY_INPUT(buf,result,max_size) \ +{\ + if ( input_str == NULL ) { \ + errno =0; \ + while ( (result = (int) fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(yyin); \ + } \ + } else {\ + yy_size_t len = MIN (max_size, str_len);\ + if ( len > 0 ){\ + memcpy (buf, input_str, len);\ + input_str+=len;\ + str_len-=len;\ + result = len;\ + } else {\ + result = YY_NULL;\ + } \ + }\ +} + + #define YY_USER_ACTION {\ yylloc->last_column+= yyleng;\ } @@ -119,7 +149,7 @@ if ( queue == NULL ){ <INITIAL>"#" { g_queue_push_head ( queue, GINT_TO_POINTER (YY_START) ); BEGIN(NAMESTR);return NAME_PREFIX;} <NAMESTR>\.|{WHITESPACE} { return NSEP; } -<INITIAL,ENTRY>{WORD} { yylval->sval = g_strdup(yytext); return N_STRING;} +<ENTRY>{WORD} { yylval->sval = g_strdup(yytext); return N_STRING;} <NAMESTR>{WORD} { yylval->sval = g_strdup(yytext); return NAME_ELEMENT;} /* After Namestr/Classstr we want to go to state str, then to { */ @@ -289,6 +319,13 @@ if ( queue == NULL ){ yylloc->last_column = 1; yylloc->last_line ++; }; +<INITIAL>. { + const char *error_msg = "Expected 'root' element or a 'named' element.\n"\ + "Place all global properties in a root element:\n"\ + " * {\n"\ + " }\n"; + YY_FATAL_ERROR( error_msg ); +} <*>. { fprintf(stderr, "Invalid character: '%c'\n", *yytext); yyterminate(); diff --git a/lexer/theme-parser.y b/lexer/theme-parser.y index d0f52f50..59317b52 100644 --- a/lexer/theme-parser.y +++ b/lexer/theme-parser.y @@ -38,21 +38,21 @@ int yylex (YYSTYPE *, YYLTYPE *); %token <sval> T_STRING %token <sval> N_STRING %token <ival> T_POSITION; -%token <sval> NAME_ELEMENT +%token <sval> NAME_ELEMENT "Element name" %token <bval> T_BOOLEAN %token <colorval> T_COLOR %token <distance> T_PIXEL %token <sval> T_LINK %token <sval> FIRST_NAME -%token BOPEN "bracket open"; -%token BCLOSE "bracket close"; -%token PSEP "property separator"; -%token PCLOSE "property close"; -%token NSEP "Name separator"; +%token BOPEN "bracket open"; +%token BCLOSE "bracket close"; +%token PSEP "property separator"; +%token PCLOSE "property close"; +%token NSEP "Name separator"; %token NAME_PREFIX "Name prefix"; -%token WHITESPACE "White space"; -%token PDEFAULTS "Default settings"; +%token WHITESPACE "White space"; +%token PDEFAULTS "Default settings"; %type <sval> entry %type <sval> pvalue @@ -68,8 +68,10 @@ int yylex (YYSTYPE *, YYLTYPE *); entries: %empty { // There is always a base widget. - $$ = rofi_theme = (ThemeWidget*)g_malloc0 (sizeof(ThemeWidget)); - rofi_theme->name = g_strdup ( "Root" ); + if (rofi_theme == NULL ){ + $$ = rofi_theme = (ThemeWidget*)g_malloc0 (sizeof(ThemeWidget)); + rofi_theme->name = g_strdup ( "Root" ); + } } | entries entry { |