all repos — openbox @ 18f704edd0938355622049d853c1ce3cdfaee168

openbox fork - make it a bit more like ryudo

better error reporting. epist now reports the line number and token a parser error occurs at, as well as invalid actions.
Marius Nita marius@cs.pdx.edu
commit

18f704edd0938355622049d853c1ce3cdfaee168

parent

37ccfef89546e38fe8c0ab1e039a8abdff8bd588

4 files changed, 49 insertions(+), 17 deletions(-)

jump to
M util/epist/epist.lutil/epist/epist.l

@@ -8,8 +8,10 @@ #include <string.h>

#include "yacc_parser.hh" extern YYSTYPE yylval; - + %} + +%option yylineno %%

@@ -27,6 +29,8 @@ Mod3 |

mod3 | Mod4 | mod4 | +Mod5 | +mod5 | Control | control | shift |
M util/epist/epist.yutil/epist/epist.y

@@ -9,7 +9,10 @@ #include "parser.hh"

#define YYPARSE_PARAM parser_obj #define YYSTYPE char* - + +extern int yylineno; +extern char *yytext; + extern "C" { int yylex(); int yywrap() {

@@ -17,14 +20,15 @@ return 1;

} } -void yyerror(const char *c) { - printf("ERROR: %s\n", c); +void yyerror(const char *c) +{ + printf("ERROR: %s, on line %d, near %s\n", c, yylineno, yytext); } - %} %token OBRACE EBRACE SEMICOLON DASH NUMBER QUOTES WORD BINDING OPTIONS TRUE FALSE +%expect 1 %%
M util/epist/parser.ccutil/epist/parser.cc

@@ -31,12 +31,14 @@ }

#include "parser.hh" #include <string> +#include <iostream> using std::string; +using std::cout; parser::parser(keytree *kt, Config *conf) : _kt(kt), _config(conf), _mask(0), _action(Action::noaction), - _key(""), _arg("") + _key(""), _arg(""), _add(true) { }

@@ -120,39 +122,56 @@ for (int i = 0; actions[i].str != ""; ++i) {

if ( strcasecmp(actions[i].str, act.c_str()) == 0 ) { _action = actions[i].act; found = true; + break; } } - if (!found) - _action = Action::noaction; + if (!found) { + cout << "ERROR: Invalid action (" << act << "). Binding ignored.\n"; + _add = false; + } } void parser::addModifier(string mod) { struct { - string str; + const char *str; unsigned int mask; } modifiers[] = { - { "Mod1", Mod1Mask }, - { "Mod2", Mod2Mask }, - { "Mod3", Mod3Mask }, - { "Mod4", Mod4Mask }, - { "Control", ControlMask }, - { "Shift", ShiftMask }, + { "mod1", Mod1Mask }, + { "mod2", Mod2Mask }, + { "mod3", Mod3Mask }, + { "mod4", Mod4Mask }, + { "mod5", Mod5Mask }, + { "control", ControlMask }, + { "shift", ShiftMask }, { "", 0 } }; + bool found = false; + for (int i = 0; modifiers[i].str != ""; ++i) { - if (modifiers[i].str == mod) + if ( strcasecmp(modifiers[i].str, mod.c_str()) == 0 ) { _mask |= modifiers[i].mask; + found = true; + break; + } + } + + if (!found) { + cout << "ERROR: Invalid modifier (" << mod << "). Binding ignored.\n"; + _add = false; } } void parser::endAction() { - _kt->addAction(_action, _mask, _key, _arg); + if (_add) + _kt->addAction(_action, _mask, _key, _arg); reset(); + + _add = true; } void parser::startChain()

@@ -171,6 +190,10 @@

void parser::setChainBinding() { if (_mask != 0 && _key != "") { + if (!_add) { + cout << "Error: Bad modifier detected on chain's root key.\n"; + _add = true; + } _kt->setCurrentNodeProps(Action::noaction, _mask, _key, ""); reset(); }
M util/epist/parser.hhutil/epist/parser.hh

@@ -73,6 +73,7 @@ unsigned int _mask;

Action::ActionType _action; std::string _key; std::string _arg; + bool _add; }; #endif //__parser_hh