Files
markdown/source/parser/implementation/markdown-implementation.adb
Vadim Godunko 1b8287e93b Fix Ada code to prevent raise of Constraint_Error
(cherry picked from commit 2bce193284)
2024-12-17 09:58:15 +00:00

154 lines
4.1 KiB
Ada

--
-- Copyright (C) 2021-2024, AdaCore
--
-- SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
--
with Markdown.Implementation.Lists;
with Markdown.Implementation.List_Items;
package body Markdown.Implementation is
---------------------
-- Complete_Parsing --
---------------------
overriding procedure Complete_Parsing
(Self : in out Abstract_Container_Block;
Parser : Markdown.Inline_Parsers.Inline_Parser)
is
use type Markdown.Implementation.Lists.List_Access;
Found : Boolean := False;
Result : Block_Vectors.Vector;
List : Markdown.Implementation.Lists.List_Access;
begin
for Item of Self.Children loop
Item.Complete_Parsing (Parser);
if Item.all in Markdown.Implementation.List_Items.List_Item then
if List = null or else not List.Match (Item) then
List := new Markdown.Implementation.Lists.List;
Result.Append (Abstract_Block_Access (List));
Found := True;
end if;
List.Children.Append (Item);
else
List := null;
Result.Append (Item);
end if;
end loop;
if Found then
Self.Children.Move (Source => Result);
end if;
end Complete_Parsing;
-------------
-- Forward --
-------------
procedure Forward
(Cursor : in out VSS.Strings.Character_Iterators.Character_Iterator;
Count : VSS.Strings.Character_Index := 1) is
begin
for J in 1 .. Count loop
declare
Ok : constant Boolean := Cursor.Forward or J = Count;
pragma Unreferenced (Ok);
begin
null;
-- We should enable pragma Assert (Ok); but it breaks some tests
-- currently.
end;
end loop;
end Forward;
---------------
-- Reference --
---------------
procedure Reference (Self : Abstract_Block_Access) is
begin
if Markdown.Implementation.Is_Assigned (Self) then
System.Atomic_Counters.Increment (Self.Counter);
end if;
end Reference;
---------------
-- Reference --
---------------
procedure Reference (Self : Abstract_Container_Block_Access) is
begin
if Markdown.Implementation.Is_Assigned (Self) then
System.Atomic_Counters.Increment (Self.Counter);
end if;
end Reference;
---------------------
-- Unexpanded_Tail --
---------------------
function Unexpanded_Tail
(Self : Input_Line;
From : VSS.Strings.Character_Iterators.Character_Iterator)
return VSS.Strings.Virtual_String
is
use type VSS.Strings.Virtual_String;
begin
if Self.Text = Self.Expanded then
return Self.Expanded.Slice (From, Self.Expanded.At_Last_Character);
else
raise Program_Error with "Unimplemented";
end if;
end Unexpanded_Tail;
---------------------
-- Unexpanded_Tail --
---------------------
function Unexpanded_Tail
(Self : Input_Line;
From : VSS.Strings.Character_Iterators.Character_Iterator;
To : VSS.Strings.Character_Iterators.Character_Iterator)
return VSS.Strings.Virtual_String
is
use type VSS.Strings.Virtual_String;
begin
if Self.Text = Self.Expanded then
return Self.Expanded.Slice (From, To);
else
raise Program_Error with "Unimplemented";
end if;
end Unexpanded_Tail;
-----------------
-- Unreference --
-----------------
procedure Unreference (Self : in out Abstract_Container_Block_Access) is
procedure Free is new Ada.Unchecked_Deallocation
(Markdown.Implementation.Abstract_Container_Block'Class,
Abstract_Container_Block_Access);
begin
if not Markdown.Implementation.Is_Assigned (Self) then
null;
elsif System.Atomic_Counters.Decrement (Self.Counter) then
for Item of Self.Children loop
if System.Atomic_Counters.Decrement (Item.Counter) then
Markdown.Implementation.Free (Item);
end if;
end loop;
Free (Self);
else
Self := null;
end if;
end Unreference;
end Markdown.Implementation;