Annotation of parser3/src/doc/doxygen.txt, revision 1.3
1.1 paf 1: /** @mainpage
1.3 ! paf 2:
! 3:
! 4: @section Targets Targets
! 5:
! 6: Parser, варианты сборки [/targets]:
! 7: - apache 1.3 модуль [apache13/];
! 8: - CGI скрипт [cgi/];
! 9: - ISAPI extension [isapi/].
! 10:
! 11: Каждый вариант реализует pure virtual static SAPI класс - интерфейс общения Parser'а с сервером,
! 12: и функции выделения памяти Pool класса - задаёт способ выделения памяти.
! 13:
! 14: Сначала создаётся объект Request, ему передаётся Request::Info с параметрами запроса.
! 15: После чего выполняется метод Request::core, выполняющий всю обработку.
! 16:
! 17:
! 18: @section Pooled Pooled
! 19:
! 20: Работа с памятью происходит так: все выделения происходят через Pool::malloc и Pool::calloc,
! 21: для удобства имеется Pooled родитель, инкапсулирующий класс Pool, и имеющий одноимённые обёртки:
! 22: Pooled::malloc и Pooled::calloc, а также функцию Pooled::pool() для доступа к самому pool'у.
! 23: Когда освобождается память зависит от варианта сборки:
! 24: - apache: делает это за модуля;
! 25: - CGI: вообще ничего не освобождает, смерть процесса всё списывает;
! 26: - ISAPI extension: освобождается в Pooled:~Pooled().
! 27:
! 28: Работа с исключениями происходит через класс Exception, инкапсулированный в Pooled.
! 29: Для доступа к нему имеется функция Pooled::exception().
! 30: Если возникает проблема, её следует THROW. И где-то CATCH.
! 31:
! 32:
! 33: @section String String
! 34:
! 35: В памяти строки[String] хранятся в виде списка фрагментов[String::Chunk::Row .item],
! 36: каждый помнит язык, на котором написан фрагмент.
! 37: Фрагменты, полученные из скриптов считаются чистыми(String::Untaint_lang ::UL_CLEAN),
! 38: а от пользователя - из environment, из form, с диска[table:load] или из sql сервера[table:sql]
! 39: считаются испачканными(String::Untaint_lang ::UL_TAINTED),
! 40: при операциях со строкой её могут расделять на части, но получающиеся части по-прежнему помнят свой язык.
! 41: Строку могут записать в Request.wcontext, задав ей язык.
! 42: При этом язык задаётся всем её испачканным частям, они становятся не неопределённо грязными[UL_TAINTED],
! 43: а "грязными, но известно, что нужно с ними сделать, чтобы стали чистыми, т.е. известен их язык".
! 44: скажем
! 45: @verbatim
! 46: ^table:sql{insert into news (title) values ('$form:title')]
! 47: @endverbatim
! 48: при обработке параметра посредством Temp_lang выставляется "текущий язык"[Request::flang],
! 49: и при записи[Request::write_assign_lang] UL_TAINTED строки из $form:title фрагмента параметра
! 50: метода sql, находящегося в кавычках, получает язык UL_SQL.
! 51:
! 52: String можно преобразовать в обычную С-строку, используя String::cstr().
! 53: При этом будут учтены языки фрагментов и произведены соответствующие вычищения.
! 54: Также можно воспользоваться String::cstr(String::Untaint_lang), при этом будет все фрагменты строки
! 55: насильно будути считаться написаннами на этом языке. Безотносительно к указанному во фрагменте языку.
! 56: Такое используется, например, для работы с именами файлов:
! 57: @verbatim
! 58: ^table:load[$form:file_name]
! 59: @endverbatim
! 60: здесь при обычной обработке $form:file_name вышел бы UL_USER_HTML, а нужен UL_FILE_NAME,
! 61: при этом глупо всё время подобное делать, как для table:sql, настаивая на {} параметрах.
! 62:
! 63: Обычным языком вывода является String::Untaint_lang::UL_USER_HTML,
! 64: исключение составляет CGI скрипт, который запускают вне веб-сервера,
! 65: в этом случае используется язык UL_AS_IS.
! 66:
1.1 paf 67:
68: @section Compiler Compiler
1.3 ! paf 69:
! 70: Входной код предварительно компилируется во внутренний формат.
! 71: Это происходит с каждым запросом, результат компиляции не кэшируется.
! 72: На выходе получается VStateless_class, т.е.
! 73: - название: VStateless_class::name();
! 74: - родитель: VStateless_class::base();
! 75: - ворох методов: VStateless_class::fmethods, Method.
! 76:
! 77: этот класс складывается в Hash Request.classes().
! 78:
! 79: @see compile.y, compile.C, compile_tools.h, compile_tools.C
! 80:
! 81:
1.1 paf 82: @section Executor Executor
1.3 ! paf 83:
! 84: Код во внутреннем формате затем исполняется.
! 85: Методы[Method] могут быть
! 86: - native: добавляются VStateless_class::add_native_method, и имеют непустой Method::native_code
! 87: - parser: добавляются VStateless_class::add_method, и имеют непустой Method::parser_code
! 88:
! 89: @see execute.C
! 90:
1.1 paf 91: @section module module
1.3 ! paf 92:
! 93: Все исходные файлы называются модулями, и имеют синтаксис:
! 94: @verbatim
! 95: @CLASS
! 96: Имя_класса
! 97:
! 98: @BASE
! 99: Имя_базового_класса
! 100:
! 101: @USE
! 102: Список
! 103: Модулей
! 104: Которые
! 105: Нужны
! 106: В
! 107: Этом
! 108: Модуле
! 109:
! 110: @метод1[параметр1;параметр2][локальная_переменная1;локальная_переменная2] комментарий
! 111: тело метода
! 112: @endverbatim
! 113:
! 114: при этом CLASS, BASE, USE части необязательны.
! 115: Запрашиваемый пользователем документ, компилируется в класс с предопределённым названием "MAIN", и его имя сменить нельзя.
! 116: Файл с именем auto.p, найденный в том же каталоге, где запрошенный пользователем документ,
! 117: компилируется в безымянный[на деле, тоже в имя "MAIN"] класс, и становится родителем класса, в который скомпилировался
! 118: запрошенный пользователем документ.
! 119: Файл auto.p из ../ каталога, компилируется в родителя следующего уровня, и так далее.
! 120: Дополнительно:
! 121: - apache: файл auto.p из каталога,
! 122: задаваемого директивой parser_site_auto_path[допустима в любом месте],
! 123: а затем, parser_root_auto_path[допустима только в конфиге сервера]
! 124: - CGI: файл auto.p из каталога, рядом с бинарником скрипта[обычно cgi-bin],
! 125: а затем из windows directory [c:\winnt] под windows и из $HOME под unix.
! 126: - ISAPI: файл auto.p из windows directory [c:\winnt]
! 127:
! 128:
1.1 paf 129: @section Value Value
1.3 ! paf 130:
! 131:
! 132:
1.1 paf 133: @section Class Class
134: @section Object Object
135: */
E-mail: