Annotation of parser3/src/main/pa_request.C, revision 1.29
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.29 ! paf 6: $Id: pa_request.C,v 1.28 2001/03/13 17:54:14 paf Exp $
1.1 paf 7: */
8:
1.19 paf 9: #include <string.h>
10:
1.1 paf 11: #include "pa_request.h"
1.3 paf 12: #include "pa_wwrapper.h"
13: #include "pa_common.h"
14: #include "pa_vclass.h"
1.11 paf 15: #include "_root.h"
16: #include "_env.h"
1.17 paf 17: #include "_table.h"
1.6 paf 18: #include "core.h"
1.3 paf 19:
20: #include <stdio.h>
21:
1.28 paf 22: Request::Request(Pool& apool,
23: String::Untaint_lang alang,
24: char *adocument_root,
25: char *apage_filespec) : Pooled(apool),
1.3 paf 26: stack(apool),
27: root_class(apool),
28: env_class(apool),
1.27 paf 29: form_class(apool),
1.3 paf 30: fclasses(apool),
1.28 paf 31: flang(alang),
32: fdocument_root(adocument_root),
33: fpage_filespec(apage_filespec)
1.3 paf 34: {
1.27 paf 35: // root superclass,
1.3 paf 36: // parent of all classes,
37: // operators holder
1.27 paf 38: initialize_root_class(pool(), root_class);
1.6 paf 39: classes().put(*root_class_name, &root_class);
1.27 paf 40: // table class
41: classes().put(*table_class_name, table_class);
42: // table_class->set_name(*table_class_name);
1.3 paf 43:
44: // env class
1.6 paf 45: classes().put(*env_class_name, &env_class);
1.27 paf 46: // form class
47: classes().put(*form_class_name, &form_class);
1.3 paf 48: }
1.1 paf 49:
1.29 ! paf 50: char *Request::core(const char *sys_auto_path1,
! 51: const char *sys_auto_path2) {
1.28 paf 52: char *result;
1.29 ! paf 53: VStateless_class *main_class=0;
1.3 paf 54: TRY {
1.29 ! paf 55: char *auto_filespec=(char *)malloc(MAX_STRING);
! 56:
! 57: // load MAIN class,
! 58: // it consists of all the auto.p files we'd manage to find
! 59: // plus
! 60: // the file user requested us to process
! 61: // all located classes become children of one another,
! 62: // composing class we name 'MAIN'
! 63:
! 64: // loading system auto.p 1
! 65: if(sys_auto_path1) {
! 66: strncpy(auto_filespec, MAX_STRING-strlen(AUTO_FILE_NAME), sys_auto_path1);
! 67: strcat(auto_filespec, AUTO_FILE_NAME);
! 68: main_class=use_file(
! 69: auto_filespec, false/*ignore possible read problem*/,
! 70: main_class_name);
! 71: }
! 72:
! 73: // loading system auto.p 2
! 74: if(sys_auto_path2) {
! 75: strncpy(auto_filespec, MAX_STRING-strlen(AUTO_FILE_NAME), sys_auto_path2);
! 76: strcat(auto_filespec, AUTO_FILE_NAME);
! 77: VStateless_class *main_class=use_file(
! 78: auto_filespec, false/*ignore possible read problem*/,
! 79: main_class_name);
! 80: }
1.8 paf 81:
1.13 paf 82: // TODO: использовать $MAIN:limits здесь, пока их не сломали враги
1.7 paf 83:
84: // TODO: load site auto.p files, all assigned bases from upper dir
85: char *site_auto_file="Y:\\parser3\\src\\auto.p";
1.16 paf 86: main_class=use_file(
87: site_auto_file, false/*ignore possible read problem*/,
1.25 paf 88: main_class_name, main_class);
1.7 paf 89:
90: // there must be some auto.p
1.12 paf 91: if(!main_class)
1.7 paf 92: THROW(0,0,
93: 0,
1.24 paf 94: "no 'auto.p' found (nither system nor any site's)");
1.5 paf 95:
1.7 paf 96: // compiling requested file
1.28 paf 97: main_class=use_file(fpage_filespec, true/*don't ignore read problem*/,
1.25 paf 98: main_class_name, main_class);
99:
100: // execute @main[]
1.28 paf 101: result=execute_method(*main_class, *main_method_name,
1.25 paf 102: true /*result needed*/);
103: if(!result)
104: THROW(0,0,
105: 0,
106: "'"MAIN_METHOD_NAME"' method not found");
1.3 paf 107: }
108: CATCH(e) {
1.28 paf 109: // we're returning not result, but error explanation
110: result=(char *)malloc(MAX_STRING);
111: result[0]=0;
112: size_t printed=0;
113:
1.3 paf 114: const String *problem_source=e.problem_source();
1.28 paf 115: if(problem_source) {
1.16 paf 116: #ifndef NO_STRING_ORIGIN
1.3 paf 117: const Origin& origin=problem_source->origin();
118: if(origin.file)
1.28 paf 119: printed+=snprintf(result+printed, MAX_STRING-printed, "%s(%d): ",
120: origin.file, 1+origin.line);
121: #endif
122: printed+=snprintf(result+printed, MAX_STRING-printed, "'%s' ",
1.3 paf 123: problem_source->cstr());
124: }
1.28 paf 125: printed+=snprintf(result+printed, MAX_STRING-printed, "%s",
126: e.comment());
1.1 paf 127: const String *type=e.type();
128: if(type) {
1.28 paf 129: printed+=snprintf(result+printed, MAX_STRING-printed, " type: %s",
130: type->cstr());
1.1 paf 131: const String *code=e.code();
132: if(code)
1.28 paf 133: printed+=snprintf(result+printed, MAX_STRING-printed, ", code: %s",
134: code->cstr());
1.1 paf 135: }
136: }
1.3 paf 137: END_CATCH
1.28 paf 138:
139: return result;
1.1 paf 140: }
141:
1.26 paf 142: VStateless_class *Request::use_file(
143: const char *file, bool fail_on_read_problem,
144: const String *name,
145: VStateless_class *base_class) {
1.3 paf 146: // TODO: обнаружить|решить cyclic dependences
1.5 paf 147: char *source=file_read(pool(), file, fail_on_read_problem);
1.3 paf 148: if(!source)
1.12 paf 149: return base_class;
1.3 paf 150:
1.25 paf 151: return use_buf(source, file, 0/*new class*/, name, base_class);
1.16 paf 152: }
153:
1.26 paf 154: VStateless_class *Request::use_buf(
155: const char *source, const char *file,
156: VStateless_class *aclass, const String *name,
157: VStateless_class *base_class) {
1.5 paf 158: // compile loaded class
1.26 paf 159: VStateless_class& cclass=COMPILE(source, aclass, name, base_class, file);
1.1 paf 160:
1.4 paf 161: // locate and execute possible @auto[] static method
1.25 paf 162: execute_method(cclass, *auto_method_name, false /*no result needed*/);
1.16 paf 163: return &cclass;
1.20 paf 164: }
165:
166: void Request::fail_if_junction_(bool is,
1.26 paf 167: Value& value, const String& method_name, char *msg) {
1.20 paf 168:
169: // fail_if_junction(true, junction = fail
170: // fail_if_junction(false, not junction = fail
171: if((value.get_junction()!=0) ^ !is)
172: THROW(0, 0,
173: &method_name,
174: msg);
1.19 paf 175: }
176:
177: char *Request::relative(const char *path, const char *file) {
1.21 paf 178: char *result=(char *)malloc(strlen(path)+strlen(file)+1);
1.19 paf 179: strcpy(result, path);
180: rsplit(result,'/');
181: strcat(result, "/");
182: strcat(result, file);
183: return result;
184: }
185:
186: char *Request::absolute(const char *name) {
187: if(name[0]=='/') {
1.28 paf 188: char *result=(char *)malloc(strlen(fdocument_root)+strlen(name)+1);
189: strcpy(result, fdocument_root);
1.19 paf 190: strcat(result, name);
191: return result;
192: } else
1.28 paf 193: return relative(fpage_filespec, name);
1.1 paf 194: }
E-mail: