7.6. ПРИМЕР ПАКЕТА ОБРАБОТКИ ТЕКСТОВ

Этот пример иллюстрирует простой пакет обработки текстов. Пользователи имеют доступ только к видимому разделу; реализация от них скрыта в личном разделе и теле пакета (тело не показано).

С точки зрения пользователя, 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;