--- parser3/src/include/pa_request.h 2002/03/27 15:30:35 1.125 +++ parser3/src/include/pa_request.h 2002/04/15 11:34:24 1.130 @@ -4,7 +4,7 @@ Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) - $Id: pa_request.h,v 1.125 2002/03/27 15:30:35 paf Exp $ + $Id: pa_request.h,v 1.130 2002/04/15 11:34:24 paf Exp $ */ #ifndef PA_REQUEST_H @@ -30,6 +30,12 @@ #include #endif +// consts + +const uint ANTI_ENDLESS_EXECUTE_RECOURSION=500; + +// defines + #ifndef NO_STRING_ORIGIN # define COMPILE_PARAMS \ const char *source, \ @@ -101,6 +107,18 @@ public: /// executes ops void execute(const Array& ops); // execute.C + /// execute ops with anti-recoursion check + void recoursion_checked_execute(const String *name, const Array& ops) { + // anti_endless_execute_recoursion + if(++anti_endless_execute_recoursion==ANTI_ENDLESS_EXECUTE_RECOURSION) { + anti_endless_execute_recoursion=0; // give @exception a chance + throw Exception("parser.runtime", + name, + "call canceled - endless recursion detected"); + } + execute(ops); // execute it + anti_endless_execute_recoursion--; + } /// compiles the file, maybe forcing it's class @a name and @a base_class. VStateless_class *use_file( @@ -113,12 +131,18 @@ public: const char *source, const char *file, VStateless_class *aclass=0, const String *name=0, VStateless_class *base_class=0); // core.C - /// processes any code-junction there may be inside of @a value - Value& process( - Value& value, - const String *name=0, - bool intercept_string=true); // execute.C + /// processes any code-junction there may be inside of @a value + StringOrValue process(Value& input_value, bool intercept_string); // execute.C + //@{ convinient helpers + const String& process_to_string(Value& input_value) { + return process(input_value, true/*intercept_string*/).as_string(); + } + Value& process_to_value(Value& input_value, bool intercept_string=true) { + return process(input_value, intercept_string).as_value(); + } + //@} + /// appending, sure of clean string inside void write_no_lang(const String& astring) { wcontext->write(astring, @@ -284,9 +308,6 @@ private: /// connection SQL_Connection *fconnection; - -private: - void output_result(const VFile& body_file, bool header_only); }; @@ -372,9 +393,7 @@ private: } Value& get_processed(int index, const char *msg, Request& r) { - return r.process(as_junction(index, msg), - 0/*no name*/, - false/*don't intercept string*/); + return r.process_to_value(as_junction(index, msg), 0/*no name*/); } private: