]>
Commit | Line | Data |
---|---|---|
cacbc350 RK |
1 | ------------------------------------------------------------------------------ |
2 | -- -- | |
3 | -- GNAT COMPILER COMPONENTS -- | |
4 | -- -- | |
5 | -- S Y S T E M . V A L _ U N S -- | |
6 | -- -- | |
7 | -- S p e c -- | |
8 | -- -- | |
4b490c1e | 9 | -- Copyright (C) 1992-2020, Free Software Foundation, Inc. -- |
cacbc350 RK |
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- -- | |
748086b7 | 13 | -- ware Foundation; either version 3, or (at your option) any later ver- -- |
cacbc350 RK |
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 -- | |
748086b7 JJ |
16 | -- or FITNESS FOR A PARTICULAR PURPOSE. -- |
17 | -- -- | |
18 | -- As a special exception under Section 7 of GPL version 3, you are granted -- | |
19 | -- additional permissions described in the GCC Runtime Library Exception, -- | |
20 | -- version 3.1, as published by the Free Software Foundation. -- | |
21 | -- -- | |
22 | -- You should have received a copy of the GNU General Public License and -- | |
23 | -- a copy of the GCC Runtime Library Exception along with this program; -- | |
24 | -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- | |
25 | -- <http://www.gnu.org/licenses/>. -- | |
cacbc350 RK |
26 | -- -- |
27 | -- GNAT was originally developed by the GNAT team at New York University. -- | |
71ff80dc | 28 | -- Extensive contributions were provided by Ada Core Technologies Inc. -- |
cacbc350 RK |
29 | -- -- |
30 | ------------------------------------------------------------------------------ | |
31 | ||
32 | -- This package contains routines for scanning modular Unsigned | |
bfe7c10c | 33 | -- values for use in Text_IO.Modular_IO, and the Value attribute. |
cacbc350 RK |
34 | |
35 | with System.Unsigned_Types; | |
36 | ||
37 | package System.Val_Uns is | |
ca305a84 | 38 | pragma Preelaborate; |
cacbc350 | 39 | |
bfe7c10c | 40 | function Scan_Raw_Unsigned |
9de61fcb | 41 | (Str : String; |
d90e94c7 | 42 | Ptr : not null access Integer; |
9de61fcb | 43 | Max : Integer) return System.Unsigned_Types.Unsigned; |
cacbc350 RK |
44 | -- This function scans the string starting at Str (Ptr.all) for a valid |
45 | -- integer according to the syntax described in (RM 3.5(43)). The substring | |
bfe7c10c BD |
46 | -- scanned extends no further than Str (Max). Note: this does not scan |
47 | -- leading or trailing blanks, nor leading sign. | |
48 | -- | |
49 | -- There are three cases for the return: | |
cacbc350 | 50 | -- |
bfe7c10c BD |
51 | -- If a valid integer is found, then Ptr.all is updated past the last |
52 | -- character of the integer. | |
cacbc350 RK |
53 | -- |
54 | -- If no valid integer is found, then Ptr.all points either to an initial | |
55 | -- non-digit character, or to Max + 1 if the field is all spaces and the | |
56 | -- exception Constraint_Error is raised. | |
57 | -- | |
58 | -- If a syntactically valid integer is scanned, but the value is out of | |
59 | -- range, or, in the based case, the base value is out of range or there | |
60 | -- is an out of range digit, then Ptr.all points past the integer, and | |
bfe7c10c | 61 | -- Constraint_Error is raised. |
cacbc350 RK |
62 | -- |
63 | -- Note: these rules correspond to the requirements for leaving the pointer | |
9ec98e13 AC |
64 | -- positioned in Text_IO.Get. Note that the rules as stated in the RM would |
65 | -- seem to imply that for a case like: | |
66 | -- | |
67 | -- 8#12345670009# | |
68 | -- | |
69 | -- the pointer should be left at the first # having scanned out the longest | |
70 | -- valid integer literal (8), but in fact in this case the pointer points | |
71 | -- past the final # and Constraint_Error is raised. This is the behavior | |
72 | -- expected for Text_IO and enforced by the ACATS tests. | |
73 | -- | |
74 | -- If a based literal is malformed in that a character other than a valid | |
75 | -- hexadecimal digit is encountered during scanning out the digits after | |
76 | -- the # (this includes the case of using the wrong terminator, : instead | |
77 | -- of # or vice versa) there are two cases. If all the digits before the | |
78 | -- non-digit are in range of the base, as in | |
79 | -- | |
80 | -- 8#100x00# | |
81 | -- 8#100: | |
82 | -- | |
83 | -- then in this case, the "base" value before the initial # is returned as | |
84 | -- the result, and the pointer points to the initial # character on return. | |
85 | -- | |
86 | -- If an out of range digit has been detected before the invalid character, | |
87 | -- as in: | |
88 | -- | |
89 | -- 8#900x00# | |
90 | -- 8#900: | |
91 | -- | |
92 | -- then the pointer is also left at the initial # character, but constraint | |
93 | -- error is raised reflecting the encounter of an out of range digit. | |
94 | -- | |
95 | -- Finally if we have an unterminated fixed-point constant where the final | |
96 | -- # or : character is missing, Constraint_Error is raised and the pointer | |
97 | -- is left pointing past the last digit, as in: | |
98 | -- | |
99 | -- 8#22 | |
100 | -- | |
101 | -- This string results in a Constraint_Error with the pointer pointing | |
102 | -- past the second 2. | |
cacbc350 | 103 | -- |
bfe7c10c | 104 | -- Note: if Str is empty, i.e. if Max is less than Ptr, then this is a |
cacbc350 RK |
105 | -- special case of an all-blank string, and Ptr is unchanged, and hence |
106 | -- is greater than Max as required in this case. | |
1a779058 AC |
107 | -- |
108 | -- Note: this routine should not be called with Str'Last = Positive'Last. | |
109 | -- If this occurs Program_Error is raised with a message noting that this | |
110 | -- case is not supported. Most such cases are eliminated by the caller. | |
cacbc350 | 111 | |
bfe7c10c BD |
112 | function Scan_Unsigned |
113 | (Str : String; | |
d90e94c7 | 114 | Ptr : not null access Integer; |
bfe7c10c BD |
115 | Max : Integer) return System.Unsigned_Types.Unsigned; |
116 | -- Same as Scan_Raw_Unsigned, except scans optional leading | |
117 | -- blanks, and an optional leading plus sign. | |
1a779058 | 118 | -- |
bfe7c10c BD |
119 | -- Note: if a minus sign is present, Constraint_Error will be raised. |
120 | -- Note: trailing blanks are not scanned. | |
121 | ||
cacbc350 | 122 | function Value_Unsigned |
9de61fcb | 123 | (Str : String) return System.Unsigned_Types.Unsigned; |
cacbc350 RK |
124 | -- Used in computing X'Value (Str) where X is a modular integer type whose |
125 | -- modulus does not exceed the range of System.Unsigned_Types.Unsigned. Str | |
126 | -- is the string argument of the attribute. Constraint_Error is raised if | |
127 | -- the string is malformed, or if the value is out of range. | |
128 | ||
129 | end System.Val_Uns; |