blob: 0ddc52c866f128fb3c7c3d4b75ab58b7ad221e3c [file] [log] [blame]
Thomas Heijligen62268ee2023-11-27 15:10:41 +00001with Interfaces;
2
Nico Huber98417fc2023-11-30 16:46:25 +01003use Interfaces;
4
Thomas Heijligen5c43abc2023-12-11 15:24:36 +00005package FILO is
Thomas Heijligend1e04572023-11-27 14:28:55 +00006
Nico Huber22173222023-12-14 00:02:03 +01007 type Blockdev_Length is range 0 .. Interfaces.Integer_64'Last;
Nico Huber9c041872023-12-12 13:24:55 +01008 subtype Blockdev_Offset is Blockdev_Length range 0 .. Blockdev_Length'Last - 1;
9 subtype Partition_Length is Blockdev_Length;
10 subtype Partition_Offset is Blockdev_Offset;
Nico Huber481ff842023-12-12 13:19:49 +010011
12 BLOCK_SIZE : constant := 512;
13 type Block_Offset is range 0 .. Partition_Offset'Last / BLOCK_SIZE;
14
Nico Huber98417fc2023-11-30 16:46:25 +010015 subtype Index_Type is Natural range 0 .. Natural'Last - 1;
16 subtype Index_Type16 is Index_Type range 0 .. Index_Type'Last - 1;
17 subtype Index_Type32 is Index_Type16 range 0 .. Index_Type16'Last - 2;
18
Nico Huber995779c2024-01-29 15:12:05 +010019 type Buffer_Type is array (Index_Type range <>) of Unsigned_8
20 with
21 Pack;
Nico Huber98417fc2023-11-30 16:46:25 +010022
23 function Read_LE16 (Buf : Buffer_Type; Off : Index_Type16) return Unsigned_16
24 is
Nico Huber90720902023-12-12 16:03:30 +010025 (Shift_Left (Unsigned_16 (Buf (Buf'First + Off + 1)), 8) or
26 Unsigned_16 (Buf (Buf'First + Off)))
Nico Hubercd6b7ec2023-12-04 15:21:26 +010027 with
Nico Huber90720902023-12-12 16:03:30 +010028 Pre =>
29 Buf'First <= Index_Type16'Last - Off and
30 Buf'First + Off + 1 <= Buf'Last;
Nico Huber98417fc2023-11-30 16:46:25 +010031
32 function Read_LE32 (Buf : Buffer_Type; Off : Index_Type32) return Unsigned_32
33 is
Nico Huber90720902023-12-12 16:03:30 +010034 (Shift_Left (Unsigned_32 (Buf (Buf'First + Off + 3)), 24) or
35 Shift_Left (Unsigned_32 (Buf (Buf'First + Off + 2)), 16) or
36 Shift_Left (Unsigned_32 (Buf (Buf'First + Off + 1)), 8) or
37 Unsigned_32 (Buf (Buf'First + Off)))
Nico Hubercd6b7ec2023-12-04 15:21:26 +010038 with
Nico Huber90720902023-12-12 16:03:30 +010039 Pre =>
40 Buf'First <= Index_Type32'Last - Off and
41 Buf'First + Off + 3 <= Buf'Last;
Thomas Heijligend1e04572023-11-27 14:28:55 +000042
Nico Huber0496d892023-12-13 16:00:22 +010043 generic
44 type T is mod <>;
45 function Gen_Is_Power_Of_2 (Val : T) return Boolean;
46 function Gen_Is_Power_Of_2 (Val : T) return Boolean
47 is
48 (Val /= 0 and (Val and (Val - 1)) = 0);
49
50 function Is_Power_Of_2 is new Gen_Is_Power_Of_2 (Unsigned_16);
51 function Is_Power_Of_2 is new Gen_Is_Power_Of_2 (Unsigned_32);
52
Nico Huberf83364a2023-12-13 23:17:13 +010053 Space : constant Character := ' ';
54 Form_Feed : constant Character := Character'Val (16#0c#);
55 New_Line : constant Character := Character'Val (16#0a#);
56 Carriage_Return : constant Character := Character'Val (16#0d#);
57 Tab : constant Character := Character'Val (16#09#);
58 Vertical_Tab : constant Character := Character'Val (16#0b#);
59
60 function Is_Space (Ch : Character) return Boolean
61 is
62 (Ch = ' ' or (Tab <= Ch and Ch <= Carriage_Return));
63
Thomas Heijligen5c43abc2023-12-11 15:24:36 +000064end FILO;