diff --git a/src/docode.c b/src/docode.c index e667c70bf4a991e81b2aa0a9e87d778c420e09a0..6011dec455578c03de219975095e31dfbff4b19d 100644 --- a/src/docode.c +++ b/src/docode.c @@ -5,7 +5,7 @@ \*/ /**/ #include "global.h" -RCSID("$Id: docode.c,v 1.62 2000/01/04 00:39:04 grubba Exp $"); +RCSID("$Id: docode.c,v 1.63 2000/01/04 01:29:11 grubba Exp $"); #include "las.h" #include "program.h" #include "language.h" @@ -963,43 +963,48 @@ static int do_docode2(node *n,int flags) for(tmp1=current_switch_values_on_stack; tmp1 > 1; tmp1--) if(is_equal(sp-tmp1, sp-1)) yyerror("Duplicate case."); + } else { + push_int(0); + current_switch_values_on_stack++; + } + current_switch_jumptable[current_switch_case++]=ins_label(-1); - current_switch_jumptable[current_switch_case++]=ins_label(-1); + if(CDR(n)) + { + current_switch_jumptable[current_switch_case]= + current_switch_jumptable[current_switch_case-1]; + current_switch_case++; - if(CDR(n)) + if(CAR(n)) { + if(!is_const(CDR(n))) + yyerror("Case label isn't constant."); + current_switch_jumptable[current_switch_case]= current_switch_jumptable[current_switch_case-1]; current_switch_case++; - if(CAR(n)) - { - if(!is_const(CDR(n))) - yyerror("Case label isn't constant."); - - current_switch_jumptable[current_switch_case]= - current_switch_jumptable[current_switch_case-1]; - current_switch_case++; - - if (!num_parse_error) { - tmp1=eval_low(CDR(n)); - if(tmp1<1) - { - yyerror("Error in second half of case label."); - push_int(0); - tmp1=1; - } - pop_n_elems(tmp1-1); - current_switch_values_on_stack++; - for(tmp1=current_switch_values_on_stack; tmp1 > 1; tmp1--) - if(is_equal(sp-tmp1, sp-1)) - yyerror("Duplicate case."); + if (!num_parse_error) { + tmp1=eval_low(CDR(n)); + if(tmp1<1) + { + yyerror("Error in second half of case label."); + push_int(0); + tmp1=1; } - current_switch_jumptable[current_switch_case++]=-1; + pop_n_elems(tmp1-1); + current_switch_values_on_stack++; + for(tmp1=current_switch_values_on_stack; tmp1 > 1; tmp1--) + if(is_equal(sp-tmp1, sp-1)) + yyerror("Duplicate case."); + } else { + push_int(0); + current_switch_values_on_stack++; } - }else{ current_switch_jumptable[current_switch_case++]=-1; } + }else{ + current_switch_jumptable[current_switch_case++]=-1; } } return 0;