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: