Annotation of parser3/src/doc/doxygen.txt, revision 1.4

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: Это происходит с каждым запросом, результат компиляции не кэшируется.
1.4     ! paf        72: На выходе получается \b класс, который складывается в Hash Request.classes().
1.3       paf        73: 
                     74: @see compile.y, compile.C, compile_tools.h, compile_tools.C
                     75: 
                     76: 
1.1       paf        77: @section Executor Executor
1.3       paf        78: 
                     79: Код во внутреннем формате затем исполняется.
                     80: Методы[Method] могут быть 
                     81: - native: добавляются VStateless_class::add_native_method, и имеют непустой Method::native_code
                     82: - parser: добавляются VStateless_class::add_method, и имеют непустой Method::parser_code
                     83: 
                     84: @see execute.C
                     85: 
1.1       paf        86: @section module module
1.3       paf        87: 
                     88: Все исходные файлы называются модулями, и имеют синтаксис:
                     89: @verbatim
                     90: @CLASS
                     91: Имя_класса
                     92: 
                     93: @BASE
                     94: Имя_базового_класса
                     95: 
                     96: @USE
                     97: Список
                     98: Модулей
                     99: Которые
                    100: Нужны
                    101: В
                    102: Этом
                    103: Модуле
                    104: 
                    105: @метод1[параметр1;параметр2][локальная_переменная1;локальная_переменная2] комментарий
                    106: тело метода
                    107: @endverbatim
                    108: 
                    109: при этом CLASS, BASE, USE части необязательны.
                    110: Запрашиваемый пользователем документ, компилируется в класс с предопределённым названием "MAIN", и его имя сменить нельзя.
1.4     ! paf       111: Файл с именем auto.p, найденный в том же каталоге, где и запрошенный пользователем документ, 
1.3       paf       112: компилируется в безымянный[на деле, тоже в имя "MAIN"] класс, и становится родителем класса, в который скомпилировался
                    113: запрошенный пользователем документ.
                    114: Файл auto.p из ../ каталога, компилируется в родителя следующего уровня, и так далее.
                    115: Дополнительно:
                    116: - apache: файл auto.p из каталога, 
                    117:   задаваемого директивой parser_site_auto_path[допустима в любом месте], 
                    118:   а затем, parser_root_auto_path[допустима только в конфиге сервера]
                    119: - CGI: файл auto.p из каталога, рядом с бинарником скрипта[обычно cgi-bin],
                    120:   а затем из windows directory [c:\winnt] под windows и из $HOME под unix.
                    121: - ISAPI: файл auto.p из windows directory [c:\winnt] 
                    122: 
                    123: 
1.1       paf       124: @section Value Value
1.3       paf       125: 
1.4     ! paf       126: Значения, которыми оперирует Parser, есть экземпляры классов, производных от Value.
        !           127: Value знает своё имя [Value::name] и тип [Value::type], которые используются для выводов сообщений об ошибках.
        !           128: Тип также можно проверить в
        !           129: @verbatim
        !           130: ^if($variable is hash){когда в переменной hash}{когда не hash}
        !           131: @endverbatim
        !           132: 
        !           133: Value может хранить элементы [Value::get_element, Value::put_element].
        !           134: Самый простой случай - hash[VHash].
1.3       paf       135: 
                    136: 
1.1       paf       137: @section Class Class
1.4     ! paf       138: 
        !           139: Класс хранит
        !           140: - родителя: VStateless_class::base();
        !           141: - ворох методов: VStateless_class::fmethods, Method.
        !           142: - поля: VClass::ffields
        !           143: 
        !           144: в VStateless_class::get_element отдаётся метод+self[VJunction].
        !           145: в VClass_class::get_element отдаются статические поля
        !           146: 
        !           147: 
1.1       paf       148: @section Object Object
1.4     ! paf       149: 
        !           150: Объект[VObject], это экземпляр Класса.
        !           151: Хранит поля: VObject::ffields (динамические, не статические - тех хранит Класс).
        !           152: 
        !           153: 
        !           154: @section Aliased Aliased
        !           155: 
        !           156: При выполнении метода Объекта или Класса, бывает так, что 
        !           157: управление попадает вверх к методу родительского класса,
        !           158: и потом вниз, к методу производного класса.
        !           159: При этом необходимо искать всякий раз в разных таблицах методов,
        !           160: если, конечно, не пытаться объединить таблицу методов в один общий Hash.
        !           161: Было решено не объединять, для упрощения конструкции, чтобы "каждый за себя".
        !           162: Соответственно, в какой-то момент необходимо "переключить текущий набор методов/статических переменных",
        !           163: т.е. работать с текущим классом, как будто он - другой класс (родитель текущего, затем ребёнок того родителя).
        !           164: Так появился VAliased, прародитель Классов/Объектов, 
        !           165: который хранит "текущий используемый класс", назовём его "псевдоним"[Valiased::fclass_alias].
        !           166: 
        !           167: Изначально  VClass/VObject устанавливает alias в "мой_класс"/this.
        !           168: А затем, при переходе управления от метода ребёнка к методу родителя, псевдоним меняется[Temp_alias].
        !           169: 
1.1       paf       170: */

E-mail: