diff --git a/builtin.cpp b/builtin.cpp index dbc301653..b9b05a794 100644 --- a/builtin.cpp +++ b/builtin.cpp @@ -797,26 +797,20 @@ static int builtin_block( parser_t &parser, wchar_t **argv ) sb_printf( sb_err, _( L"%ls: Can not specify scope when removing block\n" ), argv[0] ); return STATUS_BUILTIN_ERROR; } - - event_block_t *eb = parser.global_event_block; - if( ! eb ) + + if (parser.global_event_blocks.empty()) { sb_printf( sb_err, _( L"%ls: No blocks defined\n" ), argv[0] ); return STATUS_BUILTIN_ERROR; } - parser.global_event_block = eb->next; - free( eb ); + parser.global_event_blocks.pop_front(); } else { block_t *block=parser.current_block; - event_block_t *eb = (event_block_t *)malloc( sizeof( event_block_t ) ); - - if( !eb ) - DIE_MEM(); - - eb->type = type; + event_block_t eb = {}; + eb.typemask = type; switch( scope ) { @@ -840,14 +834,11 @@ static int builtin_block( parser_t &parser, wchar_t **argv ) } if( block ) { - eb->next = block->first_event_block; - block->first_event_block = eb; - halloc_register( block, eb ); + block->event_blocks.push_front(eb); } else { - eb->next = parser.global_event_block; - parser.global_event_block=eb; + parser.global_event_blocks.push_front(eb); } } diff --git a/event.cpp b/event.cpp index 3734ef321..d8a1d1231 100644 --- a/event.cpp +++ b/event.cpp @@ -172,29 +172,13 @@ static event_t *event_copy( event_t *event, int copy_arguments ) static int event_is_blocked( event_t *e ) { block_t *block; - event_block_t *eb; parser_t &parser = parser_t::principal_parser(); for( block = parser.current_block; block; block = block->outer ) { - for( eb = block->first_event_block; eb; eb=eb->next ) - { - if( eb->type & (1<type & (1<type) ) - return 1; - } + if (event_block_list_blocks_type(block->event_blocks, e->type)) + return true; } - for( eb = parser.global_event_block; eb; eb=eb->next ) - { - if( eb->type & (1<type & (1<type) ) - return 1; - return 1; - - } - - return 0; + return event_block_list_blocks_type(parser.global_event_blocks, e->type); } const wchar_t *event_get_desc( event_t *e ) diff --git a/parser.cpp b/parser.cpp index 82407bf0e..3db44d47f 100644 --- a/parser.cpp +++ b/parser.cpp @@ -368,7 +368,6 @@ parser_t::parser_t(enum parser_type_t type) : job_start_pos(0), eval_level(-1), current_block(NULL), - global_event_block(NULL), block_io(NULL) { diff --git a/parser.h b/parser.h index a08500db2..5b6b2f974 100644 --- a/parser.h +++ b/parser.h @@ -12,6 +12,7 @@ #include "parser.h" #include "event.h" #include +#include #define PARSER_TEST_ERROR 1 #define PARSER_TEST_INCOMPLETE 2 @@ -19,7 +20,7 @@ /** event_block_t represents a block on events of the specified type */ -typedef struct event_block +struct event_block_t { /** The types of events to block. This is interpreted as a bitset @@ -29,13 +30,20 @@ typedef struct event_block Note that EVENT_ANY can be used to specify any event. */ - int type; - - /** - The next event_block struct - */ - struct event_block *next; -} event_block_t; + unsigned int typemask; +}; + +typedef std::deque event_block_list_t; + +inline bool event_block_list_blocks_type(const event_block_list_t &ebls, int type) { + for (event_block_list_t::const_iterator iter = ebls.begin(); iter != ebls.end(); iter++) { + if( iter->typemask & (1<typemask & (1<