--- parser3/src/classes/op.C 2010/11/15 23:31:08 1.205 +++ parser3/src/classes/op.C 2012/06/04 13:46:18 1.210 @@ -1,12 +1,10 @@ /** @file Parser: parser @b operators. - Copyright (c) 2001-2009 ArtLebedev Group (http://www.artlebedev.com) + Copyright (c) 2001-2012 Art. Lebedev Studio (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char * const IDENT_OP_C="$Date: 2010/11/15 23:31:08 $"; - #include "classes.h" #include "pa_vmethod_frame.h" @@ -20,6 +18,8 @@ static const char * const IDENT_OP_C="$D #include "pa_vclass.h" #include "pa_charset.h" +volatile const char * IDENT_OP_C="$Id: op.C,v 1.210 2012/06/04 13:46:18 moko Exp $"; + // limits #define MAX_LOOPS 20000 @@ -104,13 +104,10 @@ static void _if(Request& r, MethodParams r.process_write(*params.get(i)); } -static String::Language get_untaint_lang(MethodParams& params, int index){ - const String& lang_name=params.as_string(index, "lang must be string"); +String::Language get_untaint_lang(const String& lang_name){ String::Language lang=untaint_lang_name2enum.get(lang_name); if(!lang) - throw Exception(PARSER_RUNTIME, - &lang_name, - "invalid taint language"); + throw Exception(PARSER_RUNTIME, &lang_name, "invalid taint language"); return lang; } @@ -119,7 +116,7 @@ static void _untaint(Request& r, MethodP if(params.count()==1) lang=String::L_AS_IS; // mark as simply 'as-is'. useful in html from sql else - lang=get_untaint_lang(params, 0); + lang=get_untaint_lang(params.as_string(0, "lang must be string")); { Value& vbody=params.as_junction(params.count()-1, "body must be code"); @@ -135,7 +132,7 @@ static void _taint(Request& r, MethodPar if(params.count()==1) lang=String::L_TAINTED; // mark as simply 'tainted'. useful in table:create else - lang=get_untaint_lang(params, 0); + lang=get_untaint_lang(params.as_string(0, "lang must be string")); { Value& vbody=params.as_no_junction(params.count()-1, "body must not be code"); @@ -146,7 +143,7 @@ static void _taint(Request& r, MethodPar } static void _apply_taint(Request& r, MethodParams& params) { - String::Language lang=params.count()==1 ? String::L_AS_IS : get_untaint_lang(params, 0); + String::Language lang=params.count()==1 ? String::L_AS_IS : get_untaint_lang(params.as_string(0, "lang must be string")); const String &sbody=params.as_string(params.count()-1, "body must be string"); String::Body result_body=sbody.cstr_to_string_body_untaint(lang, 0, &r.charsets); r.write_pass_lang(*new String(result_body, String::L_AS_IS)); @@ -303,7 +300,7 @@ static void _use(Request& r, MethodParam static void set_skip(Request& r, Request::Skip askip) { if(!r.get_in_cycle()) - throw Exception(PARSER_RUNTIME, + throw Exception(askip==Request::SKIP_BREAK?"parser.break":"parser.continue", 0, "without cycle"); @@ -439,6 +436,7 @@ public: Request& r; const String* searching_string; double searching_double; + bool searching_bool; Value* found; Value* _default; public: @@ -448,9 +446,11 @@ public: if(asearching.is_string() || asearching.is_void()){ searching_string=&asearching.as_string(); searching_double=0; + searching_bool=false; } else { searching_string=0; searching_double=asearching.as_double(); + searching_bool=asearching.is_bool(); } } }; @@ -500,6 +500,8 @@ static void _case(Request& r, MethodPara bool matches; if(data->searching_string) matches=(*data->searching_string) == value.as_string(); + else if(data->searching_bool || value.is_bool()) + matches=(data->searching_double != 0) == value.as_bool(); else matches=data->searching_double == value.as_double(); @@ -876,7 +878,8 @@ static void _throw_operator(Request&, Me static void _sleep_operator(Request& r, MethodParams& params) { double seconds=params.as_double(0, "seconds must be double", r); - pa_sleep((int)trunc(seconds), (int)trunc(seconds*1000)); + if(seconds>0) + pa_sleep((int)trunc(seconds), (int)trunc((seconds-trunc(seconds))*1000000)); } #if defined(WIN32) && defined(_DEBUG)