Тип регистра ввода-вывода pgoblin_io. Группа IO_PATH flags & PGOBLIN_PATHPARM flags & PGOBLIN_FREEPATH flags & PGOBLIN_FILEOVER path Для исходного значения должны выполняться условия: if (!(flags & PGOBLIN_PATHPARM)) { !(flags & PGOBLIN_FREEPATH) && !(flags & PGOBLIN_FILEOVER) && path == NULL } else { !!path } && if (!path) { !(flags & PGOBLIN_FREEPATH) && !(flags & PGOBLIN_FILEOVER) } && if (!!path) { flags & PGOBLIN_PATHPARM и path обязательно указывает на строку, оканчивающуюся \0 } Кроме того, если (flags & PGOBLIN_PATHPARM) и (flags & PGOBLIN_FREEPATH), то зануление PGOBLIN_PATHPARM и path должно обязательно сопровождаться free(path) перед занулением. Если (flags & PGOBLIN_PATHPARM) и !(flags & PGOBLIN_FREEPATH), то free(path) перед занулением не делается. Группа IO_TEXT flags & PGOBLIN_TEXTPARM flags & PGOBLIN_BINPARM flags & PGOBLIN_FREETEXT text length Для исходного значения должны выполняться условия: if (!(flags & PGOBLIN_TEXTPARM)) { !(flags & PGOBLIN_FREETEXT) && !(flags & PGOBLIN_BINPARM) && text == NULL && length == 0 } else { !!text } && if (!text) { !(flags & PGOBLIN_FREETEXT) && !(flags & PGOBLIN_BINPARM) && length == 0 } && if (!!text) { flags & PGOBLIN_TEXTPARM } && if (!!length) { (flags & PGOBLIN_TEXTPARM) && !!text } && if (!!text && !(flags & PGOBLIN_BINPARM)) { text обязательно указывает на строку и *(text + length) == '\0' Внутри строки могут быть '\0'. } Кроме того, если (flags & PGOBLIN_TEXTPARM) и (flags & PGOBLIN_FREETEXT), то зануление PGOBLIN_TEXTPARM и text должно обязательно сопровождаться free(text) перед занулением. Если (flags & PGOBLIN_TEXTPARM) и !(flags & PGOBLIN_FREETEXT), то free(text) перед занулением не делается. Группа IO_MIFE flags & PGOBLIN_MIFEDES flags & PGOBLIN_FREEMIFE mife pid offset Для исходного значения должны выполняться условия: if (!(flags & PGOBLIN_MIFEDES)) { !(flags & PGOBLIN_FREEMIFE) && mife == NULL && pid == 0 && offset == 0 } else { !!mife } && if (!mife) { !(flags & PGOBLIN_FREEMIFE) && pid == 0 && offset == 0 } && if (!!mife) { flags & PGOBLIN_MIFEDES } && if (!!pid) { flags & PGOBLIN_MIFEDES } && if (!!offset) { flags & PGOBLIN_MIFEDES } Кроме того, если (flags & PGOBLIN_MIFEDES) и (flags & PGOBLIN_FREEMIFE), то зануление PGOBLIN_MIFEDES и mife должно обязательно сопровождаться mife_close(mife) перед занулением. Если (flags & PGOBLIN_MIFEDES) и !(flags & PGOBLIN_FREEMIFE), то mife_close(mife) перед занулением не делается. pid - это PID процесса, открытого неявным форком для поставки данных в этот mife_descriptor. offset используется для эмуляции последовательного доступа, всегда относительно начала файла, независимо от положения окна доступа в открытом этим mife файле. Группа IO_PQ flags & PGOBLIN_PQRESULT flags & PGOBLIN_FREEPQRE pq flagc Для исходного значения должны выполняться условия: if (!(flags & PGOBLIN_PQRESULT)) { !(flags & PGOBLIN_FREEPQRE) && pq == NULL && flagc == 0 } else { !!pq } && if (!pq) { !(flags & PGOBLIN_FREEPQRE) && flagc == 0 } && if (!!pq) { flags & PGOBLIN_PQRESULT } && if (!!flagc) { flags & PGOBLIN_PQRESULT } Кроме того, если (flags & PGOBLIN_PQRESULT) и (flags & PGOBLIN_FREEPQRE), то зануление PGOBLIN_PQRESULT и pq должно обязательно сопровождаться pgoblin.dbasetable[flagc & PGOBLIN_DB_TYPE]->clear(pq) перед занулением. Если (flags & PGOBLIN_PQRESULT) и !(flags & PGOBLIN_FREEPQRE), то pgoblin.dbasetable[flagc & PGOBLIN_DB_TYPE]->clear(pq) перед занулением не делается. Когда заполняется pq, то flagc должно копироваться из pgoblin_conn.flags того регистра базы, из которого получен результат pq. Группа IO_OUT flags & PGOBLIN_OUTSET flags & PGOBLIN_FREEOUTS wri clo onu Всегда должны выполняться условия: if (!(flags & PGOBLIN_OUTSET)) { !(flags & PGOBLIN_FREEOUTS) && wri == 0 && clo == NULL && onu == 0 } else { !!wri } && if (!wri) { !(flags & PGOBLIN_FREEOUTS) && clo == NULL && onu == 0 } && if (!!clo) { (flags & PGOBLIN_OUTSET) && !!wri } && if (!!onu) { (flags & PGOBLIN_OUTSET) && !!wri } if (flags & PGOBLIN_FREEOUTS) { !!clo && !!wri } Кроме того, если (flags & PGOBLIN_OUTSET) и (flags & PGOBLIN_FREEOUTS), то зануление PGOBLIN_OUTSET и wri должно обязательно сопровождаться clo(onu) перед занулением. Если (flags & PGOBLIN_OUTSET) и !(flags & PGOBLIN_FREEOUTS), то clo(onu) перед занулением не делается. wri - это write(2) или mife_writ(3), clo - это обычно close(2), onu - дескриптор файла. Значения из групп IO_PATH, IO_TEXT, IO_MIFE, IO_PQ могут приводиться в другую группу из этого же множества (может, не все возможные приведения сейчас реализованы), значения, полученные из другой группы, называются производными значениями. Для каждого производного значения действуют те же правила, что и для исходных, за исключением отметки в битах PGOBLIN_PATHPARM, PGOBLIN_TEXTPARM, PGOBLIN_MIFEDES, PGOBLIN_PQRESULT - отсутствие этой отметки обозначает производность значения. Это правило может не выполняться для 0го регистра - там постоянные Po|Pm и все остальное оттуда выгружается на каждом цикле интерпретатора. В остальных регистрах наличие Po в конце цикла интерпретатора приводит к выгрузке в него любых появившихся значений. Подключаемые интерпретаторы стиля. Каждый интерпретатор занимает один элемент массива структур pgoblin.styletable. В каждой структуре имеются следующие поля: name - указатель на текстовую строку - имя интерпретатора. parser - процедура, укладывающая внутреннее представление стиля в регистр стиля. Параметры: reg_style - регистр, куда надо поместить стиль. in - исходный текст стиля. dump - Процедура, которая выводит внутреннее представление стиля в читаемом виде. Параметры: reg_style - регистр, откуда выводить стиль. free - Процедура, освобождающая память из-под стиля. Параметр: reg_style - регистр, который надо освободить. get - Процедура, которая выдает строку с запрошенным именем. Параметры: reg_style - регистр стиля. stringname - имя строки. table - Процедура, которая выводит pq в заданный выходной регистр. Параметры: reg_out - выходной регистр. reg_style - регистр стиля. reg_in - входной регистр. low - номер первой строки в таблице. hig - номер за последней строкой таблицы. Во входном регистре должна быть готовая для вывода таблица. hig может иметь специальные значения: -2 - номер за последней строкой надо рассчитать из low и содержимого reg_in, при этом в low должно быть правильное значение и в reg_in должен содержаться конец таблицы. -1 - конец таблицы неизвестен. low может иметь специальное значение: -1 - начало таблицы неизвестно.