Annotation of parser3/src/main/pa_request.C, revision 1.18

1.1       paf         1: /*
1.9       paf         2:        Parser
                      3:        Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)
1.14      paf         4:        Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)
1.9       paf         5: 
1.18    ! paf         6:        $Id: pa_request.C,v 1.17 2001/03/12 12:00:06 paf Exp $
1.1       paf         7: */
                      8: 
                      9: #include "pa_request.h"
1.3       paf        10: #include "pa_wwrapper.h"
                     11: #include "pa_common.h"
                     12: #include "pa_vclass.h"
1.11      paf        13: #include "_root.h"
                     14: #include "_env.h"
1.17      paf        15: #include "_table.h"
1.6       paf        16: #include "core.h"
1.3       paf        17: 
                     18: #include <stdio.h>
                     19: 
                     20: Request::Request(Pool& apool) : Pooled(apool),
                     21:        stack(apool),
                     22:        root_class(apool),
                     23:        env_class(apool),
                     24:        fclasses(apool),
                     25:        fclasses_array(apool),
1.15      paf        26:        flang(String::Untaint_lang::HTML_TYPO)
1.3       paf        27: {
                     28:        // root class
                     29:        initialize_root_class(pool(), root_class);
                     30:        // adding root superclass, 
                     31:        //   parent of all classes, 
                     32:        //   operators holder
1.6       paf        33:        classes().put(*root_class_name, &root_class);
1.18    ! paf        34:        //root_class.set_name(*root_class_name);
1.3       paf        35: 
                     36:        // env class
                     37:        initialize_env_class(pool(), env_class);
1.6       paf        38:        classes().put(*env_class_name, &env_class);
1.17      paf        39: 
                     40:        // table class
1.18    ! paf        41:        classes().put(*table_class_name, table_class);  
        !            42:        table_class->set_name(*table_class_name);
1.3       paf        43: }
1.1       paf        44: 
                     45: void Request::core() {
1.3       paf        46:        TRY {
1.7       paf        47:                // loading system auto.p
                     48:                char *sys_auto_file="C:\\temp\\auto.p";
1.16      paf        49:                VClass *main_class=use_file(
                     50:                        sys_auto_file, false/*ignore possible read problem*/,
                     51:                        0/*new class*/, main_class_name);
1.8       paf        52: 
1.13      paf        53:                // TODO: использовать $MAIN:limits здесь, пока их не сломали враги
1.7       paf        54: 
                     55:                // TODO: load site auto.p files, all assigned bases from upper dir
                     56:                char *site_auto_file="Y:\\parser3\\src\\auto.p";
1.16      paf        57:                main_class=use_file(
                     58:                        site_auto_file, false/*ignore possible read problem*/,
                     59:                        0/*new class*/, main_class_name, main_class);
1.7       paf        60: 
                     61:                // there must be some auto.p
1.12      paf        62:                if(!main_class)
1.7       paf        63:                        THROW(0,0,
                     64:                                0,
                     65:                                "'auto.p' not found");
1.5       paf        66: 
1.7       paf        67:                // compiling requested file
1.5       paf        68:                char *test_file="Y:\\parser3\\src\\test.p";
1.16      paf        69:                use_file(test_file, true/*don't ignore read problem*/,
                     70:                        0/*new class*/, main_class_name, main_class);
1.3       paf        71: 
1.7       paf        72:                // executing some @main[]
1.3       paf        73:                char *result=execute_MAIN();
                     74:                printf("result-----------------\n%sEOF----------------\n", result);
                     75:        } 
                     76:        CATCH(e) {
                     77:                printf("\nERROR: ");
                     78:                const String *problem_source=e.problem_source();
1.16      paf        79: #ifndef NO_STRING_ORIGIN
1.3       paf        80:                if(problem_source) {
                     81:                        const Origin& origin=problem_source->origin();
                     82:                        if(origin.file)
                     83:                                printf("%s(%d): ",
                     84:                                origin.file, 1+origin.line);
                     85:                        printf("'%s' ", 
                     86:                                problem_source->cstr());
                     87:                }
1.16      paf        88: #endif
1.3       paf        89:                printf("%s", e.comment());
1.1       paf        90:                const String *type=e.type();
                     91:                if(type) {
                     92:                        printf("  type: %s", type->cstr());
                     93:                        const String *code=e.code();
                     94:                        if(code)
                     95:                                printf(", code: %s", code->cstr());
                     96:                }
1.3       paf        97:                printf("\n");
1.1       paf        98:        }
1.3       paf        99:        END_CATCH
1.1       paf       100: }
                    101: 
1.16      paf       102: VClass *Request::use_file(
                    103:                                                  const char *file, bool fail_on_read_problem,
                    104:                                                  VClass *aclass, const String *name, 
                    105:                                                  VClass *base_class) {
1.3       paf       106:        // TODO: обнаружить|решить cyclic dependences
1.5       paf       107:        char *source=file_read(pool(), file, fail_on_read_problem);
1.3       paf       108:        if(!source)
1.12      paf       109:                return base_class;
1.3       paf       110: 
1.16      paf       111:        return use_buf(source, file, aclass, name, base_class);
                    112: }
                    113: 
                    114: VClass *Request::use_buf(
                    115:                                                  const char *source, const char *file,
                    116:                                                  VClass *aclass, const String *name, 
                    117:                                                  VClass *base_class) {
1.5       paf       118:        // compile loaded class
1.16      paf       119:        VClass& cclass=COMPILE(source, aclass, name, base_class, file);
1.1       paf       120: 
1.4       paf       121:        // locate and execute possible @auto[] static method
1.16      paf       122:        execute_static_method(cclass, *auto_method_name, false /*no result needed*/);
                    123:        return &cclass;
1.1       paf       124: }
                    125: 
1.3       paf       126: char *Request::execute_MAIN() {
1.5       paf       127:        // locate class with @main[] & execute it
1.3       paf       128:        for(int i=classes_array().size(); --i>=0;) {
                    129:                VClass *vclass=static_cast<VClass *>(classes_array().get(i));
1.5       paf       130:                char *result=execute_static_method(*vclass, *main_method_name, true /*result needed*/);
1.4       paf       131:                if(result)
                    132:                        return result;
1.3       paf       133:        }
                    134:        
                    135:        THROW(0,0,
                    136:                0, 
                    137:                "'"MAIN_METHOD_NAME"' method not found");
                    138:        return 0;
1.1       paf       139: }

E-mail: