Этот пример иллюстрирует простой пакет обработки текстов. Пользователи имеют доступ только к видимому разделу; реализация от них скрыта в личном разделе и теле пакета (тело не показано).
С точки зрения пользователя, TEXT является строкой переменной длины. Каждый текстовый объект имеет максимальную длину, которая должна задаваться при описании этого объекта, и текущую длину, которая равна длине в диапазоне от нуля до максимального. Максимальная возможная длина текстового объекта является константой, определяемой реализацией.
Сначала в пакете определяются необходимые типы, затем функции, возвращающие некоторые характеристики объектов типа, затем функции преобразования текстов и предопределенных типов CHARACTER и STRING и, наконец, некоторые стандартные операции над переменными строками. Большинство операций над строками, символами, а также над типом TEXT совмещены для минимизации числа явных преобразований, которые должен написать пользователь.
package TEXT_HANDLER is MAXIMUM : constant := SOME_VALUE; -— это значение определено реализацией subtype INDEX it INTEGER range 0 .. MAXIMUM; type TEXT(MAXIMUM_LENGTH : INDEX) is limited private; function LENGTH (T TEXT) return INDEX; function VALUE (T TEXT) return STRING; function EMPTY (T TEXT) return BOOLEAN; function TO_TEXT (S STRING; MAX : INDEX) return TEXT; -- максимальная длина МАХ function TO_TEXT (С CHARACTER; MAX : INDEX) return TEXT; function TO_TEXT (S STRING) return TEXT; - - максимальная длина S'LENGTH function TO_TEXT (C CHARACTER) return TEXT; function "&" (LEFT : TEXT; RIGHT TEXT) return TEXT; function "&" (LEFT : TEXT; RIGHT STRING) return TEXT; function "&" (LEFT : STRING; RIGHT TEXT) return TEXT; function "&" (LEFT : TEXT; RIGHT CHARACTER) return TEXT; function "&" (LEFT : CHARACTER; RIGHT TEXT) return TEXT; function "=" (LEFT : TEXT; RIGHT TEXT) return BOOLEAN; function "<" (LEFT : TEXT; RIGHT TEXT) return BOOLEAN; function "<=" (LEFT : TEXT; RIGHT TEXT) return BOOLEAN; function ">" (LEFT : TEXT; RIGHT TEXT) return BOOLEAN; function ">=" (LEFT : TEXT; RIGHT TEXT) return BOOLEAN; procedure SET (OBJECT ; in out TEXT; VALUE : In TEXT); procedure SET (OBJECT : In out TEXT; VALUE : In STRING); procedure SET (OBJECT : In out TEXT; VALUE : in CHARACTER); procedure APPEND (TAIL : In TEXT; TO In out TEXT); procedure APPEND (TAIL : in STRING; TO In out TEXT); procedure APPEND (TAIL : In CHARACTER; TO in out TEXT); procedure AMEND (OBJECT in out TEXT; BY In TEXT; POSITION : In INDEX); procedure AMEND (OBJECT in out TEXT; BY In STRING; POSITION : In INDEX); procedure AMEND (OBJECT In out TEXT; BY In CHARACTER; POSITION : In INDEX); -— заменяет часть объекта с заданной позиции на данный -— текст, строку или символ function LOCATE (FRAGMENT : TEXT; WITHIN : TEXT) return INDEX; function LOCATE (FRAGMENT : STRING; WITHIN : TEXT) return INDEX; function LOCATE (FRAGMENT : CHARACTER; WITHIN : TEXT) return INDEX; —- возвращают значение О, если фрагмент не размещаетсяprivate type TEXT(MAXIMUM_LENGTH : INDEX) is record POS : INDEX := 0; VALUE : STRING(1 .. MAXIMUM_LENGTH); end record;end TEXT-HANDLER;
Пример использования пакета обработки текста:
Программа открывает файл вывода, имя которого дается строкой NAME. Эта строка имеет вид
[УСТРОЙСТВО :] [ИМЯ ТИПА [.РАСШИРЕНИЕ]]
Для устройства, имени файла и расширения существуют стандартные значения по умолчанию. Названное пользователем имя передается через параметр функции EXPAND_FILE_NAME, ее результатом является расширенная версия с необходимыми добавлениями по умолчанию.
function EXPAND_FILE_NAME (NAME : STRING) return STRING is use TEXT_HANDLER; DEFAULT_DEVICE : constant STRING = "SY:"; DEFAULT_FILE_NAME : constant STRING = "RESULTS"; DEFAULT_EXTENSION : constant STRING = ".DAT"; MAXIMUM_FILE_NAME_LENGTH : constant INDEX := SOME_APPROPRIATE_VALUE: FILE_NAME : TEXT(MAXIMUM_FILE_NAME_LENGTH);begin SET(FILE_NAME, NAME); if EMPTY(FILE_NAME) then SET(FILE_NAME, DEFAULT_FILE_NAME); end if; if LOCATEC:', FILE_NAME) = 0 then SET(FILE_NAME, DEFAULT_DEVICE & FILE_NAME); end if; if LOCATE('.', FILE_NAME) = 0 then APPEND(DEFAULT_EXTENSION, TO => FILE_NAME); end if; return VALUE(FILE_NAME);end EXPAND_FILE_NAME;