diff --git a/src/cmdparse.l b/src/cmdparse.l index ebd466af..f07420d3 100644 --- a/src/cmdparse.l +++ b/src/cmdparse.l @@ -65,16 +65,16 @@ EOL (\r?\n) cmdyycolumn = 1; } -[^\n]+ { BEGIN(INITIAL); cmdyylval.string = sstrdup(yytext); return STR; } [ \t]* { BEGIN(WANT_STRING); return WHITESPACE; } -\"[^\"]+\" { +\"[^\"]+\" { BEGIN(INITIAL); /* strip quotes */ char *copy = sstrdup(yytext+1); copy[strlen(copy)-1] = '\0'; cmdyylval.string = copy; return STR; - } + } +[^;\n]+ { BEGIN(INITIAL); cmdyylval.string = sstrdup(yytext); return STR; } [ \t]* { return WHITESPACE; } attach { return TOK_ATTACH; } diff --git a/testcases/t/20-multiple-cmds.t b/testcases/t/20-multiple-cmds.t index 379d08ee..784329fb 100644 --- a/testcases/t/20-multiple-cmds.t +++ b/testcases/t/20-multiple-cmds.t @@ -30,6 +30,27 @@ multiple_cmds("kill\t ;\tkill"); multiple_cmds("kill\t ;\t kill"); multiple_cmds("kill \t ; \t kill"); +##################################################################### +# test if un-quoted strings are handled correctly +##################################################################### + +$tmp = fresh_workspace; +cmd 'open'; +my $unused = get_unused_workspace; +ok(!($unused ~~ @{get_workspace_names()}), 'workspace does not exist yet'); +cmd "move workspace $unused; nop parser test"; +ok(($unused ~~ @{get_workspace_names()}), 'workspace exists after moving'); + +##################################################################### +# quote the workspace name and use a ; (command separator) in its name +##################################################################### + +$unused = get_unused_workspace; +$unused .= ';a'; +ok(!($unused ~~ @{get_workspace_names()}), 'workspace does not exist yet'); +cmd qq|move workspace "$unused"; nop parser test|; +ok(($unused ~~ @{get_workspace_names()}), 'workspace exists after moving'); + # TODO: need a non-invasive command before implementing a test which uses ',' done_testing;