/usr/share/ada/adainclude/plplotadad/plplot_auxiliary.adb is in libplplot-ada1-dev 5.10.0+dfsg2-0.1ubuntu2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | -- $Id: plplot_auxiliary.adb 11681 2011-03-29 09:30:43Z jbauck $
-- Auxiliary types and subprograms to be with-ed by all the Ada
-- bindings to PLplot
-- Copyright (C) 2008-2010 Jerry Bauck
-- This file is part of PLplot.
-- PLplot is free software; you can redistribute it and/or modify
-- it under the terms of the GNU Library General Public License as published
-- by the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
-- PLplot 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 Library General Public License for more details.
-- You should have received a copy of the GNU Library General Public License
-- along with PLplot; if not, write to the Free Software
-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
package body PLplot_Auxiliary is
--------------------------------------------------------------------------------
-- Utility procedures useful in compiling the examples --
--------------------------------------------------------------------------------
-- Mimic C conversion of float to integer; something similar works in e.g.
-- plplot_thin.adb.
-- C truncates towards 0. Ada rounds to nearest integer; midway rounded
-- away from zero, e.g. Inteter(±3.5) is ±4. But any completely reliable
-- conversion is probalby not possible; indeed, this one exactly emulates C
-- when tested for values around ±2 to ±3. Both convert ±2.9999999999999997
-- to ±2 and ±2.9999999999999998 to ±3.
function Trunc(a : Long_Float) return Integer is
begin
if a >= 0.0 then
return Integer(a - 0.4999999999999999);
else
return Integer(a + 0.4999999999999999);
end if;
end Trunc;
-- Find minimum in a 1D array.
function Vector_Min(x : Real_Vector) return Long_Float is
Result : Long_Float;
begin
Result := x(x'First);
for i in x'First+1..x'Last loop
Result := Long_Float'min(Result, x(i));
end loop;
return Result;
end Vector_Min;
-- Find minimum and its location in a 1D array.
procedure Vector_Min(x : Real_Vector;
The_Minimum : out Long_Float;
Location_Of_Min : out Integer) is
begin
The_Minimum := x(x'First);
Location_Of_Min := x'First;
for i in x'First+1..x'Last loop
if x(i) < x(i - 1) then -- Finds the first of repeated mins.
The_Minimum := x(i);
Location_Of_Min := i;
end if;
end loop;
end Vector_Min;
-- Find maximum in a 1D array.
function Vector_Max(x : Real_Vector) return Long_Float is
Result : Long_Float;
begin
Result := x(x'First);
for i in x'First+1..x'Last loop
Result := Long_Float'max(Result, x(i));
end loop;
return Result;
end Vector_Max;
-- Find maximum and its location in a 1D array.
procedure Vector_Max(x : Real_Vector;
The_Maximum : out Long_Float;
Location_Of_Max : out Integer) is
begin
The_Maximum := x(x'First);
Location_Of_Max := x'First;
for i in x'First+1..x'Last loop
if x(i) > x(i - 1) then -- Finds the first of repeated maxes.
The_Maximum := x(i);
Location_Of_Max := i;
end if;
end loop;
end Vector_Max;
-- Find minimum in a 2D array.
function Matrix_Min(x : Real_Matrix) return Long_Float is
Result : Long_Float := Long_Float'large;
begin
for j in x'First(2)..x'Last(2) loop
for i in x'First(1)..x'Last(1) loop
Result := Long_Float'Min(Result, x(i, j));
end loop;
end loop;
return Result;
end Matrix_Min;
-- Find maximum in a 2D array.
function Matrix_Max(x : Real_Matrix) return Long_Float is
Result : Long_Float := Long_Float'small;
begin
for j in x'First(2)..x'Last(2) loop
for i in x'First(1)..x'Last(1) loop
Result := Long_Float'Max(Result, x(i, j));
end loop;
end loop;
return Result;
end Matrix_Max;
end PLplot_Auxiliary;
|