+2009-06-25 Ed Falis <falis@adacore.com>
+
+ * s-vxwext-rtp.ads: Add missing declaration
+
+2009-06-25 Matthew Gingell <gingell@adacore.com>
+
+ * a-stwise.adb, a-stzsea.adb (Count, Index): Avoid local copy on stack,
+ speed up unmapped case.
+
+2009-06-25 Vincent Celier <celier@adacore.com>
+
+ * prj-nmsc.adb (Check): Change error message for illegal abstract
+ projects.
+
+2009-06-25 Robert Dewar <dewar@adacore.com>
+
+ * gnat_ugn.texi: Add note on use of -gnatct for ASIS
+
+2009-06-25 Emmanuel Briot <briot@adacore.com>
+
+ * fmap.ads: Add documentation on mapping files
+
2009-06-25 Robert Dewar <dewar@adacore.com>
* exp_ch6.adb, g-socket.ads, g-socket.adb, sem_ch3.adb: Minor
------------------------------------------------------------------------------
with Ada.Strings.Wide_Maps; use Ada.Strings.Wide_Maps;
+with System; use System;
package body Ada.Strings.Wide_Search is
Mapping : Wide_Maps.Wide_Character_Mapping := Wide_Maps.Identity)
return Natural
is
- N : Natural;
- J : Natural;
-
+ PL1 : constant Integer := Pattern'Length - 1;
+ Num : Natural;
+ Ind : Natural;
+ Cur : Natural;
begin
if Pattern = "" then
raise Pattern_Error;
end if;
- -- Handle the case of non-identity mappings by creating a mapped
- -- string and making a recursive call using the identity mapping
- -- on this mapped string.
+ Num := 0;
+ Ind := Source'First;
+
+ -- Unmapped case
+
+ if Mapping'Address = Wide_Maps.Identity'Address then
+ Ind := Source'First;
+ while Ind <= Source'Length - PL1 loop
+ if Pattern = Source (Ind .. Ind + PL1) then
+ Num := Num + 1;
+ Ind := Ind + Pattern'Length;
+ else
+ Ind := Ind + 1;
+ end if;
+ end loop;
- if Mapping /= Wide_Maps.Identity then
- declare
- Mapped_Source : Wide_String (Source'Range);
+ -- Mapped case
- begin
- for J in Source'Range loop
- Mapped_Source (J) := Value (Mapping, Source (J));
+ else
+ Ind := Source'First;
+ while Ind <= Source'Length - PL1 loop
+ Cur := Ind;
+ for K in Pattern'Range loop
+ if Pattern (K) /= Value (Mapping, Source (Cur)) then
+ Ind := Ind + 1;
+ goto Cont;
+ else
+ Cur := Cur + 1;
+ end if;
end loop;
- return Count (Mapped_Source, Pattern);
- end;
- end if;
+ Num := Num + 1;
+ Ind := Ind + Pattern'Length;
- N := 0;
- J := Source'First;
+ <<Cont>>
+ null;
+ end loop;
+ end if;
- while J <= Source'Last - (Pattern'Length - 1) loop
- if Source (J .. J + (Pattern'Length - 1)) = Pattern then
- N := N + 1;
- J := J + Pattern'Length;
- else
- J := J + 1;
- end if;
- end loop;
+ -- Return result
- return N;
+ return Num;
end Count;
function Count
Pattern : Wide_String;
Mapping : Wide_Maps.Wide_Character_Mapping_Function) return Natural
is
- Mapped_Source : Wide_String (Source'Range);
+ PL1 : constant Integer := Pattern'Length - 1;
+ Num : Natural;
+ Ind : Natural;
+ Cur : Natural;
begin
- for J in Source'Range loop
- Mapped_Source (J) := Mapping (Source (J));
+ if Pattern = "" then
+ raise Pattern_Error;
+ end if;
+
+ -- Check for null pointer in case checks are off
+
+ if Mapping = null then
+ raise Constraint_Error;
+ end if;
+
+ Num := 0;
+ Ind := Source'First;
+ while Ind <= Source'Last - PL1 loop
+ Cur := Ind;
+ for K in Pattern'Range loop
+ if Pattern (K) /= Mapping (Source (Cur)) then
+ Ind := Ind + 1;
+ goto Cont;
+ else
+ Cur := Cur + 1;
+ end if;
+ end loop;
+
+ Num := Num + 1;
+ Ind := Ind + Pattern'Length;
+
+ <<Cont>>
+ null;
end loop;
- return Count (Mapped_Source, Pattern);
+ return Num;
end Count;
function Count
end if;
end loop;
- -- Here if J indexes 1st char of token, and all chars
- -- after J are in the token
+ -- Here if J indexes first char of token, and all chars after J
+ -- are in the token.
Last := Source'Last;
return;
Mapping : Wide_Maps.Wide_Character_Mapping := Wide_Maps.Identity)
return Natural
is
+ PL1 : constant Integer := Pattern'Length - 1;
+ Ind : Natural;
+ Cur : Natural;
+
begin
if Pattern = "" then
raise Pattern_Error;
end if;
- -- Handle the case of non-identity mappings by creating a mapped
- -- string and making a recursive call using the identity mapping
- -- on this mapped string.
+ -- Forwards case
+
+ if Going = Forward then
+ Ind := Source'First;
- if Mapping /= Identity then
- declare
- Mapped_Source : Wide_String (Source'Range);
+ -- Unmapped forward case
- begin
- for J in Source'Range loop
- Mapped_Source (J) := Value (Mapping, Source (J));
+ if Mapping'Address = Wide_Maps.Identity'Address then
+ for J in 1 .. Source'Length - PL1 loop
+ if Pattern = Source (Ind .. Ind + PL1) then
+ return Ind;
+ else
+ Ind := Ind + 1;
+ end if;
end loop;
- return Index (Mapped_Source, Pattern, Going);
- end;
- end if;
+ -- Mapped forward case
- if Going = Forward then
- for J in Source'First .. Source'Last - Pattern'Length + 1 loop
- if Pattern = Source (J .. J + Pattern'Length - 1) then
- return J;
- end if;
- end loop;
+ else
+ for J in 1 .. Source'Length - PL1 loop
+ Cur := Ind;
- else -- Going = Backward
- for J in reverse Source'First .. Source'Last - Pattern'Length + 1 loop
- if Pattern = Source (J .. J + Pattern'Length - 1) then
- return J;
- end if;
- end loop;
+ for K in Pattern'Range loop
+ if Pattern (K) /= Value (Mapping, Source (Cur)) then
+ goto Cont1;
+ else
+ Cur := Cur + 1;
+ end if;
+ end loop;
+
+ return Ind;
+
+ <<Cont1>>
+ Ind := Ind + 1;
+ end loop;
+ end if;
+
+ -- Backwards case
+
+ else
+ -- Unmapped backward case
+
+ Ind := Source'Last - PL1;
+
+ if Mapping'Address = Wide_Maps.Identity'Address then
+ for J in reverse 1 .. Source'Length - PL1 loop
+ if Pattern = Source (Ind .. Ind + PL1) then
+ return Ind;
+ else
+ Ind := Ind - 1;
+ end if;
+ end loop;
+
+ -- Mapped backward case
+
+ else
+ for J in reverse 1 .. Source'Length - PL1 loop
+ Cur := Ind;
+
+ for K in Pattern'Range loop
+ if Pattern (K) /= Value (Mapping, Source (Cur)) then
+ goto Cont2;
+ else
+ Cur := Cur + 1;
+ end if;
+ end loop;
+
+ return Ind;
+
+ <<Cont2>>
+ Ind := Ind - 1;
+ end loop;
+ end if;
end if;
-- Fall through if no match found. Note that the loops are skipped
Going : Direction := Forward;
Mapping : Wide_Maps.Wide_Character_Mapping_Function) return Natural
is
- Mapped_Source : Wide_String (Source'Range);
+ PL1 : constant Integer := Pattern'Length - 1;
+ Ind : Natural;
+ Cur : Natural;
begin
- for J in Source'Range loop
- Mapped_Source (J) := Mapping (Source (J));
- end loop;
+ if Pattern = "" then
+ raise Pattern_Error;
+ end if;
+
+ -- Check for null pointer in case checks are off
+
+ if Mapping = null then
+ raise Constraint_Error;
+ end if;
+
+ -- Forwards case
+
+ if Going = Forward then
+ Ind := Source'First;
+ for J in 1 .. Source'Length - PL1 loop
+ Cur := Ind;
+
+ for K in Pattern'Range loop
+ if Pattern (K) /= Mapping.all (Source (Cur)) then
+ goto Cont1;
+ else
+ Cur := Cur + 1;
+ end if;
+ end loop;
+
+ return Ind;
+
+ <<Cont1>>
+ Ind := Ind + 1;
+ end loop;
+
+ -- Backwards case
+
+ else
+ Ind := Source'Last - PL1;
+ for J in reverse 1 .. Source'Length - PL1 loop
+ Cur := Ind;
+
+ for K in Pattern'Range loop
+ if Pattern (K) /= Mapping.all (Source (Cur)) then
+ goto Cont2;
+ else
+ Cur := Cur + 1;
+ end if;
+ end loop;
+
+ return Ind;
- return Index (Mapped_Source, Pattern, Going);
+ <<Cont2>>
+ Ind := Ind - 1;
+ end loop;
+ end if;
+
+ -- Fall through if no match found. Note that the loops are skipped
+ -- completely in the case of the pattern being longer than the source.
+
+ return 0;
end Index;
function Index
Going : Direction := Forward) return Natural
is
begin
+ -- Forwards case
+
if Going = Forward then
for J in Source'Range loop
if Belongs (Source (J), Set, Test) then
end if;
end loop;
- else -- Going = Backward
+ -- Backwards case
+
+ else
for J in reverse Source'Range loop
if Belongs (Source (J), Set, Test) then
return J;
------------------------------------------------------------------------------
with Ada.Strings.Wide_Wide_Maps; use Ada.Strings.Wide_Wide_Maps;
+with System; use System;
package body Ada.Strings.Wide_Wide_Search is
Wide_Wide_Maps.Identity)
return Natural
is
- N : Natural;
- J : Natural;
+ PL1 : constant Integer := Pattern'Length - 1;
+ Num : Natural;
+ Ind : Natural;
+ Cur : Natural;
begin
if Pattern = "" then
raise Pattern_Error;
end if;
- -- Handle the case of non-identity mappings by creating a mapped
- -- string and making a recursive call using the identity mapping
- -- on this mapped string.
+ Num := 0;
+ Ind := Source'First;
- if Mapping /= Wide_Wide_Maps.Identity then
- declare
- Mapped_Source : Wide_Wide_String (Source'Range);
+ -- Unmapped case
- begin
- for J in Source'Range loop
- Mapped_Source (J) := Value (Mapping, Source (J));
+ if Mapping'Address = Wide_Wide_Maps.Identity'Address then
+ Ind := Source'First;
+ while Ind <= Source'Length - PL1 loop
+ if Pattern = Source (Ind .. Ind + PL1) then
+ Num := Num + 1;
+ Ind := Ind + Pattern'Length;
+ else
+ Ind := Ind + 1;
+ end if;
+ end loop;
+
+ -- Mapped case
+
+ else
+ Ind := Source'First;
+ while Ind <= Source'Length - PL1 loop
+ Cur := Ind;
+ for K in Pattern'Range loop
+ if Pattern (K) /= Value (Mapping, Source (Cur)) then
+ Ind := Ind + 1;
+ goto Cont;
+ else
+ Cur := Cur + 1;
+ end if;
end loop;
- return Count (Mapped_Source, Pattern);
- end;
+ Num := Num + 1;
+ Ind := Ind + Pattern'Length;
+
+ <<Cont>>
+ null;
+ end loop;
end if;
- N := 0;
- J := Source'First;
+ -- Return result
- while J <= Source'Last - (Pattern'Length - 1) loop
- if Source (J .. J + (Pattern'Length - 1)) = Pattern then
- N := N + 1;
- J := J + Pattern'Length;
- else
- J := J + 1;
- end if;
- end loop;
-
- return N;
+ return Num;
end Count;
function Count
Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
return Natural
is
- Mapped_Source : Wide_Wide_String (Source'Range);
+ PL1 : constant Integer := Pattern'Length - 1;
+ Num : Natural;
+ Ind : Natural;
+ Cur : Natural;
begin
- for J in Source'Range loop
- Mapped_Source (J) := Mapping (Source (J));
+ if Pattern = "" then
+ raise Pattern_Error;
+ end if;
+
+ -- Check for null pointer in case checks are off
+
+ if Mapping = null then
+ raise Constraint_Error;
+ end if;
+
+ Num := 0;
+ Ind := Source'First;
+ while Ind <= Source'Last - PL1 loop
+ Cur := Ind;
+ for K in Pattern'Range loop
+ if Pattern (K) /= Mapping (Source (Cur)) then
+ Ind := Ind + 1;
+ goto Cont;
+ else
+ Cur := Cur + 1;
+ end if;
+ end loop;
+
+ Num := Num + 1;
+ Ind := Ind + Pattern'Length;
+
+ <<Cont>>
+ null;
end loop;
- return Count (Mapped_Source, Pattern);
+ return Num;
end Count;
function Count
end if;
end loop;
- -- Here if J indexes 1st char of token, and all chars
- -- after J are in the token
+ -- Here if J indexes first char of token, and all chars after J
+ -- are in the token.
Last := Source'Last;
return;
Wide_Wide_Maps.Identity)
return Natural
is
+ PL1 : constant Integer := Pattern'Length - 1;
+ Ind : Natural;
+ Cur : Natural;
+
begin
if Pattern = "" then
raise Pattern_Error;
end if;
- -- Handle the case of non-identity mappings by creating a mapped
- -- string and making a recursive call using the identity mapping
- -- on this mapped string.
+ -- Forwards case
+
+ if Going = Forward then
+ Ind := Source'First;
- if Mapping /= Identity then
- declare
- Mapped_Source : Wide_Wide_String (Source'Range);
+ -- Unmapped forward case
- begin
- for J in Source'Range loop
- Mapped_Source (J) := Value (Mapping, Source (J));
+ if Mapping'Address = Wide_Wide_Maps.Identity'Address then
+ for J in 1 .. Source'Length - PL1 loop
+ if Pattern = Source (Ind .. Ind + PL1) then
+ return Ind;
+ else
+ Ind := Ind + 1;
+ end if;
end loop;
- return Index (Mapped_Source, Pattern, Going);
- end;
- end if;
+ -- Mapped forward case
- if Going = Forward then
- for J in Source'First .. Source'Last - Pattern'Length + 1 loop
- if Pattern = Source (J .. J + Pattern'Length - 1) then
- return J;
- end if;
- end loop;
+ else
+ for J in 1 .. Source'Length - PL1 loop
+ Cur := Ind;
- else -- Going = Backward
- for J in reverse Source'First .. Source'Last - Pattern'Length + 1 loop
- if Pattern = Source (J .. J + Pattern'Length - 1) then
- return J;
- end if;
- end loop;
+ for K in Pattern'Range loop
+ if Pattern (K) /= Value (Mapping, Source (Cur)) then
+ goto Cont1;
+ else
+ Cur := Cur + 1;
+ end if;
+ end loop;
+
+ return Ind;
+
+ <<Cont1>>
+ Ind := Ind + 1;
+ end loop;
+ end if;
+
+ -- Backwards case
+
+ else
+ -- Unmapped backward case
+
+ Ind := Source'Last - PL1;
+
+ if Mapping'Address = Wide_Wide_Maps.Identity'Address then
+ for J in reverse 1 .. Source'Length - PL1 loop
+ if Pattern = Source (Ind .. Ind + PL1) then
+ return Ind;
+ else
+ Ind := Ind - 1;
+ end if;
+ end loop;
+
+ -- Mapped backward case
+
+ else
+ for J in reverse 1 .. Source'Length - PL1 loop
+ Cur := Ind;
+
+ for K in Pattern'Range loop
+ if Pattern (K) /= Value (Mapping, Source (Cur)) then
+ goto Cont2;
+ else
+ Cur := Cur + 1;
+ end if;
+ end loop;
+
+ return Ind;
+
+ <<Cont2>>
+ Ind := Ind - 1;
+ end loop;
+ end if;
end if;
-- Fall through if no match found. Note that the loops are skipped
Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
return Natural
is
- Mapped_Source : Wide_Wide_String (Source'Range);
+ PL1 : constant Integer := Pattern'Length - 1;
+ Ind : Natural;
+ Cur : Natural;
begin
- for J in Source'Range loop
- Mapped_Source (J) := Mapping (Source (J));
- end loop;
+ if Pattern = "" then
+ raise Pattern_Error;
+ end if;
+
+ -- Check for null pointer in case checks are off
+
+ if Mapping = null then
+ raise Constraint_Error;
+ end if;
+
+ -- Forwards case
+
+ if Going = Forward then
+ Ind := Source'First;
+ for J in 1 .. Source'Length - PL1 loop
+ Cur := Ind;
+
+ for K in Pattern'Range loop
+ if Pattern (K) /= Mapping.all (Source (Cur)) then
+ goto Cont1;
+ else
+ Cur := Cur + 1;
+ end if;
+ end loop;
+
+ return Ind;
+
+ <<Cont1>>
+ Ind := Ind + 1;
+ end loop;
+
+ -- Backwards case
+
+ else
+ Ind := Source'Last - PL1;
+ for J in reverse 1 .. Source'Length - PL1 loop
+ Cur := Ind;
+
+ for K in Pattern'Range loop
+ if Pattern (K) /= Mapping.all (Source (Cur)) then
+ goto Cont2;
+ else
+ Cur := Cur + 1;
+ end if;
+ end loop;
+
+ return Ind;
- return Index (Mapped_Source, Pattern, Going);
+ <<Cont2>>
+ Ind := Ind - 1;
+ end loop;
+ end if;
+
+ -- Fall through if no match found. Note that the loops are skipped
+ -- completely in the case of the pattern being longer than the source.
+
+ return 0;
end Index;
function Index
Going : Direction := Forward) return Natural
is
begin
+ -- Forwards case
+
if Going = Forward then
for J in Source'Range loop
if Belongs (Source (J), Set, Test) then
end if;
end loop;
- else -- Going = Backward
+ -- Backwards case
+
+ else
for J in reverse Source'Range loop
if Belongs (Source (J), Set, Test) then
return J;
-- --
-- S p e c --
-- --
--- Copyright (C) 2001-2007, Free Software Foundation, Inc. --
+-- Copyright (C) 2001-2009, 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- --
-- This package keeps two mappings: from unit names to file names,
-- and from file names to path names.
+--
+-- This mapping is used to communicate between the builder (gnatmake or
+-- gprbuild) and the compiler. The format of this mapping file is the
+-- following:
+-- For each source file, there are three lines in the mapping file:
+-- Unit name with %b or %s added depending on whether it is a body or a spec
+-- File name
+-- Path name (set to '/' if the file should be ignored in fact, ie for
+-- a Locally_Removed_File in a project)
with Namet; use Namet;
Typically
these tools do the necessary compilations automatically, so you should
not have to specify this switch in normal operation.
+Note that the combination of switches @option{-gnatct} generates a tree
+in the form required by ASIS applications.
@item -gnatu
@cindex @option{-gnatu} (@command{gcc})
else
Error_Msg
(Project, In_Tree,
- "an abstract project needs to have no language, " &
- "no sources or no source directories",
+ "at least one of Source_Files, Source_Dirs or Languages " &
+ "must be declared empty for an abstract project",
Project.Location);
end if;
end;
function Set_Time_Slice (ticks : int) return int;
pragma Inline (Set_Time_Slice);
+ --------------------------------
+ -- Processor Affinity for SMP --
+ --------------------------------
+
+ function taskCpuAffinitySet (tid : t_id; CPU : int) return int;
+ pragma Convention (C, taskCpuAffinitySet);
+ -- For SMP run-times set the CPU affinity.
+ -- For uniprocessor systems return ERROR status.
+
end System.VxWorks.Ext;