diff --git a/docs/deviceSpec.md b/docs/deviceSpec.md index 08e28a4..8151239 100644 --- a/docs/deviceSpec.md +++ b/docs/deviceSpec.md @@ -46,6 +46,11 @@ If there's more than one parameter item in a list of `api-params` or +edev|audio-implexor|alsa(shmem|param2|param3)|alsa()|cardname ``` +Each parameter must be in one of these forms: +* key=value +* key= +* key + Some examples follow: ### To attach a particular window from a window manager: diff --git a/hcore/deviceManager/deviceSpecl.ll b/hcore/deviceManager/deviceSpecl.ll index 1c2e326..376b7cc 100644 --- a/hcore/deviceManager/deviceSpecl.ll +++ b/hcore/deviceManager/deviceSpecl.ll @@ -23,7 +23,8 @@ "|" { return PIPE; } "(" { return LPAREN; } ")" { return RPAREN; } -[^\|\(\) \t\r\n]+ { deviceSpecplval.str = strdup(yytext); return STRING; } +[ \t]*"="[ \t]* { return EQUALS; } // Allow optional whitespace around equals +[^=\|\(\) \t\r\n]+ { deviceSpecplval.str = strdup(yytext); return STRING; } // Exclude = from STRING tokens \r?\n { /* ignore newlines */ } [ \t]+ { /* ignore whitespace */ } . { return yytext[0]; } diff --git a/hcore/deviceManager/deviceSpecp.yy b/hcore/deviceManager/deviceSpecp.yy index bb8a494..6027abc 100644 --- a/hcore/deviceManager/deviceSpecp.yy +++ b/hcore/deviceManager/deviceSpecp.yy @@ -42,15 +42,18 @@ void yyerror(const char *message) hk::device::SenseDeviceSpec* sensorSpec; hk::device::InteroceptorDeviceSpec* interoceptorSpec; hk::device::ExtrospectorDeviceSpec* extrospectorSpec; - std::vector* stringVector; + std::vector>* paramVector; + std::pair* param; } %token STRING %token PIPE DOUBLE_PIPE LPAREN RPAREN %token KEYWORD_SPECTYPE_ACTUATOR %token KEYWORD_SPECTYPE_EXTROSPECTOR KEYWORD_SPECTYPE_INTEROSPECTOR +%token EQUALS // Add new token for '=' -%type params opt_params +%type params opt_params +%type param %type spec_body %type interoceptor_spec %type extrospector_spec @@ -114,12 +117,32 @@ spec_body: opt_params: params - | /* empty */ { $$ = new std::vector(); } + | /* empty */ { $$ = new std::vector>(); } + ; + +param: + STRING { + $$ = new std::pair($1, ""); + } + | STRING EQUALS { + $$ = new std::pair($1, ""); + } + | STRING EQUALS STRING { + $$ = new std::pair($1, $3); + } ; params: - STRING { $$ = new std::vector{ $1 }; } - | params PIPE STRING { $$ = $1; $$->push_back($3); } + param { + $$ = new std::vector>(); + $$->push_back(*$1); + delete $1; + } + | params PIPE param { + $$ = $1; + $$->push_back(*$3); + delete $3; + } ; %% diff --git a/include/user/senseDeviceSpec.h b/include/user/senseDeviceSpec.h index 666c990..057edbf 100644 --- a/include/user/senseDeviceSpec.h +++ b/include/user/senseDeviceSpec.h @@ -30,9 +30,9 @@ public: char sensorType; std::string implexor; std::string api; - std::vector apiParams; + std::vector> apiParams; std::string provider; - std::vector providerParams; + std::vector> providerParams; std::string deviceSelector; std::string stringify() const @@ -42,12 +42,20 @@ public: << implexor << ", API: " << api << ", API Params: ("; for (const auto& param : apiParams) { - os << param << " "; + os << param.first; + if (!param.second.empty()) { + os << "=" << param.second; + } + os << " "; } os << "), Provider: " << provider << ", Provider Params: ("; for (const auto& param : providerParams) { - os << param << " "; + os << param.first; + if (!param.second.empty()) { + os << "=" << param.second; + } + os << " "; } os << "), Device Selector: " << deviceSelector << std::endl;