key_val_sl : KW_KEY key_do_sl {$$=$2;}; single_key_val : KW_KEY key_do {strcpy($$,$2);} ; key_do : key_value {strcpy($$,$1);} | OPEN_BRACKET key_value_list CLOSE_BRACKET {strcpy($$,$2);} ; key_do_sl : key_value { $$=malloc(sizeof(str_list)); $$->str_list_entry.str_list_entry_len=1; $$->str_list_entry.str_list_entry_val=malloc(sizeof($$->str_list_entry.str_list_entry_val[0]) * $$->str_list_entry.str_list_entry_len); $$->str_list_entry.str_list_entry_val[$$->str_list_entry.str_list_entry_len-1]=strdup($1); } | OPEN_BRACKET key_value_list_sl CLOSE_BRACKET { $$=$2; } ; key_value_list_sl : key_value { $$=malloc(sizeof(str_list)); $$->str_list_entry.str_list_entry_len=1; $$->str_list_entry.str_list_entry_val=malloc(sizeof($$->str_list_entry.str_list_entry_val[0]) * $$->str_list_entry.str_list_entry_len); $$->str_list_entry.str_list_entry_val[$$->str_list_entry.str_list_entry_len-1]=strdup($1); } | key_value_list_sl KW_COMMA key_value { $$=$1; $$->str_list_entry.str_list_entry_len=$1->str_list_entry.str_list_entry_len+1; $$->str_list_entry.str_list_entry_val=realloc($1->str_list_entry.str_list_entry_val, sizeof($$->str_list_entry.str_list_entry_val[0]) * $$->str_list_entry.str_list_entry_len); $$->str_list_entry.str_list_entry_val[$$->str_list_entry.str_list_entry_len-1]=strdup($3); } ; key_value_list : key_value | key_value_list KW_COMMA key_value { SPRINTF2($$,"%s||%s",$1,$3); } ; key_value : key_value_1 ; fkey_keys : KW_FKEY ; control_keys: KW_CTRL_KEY ; single_keys: KW_SINGLE_KEY {strcpy($$,$1);} ; key_value_1 : fkey_keys | control_keys | single_keys | KW_INTERRUPT | KW_ACCEPT | KW_ESCAPE {strcpy($$,"escape");} | KWUP {strcpy($$,"up");} | KW_HELP {strcpy($$,"help");} | KWDOWN {strcpy($$,"down");} | KW_RETURN_KEY {strcpy($$,"return");} | KW_ENTER {strcpy($$,"return");} /* Synonym for RETURN */ | KW_DELETE {strcpy($$,"delete");} | KW_INSERT {strcpy($$,"insert");} | KW_TAB {strcpy($$,"tab");} | KW_LEFT {strcpy($$,"left");} | KW_RIGHT {strcpy($$,"right");} | KW_NEXTPAGE {strcpy($$,"nextpage");} | KW_NEXT {strcpy($$,"nextpage");} | KW_PREVPAGE {strcpy($$,"prevpage");} | KW_PREVIOUS {strcpy($$,"prevpage");} | CHAR_VALUE { rm_quotes($1); strcpy($$,$1); } ; idle_time: INT_VALUE {$$=atoi($1);} | INT_VALUE IDLE_SECONDS {$$=atoi($1);} | INT_VALUE IDLE_MINUTES {$$=atoi($1)*60;} | INT_VALUE IDLE_HOURS {$$=atoi($1)*60*60;} ;