File : posix-page_alignment.adb
------------------------------------------------------------------------------
-- --
-- FLORIST (FSU Implementation of POSIX.5) COMPONENTS --
-- --
-- P O S I X . P A G E _ A L I G N M E N T --
-- --
-- B o d y --
-- --
-- --
-- Copyright (c) 1996-1998 Florida State University (FSU), --
-- All Rights Reserved. --
-- --
-- This file is a component of FLORIST, an implementation of an Ada API --
-- for the POSIX OS services, for use with the GNAT Ada compiler and --
-- the FSU Gnu Ada Runtime Library (GNARL). The interface is intended --
-- to be close to that specified in IEEE STD 1003.5: 1990 and IEEE STD --
-- 1003.5b: 1996. --
-- --
-- FLORIST is free software; you can redistribute it and/or modify it --
-- under terms of the GNU General Public License as published by the --
-- Free Software Foundation; either version 2, or (at your option) any --
-- later version. FLORIST is distributed in the hope that it will be --
-- useful, but WITHOUT ANY WARRANTY; without even the implied warranty --
-- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --
-- General Public License for more details. You should have received a --
-- copy of the GNU General Public License distributed with GNARL; see --
-- file COPYING. If not, write to the Free Software Foundation, 59 --
-- Temple Place - Suite 330, Boston, MA 02111-1307, USA. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
-- --
------------------------------------------------------------------------------
-- [$Revision: 1.1.1.1 $]
with POSIX.Configurable_System_Limits,
System,
System.Storage_Elements;
pragma Elaborate_All (POSIX.Configurable_System_Limits);
package body POSIX.Page_Alignment is
use System.Storage_Elements,
System;
Page_Size : constant Storage_Offset :=
Storage_Offset (POSIX.Configurable_System_Limits.Page_Size);
------------------------
-- Truncate_To_Page --
------------------------
function Truncate_To_Page
(Addr : Address) return Address is
begin
if Page_Size /= 0 then
return Addr - (Addr mod Page_Size);
else
return Addr;
end if;
end Truncate_To_Page;
function Truncate_To_Page
(Offset : IO_Count) return IO_Count is
begin
if Page_Size /= 0 then
return Offset - (Offset rem IO_Count (Page_Size));
else
return Offset;
end if;
end Truncate_To_Page;
---------------------
-- Adjust_Length --
---------------------
function Adjust_Length
(Addr : Address;
Length : Storage_Offset) return Storage_Offset is
L : Storage_Offset;
begin
L := Length + Addr - Truncate_To_Page (Addr);
if Page_Size = 0 then return L; end if;
if L mod Page_Size = 0 then return L; end if;
return Page_Size * (L / Page_Size + 1);
end Adjust_Length;
function Adjust_Length
(Offset : IO_Count;
Length : Storage_Offset) return Storage_Offset is
O : IO_Count;
L : Storage_Offset;
begin
O := Offset - Truncate_To_Page (Offset);
L := Length + Storage_Offset (O);
if Page_Size = 0 then return L; end if;
if L mod Page_Size = 0 then return L; end if;
return Page_Size * (L / Page_Size + 1);
end Adjust_Length;
--------------
-- Length --
--------------
function Length
(Size : in Natural) return Storage_Offset is
begin
if Size mod System.Storage_Unit = 0 then
return Storage_Offset (Size);
else
return Storage_Offset (Size / System.Storage_Unit + 1);
end if;
end Length;
end POSIX.Page_Alignment;