File : adagio-file-criteria.adb


------------------------------------------------------------------------------

--                         ADAGIO - ADALID - AENEA.                         --

--                                                                          --

--                            Copyright (C) 2003                            --

--                                 A. Mosteo.                               --

--                                                                          --

--  Authors: A. Mosteo. (adagio@mosteo.com)                                 --

--                                                                          --

--  If you have any questions in regard to this software, please address    --

--  them to the above email.                                                --

--                                                                          --

--  This program is free software; you can redistribute it and/or modify    --

--  it under the terms of the GNU General Public License as published by    --

--  the Free Software Foundation; either version 2 of the License, or (at   --

--  your option) any later version.                                         --

--                                                                          --

--  This program 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       --

--  along with this library; if not, write to the Free Software Foundation, --

--  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.          --

--                                                                          --

--  You are not allowed to use any part of this code to develop a program   --

--  whose output would be used to harass or prosecute other users of the    --

--  networks Adagio connects with. All data collected with Adagio or a tool --

--  containing Adagio code about other network users must remain            --

--  confidential and cannot be made public by any mean, nor be used to      --

--  harass or legally prosecute these users.                                --

------------------------------------------------------------------------------

--  $Id: adagio-file-criteria.adb,v 1.4 2004/01/21 21:05:27 Jano Exp $


--  Criteria to qualify files


with Adagio.Misc;

with Strings.Fields; use Strings.Fields;
with Strings.Utils;  use Strings.Utils;

with Gnat.Directory_operations; use Gnat;

package body Adagio.File.Criteria is

   -- Defined criteria:

   -- Greater_than            Size greater OR EQUAL than

   -- Smaller_than            Size smaller than 

   -- Is_in                   File is in a certain subfolder

   -- Extension_is            Extension comparison (with dot)

   --    Additionally we have: and or not true false, 

   --    evaluated always left to righ


   -- Examples:

   -- Smaller_than 1024 or Is_in c:/test or Extension_is .mp3

   -- Greater_than 1024 and Smaller_than 10240


   function L (S : in String) return String
      renames Misc.To_lower;

   function Qualify (
      this      : in File.Object; 
      Criterion : in String;
      Initially : in Boolean := false) 
      return Boolean is

      function Greater_than (S : String) return Boolean is
      begin
         return File.Size (this) >= Misc.Parse_size (S);
      end Greater_than;

      function Smaller_than (S : String) return Boolean is
      begin
         return File.Size (this) < Misc.Parse_size (S);
      end Smaller_than;

      function Is_in (S : String) return Boolean is
         Path : String := File.Path (This);
      begin
         return 
            S'Length > 0 and then
            S = Path (Path'First .. Path'First + S'length - 1);
      end Is_in;

      function Extension_is (S : String) return Boolean is
         Ext : String renames L (Directory_operations.File_extension (
            File.Path (This)));
      begin
         return Ext = L (S);
      end Extension_is;

      -- Extract a path delimited with ||, normalizing slashes to forward.

      function Next_path (S : String) return String is
         use Gnat.Directory_operations;
         Path : String renames Select_field (S, '|', '|');
      begin
         return Format_pathname (path, UNIX);
      end Next_path;

      function Skip_path (S : String) return String is
      begin
         return Select_field (S, 3, '|');
      end Skip_path;
      
      H    : String  := L (Head (Criterion));
      T    : String  := Tail (Criterion);
      Next : String  := Tail (T);

   begin
      if H = "" then
         return Initially;
      elsif H = "true" then
         return Qualify (this, T, true);
      elsif H = "false" then
         return Qualify (this, T, false);
      elsif H = "or" then
         return Initially or Qualify (this, T);
      elsif H = "and" then
         return Initially and Qualify (this, T);
      elsif H = "greater_than" then
         return Qualify (this, Next, Greater_than (Head (T)));
      elsif H = "smaller_than" then
         return Qualify (this, Next, Smaller_than (Head (T)));
      elsif H = "is_in" then
         return Qualify (this, Skip_path (T), Is_in (Next_path (T)));
      elsif H = "extension_is" then
         return Qualify (this, Next, Extension_is (Head (T)));
      else
         Raise_exception (Syntax_error'Identity, Criterion);
         return false;
      end if;
   end Qualify;
   
end Adagio.File.Criteria;