UIL

UIL — !! Формат файлов языка описания интерфейса пользователя

Использование

MODULE module_name
  [ NAMES = CASE_INSENSITIVE | CASE_SENSITIVE ]
  [ CHARACTER_SET = character_set ]
  [ OBJECTS = { widget_name = GADGET | WIDGET; [...] } ]
  { [
    [ value_section ] |
    [ procedure_section ] |
    [ list_section ] |
    [ object_section ] |
    [ identifier_section ]
    [ ... ]
  ] }
END MODULE;

Описание

Язык UIL используется для описания начального состояния интерфейса пользователя для приложений основанных на виджетах. UIL описывает используемые в интерфейсе пользователя виджеты, ресурсы этих виджетов и процедуры обратного вызова для этих виджетов. Файлы UIL компилируются в файлы UID при помощи команды uil или при помощи вызова подпрограммы вызываемого компилятора Uil. Содержимое откомпилированного UIL файла может быть получено с помощью различных подпрограмм менеджера ресурсов Motif (Motif Resource Manager -- MRM) внутри прикладной программы.

UID файлы не зависят от платформы на которой должна запускаться Motif программа. Другими словами, одни и те же UID файлы могут использоваться на любых системах поддерживающих Motif.

Замечание

От переводчика: в предыдущем параграфе вероятно имеется ошибка. Дело в том, что в версии Motif 2.1 многократно повторялось, что для откомпилированного файла описания интерфейса используется формат, различный для машин с разной длинной слова.

Файл

UIL файл содержит один полный модуль, в соответствии с синткасисом, определенным выше; либо, если файл подключается к большому UIL файлу, одну полую секцию в соответствии с ниже описанным синтаксисом.

UIL является языком свободной формы. Это обозначает, что все высокоуровневые конструкции, такие как определения объектов и значениц, не обязаны начинаться в какой-либо конкретной колонке и может быть разбито на любое число строк. Низкоуровневые конструкции, такие как ключевые слова и знаки пунктуации, также могут распологаться в любых колонках, однако это не относится к строковым литералам и комментариям, которые не могут разбиваться на строки.

Компилятор UIL обрабатывает строки с длинной не превышающей 132 символов.

MODULE module_name

Имя под которым UIL модуль будет известен в UIL файле. Это имя сохраняется в UIL файле для последующего использования при извлечении ресурсов посредством MRM. Это имя в UID файле всегда сохраняется заглавными буквами.

NAMES = CASE_INSENSITIVE | CASE_SENSITIVE

Указывает должны ли имена интерпретироваться как зависимые или независимые от регистра. По умолчанию имена зависят от регистра. Оператор назначения зависимости от регистра дожен быть первым оператором в заголовке модуля и, в любом случае, должен стоять перед первым выражением, содержащим имя. Если имена в UIL можуле зависят от регистра, то ключевые слова в этом модуле должны записываться строчными буквами. Каждое имя сохраняется в UIL файле в том же регистре в котором использовалось в UID модуле. Если имена независимы от регистра, то ключевые слова могут быть записаны заглавными, строчными или комбинацией строчных и заглавных букв. В этом случае в UIL файл записываются эквиваленты имен с использование заглавных букв.

CHARACTER_SET = character_set

Определяет набор символов по умолчанию, используемый для строковых литералов модуля если для них явно не указан набор знаков. Набором символов по умолчанию, в случае отсутствия этого оператора, является компонента набора символов из переменной среды окружения LANG или значение XmFALLBACK_CHARSET если переменная среды окружения LANG не задана или не содержит компоненту набора символов. Значение XmFALLBACK_CHARSET определяется поставщиком компилятора UIL, и обычно определено как ISO8859-1 (что эквивалентно ISO_LATIN1). использование этого оператора отключает обработку всех локализованных строковых литералов включенную флагом -s компилятора или элементом use_setlocale_flag структуры данных Uil_command_type.

OBJECTS = { widget_name = GADGET | WIDGET; }

Определяет какая форма (виджет или гаджет) управляющих компонент с именем класса widget_name должна использоваться по умолчанию. По умолчанию используется форма виджета, поэтому обычно в этом операторе обычно используется только ключевое слово GADGET. Указанный управляющий компонент должет иметь обе формы (и виджета и гаджета). К таким управляющим элементам относятся XmCascadeButton, XmLabel, XmPushButton, XmSeparator и XmToggleButton. При необходимости задать форму более одного управляющего элемента, они перечисляются через точку с запятой. Форма (виджет или гаджет) для конкретного экземпляра управляющего элемента может быть определена путем указания соответствующего ключевого слова (GADGET или WIDGET) в определении конкретного объекта.

value_section

Используется для присвоения имен значениям выражений или литералам. Имя значения затем может использоваться в любом месте UIL модуля, где в контексте может использоваться это значение. Имена значений могут использоваться до их определения. Полное описание раздела значений приводится ниже.

procedure_section

Определяет процедуры обратного вызова используемые виджетами и процедуры создания для определяемых пользователем виджетов. Эти определения используются для проверки ошибок. Более полная информация о разделе процедур приведена ниже.

list_section

Предоставляет возможность объединения в единое целое набора параметров, управляющих элементов (дочерних виджетов), процедур обратного вызова и обычных процедур для последующего использования в UIL модуле. Списки могут содержать вложенные списки, таким образом давая возможность не только создавать иерархию, но и более ясно определять какие параметры, управляющие элементы, процедуры обратного вызова и обычные процедуры являются общими и для каких виджетов. раздел списков более подробно обсуждается ниже.

object_section

Определяет объекты, составляющие интерфейс пользователя программы. На имя объекта, объывленное в определении, можно ссылаться везде в пределах UIL модуля, в контексте, где может быть использовано имя объекта (например, в списке управляющих элементов, как символическая ссылка на идентификатор виджета, или в параметре tag_value для процедур обратного вызова. Объекты могут использоваться до их определения. Раздел объектов более подробно описывается ниже.

identifier_section

Определяет привязки реальных данных времени исполнения к именам, использующимся в UIL модуле. Раздел идентификаторов более подробно описан ниже.

UIL файл также может содержать комментарии и директивы подключения, которые описаны вместе с другими основными элементами формата UIL файлов в последующих разделах.

Комментарии

Комментарии могут иметь одну из следующих форм:

Ни одна из форм комментариев не может быть вложена.

Раздел значений

Раздел значений состоит из ключевого слова VALUE за которым следует последовательность определений значений. Она имеют следующий синтаксис:
 VALUE value_name : [ EXPORTED | PRIVATE ]value_expression |
IMPORTED value_type; 
Здесь значений выражения value_expression назначается имени value_name или же импортированному значению с именем value_name назначается тип value_type. Определения значений прдоставляют возможность назначить имя некоторому выражению или литералу. После этого возможно использование имени в любом месте UIL файла, где контекст позволяет использование значения. Имена значений могут использоваться до их определения.

EXPORTED

Значение, определенное как экспортируемое, сохраняется в UID файле как именованный ресурс, и затем может быть использовано для ссылок по имени из других UID файлов. Когда значение определено как экспортируемое MRM во время исполнения производит поиск реального значения за пределами модуля, в котором определено это значение.

PRIVATE

Приватным является значение которое не определено как экспротируемое или импортируемое. Значение, определенное как приватное, не сохраняется в виде отдельного ресурса в UID файле. Ссылки на приватное значение возможно только внутри UIL модуля в котором оно определено. Значение или объект на которое ссылается имя интегрируется непосредственно в то место UIL модуля где находится ссылка.

IMPORTED

Значение, определенное как импортированное, определяется в UID файле как именованный ресурс. MRM разрешает это определение с соответствующим определением экспорта во время выполнения приложения.

По умолчанию значения и объекты являются приватными. UIL поддерживает следующие типы данных для значений:

Раздел процедур

Раздел процедур состоит из ключевого слова PROCEDURE и последующих определений процеду. Она имеет следующий синтаксис:
PROCEDURE
   procedure [ ( [ value_type] ) ];

Определение процедур используется для определения:

Имя процедуры может использоваться в UIL модуле везде, где контекст предпологает или позволяет использование процедуры. Процедуры могут использоваться до их определения. Нельзя использовать имя, уже использованное в другом контексте, как имя процедуры.

В определении процедуры имеется возможность указать какие параметры будут передаваться соответствующей процедуре обратного вызова во время исполнения. Этот параметр называется тэгом процедуры обратного вызова. Можно определить тип данных тэга процедуры обратного вызова посредством указания типа данных в круглых скобках непосредственно за именем процедуры. При компиляции модуля UIL компилятор проверяет чтобы параметр, передаваемый указываемой процедуре, имел необходимый тип. Имейте в виду, что тип данных тэга процедуры обратного вызова должен быть одним из допустимых в UIL типов данных. В качестве тэга процедуры обратного вызова можно использовать виджет, если он определен на том же уровне иерархии виджетов, что и процедура обратного вызова, иными словами, если они имеют одного общего родителя то они находятся на одном уровне иерархии.

Следующий список обобщает метеодику проверки UIL компилятором типов и количества аргументов в зависимости от определения процедуры.

Переметры отсутствуют

Не выполняется никакой проверки типов и количества параметров. в ссылке на процедуру допускается не использовать параметры или указывать один параметр.

( )

Производится проверка на отсутствие параметров.

(ANY)

Проверяется, чтобы присутствовал один параметр. Не производится проверки типа параметра. Тип ANY используется для подавления проверки типа тэга процедуры обратного вызова.

(type

Производится проверка наличия одного параметра указанного типа.

(class_name

Проверяется наличие одного виджета указанного класса виджетов.

Поскольку для указания типа данных тэга процедуры обратного вызова имеется возможность указывать любой тип данных UIL, необходимо иметь возможность представления этого типа в программе на используемом языке программирования. Некоторые типы данных (такие, как целые, булевые и строки), являясь общими типами данных, распознаются большинством языков программирования. Другие типы данных UIL (такие, как таблицы строк) являются более сложными и могут потребовать установить соответствующую структуру данных в приложении при передаче тэга этого типа процедуру обратного вызова.

Имеется возможность использования определения процедуры для указания функции создания определенного пользователем виджета. В этом случае необходимо указать, что формальные параметры не используются. Процедура вызывается с тремя стандартными аргументами, передаваемыми всем функциям создания виджетов. (См. документацию на набор компонентов Motif для получения дополнительной информации об аргументах функций создания виджетов.)

Раздел списков

Раздел списков состоит из ключевого слова LIST и последующих определений списков. Он имеет следующий синтаксис:
LIST
   list_name: { list_item; [...] }
   [...]

Разделы списков можно использовать для группирования набора аргументов, управляемых компонентов (потомков), процедур обратного вызова и обычных процедур для последующего использования в UIL модуле. Списки могут содержать другие списки, таким образом предоставляяя возможность создавать иерархию для наглядно определяя какие параметы, управляемые элементы, процедуры обратного вызова и обычные процедуры являются общими и для каких виджетов. Нельзя смешивать различные виды списков, список конкретного типа на может содержать элементов списка другого вида или ссылаться на имя списка другого вида. Имя списка всегда является приватным для UIL модуля в котором список определен и не может сохраняться как именованный ресурс в UID файле.

В последующих разделах описываются различные типы списков.

Структура списка параметров

Список параметров определяет какие параметры должны быть определены в спике параметров при вызове процедуры создания конкретного объекта во время исполнения программы. Список параметров также определяет значения для этих параметров. Список параметров имеет следующий синтаксис:
LIST
   list_name: ARGUMENTS {
      argument_name = value_expression;
      [...] }
   [...]

Имя параметра должно быть либо встроенным именем параметра, либо именеи параметра который определен функцией ARGUMENT.

Если используется встроенное имя параметра как элемент списка параметров при определении объекта, то UIL компилятор проводит проверку на поддержку указанного параметра типом определяемого объекта. Если одно и то же имя параметра появится в списке параметор несколько раз, то самое последний элемент перекроет все предыдущие элементы, использующие то же имя параметра, а компилятор выведет предупреждение.

Некоторые параметры, такие как XmNitems и XmNitemCount, объединяются UIL компилятором. Когда указывается значение одного из параметров, компилятор также устанавливает и другие. Объединенные параметры не доступны программисту.

Наборы компонентов Motif и X Toolkit поддерживают параметры ограничений. параметры ограничений передаются их владельцем своим дочерним объектам, после чего эти параметры становятся доступны. Например, виджет XmForm передает своим потомкам целый набор параметров ограничений. Эти параметры управляют положением потомков внутри самой формы.

В отличии от параметров используемых для определения характеристик конкретного виджета, параметры ограничений используются исключительно для определния дополнительных характеристик потомков конкретного виджета. Для передачи парамтров ограничений потомкам, необходимо включить эти параметры в список аргументов потомка.

См. Прил. A для получения информации о поддержке конкретных параметров конкретными виджетами. См. Прил. B для получения информации о допустимых типах значений для каждого встроенного параметра.

Структура списков процедур обратного вызова

Списки процедур обратного вызова используются для определения того, какие причины обратного вызова обрабатываются для конкретного виджета во время исполнения. Список процедур обратного вызова имеет следующий синтаксис:
LIST
   list_name: CALLBACKS {
      reason_name = PROCEDURE procedure_name [ ( [ value_expression ] ) ];
    | reason_name = procedure_list;
      [...] }
   [...]

Для виджетов набора компонентов Motif имя причины должно быть встроенным именем причины. Для определенных пользователем виджетов используется имя причины, предварительно определенное с использованием функции REASON. Если при определении объекта используется встроенное имя причины, то UIL компиляторпроверяет поддержку этой причины типом определяемого объекта. Прил. B описывает какой объект какие причины поддерживает.

Если имя причины используется в списке несколько раз, то последний элемент списка перекрывает все остальные, использующие то же имя причины, а UIL компилятор выдвет предупреждение.

Если для аргументов процедуры определяется именованное значения (тэг процедуры обратного вызова), то тип данных этого значения должен совпадать с типом, указанным для тэга процедуры обратного вызова в соответствующем определении процедуры. Когда в качестве выражения значения процедуры указывается имя виджета, то перед именем виджета необходимо указывать тип виджета, а также отделять тип виджета от имени с помощью пробела.

Поскольку UIL компилятор создает UID файл, а не файл объектного кода, привязка имен UIL к адресам процедур не производится загрузчиком, а устанавливается во время исполнения с использованием фнукции MrmRigisterNames. Вызов этой функции необходимо производить до извлечения любых объектов, использующих их UIL имена или адреса каждой процедуры обратного вызова. Имя, используемое прикладной программой при регистрации в MRM должно совпадать с именем, определенном для процедуры в UIL модуле.

Каждая процедура обратного вызова принимает три параметра. Первые два параметра похожи для всех процедур обратного вызова. Форма третьего параметра изменяется от объекта к объекту.

Первый параметр представляет адрес структуры данных, поддерживаемой набором компонентов Motif, для экземпляра объекта. Этот адрес называется идентификатором объекта.

Второй параметр является адресом значения, определенного в списке процедур обратного вызова для этой процедуры. Если этот переметр не определялся, то передается NULL адрес. Имейте в виде, что в случае когда в качестве параметра определема строка или XmString, значение указанное в списке процедур обратного вызова всегда представляется адресом, а не самим значением. В случае простой строки передаваемый адрес является адресом первого знака этой строки. В других случаях UIL не добавляет лишний уровень косвенности, а второй аргумент процедуры обратного вызова просто является значением, указанным в списке процедур обратного вызова.

Третий аргумент является именем причины, указанном в списке процедур обратного вызова.

Структура списка управляемых элементов

Список управляемых элементов перечисляет объекты, являющиеся дочерними, или управляемыми, конкретным объектом. Каждый элемент списка управляемых объектов имеет следующий синтаксис:
LIST
   list_name: CONTROLS {
      [child_name: ] [MANAGED | UNMANAGED] object_definition;
      [...] }
   [...]

Если указывается ключевое слово MANAGED, то во время исполнения объект создается и берется на управление; если же указано ключевое слово UNMANAGED, то объект только создается. По умолчанию объекты берутся на управление.

Поле child_name может использоваться для определения ресурсов автоматически создаваемых управляемых объектов. Имена автоматически создаваемых дочерних объектов формируются добавлением Xm_ к имени дочернего виджета. Эти имена указаны в документации на родительский виджет.

В отличии от списков параметров и списков процедур обратного вызова в списках управляемых элементов элемент, идентичный предыдущему, не перекрывает предыдущий элемент. Во время исполнения при создании родительского виджета каждый элемент списка управляемых элементов вызывает создание дочернего объекта. Если схожие определения объектов используются несколько раз, то во время исполнения создается несколько экземпляров объектов. В Прил. B приводится информация о том, какие типы виджетов какими другими виджетами могут управляться.

Структура списка процедур

В UIL имеется возможность указания нескольких процедур для причины обратного вызова посредством определения списка процедур. Также как и списки других типов, списки процедур могут определяться как встраиваемые (т.е. в месте UIL модуля где синтаксисом положен соответствующий элемент), так и в разделе списков с последующей ссылкой по имени.

Если одна и таже причина обратного вызова определена несколько раз (например, когда причина указана как в ссылке на спискок процедур, так и в списке процедур обратного вызова для объекта), предыдущие определения перекрываются последующими. Список процедур имеет следующий синтаксис:
LIST
   list_name: PROCEDURES {
      procedure_name [ ( [ value_expression ] ) ];
      [...] }
   [...]

Когда в качестве значения выражения параметра процедуры используется имя виджета, необходимо перед именем объекта указывать тип объекта, отделяя его от имени пробелом.

Раздел объектов

Раздел объектов начинается ключевым словом OBJECT, за которым следуют определения объектов. Этот раздел имеет следующий синтаксис:
OBJECT object_name:
   [ EXPORTED | PRIVATE | IMPORTED ] object_type
      [ PROCEDURE creation_function ]
      [ object_name [ WIDGET | GADGET ] | { list_definitions } ]

Определение объектов используется для описания объектов, сохраняемых в UID файле. Ссылаться на имя объекта можно в любом месте UIL модуля в любом контексте, где может использоваться имя объекта (например, в списке управляемых элементов (как символическая ссылка на идентификатор виджета) или в параметре tag_value для процедуры обратного вызова). Объекты могут использоваться до их определения, т.е. можно ссылаться на идентификатор объекта до его определения. Объект можно определить как экспортируемый, импортируемый или приватный.

Определение объекта может содержать последовательность списков, которые определяют параметры, иерархию и процедуры обратного вызова для виджета. Для объекта допускается определение только одного списка каждого типа. При определении определяемого пользователем виджета необходимо указать функцию создания для этого виджета.

Замечание

Некоторые виджеты набора компонентов Motif фактически состоят из двух виджетов. Например, XmScrolledText и XmScrolledList состоят из дочернего к XmScrolledWindow вижета XmText (XmList). При создании таких виджетов набор ресурсов доступен обоим указанным виджетам. Иногда это вызывает проблеммы, например, если назначается процедура XmNdestroyCallback для выполнения некоторых действий при уничтожении виджета. В этом случае ресурс процедур обратного вызова оказывается доступен обоим виджетам и вызывает проблеммы при уничтожении виджетов. Для преодоления этих проблемм, вместо использования подобных связанных виджетов необходимо раздельно создать родительский и дочерний виджеты.

Замечание

От переводчика: указанная проблемма возникает только при указании значения ресурса XmNdestroyCallback в списке параметров при создании виджета. Если используется стандартная подпрограмма регистрации процедур обратного вызова XtAddCallback, то подобных проблемм не возникает. Однако необходимо помнить, что возвращаемый функцией создания идентфикатор виджета указывает на виджет XmText (XmList), а для получения доступа к ресурсам XmScrolledWindow необходимо использовать функцию XtParent, возвращающую идентификатор родительского виджета.

Необходимо также заметить, что замена "связки" виджетов типа XmScrolledText и XmScrolledList парой соответствующих виджетов не является простой задачей. При создании виджетов этих классов производится не только создание двух экземпляров необходимых виджетов, но и установка специализированных процедур обратного вызова, например, для осуществления прокрутки.

Ключевые слова GADGET и WIDGET определяют тип объекта и перекрывают соответствующее значение по умолчанию для этого типа объектов. Поле object_type может определять любой тип объекта, в том числе и имя необходимого гаджет варианта объекта (например, XmLabelGadget). Ключевые слова GADGET и WIDGET указываются только при определении объекта, и никогда не используются при ссылке на объект. Для определяемых пользователем виджетов нельзя указывать ключевые слова GADGET и WIDGET, определяемые пользователем объекты всегда являются виджетами.

Раздел идентификаторов

Раздел идентификаторов позволяет определять иденитфикаторы, механизм, позволяющий привязывать данные времени исполнения к именам в UIL модуле. Раздел идентификаторов состоит из ключевого слова IDENTIFIER и последующего списка имен, разделенных точкой с запятой.

IDENTIFIER identifier_name; [...;]

В последствии имена идентификаторов могут использоваться как значения параметров виджетов или как значения тэга процедур обратного вызова. Во время исполнения программа, используя функции MrmRegisterNames и MrmRegisterNamesInHierarchy, должна привязать имена идентификаторов к фактическим данным или, в случае процедур обратного вызова, к адресам данных, связанных с идентификатором.

Каждый UIL модуль имеет единственное пространство имен, т.е. нельзя использовать имя значения, объекта или процедуры в том же модуле в качестве идентификатора.

UIL компилятор не проводит никаких проверок типов для идентификаторов в UIL модуле. В отличии от значений, идентификаторы не имеют связанного с ними UIL типа. Вне зависимости от конкретного типа параметра виджета или тэга процедуры обратного вызова, идентификатор может использоваться вместо значения соответствующего типа.

Для ссылки на значения имен идентификаторов в UIL модуле, просто указывается имя необходимого идентификатора в том месте, где необходимо использовать значение идентификатора.

Директива подключения файлов

Директива подключения файла производит объединение содержимого указанного файла с UIL модулем. Этот механизм дает возможность совместного использования UIL модулями общих определений. Директива подключения файла имеет следующий синтаксис:
INCLUDE FILE file_name;

UIL компилятор заменяет директиву подключения файла содержимым подключаемого файла и обрабатывает его как если бы его содержимое просто было бы написано в текущем исходном файле UIL.

Додключаемые файлы могут быть вложенными, т.е. подключаемый файл сам может содержать директивы подключания файлов. UIL компилятор может обработать до 100 ссылок на подключаемые файлы (включая файл самого UIL модуля). Таким образом имеется возможность подключитб к модулю 99 файлов, включая вложенные. Счетчик ссылок ивеличивается на одни каждый раз, когда открывается файл, т.е. подключение одного файла дважды приведет к использованию двух ссылок.

Поле file_name является строкой, содержащей спецификацию файла, определяющую подключаемый файл. Правила поиска указанного файла похожи на правила поиска файлов заголовков (файлов .h) при использовании директивы #include со строкой заключенной в двойные кавычки в языке C. Для определения каталогов поиска подключаемых файлов UIL компилятор использует параметр -I. Поиск подкючаемых файлов осуществляется следующим образом:

Имена и строки

Имена могут состоять из любых символов от A до Z, от a до z, от 0 до 9, $ (знак доллара) и _ (подчеркивания). Имена не могут начинаться с цифры (от 0 до 9). Максимальная длинна имени ограничена 31 символом.

UIL дает возможность установить чувствительность или нечувствительность имен от регистра знаков с помощью соответствующего оператора в заголовке модуля. Например, если имена чувствительны к регистру, имена "sample" и "Sample" отличаются друг от друга. Если же имена нечувствительны к регистру, то выше приведенные имена представляют одно и тоже имя и могут использоваться совместно. По умолчанию UIL предпологает чувствительность имен к регистру.

В режиме нечувствиткльности к регистру компилятор сохраняет все имена в UID файле в рерхнем регистре. В режиме чувствиельности к регистру, компилятор производит запись имен в том же виде в каком они указаны в UIL файле.

Следующая таблица перечисляет зарезервированные ключевые слова UIL, которые не могут использоваться в качестве имен.

Таблица 6-1. Рарезервированные ключевые слова UIL

ARGUMENTCALLBACKSCONTROLSEND
EXPORTEDFALSEGADGETIDENTIFIER
INCLUDELISTMODULEOFF
ONOBJECTPRIVATEPROCEDURE
PROCEDURESTRUEVALUEWIDGET

Незарезервированные ключевые слова UIL перечислены в следующем списке и таблице. Эти ключевые слова могут использоваться для определения имен, однако если эти ключевые слова используются в качестве имен, то становится невозможным использование соотетствующих этим ключевым словам возможностей UIL. К незарезирвированным ключевым словам UIL относятся:

Таблица 6-2. Незарезервированные ключевые слова UIL

ANYARGUMENTASCIZ_STRING_TABLE
ASCIZ_TABLEBACKGROUNDBOOLEAN
CASE_INSENSITIVECASE_SENSITIVECHARACTER_SET
COLORCOLOR_TABLECOMPOUND_STRING
COMPOUND_STRING_COMPONENTCOMPOUND_STRING_TABLEFILE
FLOATFONTFONT_TABLE
FONTSETFOREGROUNDICON
IMPORTEDINTEGERINTEGER_TABLE
KEYSYMMANAGEDNAMES
OBJECTSREASONRGB
RIGHT_TO_LEFTSINGLE_FLOATSTRING
STRING_TABLETRANSLATION_TABLEUNMANAGED
USER_DEFINEDVERSIONWIDE_CHARACTER
WIDGETXBITMAPFILE 

Строковые литералы могут содержать символы нижнего и верхнего регистров, цифры и знаки пунктуации. Пробелы, табуляции и комментарии являются специальными элементами языка. Они предпологают разделение других элементов, например двух имен. Один и более таких элементов могут встречаться перед или между любыми другими элементами языка. Однако пробелы, табуляции и комментарии, которые содержаться в строковых литералах, распознаются как последовательности символов, а не разделители.

Типы данных

UIL предоставляет возможность задания литералов для некоторых из поддерживаемых типов данных. Некоторые типы значений не поддерживают литеральной нотации (например, пиксельные изобраджения и таблицы строк). Значения для таких типов данных могут указываться с использованием функций, определенных в разделе функций. UIL непосредственно поддерживает следующие типы литералов:

Кроме этого UIL поддерживает тип данных ANY, который используется для отключения проверок типов данных во время компиляции.

Строковые литералы

Строковые литераля являются последовательностью 8-ми, 16-ти битовых символов или их комбинацией заключенных в ' (одиночные кавычки) или " (двойные кавычки). Строковые литералы также могут состоять из многобайтных символов заключенных в двойные кавычки. Строковые литералы не могут содержать более 2000 символов.

Строковые литералы ограниченные одиночными кавычками могут разбиваться на несколько строк. Для продолжения такого литерала на следующей строки необходимо завершить текущую строки символом \ (обратная наклонная черта). Литерал продолжается с первого символа на следующей строке.

Строковые литералы заключенные в двойные кавычки не могут разбиваться на несколько строк. (Поскольку они могут содержать управляющие последовательности и другие специальные символы, невозможно использовать символ обратной наклонной черты для обозначения продолжения строки.) Для построения строкового значения, которое можно расположить на нескольких строках, можно использовать оператор слияния описанный ниже в этом разделе.

Строковые литералы могут использовать один из следующих синтаксисов:
'[character_string]'
[#char_set]"[character_string]"

Оба формата задания строковых литералов связывают набор символов со строковым значением. UIL использует следующие правила для определения набора символов и формата сохранения строковых литералов:

Если в спецификации строки поле char_set не является встроенным набором символов или определенным пользователем набором символом, то для строки устанавливается набор символов XmFONTLIST_DEFAULT_TAG и пользователю выдется информационное сообщение о выполнении этой подстановки.

Приведенная ниже таблица содержит список наборов символов, поддерживаемых UIL для строковых литералов. Обратите внимание на то, что несколько имен UIL обозначают один и тот-же набор символов. В некоторых случаях имя UIL виляет на то, как будут читаться строковые литералы. Например, строки, обозначенные именем набора знаков UIL, заканчивающимся _LR, читаются слева на право. Имена, заканчивающиеся различной цифрой, обозначают использование различных шрифтов (например, ISO_LATIN1 и ISO_LATIN6). Все наборы символов в этой таблице представляются 8-ю битами.

Таблица 6-3. Поддерживаемые наборы символов

Имя UILОписание
ISO_LATIN1Поддерживаются GL: ASCII, GR: Latin-1
ISO_LATIN2Поддерживаются GL: ASCII, GR: Latin-2
ISO_ARABICПоддерживаются GL: ASCII, GR: Latin-Arabic
ISO_LATIN6Поддерживаются GL: ASCII, GR: Latin-Arabic
ISO_GREEKПоддерживаются GL: ASCII, GR: Latin-Greek
ISO_LATIN7Поддерживаются GL: ASCII, GR: Latin-Greek
ISO_HEBREWПоддерживаются GL: ASCII, GR: Latin-Hebrew
ISO_LATIN8Поддерживаются GL: ASCII, GR: Latin-Hebrew
ISO_HEBREW_LRПоддерживаются GL: ASCII, GR: Latin-Hebrew
ISO_LATIN8_LRПоддерживаются GL: ASCII, GR: Latin-Hebrew
JIS_KATAKANAGL: JIS Roman, GR: JIS Katakana

Ниже приведены правила разбора строк для каждого набора символов:

Все наборы символов

Символы с кодами в дапазоне 00 .. 1F, 7F и 80 .. 9F являются управляющими символами, включая оба байта для 16-битных символов. Компилятор обозначает эти символы как недопустимые.

ISO_LATIN1 ISO_LATIN2 ISO_LATIN3 ISO_GREEK ISO_LATIN4

Строки этих наборов символов обрабатываются слева на право. Также для этих наборов символов поддерживаются управляющие последовательности в нуль ограниченных строках.

ISO_HEBREW ISO_ARABIC ISO_LATIN8

Строки этих наборов символов обрабатываются справа на лево. Например, строка #ISO_HEBREW"012345" создает простую строку "543210" с набором символов ISO_HEBREW. Направление для такой строки всегда будет справа на лево, тогда при выводе строка будет выглядеть как "012345". Для этих наборов символов в нуль ограниченных строках поддерживаются управляющие последовательности, а символы, порождающие эти последовательности, указываются в направлении слева на право. Например, всегда должно указываться \n, а не n\.

ISO_HEBREW_LR ISO_ARABIC_LR ISO_LATIN8_LR

Строки в этих наборах символов обрабатываются слева на право. Например, строка #ISO_HEBREW_LR"012345" порождает простую строку "012345" с набором символов ISO_HEBREW. Направление для таких строк всегда будет справа на лево, таким образом при отрисовке она будет выглядеть "543210". Другими словами, символы представленные в обычном порядке затем будут отображаться в принятом в иврите (поскольку в иврите обычно используются текстовые редакторы, записывающие строки справа на лево). Управляющие последовательности для нуль ограниченных также поддерживаются в этих наборах символов.

JIS_KATAKANA

Этот набор символов обрабатывается слева на право. Управляющие последовательности в нуль ограниченных строках поддерживаются этим набором символов. Имейте в виду, что символ \ (обратная наклонная черта) иногда может отображаться как знак йены.

В дополнении к указанным правлами разбора строк, для составных строк в качестве атрибут указывается информация о наборе символов. Если строка включается в строку из нескольких объединенных сегментов, информация о наборе символов для этого сегмента строки также включается в результирующую строку. Это дает набору компонентов Motif информацию, необходимую для расшифровки составной строки и выбора шрифта при отображении строки.

Для интерфейсов приложений, отображающихся только на английском языке, UIL позволяет игнорировать различие между двумя вариантами использования строк. Компилятор по контексту определяет должна ли строка быть представлена как нуль ограниченная или же как составная строка.

UIL компилятор свободно распознает различные наборы символов и корректно обрабатывает строковые литералы. Также компилятор выдает ошибку при использовании составной строки в контексте, поддерживающем только нуль ограниченные строки.

Поскольку имена наборов символов являются ключевыми словами, при включенном режиме чувствительности имен к регистру их необходимо записывать строчными буквами. Если же используется режим нечувствительности к регистру, имена наборов символов могут записываться строчными, заглавными и обоими символами.

Связанная информация