|
|
| version 1.19, 2001/03/12 17:00:48 | version 1.27, 2001/03/13 16:38:24 |
|---|---|
| Line 23 Request::Request(Pool& apool) : Pooled(a | Line 23 Request::Request(Pool& apool) : Pooled(a |
| stack(apool), | stack(apool), |
| root_class(apool), | root_class(apool), |
| env_class(apool), | env_class(apool), |
| form_class(apool), | |
| fclasses(apool), | fclasses(apool), |
| fclasses_array(apool), | |
| flang(String::Untaint_lang::HTML_TYPO) | flang(String::Untaint_lang::HTML_TYPO) |
| { | { |
| // root class | // root superclass, |
| initialize_root_class(pool(), root_class); | |
| // adding root superclass, | |
| // parent of all classes, | // parent of all classes, |
| // operators holder | // operators holder |
| initialize_root_class(pool(), root_class); | |
| classes().put(*root_class_name, &root_class); | classes().put(*root_class_name, &root_class); |
| //root_class.set_name(*root_class_name); | |
| // env class | |
| initialize_env_class(pool(), env_class); | |
| classes().put(*env_class_name, &env_class); | |
| // table class | // table class |
| classes().put(*table_class_name, table_class); | classes().put(*table_class_name, table_class); |
| table_class->set_name(*table_class_name); | // table_class->set_name(*table_class_name); |
| // env class | |
| classes().put(*env_class_name, &env_class); | |
| // form class | |
| classes().put(*form_class_name, &form_class); | |
| // web | // web |
| // todo: ifdef WIN32 flip \\ to / | // TODO: ifdef WIN32 flip \\ to / |
| document_root="Y:/parser3/src/"; | document_root="Y:/parser3/src/"; |
| page_filespec="Y:/parser3/src/test.p"; | page_filespec="Y:/parser3/src/test.p"; |
| } | } |
| Line 54 void Request::core() { | Line 51 void Request::core() { |
| TRY { | TRY { |
| // loading system auto.p | // loading system auto.p |
| char *sys_auto_file="C:\\temp\\auto.p"; | char *sys_auto_file="C:\\temp\\auto.p"; |
| VClass *main_class=use_file( | VStateless_class *main_class=use_file( |
| sys_auto_file, false/*ignore possible read problem*/, | sys_auto_file, false/*ignore possible read problem*/, |
| 0/*new class*/, main_class_name); | main_class_name); |
| // TODO: использовать $MAIN:limits здесь, пока их не сломали враги | // TODO: использовать $MAIN:limits здесь, пока их не сломали враги |
| Line 64 void Request::core() { | Line 61 void Request::core() { |
| char *site_auto_file="Y:\\parser3\\src\\auto.p"; | char *site_auto_file="Y:\\parser3\\src\\auto.p"; |
| main_class=use_file( | main_class=use_file( |
| site_auto_file, false/*ignore possible read problem*/, | site_auto_file, false/*ignore possible read problem*/, |
| 0/*new class*/, main_class_name, main_class); | main_class_name, main_class); |
| // there must be some auto.p | // there must be some auto.p |
| if(!main_class) | if(!main_class) |
| THROW(0,0, | THROW(0,0, |
| 0, | 0, |
| "'auto.p' not found"); | "no 'auto.p' found (nither system nor any site's)"); |
| // compiling requested file | // compiling requested file |
| use_file(page_filespec, true/*don't ignore read problem*/, | main_class=use_file(page_filespec, true/*don't ignore read problem*/, |
| 0/*new class*/, main_class_name, main_class); | main_class_name, main_class); |
| // execute @main[] | |
| char *result=execute_method(*main_class, *main_method_name, | |
| true /*result needed*/); | |
| if(!result) | |
| THROW(0,0, | |
| 0, | |
| "'"MAIN_METHOD_NAME"' method not found"); | |
| // executing some @main[] | |
| char *result=execute_MAIN(); | |
| printf("result-----------------\n%sEOF----------------\n", result); | printf("result-----------------\n%sEOF----------------\n", result); |
| } | } |
| CATCH(e) { | CATCH(e) { |
| Line 106 void Request::core() { | Line 109 void Request::core() { |
| END_CATCH | END_CATCH |
| } | } |
| VClass *Request::use_file( | VStateless_class *Request::use_file( |
| const char *file, bool fail_on_read_problem, | const char *file, bool fail_on_read_problem, |
| VClass *aclass, const String *name, | const String *name, |
| VClass *base_class) { | VStateless_class *base_class) { |
| // TODO: обнаружить|решить cyclic dependences | // TODO: обнаружить|решить cyclic dependences |
| char *source=file_read(pool(), file, fail_on_read_problem); | char *source=file_read(pool(), file, fail_on_read_problem); |
| if(!source) | if(!source) |
| return base_class; | return base_class; |
| return use_buf(source, file, aclass, name, base_class); | return use_buf(source, file, 0/*new class*/, name, base_class); |
| } | } |
| VClass *Request::use_buf( | VStateless_class *Request::use_buf( |
| const char *source, const char *file, | const char *source, const char *file, |
| VClass *aclass, const String *name, | VStateless_class *aclass, const String *name, |
| VClass *base_class) { | VStateless_class *base_class) { |
| // compile loaded class | // compile loaded class |
| VClass& cclass=COMPILE(source, aclass, name, base_class, file); | VStateless_class& cclass=COMPILE(source, aclass, name, base_class, file); |
| // locate and execute possible @auto[] static method | // locate and execute possible @auto[] static method |
| execute_static_method(cclass, *auto_method_name, false /*no result needed*/); | execute_method(cclass, *auto_method_name, false /*no result needed*/); |
| return &cclass; | return &cclass; |
| } | } |
| char *Request::execute_MAIN() { | void Request::fail_if_junction_(bool is, |
| // locate class with @main[] & execute it | Value& value, const String& method_name, char *msg) { |
| for(int i=classes_array().size(); --i>=0;) { | |
| VClass *vclass=static_cast<VClass *>(classes_array().get(i)); | // fail_if_junction(true, junction = fail |
| char *result=execute_static_method(*vclass, *main_method_name, true /*result needed*/); | // fail_if_junction(false, not junction = fail |
| if(result) | if((value.get_junction()!=0) ^ !is) |
| return result; | THROW(0, 0, |
| } | &method_name, |
| msg); | |
| THROW(0,0, | |
| 0, | |
| "'"MAIN_METHOD_NAME"' method not found"); | |
| return 0; | |
| } | } |
| char *Request::relative(const char *path, const char *file) { | char *Request::relative(const char *path, const char *file) { |
| char *result=static_cast<char *>(malloc(strlen(path)+strlen(file)+1)); | char *result=(char *)malloc(strlen(path)+strlen(file)+1); |
| strcpy(result, path); | strcpy(result, path); |
| rsplit(result,'/'); | rsplit(result,'/'); |
| strcat(result, "/"); | strcat(result, "/"); |
| Line 156 char *Request::relative(const char *path | Line 155 char *Request::relative(const char *path |
| char *Request::absolute(const char *name) { | char *Request::absolute(const char *name) { |
| if(name[0]=='/') { | if(name[0]=='/') { |
| char *result=static_cast<char *>(malloc(strlen(document_root)+strlen(name)+1)); | char *result=(char *)malloc(strlen(document_root)+strlen(name)+1); |
| strcpy(result, document_root); | strcpy(result, document_root); |
| strcat(result, name); | strcat(result, name); |
| return result; | return result; |