Справочник Ada (Ada 2022)
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
with Preelaborate, Nonblocking, Global => in out synchronized is
package Ada.Strings.Fixed
with Preelaborate, Nonblocking, Global => in out synchronized is
-- Процедура "копирования" для строк, возможно, различной длины
procedure Move (Source : in String;
Target : out String;
Drop : in Truncation := Error;
Justify : in Alignment := Left;
Pad : in Character := Space);
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;
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;
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;
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;
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;
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;
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;
From : in Positive;
Going : in Direction := Forward)
return Natural;
function Index_Non_Blank (Source : in String;
Going : in Direction := Forward)
return Natural;
Going : in Direction := Forward)
return Natural;
function Count (Source : in String;
Pattern : in String;
Mapping : in Maps.Character_Mapping
:= Maps.Identity)
return Natural;
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;
Pattern : in String;
Mapping : in Maps.Character_Mapping_Function)
return Natural;
function Count (Source : in String;
Set : in Maps.Character_Set)
return Natural;
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);
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);
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;
Mapping : in Maps.Character_Mapping)
return String;
procedure Translate (Source : in out String;
Mapping : in Maps.Character_Mapping);
Mapping : in Maps.Character_Mapping);
function Translate (Source : in String;
Mapping : in Maps.Character_Mapping_Function)
return String;
Mapping : in Maps.Character_Mapping_Function)
return String;
procedure Translate (Source : in out String;
Mapping : in Maps.Character_Mapping_Function);
Mapping : in Maps.Character_Mapping_Function);
-- Подпрограммы преобразования строк
function Replace_Slice (Source : in String;
Low : in Positive;
High : in Natural;
By : in String)
return 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);
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;
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);
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;
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);
Position : in Positive;
New_Item : in String;
Drop : in Truncation := Right);
function Delete (Source : in String;
From : in Positive;
Through : in Natural)
return 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);
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;
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);
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;
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);
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;
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);
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;
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);
Count : in Natural;
Justify : in Alignment := Left;
Pad : in Character := Space);
--Функции-конструкторы строк
function "*" (Left : in Natural;
Right : in Character) return String;
Right : in Character) return String;
function "*" (Left : in Natural;
Right : in String) return String;
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);
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.
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;
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;
Каждая функция Index ищет, начиная с From, фрагмент Source длиной Pattern'Length, который соответствует Pattern относительно Mapping; параметр Going указывает направление поиска. Если Source — пустая строка, Index возвращает 0; в противном случае, если From не входит в диапазон Source'Range, то генерируется Index_Error. Если Going = Forward, то Index возвращает наименьший индекс I, который больше или равен From, такой, что фрагмент Source, начинающийся с I, соответствует Pattern. Если Going = Backward, то Index возвращает наибольший индекс I, такой что фрагмент Source, начинающийся с I, соответствует Pattern и имеет верхнюю границу, меньшую или равную From. Если такого фрагмента нет, возвращается 0. Если Pattern — пустая строка, генерируется Pattern_Error.
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;
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;
Если Going = Forward, возвращает
Index (Source, Pattern, Source'First, Forward, Mapping);
в противном случае, возвращает
Index (Source, Pattern, Source'Last, Backward, Mapping);
function Index (Source : in String;
Set : in Maps.Character_Set;
From : in Positive;
Test : in Membership := Inside;
Going : in Direction := Forward)
return Natural;
Set : in Maps.Character_Set;
From : in Positive;
Test : in Membership := Inside;
Going : in Direction := Forward)
return Natural;
Index ищет первое или последнее вхождение любого из набора символов (при Test=Inside) или любого из дополнения набора символов (при Test=Outside). Если Source — пустая строка, Index возвращает 0; в противном случае, если From не входит в Source'Range, то генерируется Index_Error. В противном случае, она возвращает наименьший индекс I >= From (если Going=Forward) или наибольший индекс I <= From (если Going=Backward), такой, что Source(I) удовлетворяет условию Test относительно Set; возвращает 0, если такого символа в Source нет.
function Index (Source : in String;
Set : in Maps.Character_Set;
Test : in Membership := Inside;
Going : in Direction := Forward)
return Natural;
Set : in Maps.Character_Set;
Test : in Membership := Inside;
Going : in Direction := Forward)
return Natural;
Если Going = Forward, возвращает
Index (Source, Set, Source'First, Test, Forward);
в противном случае, возвращает
Index (Source, Set, Source'Last, Test, Backward);
function Index_Non_Blank (Source : in String;
From : in Positive;
Going : in Direction := Forward)
return Natural;
From : in Positive;
Going : in Direction := Forward)
return Natural;
Возвращает Index (Source, Maps.To_Set(Space), From, Outside, Going);
function Index_Non_Blank (Source : in String;
Going : in Direction := Forward)
return Natural;
Going : in Direction := Forward)
return Natural;
Возвращает Index(Source, Maps.To_Set(Space), Outside, Going)
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;
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;
Возвращает максимальное количество неперекрывающихся фрагментов Source, которые соответствуют Pattern относительно Mapping. Если Pattern — пустая строка, генерируется Pattern_Error.
function Count (Source : in String;
Set : in Maps.Character_Set)
return Natural;
Set : in Maps.Character_Set)
return Natural;
Возвращает количество вхождений в Source символов, которые находятся в Set.
procedure Find_Token (Source : in String;
Set : in Maps.Character_Set;
From : in Positive;
Test : in Membership;
First : out Positive;
Last : out Natural);
Set : in Maps.Character_Set;
From : in Positive;
Test : in Membership;
First : out Positive;
Last : out Natural);
Если 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.
procedure Find_Token (Source : in String;
Set : in Maps.Character_Set;
Test : in Membership;
First : out Positive;
Last : out Natural);
Set : in Maps.Character_Set;
Test : in Membership;
First : out Positive;
Last : out Natural);
Эквивалентно Find_Token (Source, Set, Source'First, Test, First, Last).
function Translate (Source : in String;
Mapping : in Maps.Character_Mapping)
return String;
function Translate (Source : in String;
Mapping : in Maps.Character_Mapping_Function)
return String;
Mapping : in Maps.Character_Mapping)
return String;
function Translate (Source : in String;
Mapping : in Maps.Character_Mapping_Function)
return String;
Возвращает строку S длиной Source'Length, такая, что S(I) — символ, к которому Mapping отображает соответствующий элемент Source, для I в 1..Source'Length.
procedure Translate (Source : in out String;
Mapping : in Maps.Character_Mapping);
procedure Translate (Source : in out String;
Mapping : in Maps.Character_Mapping_Function);
Mapping : in Maps.Character_Mapping);
procedure Translate (Source : in out String;
Mapping : in Maps.Character_Mapping_Function);
Эквивалентно Source := Translate(Source, Mapping).
function Replace_Slice (Source : in String;
Low : in Positive;
High : in Natural;
By : in String)
return String;
Low : in Positive;
High : in Natural;
By : in String)
return String;
Если 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).
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);
Low : in Positive;
High : in Natural;
By : in String;
Drop : in Truncation := Error;
Justify : in Alignment := Left;
Pad : in Character := Space);
Эквивалентно Move(Replace_Slice(Source, Low, High, By), Source, Drop, Justify, Pad).
function Insert (Source : in String;
Before : in Positive;
New_Item : in String)
return String;
Before : in Positive;
New_Item : in String)
return String;
Генерирует Index_Error, если Before не находится в Source'First .. Source'Last+1; в противном случае, возвращает Source(Source'First..Before–1) & New_Item & Source(Before..Source'Last), но с нижней границей 1.
procedure Insert (Source : in out String;
Before : in Positive;
New_Item : in String;
Drop : in Truncation := Error);
Before : in Positive;
New_Item : in String;
Drop : in Truncation := Error);
Эквивалентно Move(Insert(Source, Before, New_Item), Source, Drop).
function Overwrite (Source : in String;
Position : in Positive;
New_Item : in String)
return String;
Position : in Positive;
New_Item : in String)
return String;
Генерирует Index_Error, если Position не находится в Source'First .. Source'Last+1; в противном случае, возвращает строку, полученную из Source путем последовательной замены символов, начиная с Position, соответствующими символами из New_Item. Если конец Source достигнут раньше, чем исчерпаны символы в New_Item, оставшиеся символы из New_Item добавляются к строке.
procedure Overwrite (Source : in out String;
Position : in Positive;
New_Item : in String;
Drop : in Truncation := Right);
Position : in Positive;
New_Item : in String;
Drop : in Truncation := Right);
Эквивалентно Move(Overwrite(Source, Position, New_Item), Source, Drop).
function Delete (Source : in String;
From : in Positive;
Through : in Natural)
return String;
From : in Positive;
Through : in Natural)
return String;
Если From <= Through, возвращаемая строка — Replace_Slice(Source, From, Through, ""); в противном случае — Source с нижней границей 1.
procedure Delete (Source : in out String;
From : in Positive;
Through : in Natural;
Justify : in Alignment := Left;
Pad : in Character := Space);
From : in Positive;
Through : in Natural;
Justify : in Alignment := Left;
Pad : in Character := Space);
Эквивалентно Move(Delete(Source, From, Through), Source, Justify => Justify, Pad => Pad).
function Trim (Source : in String;
Side : in Trim_End)
return String;
Side : in Trim_End)
return String;
Возвращает строку, полученную путем удаления из Source всех ведущих пробельных символов (если Side = Left), всех хвостовых пробельных символов (если Side = Right) или всех ведущих и хвостовых пробельных символов (если Side = Both).
procedure Trim (Source : in out String;
Side : in Trim_End;
Justify : in Alignment := Left;
Pad : in Character := Space);
Side : in Trim_End;
Justify : in Alignment := Left;
Pad : in Character := Space);
Эквивалентно Move(Trim(Source, Side), Source, Justify=>Justify, Pad=>Pad).
function Trim (Source : in String;
Left : in Maps.Character_Set;
Right : in Maps.Character_Set)
return String;
Left : in Maps.Character_Set;
Right : in Maps.Character_Set)
return String;
Возвращает строку, полученную путем удаления из Source всех начальных символов в Left и всех конечных символов в Right.
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);
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).
function Head (Source : in String;
Count : in Natural;
Pad : in Character := Space)
return String;
Count : in Natural;
Pad : in Character := Space)
return String;
Возвращает строку длиной Count. Если Count <= Source'Length, строка содержит первые Count символов Source. В противном случае, ее содержимое состоит из Source, конкатенированного с Count–Source'Length символами Pad.
procedure Head (Source : in out String;
Count : in Natural;
Justify : in Alignment := Left;
Pad : in Character := Space);
Count : in Natural;
Justify : in Alignment := Left;
Pad : in Character := Space);
Эквивалентно Move(Head(Source, Count, Pad), Source, Drop=>Error, Justify=>Justify, Pad=>Pad).
function Tail (Source : in String;
Count : in Natural;
Pad : in Character := Space)
return String;
Count : in Natural;
Pad : in Character := Space)
return String;
Возвращает строку длиной Count. Если Count <= Source'Length, строка содержит последние Count символов Source. В противном случае, ее содержимое состоит из Count-Source'Length символов Pad, конкатенированных со Source.
procedure Tail (Source : in out String;
Count : in Natural;
Justify : in Alignment := Left;
Pad : in Character := Space);
Count : in Natural;
Justify : in Alignment := Left;
Pad : in Character := Space);
Эквивалентно Move(Tail(Source, Count, Pad), Source, Drop=>Error, Justify=>Justify, Pad=>Pad).
function "*" (Left : in Natural;
Right : in Character) return String;
function "*" (Left : in Natural;
Right : in String) return String;
Right : in Character) return String;
function "*" (Left : in Natural;
Right : in String) return String;
Эти функции повторяют символ или строку заданное количество раз. Первая функция возвращает строку, длина которой равна Left, а каждый из элементов которой — Right. Вторая функция возвращает строку, длина которой равна Left*Right'Length, и значение которой — пустая строка, если Left = 0, а в противном случае — (Left–1)*Right & Right с нижней границей 1.
ПРИМЕЧАНИЕ 1 В функциях Index и Count, принимающих параметры Pattern и Mapping, для соответствия шаблон Pattern может содержать только символы, присутствующие в качестве целевых символов в отображении.
ПРИМЕЧАНИЕ 2 В подпрограммах Insert, вставка в конец строки достигается путем передачи Source'Last+1 в качестве параметра Before.
ПРИМЕЧАНИЕ 3 Если в любую из подпрограмм обработки строк передается нулевая Character_Mapping_Function, возникает Constraint_Error.