Commit Diff


commit - e0041ee5139dcd4173fe8f47ff691c0d41951341
commit + 7d3286caede96d7b813eff7dc3691d683d0f9bf9
blob - 943a39c29b407715da6bf55e5a0d43d66ee83837
blob + 92aadc8434cd61b0831ea6b5c8170b9d8713e985
--- lex.l
+++ lex.l
@@ -1,4 +1,4 @@
-/* -*- mode:fundamental; indent-tabs-mode: t; -*- */
+/* -*- mode:c; indent-tabs-mode: t; -*- */
 %{
 
 /*
@@ -34,77 +34,78 @@ KeySym key = 0;
 
 %x COMMENT
 %x KEY
+%x STRING
 
 %%
 
-"#"		{ BEGIN(COMMENT); }
-<COMMENT>\n	{ yylineno++; BEGIN(INITIAL); }
-<COMMENT>.	;
+<INITIAL>#	BEGIN(COMMENT);
+<COMMENT>.*\n	yylineno++; BEGIN(INITIAL); return '\n';
 
-[ \t\r\v\f]+	;
+<INITIAL>\"	BEGIN(KEY);
+<KEY>\"		{
+	BEGIN(INITIAL);
+	yylval.key = (struct key){ state, key };
+	state = 0;
+	key = 0;
+	return TKEY;
+ }
 
-"match"		return TMATCH;
-"class"		return TCLASS;
-"on"		return TON;
-"do"		return TDO;
-"toggle"	return TTOGGLE;
-"activate"	return TACTIVATE;
-"deactivate"	return TDEACTIVATE;
-"ignore"	return TIGNORE;
+<KEY>C-		state |= ControlMask;
+<KEY>S-		state |= ShiftMask;
+<KEY>M-		state |= Mod1Mask;
+<KEY>s-		state |= Mod4Mask;
 
-"\n"		yylineno++; return '\n';
-"*"		return '*';
+<KEY><[^>]+>	{
+	char *c;
 
-[-a-zA-Z0-9]+	{
-			char *ident;
-			if ((ident = strdup(yytext)) == NULL)
-				err(1, "strdup");
-			yylval.str = ident;
-			return TSTRING;
-		}
+	if ((c = strdup(yytext)) == NULL)
+		err(1, "strdup");
 
-"\""		{ BEGIN(KEY); }
-<KEY>"\""	{
-			BEGIN(INITIAL);
+	c++;			/* skip the < */
+	c[strlen(c)-1] = '\0';	/* trim the > */
 
-			yylval.key = (struct key){ state, key };
-			state = 0;
-			key = 0;
-			return TKEY;
-		}
+	if ((key = XStringToKeysym(c)) == NoSymbol)
+		yyerror("invalid keysym %s", c);
 
-<KEY>C-		{ state |= ControlMask; }
-<KEY>S-		{ state |= ShiftMask; }
-<KEY>M-		{ state |= Mod1Mask; }
-<KEY>s-		{ state |= Mod4Mask; }
+	free(--c);
+ }
 
-<KEY><[^>]+>	{
-			char *c;
+<KEY>SPC	key = XK_space;
+<KEY>RET	key = XK_Return;
 
-			if ((c = strdup(yytext)) == NULL)
-                                err(1, "strdup");
+<KEY>"("	key = XK_parenleft;
+<KEY>")"	key = XK_parenright;
 
-			c++;			/* skip the < */
-			c[strlen(c)-1] = '\0';	/* trim the > */
+<KEY>.		{
+	if ((key = XStringToKeysym(yytext)) == NoSymbol)
+		yyerror("invalid key %s", yytext);
+ }
 
-			if ((key = XStringToKeysym(c)) == NoSymbol)
-				yyerror("invalid keysym %s", c);
+<INITIAL>\'	BEGIN(STRING);
+<STRING>[^']*\'	{
+	if ((yylval.str = strdup(yytext)) == NULL)
+		err(1, "strdup");
+	yylval.str[strlen(yylval.str)-1] = '\0'; /* remove the closing quote */
+	BEGIN(INITIAL);
+	return TSTRING;
+ }
 
-			free(--c);
-		}
+match		return TMATCH;
+class		return TCLASS;
+on		return TON;
+do		return TDO;
+toggle		return TTOGGLE;
+activate	return TACTIVATE;
+deactivate	return TDEACTIVATE;
+ignore		return TIGNORE;
+exec		return TEXEC;
+all		return TALL;
 
-<KEY>SPC	{ key = XK_space; }
-<KEY>RET	{ key = XK_Return; }
+\n		yylineno++; return '\n';
+[ \r\t\f]+
 
-<KEY>"("	{ key = XK_parenleft; }
-<KEY>")"	{ key = XK_parenright; }
+.		return TERR;
 
-<KEY>.		{
-			if ((key = XStringToKeysym(yytext)) == NoSymbol)
-				yyerror("invalid key %s", yytext);
-		}
-
-
 %%
 
 int
blob - 32657d48a66e7b0a1bac2addbf2a5e8efdcbe614
blob + 68bb6d1db282d70709de7d07b094a10d72e3aa5a
--- parse.y
+++ parse.y
@@ -41,7 +41,7 @@
 	struct group *group;
 }
 
-%token TMATCH TCLASS
+%token TMATCH TCLASS TALL
 %token TON TDO
 %token TTOGGLE TACTIVATE TDEACTIVATE TIGNORE TEXEC
 %token TERR
@@ -69,7 +69,7 @@ matches		: /* empty */		{ $$ = NULL; }
 		| matches match '\n'	{ $2->next = $1; $$ = $2; }
 		;
 
-match		: TMATCH '*'		{ $$ = new_match(MANY, NULL); }
+match		: TMATCH TALL		{ $$ = new_match(MANY, NULL); }
 		| TMATCH TCLASS TSTRING { $$ = new_match(MCLASS, $3); }
 		;