File : gnatkr.adb


   1 ------------------------------------------------------------------------------
   2 --                                                                          --
   3 --                         GNAT COMPILER COMPONENTS                         --
   4 --                                                                          --
   5 --                               G N A T K R                                --
   6 --                                                                          --
   7 --                                 B o d y                                  --
   8 --                                                                          --
   9 --          Copyright (C) 1992-2013, Free Software Foundation, Inc.         --
  10 --                                                                          --
  11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  12 -- terms of the  GNU General Public License as published  by the Free Soft- --
  13 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
  14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  16 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
  17 -- for  more details.  You should have  received  a copy of the GNU General --
  18 -- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
  19 -- http://www.gnu.org/licenses for a complete copy of the license.          --
  20 --                                                                          --
  21 -- GNAT was originally developed  by the GNAT team at  New York University. --
  22 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
  23 --                                                                          --
  24 ------------------------------------------------------------------------------
  25 
  26 with Gnatvsn;
  27 with Krunch;
  28 with Switch;  use Switch;
  29 
  30 with Ada.Characters.Handling; use Ada.Characters.Handling;
  31 with Ada.Command_Line;        use Ada.Command_Line;
  32 
  33 with System.IO; use System.IO;
  34 
  35 procedure Gnatkr is
  36    pragma Ident (Gnatvsn.Gnat_Static_Version_String);
  37 
  38    Count        : Natural;
  39    Maxlen       : Integer;
  40    Exit_Program : exception;
  41 
  42    function Get_Maximum_File_Name_Length return Integer;
  43    pragma Import (C, Get_Maximum_File_Name_Length,
  44                   "__gnat_get_maximum_file_name_length");
  45 
  46    procedure Usage;
  47    --  Output usage information
  48 
  49    -----------
  50    -- Usage --
  51    -----------
  52 
  53    procedure Usage is
  54    begin
  55       Put_Line ("Usage: gnatkr  filename[.extension]  [krunch-count]");
  56    end Usage;
  57 
  58    procedure Check_Version_And_Help is new Check_Version_And_Help_G (Usage);
  59 
  60 begin
  61    Check_Version_And_Help ("GNATKR", "1992");
  62    Count := Argument_Count;
  63 
  64    if Count < 1 or else Count > 2 then
  65       Usage;
  66       raise Exit_Program;
  67 
  68    else
  69       --  If the length (krunch-count) argument is omitted use the system
  70       --  default if there is one, otherwise use 8.
  71 
  72       if Count = 1 then
  73          Maxlen := Get_Maximum_File_Name_Length;
  74 
  75          if Maxlen = -1 then
  76             Maxlen := 8;
  77          end if;
  78 
  79       else
  80          Maxlen := 0;
  81 
  82          for J in Argument (2)'Range loop
  83             if Argument (2) (J) /= ' ' then
  84                if Argument (2) (J) not in '0' .. '9' then
  85                   Put_Line ("Illegal argument for krunch-count");
  86                   raise Exit_Program;
  87                else
  88                   Maxlen := Maxlen * 10 +
  89                     Character'Pos (Argument (2) (J)) - Character'Pos ('0');
  90                end if;
  91             end if;
  92          end loop;
  93 
  94          --  Zero means crunch only system files
  95 
  96          if Maxlen = 0 then
  97             Maxlen := Natural'Last;
  98          end if;
  99 
 100       end if;
 101 
 102       declare
 103          Fname : String  := Argument (1);
 104          Klen  : Natural := Fname'Length;
 105 
 106          Extp : Boolean := False;
 107          --  True if extension is present
 108 
 109          Ext : Natural := 0;
 110          --  If extension is present, points to it (init to prevent warning)
 111 
 112       begin
 113          --  Remove extension if present (an extension is defined as the
 114          --  section of the file name after the last dot in the name. If
 115          --  there is no dot in the name, then
 116          --  name is all lower case and contains no other instances of dots)
 117 
 118          for J in reverse 1 .. Klen loop
 119             if Fname (J) = '.' then
 120                Extp := True;
 121                Ext := J;
 122                Klen := J - 1;
 123                exit;
 124             end if;
 125          end loop;
 126 
 127          --  Fold to lower case and replace dots by dashes
 128 
 129          for J in 1 .. Klen loop
 130             Fname (J) := To_Lower (Fname (J));
 131 
 132             if Fname (J) = '.' then
 133                Fname (J) := '-';
 134             end if;
 135          end loop;
 136 
 137          Krunch (Fname, Klen, Maxlen, False);
 138 
 139          Put (Fname (1 .. Klen));
 140 
 141          if Extp then
 142             Put (Fname (Ext .. Fname'Length));
 143          end if;
 144 
 145          New_Line;
 146       end;
 147    end if;
 148 
 149    Set_Exit_Status (Success);
 150 
 151 exception
 152    when Exit_Program =>
 153       Set_Exit_Status (Failure);
 154 
 155 end Gnatkr;