-- CB40A030.A
--
--                             Grant of Unlimited Rights
--
--     Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
--     F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained 
--     unlimited rights in the software and documentation contained herein.
--     Unlimited rights are defined in DFAR 252.227-7013(a)(19).  By making 
--     this public release, the Government intends to confer upon all 
--     recipients unlimited rights  equal to those held by the Government.  
--     These rights include rights to use, duplicate, release or disclose the 
--     released technical data and computer software in whole or in part, in 
--     any manner and for any purpose whatsoever, and to have or permit others 
--     to do so.
--
--                                    DISCLAIMER
--
--     ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
--     DISCLOSED ARE AS IS.  THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED 
--     WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
--     SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE 
--     OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
--     PARTICULAR PURPOSE OF SAID MATERIAL.
--*
--
-- OBJECTIVE:
--      See CB40A031.AM.
--
-- TEST DESCRIPTION:
--      See CB40A031.AM.
--
-- TEST FILES:
--      This test consists of the following files:
--
--         FB40A00.A
--      => CB40A030.A
--         CB40A031.AM
--
--       
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--      02 Nov 96   SAIC    ACVC 2.1: Modified prologue.
--
--!


package FB40A00.CB40A030_0 is  -- package Text_Parser.Character_Counting

   function Count_AlphaNumerics (Text : in String) return Natural;

end FB40A00.CB40A030_0;


     --=================================================================--


private package  FB40A00.CB40A030_1  is    -- package Text_Parser.Processing

   procedure Process_Text (Text : in String);

end FB40A00.CB40A030_1;  


     --=================================================================--


package body  FB40A00.CB40A030_1  is

   procedure Process_Text (Text : in String) is
      Loop_Count : Integer := Text'Length + 1;
   begin
      for Pos in 1..Loop_Count loop          -- Process string, force the 
                                             -- raise of Constraint_Error. 
         if (Text (Pos) in 'a'..'z') or 
            (Text (Pos) in 'A'..'Z') or
            (Text (Pos) in '0'..'9') then
            Increment_AlphaNumeric_Count;
         else
            Increment_Non_AlphaNumeric_Count;
         end if;

      end loop;
      -- No exception handler here, exception propagates.
   end Process_Text;

end FB40A00.CB40A030_1;  


     --=================================================================--


with FB40A00.CB40A030_1;  -- private sibling package Text_Parser.Processing;

package body FB40A00.CB40A030_0 is

   function Count_AlphaNumerics (Text : in String) return Natural is
   begin
      FB40A00.CB40A030_1.Process_Text (Text);     -- Call proc in prvt child
                                                  -- package that is a
                                                  -- sibling of this package.
      return (AlphaNumeric_Count);
      -- No exception handler here, exception propagates.
   end Count_AlphaNumerics;

end FB40A00.CB40A030_0;
