Справочник Ada 95
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);
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);
Target : out String;
Drop : in Truncation := Error;
Justify : in Alignment := Left;
Pad : in Character := Space);
-- Подпрограммы поиска
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;
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;
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;
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;
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;
END_OF_DOCUMENT_MARKER 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;
Каждая функция Index ищет подстроку длиной Pattern'Length в Source, которая соответствует Pattern в соответствии с Mapping; параметр Going указывает направление поиска. Если Going = Forward, то Index возвращает наименьший индекс I такой, что подстрока Source, начинающаяся с I, соответствует Pattern. Если Going = Backward, то Index возвращает наибольший индекс I такой, что подстрока Source, начинающаяся с I, соответствует Pattern. Если такой подстроки нет, возвращается 0. Если Pattern — пустая строка, то генерируется ошибка Pattern_Error.
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;
Index ищет первое или последнее вхождение любого символа из заданного набора символов (если Test=Inside), или любого символа из дополнения к этому набору (если Test=Outside). Она возвращает наименьший индекс I (если Going=Forward) или наибольший индекс I (если Going=Backward) такой, что Source(I) удовлетворяет условию Test относительно Set; возвращает 0, если такого символа в Source нет.
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;
Возвращает количество вхождений символов из набора Set в Source.
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 возвращает в First и Last индексы начала и конца первой подстроки Source, все элементы которой удовлетворяют условию Test, и такие, что элементы непосредственно перед и после подстроки не удовлетворяют этому условию. Если такой подстроки нет, то значение Last равно нулю, а значение First равно Source'First; однако, если Source'First не является положительным числом, то генерируется ошибка Constraint_Error.
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.
ПРИМЕЧАНИЯ
9 В функциях Index и Count, принимающих параметры Pattern и Mapping, фактический строковый параметр, передаваемый в Pattern, должен содержать символы, встречающиеся в качестве целевых символов отображения. В противном случае шаблон не будет соответствовать.
10 В подпрограммах Insert вставка в конец строки достигается путем передачи Source'Last+1 в качестве параметра Before.
11 Если в любую из подпрограмм обработки строк передается null Character_Mapping_Function, возникает ошибка Constraint_Error.