summaryrefslogtreecommitdiffstats
path: root/lexer
diff options
context:
space:
mode:
authorDave Davenport <qball@gmpclient.org>2017-01-08 16:09:24 +0100
committerDave Davenport <qball@gmpclient.org>2017-01-08 16:09:24 +0100
commitc57e7348d2e34c7eb27fafa73b40602725ea315a (patch)
tree3db8e06a1a46941fcd94244db658d35a73768e5a /lexer
parent6318e5024b155d5b7383d9352ba56e464f91b3b7 (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.l43
-rw-r--r--lexer/theme-parser.y22
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 {