--- parser3/src/classes/op.C 2005/11/22 15:40:17 1.161 +++ parser3/src/classes/op.C 2005/12/01 15:51:06 1.163 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char * const IDENT_OP_C="$Date: 2005/11/22 15:40:17 $"; +static const char * const IDENT_OP_C="$Date: 2005/12/01 15:51:06 $"; #include "classes.h" #include "pa_vmethod_frame.h" @@ -22,7 +22,7 @@ static const char * const IDENT_OP_C="$D // limits -#define MAX_LOOPS 10000 +#define MAX_LOOPS 20000 // defines @@ -230,10 +230,12 @@ static void _rem(Request&, MethodParams& static void _while(Request& r, MethodParams& params) { Value& vcondition=params.as_junction(0, "condition must be expression"); - Value& body=params.as_junction(1, "body must be code"); + Value& body_code=params.as_junction(1, "body must be code"); + Value* delim_maybe_code=params.count()>2?¶ms[2]:0; // while... int endless_loop_count=0; + bool need_delim=false; while(true) { if(++endless_loop_count>=MAX_LOOPS) // endless loop? throw Exception("parser.runtime", @@ -245,8 +247,14 @@ static void _while(Request& r, MethodPar if(!condition) // ...condition is true break; - // write processed body - r.write_pass_lang(r.process(body)); + StringOrValue sv_processed=r.process(body_code); + const String* s_processed=sv_processed.get_string(); + if(delim_maybe_code && s_processed && s_processed->length()) { // delimiter set and we have body + if(need_delim) // need delim & iteration produced string? + r.write_pass_lang(r.process(*delim_maybe_code)); + need_delim=true; + } + r.write_pass_lang(sv_processed); } } @@ -379,6 +387,8 @@ static void _case(Request& r, MethodPara int count=params.count(); Value& code=params.as_junction(--count, "case result must be code"); + Value& searching=data->searching; + bool we_are_searching_string_or_void=searching.is_string() || searching.is_void(); for(int i=0; isearching.is_string()) - matches=data->searching.as_string() == value.as_string(); + if(we_are_searching_string_or_void) + matches=searching.as_string() == value.as_string(); else - matches=data->searching.as_double() == value.as_double(); + matches=searching.as_double() == value.as_double(); if(matches) { if(data->found) @@ -810,7 +820,7 @@ VClassMAIN::VClassMAIN(): VClass() { add_native_method("rem", Method::CT_ANY, _rem, 1, 10000); // ^while(condition){code} - add_native_method("while", Method::CT_ANY, _while, 2, 2); + add_native_method("while", Method::CT_ANY, _while, 2, 3); // ^use[file] add_native_method("use", Method::CT_ANY, _use, 1, 1);