Spec-Zone.ru › Ada 2012
Справочное руководство по Ada 2012

A.4.3 Обработка строк фиксированной длины

В пакет Strings.Fixed, определенный языком, содержатся подпрограммы для обработки строк фиксированной длины; то есть, для значений типа Standard.String. Несколько из этих подпрограмм являются процедурами, которые изменяют содержимое строки, переданной в качестве параметра out или in out; каждая из них имеет дополнительные параметры для управления эффектом, когда логическая длина результата отличается от длины параметра.
Для каждой функции, возвращающей строку, нижняя граница возвращаемого значения равна 1.
Базовая модель, воплощенная в пакете, заключается в том, что строка фиксированной длины состоит из значимых символов и, возможно, заполнителей (пробелами) с одной или обеих сторон. При копировании более короткой строки в более длинную вставляются заполнители, а при копировании более длинной строки в более короткую — заполнители удаляются. Процедура Move в пакете Strings.Fixed, принимающая строку в качестве параметра out, позволяет программисту контролировать эти эффекты. Аналогичный контроль предоставляют процедуры преобразования строк.

Статическая семантика

Пакет библиотеки Strings.Fixed имеет следующее объявление:
with Ada.Strings.Maps;
package Ada.Strings.Fixed is
pragma Preelaborate(Fixed);
-- Процедура "копирования" для строк, возможно, с разной длиной
procedure Move (Source : in String;
Target : out String;
Drop : in Truncation := Error;
Justify : in Alignment := Left;
Pad : in Character := Space);
-- Подпрограммы поиска
function Index (Source : in String;
Pattern : in String;
From : in Positive;
Going : in Direction := Forward;
Mapping : in Maps.Character_Mapping := Maps.Identity)
return Natural;
function Index (Source : in String;
Pattern : in String;
From : in Positive;
Going : in Direction := Forward;
Mapping : in Maps.Character_Mapping_Function)
return Natural;
function Index (Source : in String;
Pattern : in String;
Going : in Direction := Forward;
Mapping : in Maps.Character_Mapping
:= Maps.Identity)
return Natural;
function Index (Source : in String;
Pattern : in String;
Going : in Direction := Forward;
Mapping : in Maps.Character_Mapping_Function)
return Natural;
function Index (Source : in String;
Set : in Maps.Character_Set;
From : in Positive;
Test : in Membership := Inside;
Going : in Direction := Forward)
return Natural;
function Index (Source : in String;
Set : in Maps.Character_Set;
Test : in Membership := Inside;
Going : in Direction := Forward)
return Natural;
function Index_Non_Blank (Source : in String;
From : in Positive;
Going : in Direction := Forward)
return Natural;
function Index_Non_Blank (Source : in String;
Going : in Direction := Forward)
return Natural;
function Count (Source : in String;
Pattern : in String;
Mapping : in Maps.Character_Mapping
:= Maps.Identity)
return Natural;
function Count (Source : in String;
Pattern : in String;
Mapping : in Maps.Character_Mapping_Function)
return Natural;
function Count (Source : in String;
Set : in Maps.Character_Set)
return Natural;
procedure Find_Token (Source : in String;
Set : in Maps.Character_Set;
From : in Positive;
Test : in Membership;
First : out Positive;
Last : out Natural);
procedure Find_Token (Source : in String;
Set : in Maps.Character_Set;
Test : in Membership;
First : out Positive;
Last : out Natural);
-- Подпрограммы преобразования строк
function Translate (Source : in String;
Mapping : in Maps.Character_Mapping)
return String;
procedure Translate (Source : in out String;
Mapping : in Maps.Character_Mapping);
function Translate (Source : in String;
Mapping : in Maps.Character_Mapping_Function)
return String;
procedure Translate (Source : in out String;
Mapping : in Maps.Character_Mapping_Function);
-- Подпрограммы преобразования строк
function Replace_Slice (Source : in String;
Low : in Positive;
High : in Natural;
By : in String)
return String;
procedure Replace_Slice (Source : in out String;
Low : in Positive;
High : in Natural;
By : in String;
Drop : in Truncation := Error;
Justify : in Alignment := Left;
Pad : in Character := Space);
function Insert (Source : in String;
Before : in Positive;
New_Item : in String)
return String;
procedure Insert (Source : in out String;
Before : in Positive;
New_Item : in String;
Drop : in Truncation := Error);
function Overwrite (Source : in String;
Position : in Positive;
New_Item : in String)
return String;
procedure Overwrite (Source : in out String;
Position : in Positive;
New_Item : in String;
Drop : in Truncation := Right);
function Delete (Source : in String;
From : in Positive;
Through : in Natural)
return String;
procedure Delete (Source : in out String;
From : in Positive;
Through : in Natural;
Justify : in Alignment := Left;
Pad : in Character := Space);
--Подпрограммы выбора строк
function Trim (Source : in String;
Side : in Trim_End)
return String;
procedure Trim (Source : in out String;
Side : in Trim_End;
Justify : in Alignment := Left;
Pad : in Character := Space);
function Trim (Source : in String;
Left : in Maps.Character_Set;
Right : in Maps.Character_Set)
return String;
procedure Trim (Source : in out String;
Left : in Maps.Character_Set;
Right : in Maps.Character_Set;
Justify : in Alignment := Strings.Left;
Pad : in Character := Space);
function Head (Source : in String;
Count : in Natural;
Pad : in Character := Space)
return String;
procedure Head (Source : in out String;
Count : in Natural;
Justify : in Alignment := Left;
Pad : in Character := Space);
function Tail (Source : in String;
Count : in Natural;
Pad : in Character := Space)
return String;
procedure Tail (Source : in out String;
Count : in Natural;
Justify : in Alignment := Left;
Pad : in Character := Space);
--Функции-конструкторы строк
function "*" (Left : in Natural;
Right : in Character) return String;
function "*" (Left : in Natural;
Right : in String) return String;
end Ada.Strings.Fixed;
Эффекты вышеперечисленных подпрограмм таковы.
procedure Move (Source : in String;
Target : out String;
Drop : in Truncation := Error;
Justify : in Alignment := Left;
Pad : in Character := Space);
Процедура Move копирует символы из Source в Target. Если Source имеет такую же длину, как Target, то эффект заключается в присвоении Source в Target. Если Source короче Target, то:
Если Justify=Left, то Source копируется в первые Source'Length символов Target.
Если Justify=Right, то Source копируется в последние Source'Length символов Target.
Если Justify=Center, то Source копируется в средние Source'Length символов Target. В этом случае, если разность в длине между Target и Source нечетная, то дополнительный символ Pad находится справа.
Pad копируется в каждый символ Target, не назначенный иначе.
Если Source длиннее Target, то эффект зависит от Drop.
Если Drop=Left, то самые правые Target'Length символов Source копируются в Target.
Если Drop=Right, то самые левые Target'Length символов Source копируются в Target.
Если Drop=Error, то эффект зависит от значения параметра Justify и также от того, будут ли любые символы в Source, отличные от Pad, не скопированы:
Если Justify=Left, и если каждый из самых правых Source'Length-Target'Length символов в Source равен Pad, то самые левые Target'Length символов Source копируются в Target.
Если Justify=Right, и если каждый из самых левых Source'Length-Target'Length символов в Source равен Pad, то самые правые Target'Length символов Source копируются в Target.
В противном случае, Length_Error распространяется.
END_OF_DOCUMENT_MARKER
функция Index (Source : вход Строка;
Pattern : вход Строка;
From : вход Положительное;
Going : вход Направление := Вперед;
Mapping : вход Maps.Character_Mapping := Maps.Identity)
возвращает Естественное;

функция Index (Source : вход Строка;
Pattern : вход Строка;
From : вход Положительное;
Going : вход Направление := Вперед;
Mapping : вход Maps.Character_Mapping_Function)
возвращает Естественное;
Каждая функция Index ищет, начиная с From, фрагмент Source длиной Pattern'Length, который соответствует Pattern относительно Mapping; параметр Going указывает направление поиска. Если Source — пустая строка, Index возвращает 0; в противном случае, если From не входит в Source'Range, то генерируется Index_Error. Если Going = Вперед, то Index возвращает наименьший индекс I, который больше или равен From, такой, что фрагмент Source, начинающийся с I, соответствует Pattern. Если Going = Назад, то Index возвращает наибольший индекс I, такой, что фрагмент Source, начинающийся с I, соответствует Pattern и имеет верхнюю границу, меньшую или равную From. Если такого фрагмента нет, возвращается 0. Если Pattern — пустая строка, то генерируется Pattern_Error.
функция Index (Source : вход Строка;
Pattern : вход Строка;
Going : вход Направление := Вперед;
Mapping : вход Maps.Character_Mapping
:= Maps.Identity)
возвращает Естественное;

функция Index (Source : вход Строка;
Pattern : вход Строка;
Going : вход Направление := Вперед;
Mapping : вход Maps.Character_Mapping_Function)
возвращает Естественное;
Если Going = Вперед, возвращает
Index (Source, Pattern, Source'First, Forward, Mapping);
в противном случае, возвращает
Index (Source, Pattern, Source'Last, Backward, Mapping);
функция Index (Source : вход Строка;
Set : вход Maps.Character_Set;
From : вход Положительное;
Test : вход Принадлежность := Внутри;
Going : вход Направление := Вперед)
возвращает Естественное;
Index ищет первое или последнее вхождение любого из набора символов (когда Test=Внутри), или любого из дополнения набора символов (когда Test=Снаружи). Если Source — пустая строка, Index возвращает 0; в противном случае, если From не входит в Source'Range, то генерируется Index_Error. В противном случае, возвращает наименьший индекс I >= From (если Going=Вперед) или наибольший индекс I <= From (если Going=Назад), такой, что Source(I) удовлетворяет условию Test относительно Set; возвращает 0, если такого символа в Source нет.
функция Index (Source : вход Строка;
Set : вход Maps.Character_Set;
Test : вход Принадлежность := Внутри;
Going : вход Направление := Вперед)
возвращает Естественное;
Если Going = Вперед, возвращает
Index (Source, Set, Source'First, Test, Forward);
в противном случае, возвращает
Index (Source, Set, Source'Last, Test, Backward);
функция Index_Non_Blank (Source : вход Строка;
From : вход Положительное;
Going : вход Направление := Вперед)
возвращает Естественное;
Возвращает Index (Source, Maps.To_Set(Space), From, Outside, Going);
функция Index_Non_Blank (Source : вход Строка;
Going : вход Направление := Вперед)
возвращает Естественное;
Возвращает Index(Source, Maps.To_Set(Space), Outside, Going)
функция Count (Source : вход Строка;
Pattern : вход Строка;
Mapping : вход Maps.Character_Mapping
:= Maps.Identity)
возвращает Естественное;

функция Count (Source : вход Строка;
Pattern : вход Строка;
Mapping : вход Maps.Character_Mapping_Function)
возвращает Естественное;
Возвращает максимальное количество неперекрывающихся фрагментов Source, которые соответствуют Pattern относительно Mapping. Если Pattern пустая строка, то генерируется Pattern_Error.
функция Count (Source : вход Строка;
Set : вход Maps.Character_Set)
возвращает Естественное;
Возвращает количество вхождений в Source символов, которые находятся в Set.
процедура Find_Token (Source : вход Строка;
Set : вход Maps.Character_Set;
From : вход Положительное;
Test : вход Принадлежность;
First : выход Положительное;
Last : выход Естественное);
Если Source не пустая строка и From не входит в Source'Range, то генерируется Index_Error. В противном случае, First устанавливается в индекс первого символа в Source(From .. Source'Last), который удовлетворяет условию Test. Last устанавливается в наибольший индекс, такой, что все символы в Source(First .. Last) удовлетворяют условию Test. Если ни один символ в Source(From .. Source'Last) не удовлетворяет условию Test, First устанавливается в From, а Last — в 0.
процедура Find_Token (Source : вход Строка;
Set : вход Maps.Character_Set;
Test : вход Принадлежность;
First : выход Положительное;
Last : выход Естественное);
Эквивалентно Find_Token (Source, Set, Source'First, Test, First, Last).
функция Translate (Source : вход Строка;
Mapping : вход Maps.Character_Mapping)
возвращает Строка;

функция Translate (Source : вход Строка;
Mapping : вход Maps.Character_Mapping_Function)
возвращает Строка;
Возвращает строку S длиной Source'Length, такая что S(I) — символ, в который Mapping отображает соответствующий элемент Source, для I в 1..Source'Length.
процедура Translate (Source : вход выход Строка;
Mapping : вход Maps.Character_Mapping);

процедура Translate (Source : вход выход Строка;
Mapping : вход Maps.Character_Mapping_Function);
Эквивалентно Source := Translate(Source, Mapping).
функция Replace_Slice (Source : вход Строка;
Low : вход Положительное;
High : вход Естественное;
By : вход Строка)
возвращает Строка;
Если Low > Source'Last+1 или High < Source'First–1, то генерируется Index_Error. В противном случае:
Если High >= Low, то возвращаемая строка состоит из Source(Source'First..Low–1) & By & Source(High+1..Source'Last), но с нижней границей 1.
Если High < Low, то возвращаемая строка — Insert(Source, Before=>Low, New_Item=>By).
процедура Replace_Slice (Source : вход выход Строка;
Low : вход Положительное;
High : вход Естественное;
By : вход Строка;
Drop : вход Обрезка := Ошибка;
Justify : вход Выравнивание := Слева;
Pad : вход Символ := Пробел);
Эквивалентно Move(Replace_Slice(Source, Low, High, By), Source, Drop, Justify, Pad).
функция Insert (Source : вход Строка;
Before : вход Положительное;
New_Item : вход Строка)
возвращает Строка;
Генерирует Index_Error, если Before не находится в Source'First .. Source'Last+1; в противном случае возвращает Source(Source'First..Before–1) & New_Item & Source(Before..Source'Last), но с нижней границей 1.
процедура Insert (Source : вход выход Строка;
Before : вход Положительное;
New_Item : вход Строка;
Drop : вход Обрезка := Ошибка);
Эквивалентно Move(Insert(Source, Before, New_Item), Source, Drop).
функция Overwrite (Source : вход Строка;
Position : вход Положительное;
New_Item : вход Строка)
возвращает Строка;
Генерирует Index_Error, если Position не находится в Source'First .. Source'Last+1; в противном случае, возвращает строку, полученную из Source путем последовательной замены символов, начиная с Position, соответствующими символами из New_Item. Если конец Source достигнут до того, как символы из New_Item будут исчерпаны, оставшиеся символы из New_Item добавляются к строке.
процедура Overwrite (Source : вход выход Строка;
Position : вход Положительное;
New_Item : вход Строка;
Drop : вход Обрезка := Справа);
Эквивалентно Move(Overwrite(Source, Position, New_Item), Source, Drop).
функция Delete (Source : вход Строка;
From : вход Положительное;
Through : вход Естественное)
возвращает Строка;
Если From <= Through, возвращаемая строка — Replace_Slice(Source, From, Through, ""); в противном случае — Source с нижней границей 1.
процедура Delete (Source : вход выход Строка;
From : вход Положительное;
Through : вход Естественное;
Justify : вход Выравнивание := Слева;
Pad : вход Символ := Пробел);
Эквивалентно Move(Delete(Source, From, Through), Source, Justify => Justify, Pad => Pad).
функция Trim (Source : вход Строка;
Side : вход Trim_End)
возвращает Строка;
Возвращает строку, полученную из Source путем удаления всех ведущих пробелов (если Side = Слева), всех trailing пробелов (если Side = Справа) или всех leading и trailing пробелов (если Side = Оба).
процедура Trim (Source : вход выход Строка;
Side : вход Trim_End;
Justify : вход Выравнивание := Слева;
Pad : вход Символ := Пробел);
Эквивалентно Move(Trim(Source, Side), Source, Justify=>Justify, Pad=>Pad).
функция Trim (Source : вход Строка;
Left : вход Maps.Character_Set;
Right : вход Maps.Character_Set)
возвращает Строка;
Возвращает строку, полученную из Source путем удаления всех leading символов из Left и всех trailing символов из Right.
процедура Trim (Source : in out String;
Left : in Maps.Character_Set;
Right : in Maps.Character_Set;
Justify : in Alignment := Strings.Left;
Pad : in Character := Space);
Эквивалентно Move(Trim(Source, Left, Right), Source, Justify => Justify, Pad=>Pad).
функция Head (Source : in String;
Count : in Natural;
Pad : in Character := Space)
return String;
Возвращает строку длиной Count. Если Count <= Source'Length, строка содержит первые Count символов Source. В противном случае, она содержит Source, дополненную Count–Source'Length символами Pad.
процедура Head (Source : in out String;
Count : in Natural;
Justify : in Alignment := Left;
Pad : in Character := Space);
Эквивалентно Move(Head(Source, Count, Pad), Source, Drop=>Error, Justify=>Justify, Pad=>Pad).
функция Tail (Source : in String;
Count : in Natural;
Pad : in Character := Space)
return String;
Возвращает строку длиной Count. Если Count <= Source'Length, строка содержит последние Count символов Source. В противном случае, она содержит Count-Source'Length символов Pad, соединённых со строкой Source.
процедура Tail (Source : in out String;
Count : in Natural;
Justify : in Alignment := Left;
Pad : in Character := Space);
Эквивалентно Move(Tail(Source, Count, Pad), Source, Drop=>Error, Justify=>Justify, Pad=>Pad).
функция "*" (Left : in Natural;
Right : in Character) return String;

функция "*" (Left : in Natural;
Right : in String) return String;
Эти функции повторяют символ или строку указанное количество раз. Первая функция возвращает строку длиной Left, каждый элемент которой равен Right. Вторая функция возвращает строку длиной Left*Right'Length, значение которой — пустая строка, если Left = 0, и в противном случае (Left–1)*Right & Right с нижней границей 1.
ПРИМЕЧАНИЯ
12 В функциях Index и Count, принимающих параметры Pattern и Mapping, фактический параметр String, передаваемый в Pattern, должен состоять из символов, являющихся целевыми символами сопоставления. В противном случае шаблон не будет совпадать.
13 В подпрограммах Insert, вставка в конец строки достигается путем передачи Source'Last+1 в качестве параметра Before.
14 Если в любую из подпрограмм обработки строк передается нулевая Character_Mapping_Function, возникает Constraint_Error.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API