File:  [parser3project] / parser3 / src / doc / string.dox
Revision 1.5: download - view: text, annotated - select for diffs - revision graph
Thu Jul 24 11:31:20 2003 UTC (22 years, 10 months ago) by paf
Branches: MAIN
CVS tags: release_3_1_2, release_3_1_1, release_3_1_0, HEAD
moved tempate_gc to HEAD

/**	@page String String

В памяти строки[String] хранятся в виде букв, и списка фрагментов[String::Fragment] язык фрагмента+его длина.
Фрагменты, полученные из stdout скриптов считаются чистыми(String::Language ::L_CLEAN),
а от пользователя - из stderr скриптов, из environment, из form, с диска[table:load] или из sql сервера[table:sql] 
считаются испачканными(String::Language ::UL_TAINTED), 
при операциях со строкой её могут расделять на части, но получающиеся части по-прежнему помнят языки своих фрагментов.
Строку могут записать в Request::wcontext, задав ей язык. 
При этом язык задаётся всем её испачканным частям, они становятся не неопределённо грязными[L_TAINTED], 
а "грязными, но известно, что нужно с ними сделать, чтобы стали чистыми, т.е. известен их язык".
скажем
@verbatim
^void:sql{insert into news (title) values ('$form:title')]
@endverbatim
при обработке параметра посредством Temp_lang выставляется "текущий язык"[Request::flang],
и при записи[Request::write_assign_lang] L_TAINTED строки из $form:title фрагмента параметра
метода sql, находящегося в кавычках, получает язык L_SQL.

String можно преобразовать в обычную С-строку, используя String::cstr().
Если задать String::cstr(String::L_UNSPECIFIED), то
при преобразовании будут учтены языки фрагментов и произведены соответствующие вычищения.
Также можно воспользоваться String::cstr(String::Language) [по-умолчанию =L_AS_IS], 
при этом будет все фрагменты строки насильно будут считаться написанными на этом языке 
безотносительно к указанному во фрагменте языку.
Такое используется, например, для работы с именами файлов 
[ВНИМАНИЕ: никогда и нигде не используйте эту конструкцию, если вам дороги ваши секретные файлы, 
используется только для примера]:
@verbatim
$file[^table::load[$form:file_name]]
@endverbatim
здесь при обычной обработке $form:file_name вышел бы L_HTML|L_OPTIMIZE_BIT, а нужен L_FILE_SPEC,
при этом глупо всё время подобное делать, как для table:sql, настаивая на {} параметрах.

Обычным языком вывода является String::Language::L_HTML|String::Language::L_OPTIMIZE_BIT, 
исключение составляет CGI скрипт, который запускают вне веб-сервера,
в этом случае используется язык String::Language::L_AS_IS.

В фрагментах, язык которых помечен как OPTIMIZED (String::Language::L_OPTIMIZE_BIT), 
при преобразовании в строку String::cstr  будут оптимизированы whitespace символы: 
из нескольких идущих подряд символов будет оставлен первый, остальные в результат не попадут.

При работе с char* считается, что он никогда не может быть 0.
*/

E-mail: