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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
  
     | 
    
      ------------------------------------------------------------------------------
--                                                                          --
--                         GNAT RUN-TIME COMPONENTS                         --
--                                                                          --
--                       S Y S T E M . I M A G E _ W                        --
--                                                                          --
--                                 B o d y                                  --
--                                                                          --
--          Copyright (C) 1992-2022, Free Software Foundation, Inc.         --
--                                                                          --
-- GNAT is free software;  you can  redistribute it  and/or modify it under --
-- terms of the  GNU General Public License as published  by the Free Soft- --
-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
--                                                                          --
-- As a special exception under Section 7 of GPL version 3, you are granted --
-- additional permissions described in the GCC Runtime Library Exception,   --
-- version 3.1, as published by the Free Software Foundation.               --
--                                                                          --
-- You should have received a copy of the GNU General Public License and    --
-- a copy of the GCC Runtime Library Exception along with this program;     --
-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
-- <http://www.gnu.org/licenses/>.                                          --
--                                                                          --
-- GNAT was originally developed  by the GNAT team at  New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
--                                                                          --
------------------------------------------------------------------------------
package body System.Image_W is
   -----------------------------
   -- Set_Image_Width_Integer --
   -----------------------------
   procedure Set_Image_Width_Integer
     (V : Int;
      W : Integer;
      S : out String;
      P : in out Natural)
   is
      Start : Natural;
   begin
      --  Positive case can just use the unsigned circuit directly
      if V >= 0 then
         Set_Image_Width_Unsigned (Uns (V), W, S, P);
      --  Negative case has to set a minus sign. Note also that we have to be
      --  careful not to generate overflow with the largest negative number.
      else
         P := P + 1;
         S (P) := ' ';
         Start := P;
         declare
            pragma Suppress (Overflow_Check);
            pragma Suppress (Range_Check);
         begin
            Set_Image_Width_Unsigned (Uns (-V), W - 1, S, P);
         end;
         --  Set minus sign in last leading blank location. Because of the
         --  code above, there must be at least one such location.
         while S (Start + 1) = ' ' loop
            Start := Start + 1;
         end loop;
         S (Start) := '-';
      end if;
   end Set_Image_Width_Integer;
   ------------------------------
   -- Set_Image_Width_Unsigned --
   ------------------------------
   procedure Set_Image_Width_Unsigned
     (V : Uns;
      W : Integer;
      S : out String;
      P : in out Natural)
   is
      Start : constant Natural := P;
      F, T  : Natural;
      procedure Set_Digits (T : Uns);
      --  Set digits of absolute value of T
      ----------------
      -- Set_Digits --
      ----------------
      procedure Set_Digits (T : Uns) is
      begin
         if T >= 10 then
            Set_Digits (T / 10);
            pragma Assert (P >= (S'First - 1) and P < S'Last and
                           P < Natural'Last);
            --  No check is done since, as documented in the specification,
            --  the caller guarantees that S is long enough to hold the result.
            P := P + 1;
            S (P) := Character'Val (T mod 10 + Character'Pos ('0'));
         else
            pragma Assert (P >= (S'First - 1) and P < S'Last and
                           P < Natural'Last);
            --  No check is done since, as documented in the specification,
            --  the caller guarantees that S is long enough to hold the result.
            P := P + 1;
            S (P) := Character'Val (T + Character'Pos ('0'));
         end if;
      end Set_Digits;
   --  Start of processing for Set_Image_Width_Unsigned
   begin
      Set_Digits (V);
      --  Add leading spaces if required by width parameter
      if P - Start < W then
         F := P;
         P := P + (W - (P - Start));
         T := P;
         while F > Start loop
            pragma Assert (T >= S'First and T <= S'Last and
                           F >= S'First and F <= S'Last);
            --  No check is done since, as documented in the specification,
            --  the caller guarantees that S is long enough to hold the result.
            S (T) := S (F);
            T := T - 1;
            F := F - 1;
         end loop;
         for J in Start + 1 .. T loop
            pragma Assert (J >= S'First and J <= S'Last);
            --  No check is done since, as documented in the specification,
            --  the caller guarantees that S is long enough to hold the result.
            S (J) := ' ';
         end loop;
      end if;
   end Set_Image_Width_Unsigned;
end System.Image_W;
 
     |