aboutsummaryrefslogtreecommitdiffhomepage
path: root/parser.cpp
diff options
context:
space:
mode:
authorGravatar ridiculousfish <corydoras@ridiculousfish.com>2012-06-04 15:10:35 -0700
committerGravatar ridiculousfish <corydoras@ridiculousfish.com>2012-06-04 15:10:35 -0700
commitb877181e172d04b90823412cb6e005b40608777d (patch)
tree5fa10c38490e5de90aa680f770cd9bcfbc9f6da5 /parser.cpp
parent69446be1ee063771f2e0b498a50f9b0787ea70c7 (diff)
Fix for what I believe to be a bug in fish trunk where you can't always successfully control-C out of some while loops
Diffstat (limited to 'parser.cpp')
-rw-r--r--parser.cpp15
1 files changed, 9 insertions, 6 deletions
diff --git a/parser.cpp b/parser.cpp
index f93dbf3a..32b9f222 100644
--- a/parser.cpp
+++ b/parser.cpp
@@ -391,10 +391,12 @@ void parser_t::skip_all_blocks(void)
/* Tell all blocks to skip */
if (s_principal_parser)
{
+ //write(2, "Cancelling blocks\n", strlen("Cancelling blocks\n"));
block_t *c = s_principal_parser->current_block;
while( c )
{
c->skip = true;
+ //fprintf(stderr, " Cancelled %p\n", c);
c = c->outer;
}
}
@@ -2292,7 +2294,7 @@ void parser_t::eval_job( tokenizer *tok )
profile_item_t *profile_item = NULL;
- int skip = 0;
+ bool skip = false;
int job_begin_pos, prev_tokenizer_pos;
const bool do_profile = profile;
@@ -2333,7 +2335,6 @@ void parser_t::eval_job( tokenizer *tok )
}
j->first_process = new process_t();
-
job_begin_pos = tok_get_pos( tok );
if( parse_job( j->first_process, j, tok ) &&
@@ -2358,9 +2359,9 @@ void parser_t::eval_job( tokenizer *tok )
profile_item->skipped=current_block->skip;
}
- skip |= current_block->skip;
- skip |= job_get_flag( j, JOB_WILDCARD_ERROR );
- skip |= job_get_flag( j, JOB_SKIP );
+ skip = skip || current_block->skip;
+ skip = skip || job_get_flag( j, JOB_WILDCARD_ERROR );
+ skip = skip || job_get_flag( j, JOB_SKIP );
if(!skip )
{
@@ -2396,7 +2397,9 @@ void parser_t::eval_job( tokenizer *tok )
{
case WHILE_TEST_FIRST:
{
- current_block->skip = proc_get_last_status()!= 0;
+ // PCA I added the 'current_block->skip ||' part because we couldn't reliably
+ // control-C out of loops like this: while test 1 -eq 1; end
+ current_block->skip = current_block->skip || proc_get_last_status()!= 0;
current_block->state1<int>()=WHILE_TESTED;
}
break;