aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/libgnat/s-casuti.ads
blob: ab28d0bf4dd4f660d73e9ace8a6514ebfc33eff0 (plain)
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
------------------------------------------------------------------------------
--                                                                          --
--                         GNAT RUN-TIME COMPONENTS                         --
--                                                                          --
--                     S Y S T E M . C A S E _ U T I L                      --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
--          Copyright (C) 1995-2024, 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.      --
--                                                                          --
------------------------------------------------------------------------------

--  Simple casing functions

--  This package provides simple casing functions that do not require the
--  overhead of the full casing tables found in Ada.Characters.Handling.

--  Preconditions in this unit are meant for analysis only, not for run-time
--  checking, so that the expected exceptions are raised. This is enforced by
--  setting the corresponding assertion policy to Ignore. Postconditions and
--  contract cases should not be executed at runtime as well, in order not to
--  slow down the execution of these functions.

pragma Assertion_Policy (Pre            => Ignore,
                         Post           => Ignore,
                         Contract_Cases => Ignore,
                         Ghost          => Ignore);

package System.Case_Util
  with Pure, SPARK_Mode
is
   --  Note: all the following functions handle the full Latin-1 set

   function To_Upper (A : Character) return Character
   with
     Post => (declare
                A_Val : constant Natural := Character'Pos (A);
              begin
                (if A in 'a' .. 'z'
                   or else A_Val in 16#E0# .. 16#F6#
                   or else A_Val in 16#F8# .. 16#FE#
                 then
                   To_Upper'Result = Character'Val (A_Val - 16#20#)
                 else
                   To_Upper'Result = A));
   --  Converts A to upper case if it is a lower case letter, otherwise
   --  returns the input argument unchanged.

   procedure To_Upper (A : in out String)
   with
     Post => (for all J in A'Range => A (J) = To_Upper (A'Old (J)));

   function To_Upper (A : String) return String
   with
     Post => To_Upper'Result'First = A'First
       and then To_Upper'Result'Last = A'Last
       and then (for all J in A'Range =>
                   To_Upper'Result (J) = To_Upper (A (J)));
   --  Folds all characters of string A to upper case

   function To_Lower (A : Character) return Character
   with
     Post => (declare
                A_Val : constant Natural := Character'Pos (A);
              begin
                (if A in 'A' .. 'Z'
                   or else A_Val in 16#C0# .. 16#D6#
                   or else A_Val in 16#D8# .. 16#DE#
                 then
                   To_Lower'Result = Character'Val (A_Val + 16#20#)
                 else
                   To_Lower'Result = A));
   --  Converts A to lower case if it is an upper case letter, otherwise
   --  returns the input argument unchanged.

   procedure To_Lower (A : in out String)
   with
     Post => (for all J in A'Range => A (J) = To_Lower (A'Old (J)));

   function To_Lower (A : String) return String
   with
     Post => To_Lower'Result'First = A'First
       and then To_Lower'Result'Last = A'Last
       and then (for all J in A'Range =>
                   To_Lower'Result (J) = To_Lower (A (J)));
   --  Folds all characters of string A to lower case

   procedure To_Mixed (A : in out String)
   with
     Post =>
       (for all J in A'Range =>
          (if J = A'First
             or else A'Old (J - 1) = '_'
           then
             A (J) = To_Upper (A'Old (J))
           else
             A (J) = To_Lower (A'Old (J))));

   function To_Mixed (A : String) return String
   with
     Post => To_Mixed'Result'First = A'First
       and then To_Mixed'Result'Last = A'Last
       and then (for all J in A'Range =>
                   (if J = A'First
                      or else A (J - 1) = '_'
                    then
                      To_Mixed'Result (J) = To_Upper (A (J))
                    else
                      To_Mixed'Result (J) = To_Lower (A (J))));
   --  Converts A to mixed case (i.e. lower case, except for initial
   --  character and any character after an underscore, which are
   --  converted to upper case.

end System.Case_Util;