|
|
| version 1.4, 2001/03/10 14:05:36 | version 1.20, 2001/03/12 17:16:50 |
|---|---|
| Line 1 | Line 1 |
| /* | /* |
| $Id$ | Parser |
| Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) | |
| Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf) | |
| $Id$ | |
| */ | */ |
| #include <string.h> | |
| #include "pa_request.h" | #include "pa_request.h" |
| #include "pa_wwrapper.h" | #include "pa_wwrapper.h" |
| #include "pa_common.h" | #include "pa_common.h" |
| #include "pa_vclass.h" | #include "pa_vclass.h" |
| #include "classes/_root.h" | #include "_root.h" |
| #include "classes/_env.h" | #include "_env.h" |
| #include "_table.h" | |
| #include "core.h" | |
| #include <stdio.h> | #include <stdio.h> |
| Line 17 Request::Request(Pool& apool) : Pooled(a | Line 25 Request::Request(Pool& apool) : Pooled(a |
| env_class(apool), | env_class(apool), |
| fclasses(apool), | fclasses(apool), |
| fclasses_array(apool), | fclasses_array(apool), |
| lang(String::Untaint_lang::HTML_TYPO) | flang(String::Untaint_lang::HTML_TYPO) |
| { | { |
| // root class | // root class |
| initialize_root_class(pool(), root_class); | initialize_root_class(pool(), root_class); |
| // adding root superclass, | // adding root superclass, |
| // parent of all classes, | // parent of all classes, |
| // operators holder | // operators holder |
| String ROOT(pool()); ROOT.APPEND_CONST(ROOT_NAME); | classes().put(*root_class_name, &root_class); |
| classes().put(ROOT, &root_class); | //root_class.set_name(*root_class_name); |
| // env class | // env class |
| initialize_env_class(pool(), env_class); | initialize_env_class(pool(), env_class); |
| String ENV(pool()); ENV.APPEND_CONST(ENV_NAME); | classes().put(*env_class_name, &env_class); |
| classes().put(ENV, &env_class); | |
| // table class | |
| classes().put(*table_class_name, table_class); | |
| table_class->set_name(*table_class_name); | |
| // web | |
| // todo: ifdef WIN32 flip \\ to / | |
| document_root="Y:/parser3/src/"; | |
| page_filespec="Y:/parser3/src/test.p"; | |
| } | } |
| void Request::core() { | void Request::core() { |
| TRY { | TRY { |
| char *file="Y:\\parser3\\src\\test.p"; | // loading system auto.p |
| String RUN(pool()); RUN.APPEND_CONST(RUN_NAME); | char *sys_auto_file="C:\\temp\\auto.p"; |
| use(file, &RUN); | VClass *main_class=use_file( |
| sys_auto_file, false/*ignore possible read problem*/, | |
| 0/*new class*/, main_class_name); | |
| // TODO: использовать $MAIN:limits здесь, пока их не сломали враги | |
| // TODO: load site auto.p files, all assigned bases from upper dir | |
| char *site_auto_file="Y:\\parser3\\src\\auto.p"; | |
| main_class=use_file( | |
| site_auto_file, false/*ignore possible read problem*/, | |
| 0/*new class*/, main_class_name, main_class); | |
| // there must be some auto.p | |
| if(!main_class) | |
| THROW(0,0, | |
| 0, | |
| "'auto.p' not found"); | |
| // compiling requested file | |
| use_file(page_filespec, true/*don't ignore read problem*/, | |
| 0/*new class*/, main_class_name, main_class); | |
| // executing some @main[] | |
| char *result=execute_MAIN(); | char *result=execute_MAIN(); |
| printf("result-----------------\n%sEOF----------------\n", result); | printf("result-----------------\n%sEOF----------------\n", result); |
| } | } |
| CATCH(e) { | CATCH(e) { |
| printf("\nERROR: "); | printf("\nERROR: "); |
| const String *problem_source=e.problem_source(); | const String *problem_source=e.problem_source(); |
| #ifndef NO_STRING_ORIGIN | |
| if(problem_source) { | if(problem_source) { |
| const Origin& origin=problem_source->origin(); | const Origin& origin=problem_source->origin(); |
| if(origin.file) | if(origin.file) |
| Line 53 void Request::core() { | Line 92 void Request::core() { |
| printf("'%s' ", | printf("'%s' ", |
| problem_source->cstr()); | problem_source->cstr()); |
| } | } |
| #endif | |
| printf("%s", e.comment()); | printf("%s", e.comment()); |
| const String *type=e.type(); | const String *type=e.type(); |
| if(type) { | if(type) { |
| Line 66 void Request::core() { | Line 106 void Request::core() { |
| END_CATCH | END_CATCH |
| } | } |
| void Request::use(char *file, String *name) { | VClass *Request::use_file( |
| const char *file, bool fail_on_read_problem, | |
| VClass *aclass, const String *name, | |
| VClass *base_class) { | |
| // TODO: обнаружить|решить cyclic dependences | // TODO: обнаружить|решить cyclic dependences |
| char *source=file_read(pool(), file); | char *source=file_read(pool(), file, fail_on_read_problem); |
| if(!source) | if(!source) |
| THROW(0,0, | return base_class; |
| 0, | |
| "use: can not read '%s' file", file); | return use_buf(source, file, aclass, name, base_class); |
| } | |
| VClass& vclass=COMPILE(source, name, file); | VClass *Request::use_buf( |
| const char *source, const char *file, | |
| VClass *aclass, const String *name, | |
| VClass *base_class) { | |
| // compile loaded class | |
| VClass& cclass=COMPILE(source, aclass, name, base_class, file); | |
| // locate and execute possible @auto[] static method | // locate and execute possible @auto[] static method |
| String name_auto(pool()); | execute_static_method(cclass, *auto_method_name, false /*no result needed*/); |
| name_auto.APPEND_CONST(AUTO_METHOD_NAME); | return &cclass; |
| execute_static(vclass, name_auto, false); | |
| } | } |
| char *Request::execute_MAIN() { | char *Request::execute_MAIN() { |
| // locate class with @main & it's code | // locate class with @main[] & execute it |
| String name_main(pool()); | |
| name_main.APPEND_CONST(MAIN_METHOD_NAME); | |
| // looking for latest known @main | |
| for(int i=classes_array().size(); --i>=0;) { | for(int i=classes_array().size(); --i>=0;) { |
| VClass *vclass=static_cast<VClass *>(classes_array().get(i)); | VClass *vclass=static_cast<VClass *>(classes_array().get(i)); |
| char *result=execute_static(*vclass, name_main, true); | char *result=execute_static_method(*vclass, *main_method_name, true /*result needed*/); |
| if(result) | if(result) |
| return result; | return result; |
| } | } |
| Line 100 char *Request::execute_MAIN() { | Line 144 char *Request::execute_MAIN() { |
| "'"MAIN_METHOD_NAME"' method not found"); | "'"MAIN_METHOD_NAME"' method not found"); |
| return 0; | return 0; |
| } | } |
| void Request::fail_if_junction_(bool is, | |
| Value& value, const String& method_name, char *msg) { | |
| // fail_if_junction(true, junction = fail | |
| // fail_if_junction(false, not junction = fail | |
| if((value.get_junction()!=0) ^ !is) | |
| THROW(0, 0, | |
| &method_name, | |
| msg); | |
| } | |
| char *Request::relative(const char *path, const char *file) { | |
| char *result=static_cast<char *>(malloc(strlen(path)+strlen(file)+1)); | |
| strcpy(result, path); | |
| rsplit(result,'/'); | |
| strcat(result, "/"); | |
| strcat(result, file); | |
| return result; | |
| } | |
| char *Request::absolute(const char *name) { | |
| if(name[0]=='/') { | |
| char *result=static_cast<char *>(malloc(strlen(document_root)+strlen(name)+1)); | |
| strcpy(result, document_root); | |
| strcat(result, name); | |
| return result; | |
| } else | |
| return relative(page_filespec, name); | |
| } |