annotate gcc/ada/libgnat/g-catiio.adb @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT RUN-TIME COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- G N A T . C A L E N D A R . T I M E _ I O --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
9 -- Copyright (C) 1999-2019, AdaCore --
111
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
kono
parents:
diff changeset
17 -- --
kono
parents:
diff changeset
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
kono
parents:
diff changeset
19 -- additional permissions described in the GCC Runtime Library Exception, --
kono
parents:
diff changeset
20 -- version 3.1, as published by the Free Software Foundation. --
kono
parents:
diff changeset
21 -- --
kono
parents:
diff changeset
22 -- You should have received a copy of the GNU General Public License and --
kono
parents:
diff changeset
23 -- a copy of the GCC Runtime Library Exception along with this program; --
kono
parents:
diff changeset
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
kono
parents:
diff changeset
25 -- <http://www.gnu.org/licenses/>. --
kono
parents:
diff changeset
26 -- --
kono
parents:
diff changeset
27 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
29 -- --
kono
parents:
diff changeset
30 ------------------------------------------------------------------------------
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 with Ada.Calendar; use Ada.Calendar;
kono
parents:
diff changeset
33 with Ada.Characters.Handling;
kono
parents:
diff changeset
34 with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
kono
parents:
diff changeset
35 with Ada.Text_IO;
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 with GNAT.Case_Util;
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 package body GNAT.Calendar.Time_IO is
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 type Month_Name is
kono
parents:
diff changeset
42 (January,
kono
parents:
diff changeset
43 February,
kono
parents:
diff changeset
44 March,
kono
parents:
diff changeset
45 April,
kono
parents:
diff changeset
46 May,
kono
parents:
diff changeset
47 June,
kono
parents:
diff changeset
48 July,
kono
parents:
diff changeset
49 August,
kono
parents:
diff changeset
50 September,
kono
parents:
diff changeset
51 October,
kono
parents:
diff changeset
52 November,
kono
parents:
diff changeset
53 December);
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 function Month_Name_To_Number
kono
parents:
diff changeset
56 (Str : String) return Ada.Calendar.Month_Number;
kono
parents:
diff changeset
57 -- Converts a string that contains an abbreviated month name to a month
kono
parents:
diff changeset
58 -- number. Constraint_Error is raised if Str is not a valid month name.
kono
parents:
diff changeset
59 -- Comparison is case insensitive
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 type Padding_Mode is (None, Zero, Space);
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 type Sec_Number is mod 2 ** 64;
kono
parents:
diff changeset
64 -- Type used to compute the number of seconds since 01/01/1970. A 32 bit
kono
parents:
diff changeset
65 -- number will cover only a period of 136 years. This means that for date
kono
parents:
diff changeset
66 -- past 2106 the computation is not possible. A 64 bits number should be
kono
parents:
diff changeset
67 -- enough for a very large period of time.
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 -----------------------
kono
parents:
diff changeset
70 -- Local Subprograms --
kono
parents:
diff changeset
71 -----------------------
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 function Am_Pm (H : Natural) return String;
kono
parents:
diff changeset
74 -- Return AM or PM depending on the hour H
kono
parents:
diff changeset
75
kono
parents:
diff changeset
76 function Hour_12 (H : Natural) return Positive;
kono
parents:
diff changeset
77 -- Convert a 1-24h format to a 0-12 hour format
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 function Image (Str : String; Length : Natural := 0) return String;
kono
parents:
diff changeset
80 -- Return Str capitalized and cut to length number of characters. If
kono
parents:
diff changeset
81 -- length is 0, then no cut operation is performed.
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 function Image
kono
parents:
diff changeset
84 (N : Sec_Number;
kono
parents:
diff changeset
85 Padding : Padding_Mode := Zero;
kono
parents:
diff changeset
86 Length : Natural := 0) return String;
kono
parents:
diff changeset
87 -- Return image of N. This number is eventually padded with zeros or spaces
kono
parents:
diff changeset
88 -- depending of the length required. If length is 0 then no padding occurs.
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 function Image
kono
parents:
diff changeset
91 (N : Natural;
kono
parents:
diff changeset
92 Padding : Padding_Mode := Zero;
kono
parents:
diff changeset
93 Length : Natural := 0) return String;
kono
parents:
diff changeset
94 -- As above with N provided in Integer format
kono
parents:
diff changeset
95
kono
parents:
diff changeset
96 procedure Parse_ISO_8861_UTC
kono
parents:
diff changeset
97 (Date : String;
kono
parents:
diff changeset
98 Time : out Ada.Calendar.Time;
kono
parents:
diff changeset
99 Success : out Boolean);
kono
parents:
diff changeset
100 -- Subsidiary of function Value. It parses the string Date, interpreted as
kono
parents:
diff changeset
101 -- an ISO 8861 time representation, and returns corresponding Time value.
kono
parents:
diff changeset
102 -- Success is set to False when the string is not a supported ISO 8861
kono
parents:
diff changeset
103 -- date. The following regular expression defines the supported format:
kono
parents:
diff changeset
104 --
kono
parents:
diff changeset
105 -- (yyyymmdd | yyyy'-'mm'-'dd)'T'(hhmmss | hh':'mm':'ss)
kono
parents:
diff changeset
106 -- [ ('Z' | ('.' | ',') s{s} | ('+'|'-')hh':'mm) ]
kono
parents:
diff changeset
107 --
kono
parents:
diff changeset
108 -- Trailing characters (in particular spaces) are not allowed.
kono
parents:
diff changeset
109 --
kono
parents:
diff changeset
110 -- Examples:
kono
parents:
diff changeset
111 --
kono
parents:
diff changeset
112 -- 2017-04-14T14:47:06 20170414T14:47:06 20170414T144706
kono
parents:
diff changeset
113 -- 2017-04-14T14:47:06,12 20170414T14:47:06.12
kono
parents:
diff changeset
114 -- 2017-04-14T19:47:06+05 20170414T09:00:06-05:47
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 -----------
kono
parents:
diff changeset
117 -- Am_Pm --
kono
parents:
diff changeset
118 -----------
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 function Am_Pm (H : Natural) return String is
kono
parents:
diff changeset
121 begin
kono
parents:
diff changeset
122 if H = 0 or else H > 12 then
kono
parents:
diff changeset
123 return "PM";
kono
parents:
diff changeset
124 else
kono
parents:
diff changeset
125 return "AM";
kono
parents:
diff changeset
126 end if;
kono
parents:
diff changeset
127 end Am_Pm;
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 -------------
kono
parents:
diff changeset
130 -- Hour_12 --
kono
parents:
diff changeset
131 -------------
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 function Hour_12 (H : Natural) return Positive is
kono
parents:
diff changeset
134 begin
kono
parents:
diff changeset
135 if H = 0 then
kono
parents:
diff changeset
136 return 12;
kono
parents:
diff changeset
137 elsif H <= 12 then
kono
parents:
diff changeset
138 return H;
kono
parents:
diff changeset
139 else -- H > 12
kono
parents:
diff changeset
140 return H - 12;
kono
parents:
diff changeset
141 end if;
kono
parents:
diff changeset
142 end Hour_12;
kono
parents:
diff changeset
143
kono
parents:
diff changeset
144 -----------
kono
parents:
diff changeset
145 -- Image --
kono
parents:
diff changeset
146 -----------
kono
parents:
diff changeset
147
kono
parents:
diff changeset
148 function Image
kono
parents:
diff changeset
149 (Str : String;
kono
parents:
diff changeset
150 Length : Natural := 0) return String
kono
parents:
diff changeset
151 is
kono
parents:
diff changeset
152 use Ada.Characters.Handling;
kono
parents:
diff changeset
153 Local : constant String :=
kono
parents:
diff changeset
154 To_Upper (Str (Str'First)) &
kono
parents:
diff changeset
155 To_Lower (Str (Str'First + 1 .. Str'Last));
kono
parents:
diff changeset
156 begin
kono
parents:
diff changeset
157 if Length = 0 then
kono
parents:
diff changeset
158 return Local;
kono
parents:
diff changeset
159 else
kono
parents:
diff changeset
160 return Local (1 .. Length);
kono
parents:
diff changeset
161 end if;
kono
parents:
diff changeset
162 end Image;
kono
parents:
diff changeset
163
kono
parents:
diff changeset
164 -----------
kono
parents:
diff changeset
165 -- Image --
kono
parents:
diff changeset
166 -----------
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 function Image
kono
parents:
diff changeset
169 (N : Natural;
kono
parents:
diff changeset
170 Padding : Padding_Mode := Zero;
kono
parents:
diff changeset
171 Length : Natural := 0) return String
kono
parents:
diff changeset
172 is
kono
parents:
diff changeset
173 begin
kono
parents:
diff changeset
174 return Image (Sec_Number (N), Padding, Length);
kono
parents:
diff changeset
175 end Image;
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 function Image
kono
parents:
diff changeset
178 (N : Sec_Number;
kono
parents:
diff changeset
179 Padding : Padding_Mode := Zero;
kono
parents:
diff changeset
180 Length : Natural := 0) return String
kono
parents:
diff changeset
181 is
kono
parents:
diff changeset
182 function Pad_Char return String;
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 --------------
kono
parents:
diff changeset
185 -- Pad_Char --
kono
parents:
diff changeset
186 --------------
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 function Pad_Char return String is
kono
parents:
diff changeset
189 begin
kono
parents:
diff changeset
190 case Padding is
kono
parents:
diff changeset
191 when None => return "";
kono
parents:
diff changeset
192 when Zero => return "00";
kono
parents:
diff changeset
193 when Space => return " ";
kono
parents:
diff changeset
194 end case;
kono
parents:
diff changeset
195 end Pad_Char;
kono
parents:
diff changeset
196
kono
parents:
diff changeset
197 -- Local Declarations
kono
parents:
diff changeset
198
kono
parents:
diff changeset
199 NI : constant String := Sec_Number'Image (N);
kono
parents:
diff changeset
200 NIP : constant String := Pad_Char & NI (2 .. NI'Last);
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202 -- Start of processing for Image
kono
parents:
diff changeset
203
kono
parents:
diff changeset
204 begin
kono
parents:
diff changeset
205 if Length = 0 or else Padding = None then
kono
parents:
diff changeset
206 return NI (2 .. NI'Last);
kono
parents:
diff changeset
207 else
kono
parents:
diff changeset
208 return NIP (NIP'Last - Length + 1 .. NIP'Last);
kono
parents:
diff changeset
209 end if;
kono
parents:
diff changeset
210 end Image;
kono
parents:
diff changeset
211
kono
parents:
diff changeset
212 -----------
kono
parents:
diff changeset
213 -- Image --
kono
parents:
diff changeset
214 -----------
kono
parents:
diff changeset
215
kono
parents:
diff changeset
216 function Image
kono
parents:
diff changeset
217 (Date : Ada.Calendar.Time;
kono
parents:
diff changeset
218 Picture : Picture_String) return String
kono
parents:
diff changeset
219 is
kono
parents:
diff changeset
220 Padding : Padding_Mode := Zero;
kono
parents:
diff changeset
221 -- Padding is set for one directive
kono
parents:
diff changeset
222
kono
parents:
diff changeset
223 Result : Unbounded_String;
kono
parents:
diff changeset
224
kono
parents:
diff changeset
225 Year : Year_Number;
kono
parents:
diff changeset
226 Month : Month_Number;
kono
parents:
diff changeset
227 Day : Day_Number;
kono
parents:
diff changeset
228 Hour : Hour_Number;
kono
parents:
diff changeset
229 Minute : Minute_Number;
kono
parents:
diff changeset
230 Second : Second_Number;
kono
parents:
diff changeset
231 Sub_Second : Second_Duration;
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 P : Positive;
kono
parents:
diff changeset
234
kono
parents:
diff changeset
235 begin
kono
parents:
diff changeset
236 -- Get current time in split format
kono
parents:
diff changeset
237
kono
parents:
diff changeset
238 Split (Date, Year, Month, Day, Hour, Minute, Second, Sub_Second);
kono
parents:
diff changeset
239
kono
parents:
diff changeset
240 -- Null picture string is error
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242 if Picture = "" then
kono
parents:
diff changeset
243 raise Picture_Error with "null picture string";
kono
parents:
diff changeset
244 end if;
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 -- Loop through characters of picture string, building result
kono
parents:
diff changeset
247
kono
parents:
diff changeset
248 Result := Null_Unbounded_String;
kono
parents:
diff changeset
249 P := Picture'First;
kono
parents:
diff changeset
250 while P <= Picture'Last loop
kono
parents:
diff changeset
251
kono
parents:
diff changeset
252 -- A directive has the following format "%[-_]."
kono
parents:
diff changeset
253
kono
parents:
diff changeset
254 if Picture (P) = '%' then
kono
parents:
diff changeset
255 Padding := Zero;
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 if P = Picture'Last then
kono
parents:
diff changeset
258 raise Picture_Error with "picture string ends with '%";
kono
parents:
diff changeset
259 end if;
kono
parents:
diff changeset
260
kono
parents:
diff changeset
261 -- Check for GNU extension to change the padding
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 if Picture (P + 1) = '-' then
kono
parents:
diff changeset
264 Padding := None;
kono
parents:
diff changeset
265 P := P + 1;
kono
parents:
diff changeset
266
kono
parents:
diff changeset
267 elsif Picture (P + 1) = '_' then
kono
parents:
diff changeset
268 Padding := Space;
kono
parents:
diff changeset
269 P := P + 1;
kono
parents:
diff changeset
270 end if;
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 if P = Picture'Last then
kono
parents:
diff changeset
273 raise Picture_Error with "picture string ends with '- or '_";
kono
parents:
diff changeset
274 end if;
kono
parents:
diff changeset
275
kono
parents:
diff changeset
276 case Picture (P + 1) is
kono
parents:
diff changeset
277
kono
parents:
diff changeset
278 -- Literal %
kono
parents:
diff changeset
279
kono
parents:
diff changeset
280 when '%' =>
kono
parents:
diff changeset
281 Result := Result & '%';
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 -- A newline
kono
parents:
diff changeset
284
kono
parents:
diff changeset
285 when 'n' =>
kono
parents:
diff changeset
286 Result := Result & ASCII.LF;
kono
parents:
diff changeset
287
kono
parents:
diff changeset
288 -- A horizontal tab
kono
parents:
diff changeset
289
kono
parents:
diff changeset
290 when 't' =>
kono
parents:
diff changeset
291 Result := Result & ASCII.HT;
kono
parents:
diff changeset
292
kono
parents:
diff changeset
293 -- Hour (00..23)
kono
parents:
diff changeset
294
kono
parents:
diff changeset
295 when 'H' =>
kono
parents:
diff changeset
296 Result := Result & Image (Hour, Padding, 2);
kono
parents:
diff changeset
297
kono
parents:
diff changeset
298 -- Hour (01..12)
kono
parents:
diff changeset
299
kono
parents:
diff changeset
300 when 'I' =>
kono
parents:
diff changeset
301 Result := Result & Image (Hour_12 (Hour), Padding, 2);
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 -- Hour ( 0..23)
kono
parents:
diff changeset
304
kono
parents:
diff changeset
305 when 'k' =>
kono
parents:
diff changeset
306 Result := Result & Image (Hour, Space, 2);
kono
parents:
diff changeset
307
kono
parents:
diff changeset
308 -- Hour ( 1..12)
kono
parents:
diff changeset
309
kono
parents:
diff changeset
310 when 'l' =>
kono
parents:
diff changeset
311 Result := Result & Image (Hour_12 (Hour), Space, 2);
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 -- Minute (00..59)
kono
parents:
diff changeset
314
kono
parents:
diff changeset
315 when 'M' =>
kono
parents:
diff changeset
316 Result := Result & Image (Minute, Padding, 2);
kono
parents:
diff changeset
317
kono
parents:
diff changeset
318 -- AM/PM
kono
parents:
diff changeset
319
kono
parents:
diff changeset
320 when 'p' =>
kono
parents:
diff changeset
321 Result := Result & Am_Pm (Hour);
kono
parents:
diff changeset
322
kono
parents:
diff changeset
323 -- Time, 12-hour (hh:mm:ss [AP]M)
kono
parents:
diff changeset
324
kono
parents:
diff changeset
325 when 'r' =>
kono
parents:
diff changeset
326 Result := Result &
kono
parents:
diff changeset
327 Image (Hour_12 (Hour), Padding, Length => 2) & ':' &
kono
parents:
diff changeset
328 Image (Minute, Padding, Length => 2) & ':' &
kono
parents:
diff changeset
329 Image (Second, Padding, Length => 2) & ' ' &
kono
parents:
diff changeset
330 Am_Pm (Hour);
kono
parents:
diff changeset
331
kono
parents:
diff changeset
332 -- Seconds since 1970-01-01 00:00:00 UTC
kono
parents:
diff changeset
333 -- (a nonstandard extension)
kono
parents:
diff changeset
334
kono
parents:
diff changeset
335 when 's' =>
kono
parents:
diff changeset
336 declare
kono
parents:
diff changeset
337 -- Compute the number of seconds using Ada.Calendar.Time
kono
parents:
diff changeset
338 -- values rather than Julian days to account for Daylight
kono
parents:
diff changeset
339 -- Savings Time.
kono
parents:
diff changeset
340
kono
parents:
diff changeset
341 Neg : Boolean := False;
kono
parents:
diff changeset
342 Sec : Duration := Date - Time_Of (1970, 1, 1, 0.0);
kono
parents:
diff changeset
343
kono
parents:
diff changeset
344 begin
kono
parents:
diff changeset
345 -- Avoid rounding errors and perform special processing
kono
parents:
diff changeset
346 -- for dates earlier than the Unix Epoc.
kono
parents:
diff changeset
347
kono
parents:
diff changeset
348 if Sec > 0.0 then
kono
parents:
diff changeset
349 Sec := Sec - 0.5;
kono
parents:
diff changeset
350 elsif Sec < 0.0 then
kono
parents:
diff changeset
351 Neg := True;
kono
parents:
diff changeset
352 Sec := abs (Sec + 0.5);
kono
parents:
diff changeset
353 end if;
kono
parents:
diff changeset
354
kono
parents:
diff changeset
355 -- Prepend a minus sign to the result since Sec_Number
kono
parents:
diff changeset
356 -- cannot handle negative numbers.
kono
parents:
diff changeset
357
kono
parents:
diff changeset
358 if Neg then
kono
parents:
diff changeset
359 Result :=
kono
parents:
diff changeset
360 Result & "-" & Image (Sec_Number (Sec), None);
kono
parents:
diff changeset
361 else
kono
parents:
diff changeset
362 Result := Result & Image (Sec_Number (Sec), None);
kono
parents:
diff changeset
363 end if;
kono
parents:
diff changeset
364 end;
kono
parents:
diff changeset
365
kono
parents:
diff changeset
366 -- Second (00..59)
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 when 'S' =>
kono
parents:
diff changeset
369 Result := Result & Image (Second, Padding, Length => 2);
kono
parents:
diff changeset
370
kono
parents:
diff changeset
371 -- Milliseconds (3 digits)
kono
parents:
diff changeset
372 -- Microseconds (6 digits)
kono
parents:
diff changeset
373 -- Nanoseconds (9 digits)
kono
parents:
diff changeset
374
kono
parents:
diff changeset
375 when 'i' | 'e' | 'o' =>
kono
parents:
diff changeset
376 declare
kono
parents:
diff changeset
377 Sub_Sec : constant Long_Integer :=
kono
parents:
diff changeset
378 Long_Integer (Sub_Second * 1_000_000_000);
kono
parents:
diff changeset
379
kono
parents:
diff changeset
380 Img1 : constant String := Sub_Sec'Img;
kono
parents:
diff changeset
381 Img2 : constant String :=
kono
parents:
diff changeset
382 "00000000" & Img1 (Img1'First + 1 .. Img1'Last);
kono
parents:
diff changeset
383 Nanos : constant String :=
kono
parents:
diff changeset
384 Img2 (Img2'Last - 8 .. Img2'Last);
kono
parents:
diff changeset
385
kono
parents:
diff changeset
386 begin
kono
parents:
diff changeset
387 case Picture (P + 1) is
kono
parents:
diff changeset
388 when 'i' =>
kono
parents:
diff changeset
389 Result := Result &
kono
parents:
diff changeset
390 Nanos (Nanos'First .. Nanos'First + 2);
kono
parents:
diff changeset
391
kono
parents:
diff changeset
392 when 'e' =>
kono
parents:
diff changeset
393 Result := Result &
kono
parents:
diff changeset
394 Nanos (Nanos'First .. Nanos'First + 5);
kono
parents:
diff changeset
395
kono
parents:
diff changeset
396 when 'o' =>
kono
parents:
diff changeset
397 Result := Result & Nanos;
kono
parents:
diff changeset
398
kono
parents:
diff changeset
399 when others =>
kono
parents:
diff changeset
400 null;
kono
parents:
diff changeset
401 end case;
kono
parents:
diff changeset
402 end;
kono
parents:
diff changeset
403
kono
parents:
diff changeset
404 -- Time, 24-hour (hh:mm:ss)
kono
parents:
diff changeset
405
kono
parents:
diff changeset
406 when 'T' =>
kono
parents:
diff changeset
407 Result := Result &
kono
parents:
diff changeset
408 Image (Hour, Padding, Length => 2) & ':' &
kono
parents:
diff changeset
409 Image (Minute, Padding, Length => 2) & ':' &
kono
parents:
diff changeset
410 Image (Second, Padding, Length => 2);
kono
parents:
diff changeset
411
kono
parents:
diff changeset
412 -- Locale's abbreviated weekday name (Sun..Sat)
kono
parents:
diff changeset
413
kono
parents:
diff changeset
414 when 'a' =>
kono
parents:
diff changeset
415 Result := Result &
kono
parents:
diff changeset
416 Image (Day_Name'Image (Day_Of_Week (Date)), 3);
kono
parents:
diff changeset
417
kono
parents:
diff changeset
418 -- Locale's full weekday name, variable length
kono
parents:
diff changeset
419 -- (Sunday..Saturday)
kono
parents:
diff changeset
420
kono
parents:
diff changeset
421 when 'A' =>
kono
parents:
diff changeset
422 Result := Result &
kono
parents:
diff changeset
423 Image (Day_Name'Image (Day_Of_Week (Date)));
kono
parents:
diff changeset
424
kono
parents:
diff changeset
425 -- Locale's abbreviated month name (Jan..Dec)
kono
parents:
diff changeset
426
kono
parents:
diff changeset
427 when 'b' | 'h' =>
kono
parents:
diff changeset
428 Result := Result &
kono
parents:
diff changeset
429 Image (Month_Name'Image (Month_Name'Val (Month - 1)), 3);
kono
parents:
diff changeset
430
kono
parents:
diff changeset
431 -- Locale's full month name, variable length
kono
parents:
diff changeset
432 -- (January..December).
kono
parents:
diff changeset
433
kono
parents:
diff changeset
434 when 'B' =>
kono
parents:
diff changeset
435 Result := Result &
kono
parents:
diff changeset
436 Image (Month_Name'Image (Month_Name'Val (Month - 1)));
kono
parents:
diff changeset
437
kono
parents:
diff changeset
438 -- Locale's date and time (Sat Nov 04 12:02:33 EST 1989)
kono
parents:
diff changeset
439
kono
parents:
diff changeset
440 when 'c' =>
kono
parents:
diff changeset
441 case Padding is
kono
parents:
diff changeset
442 when Zero =>
kono
parents:
diff changeset
443 Result := Result & Image (Date, "%a %b %d %T %Y");
kono
parents:
diff changeset
444 when Space =>
kono
parents:
diff changeset
445 Result := Result & Image (Date, "%a %b %_d %_T %Y");
kono
parents:
diff changeset
446 when None =>
kono
parents:
diff changeset
447 Result := Result & Image (Date, "%a %b %-d %-T %Y");
kono
parents:
diff changeset
448 end case;
kono
parents:
diff changeset
449
kono
parents:
diff changeset
450 -- Day of month (01..31)
kono
parents:
diff changeset
451
kono
parents:
diff changeset
452 when 'd' =>
kono
parents:
diff changeset
453 Result := Result & Image (Day, Padding, 2);
kono
parents:
diff changeset
454
kono
parents:
diff changeset
455 -- Date (mm/dd/yy)
kono
parents:
diff changeset
456
kono
parents:
diff changeset
457 when 'D' | 'x' =>
kono
parents:
diff changeset
458 Result := Result &
kono
parents:
diff changeset
459 Image (Month, Padding, 2) & '/' &
kono
parents:
diff changeset
460 Image (Day, Padding, 2) & '/' &
kono
parents:
diff changeset
461 Image (Year, Padding, 2);
kono
parents:
diff changeset
462
kono
parents:
diff changeset
463 -- Day of year (001..366)
kono
parents:
diff changeset
464
kono
parents:
diff changeset
465 when 'j' =>
kono
parents:
diff changeset
466 Result := Result & Image (Day_In_Year (Date), Padding, 3);
kono
parents:
diff changeset
467
kono
parents:
diff changeset
468 -- Month (01..12)
kono
parents:
diff changeset
469
kono
parents:
diff changeset
470 when 'm' =>
kono
parents:
diff changeset
471 Result := Result & Image (Month, Padding, 2);
kono
parents:
diff changeset
472
kono
parents:
diff changeset
473 -- Week number of year with Sunday as first day of week
kono
parents:
diff changeset
474 -- (00..53)
kono
parents:
diff changeset
475
kono
parents:
diff changeset
476 when 'U' =>
kono
parents:
diff changeset
477 declare
kono
parents:
diff changeset
478 Offset : constant Natural :=
kono
parents:
diff changeset
479 (Julian_Day (Year, 1, 1) + 1) mod 7;
kono
parents:
diff changeset
480
kono
parents:
diff changeset
481 Week : constant Natural :=
kono
parents:
diff changeset
482 1 + ((Day_In_Year (Date) - 1) + Offset) / 7;
kono
parents:
diff changeset
483
kono
parents:
diff changeset
484 begin
kono
parents:
diff changeset
485 Result := Result & Image (Week, Padding, 2);
kono
parents:
diff changeset
486 end;
kono
parents:
diff changeset
487
kono
parents:
diff changeset
488 -- Day of week (0..6) with 0 corresponding to Sunday
kono
parents:
diff changeset
489
kono
parents:
diff changeset
490 when 'w' =>
kono
parents:
diff changeset
491 declare
kono
parents:
diff changeset
492 DOW : constant Natural range 0 .. 6 :=
kono
parents:
diff changeset
493 (if Day_Of_Week (Date) = Sunday
kono
parents:
diff changeset
494 then 0
kono
parents:
diff changeset
495 else Day_Name'Pos (Day_Of_Week (Date)));
kono
parents:
diff changeset
496 begin
kono
parents:
diff changeset
497 Result := Result & Image (DOW, Length => 1);
kono
parents:
diff changeset
498 end;
kono
parents:
diff changeset
499
kono
parents:
diff changeset
500 -- Week number of year with Monday as first day of week
kono
parents:
diff changeset
501 -- (00..53)
kono
parents:
diff changeset
502
kono
parents:
diff changeset
503 when 'W' =>
kono
parents:
diff changeset
504 Result := Result & Image (Week_In_Year (Date), Padding, 2);
kono
parents:
diff changeset
505
kono
parents:
diff changeset
506 -- Last two digits of year (00..99)
kono
parents:
diff changeset
507
kono
parents:
diff changeset
508 when 'y' =>
kono
parents:
diff changeset
509 declare
kono
parents:
diff changeset
510 Y : constant Natural := Year - (Year / 100) * 100;
kono
parents:
diff changeset
511 begin
kono
parents:
diff changeset
512 Result := Result & Image (Y, Padding, 2);
kono
parents:
diff changeset
513 end;
kono
parents:
diff changeset
514
kono
parents:
diff changeset
515 -- Year (1970...)
kono
parents:
diff changeset
516
kono
parents:
diff changeset
517 when 'Y' =>
kono
parents:
diff changeset
518 Result := Result & Image (Year, None, 4);
kono
parents:
diff changeset
519
kono
parents:
diff changeset
520 when others =>
kono
parents:
diff changeset
521 raise Picture_Error with
kono
parents:
diff changeset
522 "unknown format character in picture string";
kono
parents:
diff changeset
523 end case;
kono
parents:
diff changeset
524
kono
parents:
diff changeset
525 -- Skip past % and format character
kono
parents:
diff changeset
526
kono
parents:
diff changeset
527 P := P + 2;
kono
parents:
diff changeset
528
kono
parents:
diff changeset
529 -- Character other than % is copied into the result
kono
parents:
diff changeset
530
kono
parents:
diff changeset
531 else
kono
parents:
diff changeset
532 Result := Result & Picture (P);
kono
parents:
diff changeset
533 P := P + 1;
kono
parents:
diff changeset
534 end if;
kono
parents:
diff changeset
535 end loop;
kono
parents:
diff changeset
536
kono
parents:
diff changeset
537 return To_String (Result);
kono
parents:
diff changeset
538 end Image;
kono
parents:
diff changeset
539
kono
parents:
diff changeset
540 --------------------------
kono
parents:
diff changeset
541 -- Month_Name_To_Number --
kono
parents:
diff changeset
542 --------------------------
kono
parents:
diff changeset
543
kono
parents:
diff changeset
544 function Month_Name_To_Number
kono
parents:
diff changeset
545 (Str : String) return Ada.Calendar.Month_Number
kono
parents:
diff changeset
546 is
kono
parents:
diff changeset
547 subtype String3 is String (1 .. 3);
kono
parents:
diff changeset
548 Abbrev_Upper_Month_Names :
kono
parents:
diff changeset
549 constant array (Ada.Calendar.Month_Number) of String3 :=
kono
parents:
diff changeset
550 ("JAN", "FEB", "MAR", "APR", "MAY", "JUN",
kono
parents:
diff changeset
551 "JUL", "AUG", "SEP", "OCT", "NOV", "DEC");
kono
parents:
diff changeset
552 -- Short version of the month names, used when parsing date strings
kono
parents:
diff changeset
553
kono
parents:
diff changeset
554 S : String := Str;
kono
parents:
diff changeset
555
kono
parents:
diff changeset
556 begin
kono
parents:
diff changeset
557 GNAT.Case_Util.To_Upper (S);
kono
parents:
diff changeset
558
kono
parents:
diff changeset
559 for J in Abbrev_Upper_Month_Names'Range loop
kono
parents:
diff changeset
560 if Abbrev_Upper_Month_Names (J) = S then
kono
parents:
diff changeset
561 return J;
kono
parents:
diff changeset
562 end if;
kono
parents:
diff changeset
563 end loop;
kono
parents:
diff changeset
564
kono
parents:
diff changeset
565 return Abbrev_Upper_Month_Names'First;
kono
parents:
diff changeset
566 end Month_Name_To_Number;
kono
parents:
diff changeset
567
kono
parents:
diff changeset
568 ------------------------
kono
parents:
diff changeset
569 -- Parse_ISO_8861_UTC --
kono
parents:
diff changeset
570 ------------------------
kono
parents:
diff changeset
571
kono
parents:
diff changeset
572 procedure Parse_ISO_8861_UTC
kono
parents:
diff changeset
573 (Date : String;
kono
parents:
diff changeset
574 Time : out Ada.Calendar.Time;
kono
parents:
diff changeset
575 Success : out Boolean)
kono
parents:
diff changeset
576 is
kono
parents:
diff changeset
577 Index : Positive := Date'First;
kono
parents:
diff changeset
578 -- The current character scan index. After a call to Advance, Index
kono
parents:
diff changeset
579 -- points to the next character.
kono
parents:
diff changeset
580
kono
parents:
diff changeset
581 End_Of_Source_Reached : exception;
kono
parents:
diff changeset
582 -- An exception used to signal that the scan pointer has reached the
kono
parents:
diff changeset
583 -- end of the source string.
kono
parents:
diff changeset
584
kono
parents:
diff changeset
585 Wrong_Syntax : exception;
kono
parents:
diff changeset
586 -- An exception used to signal that the scan pointer has reached an
kono
parents:
diff changeset
587 -- unexpected character in the source string.
kono
parents:
diff changeset
588
kono
parents:
diff changeset
589 procedure Advance;
kono
parents:
diff changeset
590 pragma Inline (Advance);
kono
parents:
diff changeset
591 -- Past the current character of Date
kono
parents:
diff changeset
592
kono
parents:
diff changeset
593 procedure Advance_Digits (Num_Digits : Positive);
kono
parents:
diff changeset
594 pragma Inline (Advance_Digits);
kono
parents:
diff changeset
595 -- Past the given number of digit characters
kono
parents:
diff changeset
596
kono
parents:
diff changeset
597 function Scan_Day return Day_Number;
kono
parents:
diff changeset
598 pragma Inline (Scan_Day);
kono
parents:
diff changeset
599 -- Scan the two digits of a day number and return its value
kono
parents:
diff changeset
600
kono
parents:
diff changeset
601 function Scan_Hour return Hour_Number;
kono
parents:
diff changeset
602 pragma Inline (Scan_Hour);
kono
parents:
diff changeset
603 -- Scan the two digits of an hour number and return its value
kono
parents:
diff changeset
604
kono
parents:
diff changeset
605 function Scan_Minute return Minute_Number;
kono
parents:
diff changeset
606 pragma Inline (Scan_Minute);
kono
parents:
diff changeset
607 -- Scan the two digits of a minute number and return its value
kono
parents:
diff changeset
608
kono
parents:
diff changeset
609 function Scan_Month return Month_Number;
kono
parents:
diff changeset
610 pragma Inline (Scan_Month);
kono
parents:
diff changeset
611 -- Scan the two digits of a month number and return its value
kono
parents:
diff changeset
612
kono
parents:
diff changeset
613 function Scan_Second return Second_Number;
kono
parents:
diff changeset
614 pragma Inline (Scan_Second);
kono
parents:
diff changeset
615 -- Scan the two digits of a second number and return its value
kono
parents:
diff changeset
616
kono
parents:
diff changeset
617 function Scan_Separator (Expected_Symbol : Character) return Boolean;
kono
parents:
diff changeset
618 pragma Inline (Scan_Separator);
kono
parents:
diff changeset
619 -- If the current symbol matches the Expected_Symbol then advance the
kono
parents:
diff changeset
620 -- scanner index and return True; otherwise do nothing and return False
kono
parents:
diff changeset
621
kono
parents:
diff changeset
622 procedure Scan_Separator (Required : Boolean; Separator : Character);
kono
parents:
diff changeset
623 pragma Inline (Scan_Separator);
kono
parents:
diff changeset
624 -- If Required then check that the current character matches Separator
kono
parents:
diff changeset
625 -- and advance the scanner index; if not Required then do nothing.
kono
parents:
diff changeset
626
kono
parents:
diff changeset
627 function Scan_Subsecond return Second_Duration;
kono
parents:
diff changeset
628 pragma Inline (Scan_Subsecond);
kono
parents:
diff changeset
629 -- Scan all the digits of a subsecond number and return its value
kono
parents:
diff changeset
630
kono
parents:
diff changeset
631 function Scan_Year return Year_Number;
kono
parents:
diff changeset
632 pragma Inline (Scan_Year);
kono
parents:
diff changeset
633 -- Scan the four digits of a year number and return its value
kono
parents:
diff changeset
634
kono
parents:
diff changeset
635 function Symbol return Character;
kono
parents:
diff changeset
636 pragma Inline (Symbol);
kono
parents:
diff changeset
637 -- Return the current character being scanned
kono
parents:
diff changeset
638
kono
parents:
diff changeset
639 -------------
kono
parents:
diff changeset
640 -- Advance --
kono
parents:
diff changeset
641 -------------
kono
parents:
diff changeset
642
kono
parents:
diff changeset
643 procedure Advance is
kono
parents:
diff changeset
644 begin
kono
parents:
diff changeset
645 -- Signal the end of the source string. This stops a complex scan by
kono
parents:
diff changeset
646 -- bottoming up any recursive calls till control reaches routine Scan
kono
parents:
diff changeset
647 -- which handles the exception. Certain scanning scenarios may handle
kono
parents:
diff changeset
648 -- this exception on their own.
kono
parents:
diff changeset
649
kono
parents:
diff changeset
650 if Index > Date'Last then
kono
parents:
diff changeset
651 raise End_Of_Source_Reached;
kono
parents:
diff changeset
652
kono
parents:
diff changeset
653 -- Advance the scan pointer as long as there are characters to scan,
kono
parents:
diff changeset
654 -- in other words, the scan pointer has not passed the end of the
kono
parents:
diff changeset
655 -- source string.
kono
parents:
diff changeset
656
kono
parents:
diff changeset
657 else
kono
parents:
diff changeset
658 Index := Index + 1;
kono
parents:
diff changeset
659 end if;
kono
parents:
diff changeset
660 end Advance;
kono
parents:
diff changeset
661
kono
parents:
diff changeset
662 --------------------
kono
parents:
diff changeset
663 -- Advance_Digits --
kono
parents:
diff changeset
664 --------------------
kono
parents:
diff changeset
665
kono
parents:
diff changeset
666 procedure Advance_Digits (Num_Digits : Positive) is
kono
parents:
diff changeset
667 begin
kono
parents:
diff changeset
668 for J in 1 .. Num_Digits loop
kono
parents:
diff changeset
669 if Symbol not in '0' .. '9' then
kono
parents:
diff changeset
670 raise Wrong_Syntax;
kono
parents:
diff changeset
671 end if;
kono
parents:
diff changeset
672
kono
parents:
diff changeset
673 Advance; -- past digit
kono
parents:
diff changeset
674 end loop;
kono
parents:
diff changeset
675 end Advance_Digits;
kono
parents:
diff changeset
676
kono
parents:
diff changeset
677 --------------
kono
parents:
diff changeset
678 -- Scan_Day --
kono
parents:
diff changeset
679 --------------
kono
parents:
diff changeset
680
kono
parents:
diff changeset
681 function Scan_Day return Day_Number is
kono
parents:
diff changeset
682 From : constant Positive := Index;
kono
parents:
diff changeset
683 begin
kono
parents:
diff changeset
684 Advance_Digits (Num_Digits => 2);
kono
parents:
diff changeset
685 return Day_Number'Value (Date (From .. Index - 1));
kono
parents:
diff changeset
686 end Scan_Day;
kono
parents:
diff changeset
687
kono
parents:
diff changeset
688 ---------------
kono
parents:
diff changeset
689 -- Scan_Hour --
kono
parents:
diff changeset
690 ---------------
kono
parents:
diff changeset
691
kono
parents:
diff changeset
692 function Scan_Hour return Hour_Number is
kono
parents:
diff changeset
693 From : constant Positive := Index;
kono
parents:
diff changeset
694 begin
kono
parents:
diff changeset
695 Advance_Digits (Num_Digits => 2);
kono
parents:
diff changeset
696 return Hour_Number'Value (Date (From .. Index - 1));
kono
parents:
diff changeset
697 end Scan_Hour;
kono
parents:
diff changeset
698
kono
parents:
diff changeset
699 -----------------
kono
parents:
diff changeset
700 -- Scan_Minute --
kono
parents:
diff changeset
701 -----------------
kono
parents:
diff changeset
702
kono
parents:
diff changeset
703 function Scan_Minute return Minute_Number is
kono
parents:
diff changeset
704 From : constant Positive := Index;
kono
parents:
diff changeset
705 begin
kono
parents:
diff changeset
706 Advance_Digits (Num_Digits => 2);
kono
parents:
diff changeset
707 return Minute_Number'Value (Date (From .. Index - 1));
kono
parents:
diff changeset
708 end Scan_Minute;
kono
parents:
diff changeset
709
kono
parents:
diff changeset
710 ----------------
kono
parents:
diff changeset
711 -- Scan_Month --
kono
parents:
diff changeset
712 ----------------
kono
parents:
diff changeset
713
kono
parents:
diff changeset
714 function Scan_Month return Month_Number is
kono
parents:
diff changeset
715 From : constant Positive := Index;
kono
parents:
diff changeset
716 begin
kono
parents:
diff changeset
717 Advance_Digits (Num_Digits => 2);
kono
parents:
diff changeset
718 return Month_Number'Value (Date (From .. Index - 1));
kono
parents:
diff changeset
719 end Scan_Month;
kono
parents:
diff changeset
720
kono
parents:
diff changeset
721 -----------------
kono
parents:
diff changeset
722 -- Scan_Second --
kono
parents:
diff changeset
723 -----------------
kono
parents:
diff changeset
724
kono
parents:
diff changeset
725 function Scan_Second return Second_Number is
kono
parents:
diff changeset
726 From : constant Positive := Index;
kono
parents:
diff changeset
727 begin
kono
parents:
diff changeset
728 Advance_Digits (Num_Digits => 2);
kono
parents:
diff changeset
729 return Second_Number'Value (Date (From .. Index - 1));
kono
parents:
diff changeset
730 end Scan_Second;
kono
parents:
diff changeset
731
kono
parents:
diff changeset
732 --------------------
kono
parents:
diff changeset
733 -- Scan_Separator --
kono
parents:
diff changeset
734 --------------------
kono
parents:
diff changeset
735
kono
parents:
diff changeset
736 function Scan_Separator (Expected_Symbol : Character) return Boolean is
kono
parents:
diff changeset
737 begin
kono
parents:
diff changeset
738 if Symbol = Expected_Symbol then
kono
parents:
diff changeset
739 Advance;
kono
parents:
diff changeset
740 return True;
kono
parents:
diff changeset
741 else
kono
parents:
diff changeset
742 return False;
kono
parents:
diff changeset
743 end if;
kono
parents:
diff changeset
744 end Scan_Separator;
kono
parents:
diff changeset
745
kono
parents:
diff changeset
746 --------------------
kono
parents:
diff changeset
747 -- Scan_Separator --
kono
parents:
diff changeset
748 --------------------
kono
parents:
diff changeset
749
kono
parents:
diff changeset
750 procedure Scan_Separator (Required : Boolean; Separator : Character) is
kono
parents:
diff changeset
751 begin
kono
parents:
diff changeset
752 if Required then
kono
parents:
diff changeset
753 if Symbol /= Separator then
kono
parents:
diff changeset
754 raise Wrong_Syntax;
kono
parents:
diff changeset
755 end if;
kono
parents:
diff changeset
756
kono
parents:
diff changeset
757 Advance; -- Past the separator
kono
parents:
diff changeset
758 end if;
kono
parents:
diff changeset
759 end Scan_Separator;
kono
parents:
diff changeset
760
kono
parents:
diff changeset
761 --------------------
kono
parents:
diff changeset
762 -- Scan_Subsecond --
kono
parents:
diff changeset
763 --------------------
kono
parents:
diff changeset
764
kono
parents:
diff changeset
765 function Scan_Subsecond return Second_Duration is
kono
parents:
diff changeset
766 From : constant Positive := Index;
kono
parents:
diff changeset
767 begin
kono
parents:
diff changeset
768 Advance_Digits (Num_Digits => 1);
kono
parents:
diff changeset
769
kono
parents:
diff changeset
770 while Symbol in '0' .. '9'
kono
parents:
diff changeset
771 and then Index < Date'Length
kono
parents:
diff changeset
772 loop
kono
parents:
diff changeset
773 Advance;
kono
parents:
diff changeset
774 end loop;
kono
parents:
diff changeset
775
kono
parents:
diff changeset
776 if Symbol not in '0' .. '9' then
kono
parents:
diff changeset
777 raise Wrong_Syntax;
kono
parents:
diff changeset
778 end if;
kono
parents:
diff changeset
779
kono
parents:
diff changeset
780 Advance;
kono
parents:
diff changeset
781 return Second_Duration'Value ("0." & Date (From .. Index - 1));
kono
parents:
diff changeset
782 end Scan_Subsecond;
kono
parents:
diff changeset
783
kono
parents:
diff changeset
784 ---------------
kono
parents:
diff changeset
785 -- Scan_Year --
kono
parents:
diff changeset
786 ---------------
kono
parents:
diff changeset
787
kono
parents:
diff changeset
788 function Scan_Year return Year_Number is
kono
parents:
diff changeset
789 From : constant Positive := Index;
kono
parents:
diff changeset
790 begin
kono
parents:
diff changeset
791 Advance_Digits (Num_Digits => 4);
kono
parents:
diff changeset
792 return Year_Number'Value (Date (From .. Index - 1));
kono
parents:
diff changeset
793 end Scan_Year;
kono
parents:
diff changeset
794
kono
parents:
diff changeset
795 ------------
kono
parents:
diff changeset
796 -- Symbol --
kono
parents:
diff changeset
797 ------------
kono
parents:
diff changeset
798
kono
parents:
diff changeset
799 function Symbol return Character is
kono
parents:
diff changeset
800 begin
kono
parents:
diff changeset
801 -- Signal the end of the source string. This stops a complex scan by
kono
parents:
diff changeset
802 -- bottoming up any recursive calls till control reaches routine Scan
kono
parents:
diff changeset
803 -- which handles the exception. Certain scanning scenarios may handle
kono
parents:
diff changeset
804 -- this exception on their own.
kono
parents:
diff changeset
805
kono
parents:
diff changeset
806 if Index > Date'Last then
kono
parents:
diff changeset
807 raise End_Of_Source_Reached;
kono
parents:
diff changeset
808
kono
parents:
diff changeset
809 else
kono
parents:
diff changeset
810 return Date (Index);
kono
parents:
diff changeset
811 end if;
kono
parents:
diff changeset
812 end Symbol;
kono
parents:
diff changeset
813
kono
parents:
diff changeset
814 -- Local variables
kono
parents:
diff changeset
815
kono
parents:
diff changeset
816 Date_Separator : constant Character := '-';
kono
parents:
diff changeset
817 Hour_Separator : constant Character := ':';
kono
parents:
diff changeset
818
kono
parents:
diff changeset
819 Day : Day_Number;
kono
parents:
diff changeset
820 Month : Month_Number;
kono
parents:
diff changeset
821 Year : Year_Number;
kono
parents:
diff changeset
822 Hour : Hour_Number := 0;
kono
parents:
diff changeset
823 Minute : Minute_Number := 0;
kono
parents:
diff changeset
824 Second : Second_Number := 0;
kono
parents:
diff changeset
825 Subsec : Second_Duration := 0.0;
kono
parents:
diff changeset
826
kono
parents:
diff changeset
827 Local_Hour : Hour_Number := 0;
kono
parents:
diff changeset
828 Local_Minute : Minute_Number := 0;
kono
parents:
diff changeset
829 Local_Sign : Character := ' ';
kono
parents:
diff changeset
830 Local_Disp : Duration;
kono
parents:
diff changeset
831
kono
parents:
diff changeset
832 Sep_Required : Boolean := False;
kono
parents:
diff changeset
833 -- True if a separator is seen (and therefore required after it!)
kono
parents:
diff changeset
834
kono
parents:
diff changeset
835 begin
kono
parents:
diff changeset
836 -- Parse date
kono
parents:
diff changeset
837
kono
parents:
diff changeset
838 Year := Scan_Year;
kono
parents:
diff changeset
839 Sep_Required := Scan_Separator (Date_Separator);
kono
parents:
diff changeset
840
kono
parents:
diff changeset
841 Month := Scan_Month;
kono
parents:
diff changeset
842 Scan_Separator (Sep_Required, Date_Separator);
kono
parents:
diff changeset
843
kono
parents:
diff changeset
844 Day := Scan_Day;
kono
parents:
diff changeset
845
kono
parents:
diff changeset
846 if Index < Date'Last and then Symbol = 'T' then
kono
parents:
diff changeset
847 Advance;
kono
parents:
diff changeset
848
kono
parents:
diff changeset
849 -- Parse time
kono
parents:
diff changeset
850
kono
parents:
diff changeset
851 Hour := Scan_Hour;
kono
parents:
diff changeset
852 Sep_Required := Scan_Separator (Hour_Separator);
kono
parents:
diff changeset
853
kono
parents:
diff changeset
854 Minute := Scan_Minute;
kono
parents:
diff changeset
855 Scan_Separator (Sep_Required, Hour_Separator);
kono
parents:
diff changeset
856
kono
parents:
diff changeset
857 Second := Scan_Second;
kono
parents:
diff changeset
858
kono
parents:
diff changeset
859 -- [('Z' | ('.' | ',') s{s} | ('+'|'-')hh:mm)]
kono
parents:
diff changeset
860
kono
parents:
diff changeset
861 if Index <= Date'Last then
kono
parents:
diff changeset
862
kono
parents:
diff changeset
863 -- Suffix 'Z' just confirms that this is an UTC time. No further
kono
parents:
diff changeset
864 -- action needed.
kono
parents:
diff changeset
865
kono
parents:
diff changeset
866 if Symbol = 'Z' then
kono
parents:
diff changeset
867 Advance;
kono
parents:
diff changeset
868
kono
parents:
diff changeset
869 -- A decimal fraction shall have at least one digit, and has as
kono
parents:
diff changeset
870 -- many digits as supported by the underlying implementation.
kono
parents:
diff changeset
871 -- The valid decimal separators are those specified in ISO 31-0,
kono
parents:
diff changeset
872 -- i.e. the comma [,] or full stop [.]. Of these, the comma is
kono
parents:
diff changeset
873 -- the preferred separator of ISO-8861.
kono
parents:
diff changeset
874
kono
parents:
diff changeset
875 elsif Symbol = ',' or else Symbol = '.' then
kono
parents:
diff changeset
876 Advance; -- past decimal separator
kono
parents:
diff changeset
877 Subsec := Scan_Subsecond;
kono
parents:
diff changeset
878
kono
parents:
diff changeset
879 -- Difference between local time and UTC: It shall be expressed
kono
parents:
diff changeset
880 -- as positive (i.e. with the leading plus sign [+]) if the local
kono
parents:
diff changeset
881 -- time is ahead of or equal to UTC of day and as negative (i.e.
kono
parents:
diff changeset
882 -- with the leading minus sign [-]) if it is behind UTC of day.
kono
parents:
diff changeset
883 -- The minutes time element of the difference may only be omitted
kono
parents:
diff changeset
884 -- if the difference between the time scales is exactly an
kono
parents:
diff changeset
885 -- integral number of hours.
kono
parents:
diff changeset
886
kono
parents:
diff changeset
887 elsif Symbol = '+' or else Symbol = '-' then
kono
parents:
diff changeset
888 Local_Sign := Symbol;
kono
parents:
diff changeset
889 Advance;
kono
parents:
diff changeset
890 Local_Hour := Scan_Hour;
kono
parents:
diff changeset
891
kono
parents:
diff changeset
892 -- Past ':'
kono
parents:
diff changeset
893
kono
parents:
diff changeset
894 if Index < Date'Last and then Symbol = Hour_Separator then
kono
parents:
diff changeset
895 Advance;
kono
parents:
diff changeset
896 Local_Minute := Scan_Minute;
kono
parents:
diff changeset
897 end if;
kono
parents:
diff changeset
898
kono
parents:
diff changeset
899 -- Compute local displacement
kono
parents:
diff changeset
900
kono
parents:
diff changeset
901 Local_Disp := Local_Hour * 3600.0 + Local_Minute * 60.0;
kono
parents:
diff changeset
902 else
kono
parents:
diff changeset
903 raise Wrong_Syntax;
kono
parents:
diff changeset
904 end if;
kono
parents:
diff changeset
905 end if;
kono
parents:
diff changeset
906 end if;
kono
parents:
diff changeset
907
kono
parents:
diff changeset
908 -- Sanity checks. The check on Index ensures that there are no trailing
kono
parents:
diff changeset
909 -- characters.
kono
parents:
diff changeset
910
kono
parents:
diff changeset
911 if Index /= Date'Length + 1
kono
parents:
diff changeset
912 or else not Year'Valid
kono
parents:
diff changeset
913 or else not Month'Valid
kono
parents:
diff changeset
914 or else not Day'Valid
kono
parents:
diff changeset
915 or else not Hour'Valid
kono
parents:
diff changeset
916 or else not Minute'Valid
kono
parents:
diff changeset
917 or else not Second'Valid
kono
parents:
diff changeset
918 or else not Subsec'Valid
kono
parents:
diff changeset
919 or else not Local_Hour'Valid
kono
parents:
diff changeset
920 or else not Local_Minute'Valid
kono
parents:
diff changeset
921 then
kono
parents:
diff changeset
922 raise Wrong_Syntax;
kono
parents:
diff changeset
923 end if;
kono
parents:
diff changeset
924
kono
parents:
diff changeset
925 -- Compute time without local displacement
kono
parents:
diff changeset
926
kono
parents:
diff changeset
927 if Local_Sign = ' ' then
kono
parents:
diff changeset
928 Time := Time_Of (Year, Month, Day, Hour, Minute, Second, Subsec);
kono
parents:
diff changeset
929
kono
parents:
diff changeset
930 -- Compute time with positive local displacement
kono
parents:
diff changeset
931
kono
parents:
diff changeset
932 elsif Local_Sign = '+' then
kono
parents:
diff changeset
933 Time :=
kono
parents:
diff changeset
934 Time_Of (Year, Month, Day, Hour, Minute, Second, Subsec) -
kono
parents:
diff changeset
935 Local_Disp;
kono
parents:
diff changeset
936
kono
parents:
diff changeset
937 -- Compute time with negative local displacement
kono
parents:
diff changeset
938
kono
parents:
diff changeset
939 elsif Local_Sign = '-' then
kono
parents:
diff changeset
940 Time :=
kono
parents:
diff changeset
941 Time_Of (Year, Month, Day, Hour, Minute, Second, Subsec) +
kono
parents:
diff changeset
942 Local_Disp;
kono
parents:
diff changeset
943 end if;
kono
parents:
diff changeset
944
kono
parents:
diff changeset
945 -- Notify that the input string was successfully parsed
kono
parents:
diff changeset
946
kono
parents:
diff changeset
947 Success := True;
kono
parents:
diff changeset
948
kono
parents:
diff changeset
949 exception
kono
parents:
diff changeset
950 when End_Of_Source_Reached
kono
parents:
diff changeset
951 | Wrong_Syntax
kono
parents:
diff changeset
952 =>
kono
parents:
diff changeset
953 Success := False;
kono
parents:
diff changeset
954 end Parse_ISO_8861_UTC;
kono
parents:
diff changeset
955
kono
parents:
diff changeset
956 -----------
kono
parents:
diff changeset
957 -- Value --
kono
parents:
diff changeset
958 -----------
kono
parents:
diff changeset
959
kono
parents:
diff changeset
960 function Value (Date : String) return Ada.Calendar.Time is
kono
parents:
diff changeset
961 D : String (1 .. 21);
kono
parents:
diff changeset
962 D_Length : constant Natural := Date'Length;
kono
parents:
diff changeset
963
kono
parents:
diff changeset
964 Year : Year_Number;
kono
parents:
diff changeset
965 Month : Month_Number;
kono
parents:
diff changeset
966 Day : Day_Number;
kono
parents:
diff changeset
967 Hour : Hour_Number;
kono
parents:
diff changeset
968 Minute : Minute_Number;
kono
parents:
diff changeset
969 Second : Second_Number;
kono
parents:
diff changeset
970
kono
parents:
diff changeset
971 procedure Extract_Date
kono
parents:
diff changeset
972 (Year : out Year_Number;
kono
parents:
diff changeset
973 Month : out Month_Number;
kono
parents:
diff changeset
974 Day : out Day_Number;
kono
parents:
diff changeset
975 Time_Start : out Natural);
kono
parents:
diff changeset
976 -- Try and extract a date value from string D. Time_Start is set to the
kono
parents:
diff changeset
977 -- first character that could be the start of time data.
kono
parents:
diff changeset
978
kono
parents:
diff changeset
979 procedure Extract_Time
kono
parents:
diff changeset
980 (Index : Positive;
kono
parents:
diff changeset
981 Hour : out Hour_Number;
kono
parents:
diff changeset
982 Minute : out Minute_Number;
kono
parents:
diff changeset
983 Second : out Second_Number;
kono
parents:
diff changeset
984 Check_Space : Boolean := False);
kono
parents:
diff changeset
985 -- Try and extract a time value from string D starting from position
kono
parents:
diff changeset
986 -- Index. Set Check_Space to True to check whether the character at
kono
parents:
diff changeset
987 -- Index - 1 is a space. Raise Constraint_Error if the portion of D
kono
parents:
diff changeset
988 -- corresponding to the date is not well formatted.
kono
parents:
diff changeset
989
kono
parents:
diff changeset
990 ------------------
kono
parents:
diff changeset
991 -- Extract_Date --
kono
parents:
diff changeset
992 ------------------
kono
parents:
diff changeset
993
kono
parents:
diff changeset
994 procedure Extract_Date
kono
parents:
diff changeset
995 (Year : out Year_Number;
kono
parents:
diff changeset
996 Month : out Month_Number;
kono
parents:
diff changeset
997 Day : out Day_Number;
kono
parents:
diff changeset
998 Time_Start : out Natural)
kono
parents:
diff changeset
999 is
kono
parents:
diff changeset
1000 begin
kono
parents:
diff changeset
1001 if D (3) = '-' or else D (3) = '/' then
kono
parents:
diff changeset
1002 if D_Length = 8 or else D_Length = 17 then
kono
parents:
diff changeset
1003
kono
parents:
diff changeset
1004 -- Formats are "yy*mm*dd" or "yy*mm*dd hh:mm:ss"
kono
parents:
diff changeset
1005
kono
parents:
diff changeset
1006 if D (6) /= D (3) then
kono
parents:
diff changeset
1007 raise Constraint_Error;
kono
parents:
diff changeset
1008 end if;
kono
parents:
diff changeset
1009
kono
parents:
diff changeset
1010 Year := Year_Number'Value ("20" & D (1 .. 2));
kono
parents:
diff changeset
1011 Month := Month_Number'Value (D (4 .. 5));
kono
parents:
diff changeset
1012 Day := Day_Number'Value (D (7 .. 8));
kono
parents:
diff changeset
1013 Time_Start := 10;
kono
parents:
diff changeset
1014
kono
parents:
diff changeset
1015 elsif D_Length = 10 or else D_Length = 19 then
kono
parents:
diff changeset
1016
kono
parents:
diff changeset
1017 -- Formats are "mm*dd*yyyy" or "mm*dd*yyyy hh:mm:ss"
kono
parents:
diff changeset
1018
kono
parents:
diff changeset
1019 if D (6) /= D (3) then
kono
parents:
diff changeset
1020 raise Constraint_Error;
kono
parents:
diff changeset
1021 end if;
kono
parents:
diff changeset
1022
kono
parents:
diff changeset
1023 Year := Year_Number'Value (D (7 .. 10));
kono
parents:
diff changeset
1024 Month := Month_Number'Value (D (1 .. 2));
kono
parents:
diff changeset
1025 Day := Day_Number'Value (D (4 .. 5));
kono
parents:
diff changeset
1026 Time_Start := 12;
kono
parents:
diff changeset
1027
kono
parents:
diff changeset
1028 elsif D_Length = 11 or else D_Length = 20 then
kono
parents:
diff changeset
1029
kono
parents:
diff changeset
1030 -- Formats are "dd*mmm*yyyy" or "dd*mmm*yyyy hh:mm:ss"
kono
parents:
diff changeset
1031
kono
parents:
diff changeset
1032 if D (7) /= D (3) then
kono
parents:
diff changeset
1033 raise Constraint_Error;
kono
parents:
diff changeset
1034 end if;
kono
parents:
diff changeset
1035
kono
parents:
diff changeset
1036 Year := Year_Number'Value (D (8 .. 11));
kono
parents:
diff changeset
1037 Month := Month_Name_To_Number (D (4 .. 6));
kono
parents:
diff changeset
1038 Day := Day_Number'Value (D (1 .. 2));
kono
parents:
diff changeset
1039 Time_Start := 13;
kono
parents:
diff changeset
1040
kono
parents:
diff changeset
1041 else
kono
parents:
diff changeset
1042 raise Constraint_Error;
kono
parents:
diff changeset
1043 end if;
kono
parents:
diff changeset
1044
kono
parents:
diff changeset
1045 elsif D (3) = ' ' then
kono
parents:
diff changeset
1046 if D_Length = 11 or else D_Length = 20 then
kono
parents:
diff changeset
1047
kono
parents:
diff changeset
1048 -- Possible formats are "dd mmm yyyy", "dd mmm yyyy hh:mm:ss"
kono
parents:
diff changeset
1049
kono
parents:
diff changeset
1050 if D (7) /= ' ' then
kono
parents:
diff changeset
1051 raise Constraint_Error;
kono
parents:
diff changeset
1052 end if;
kono
parents:
diff changeset
1053
kono
parents:
diff changeset
1054 Year := Year_Number'Value (D (8 .. 11));
kono
parents:
diff changeset
1055 Month := Month_Name_To_Number (D (4 .. 6));
kono
parents:
diff changeset
1056 Day := Day_Number'Value (D (1 .. 2));
kono
parents:
diff changeset
1057 Time_Start := 13;
kono
parents:
diff changeset
1058
kono
parents:
diff changeset
1059 else
kono
parents:
diff changeset
1060 raise Constraint_Error;
kono
parents:
diff changeset
1061 end if;
kono
parents:
diff changeset
1062
kono
parents:
diff changeset
1063 else
kono
parents:
diff changeset
1064 if D_Length = 8 or else D_Length = 17 then
kono
parents:
diff changeset
1065
kono
parents:
diff changeset
1066 -- Possible formats are "yyyymmdd" or "yyyymmdd hh:mm:ss"
kono
parents:
diff changeset
1067
kono
parents:
diff changeset
1068 Year := Year_Number'Value (D (1 .. 4));
kono
parents:
diff changeset
1069 Month := Month_Number'Value (D (5 .. 6));
kono
parents:
diff changeset
1070 Day := Day_Number'Value (D (7 .. 8));
kono
parents:
diff changeset
1071 Time_Start := 10;
kono
parents:
diff changeset
1072
kono
parents:
diff changeset
1073 elsif D_Length = 10 or else D_Length = 19 then
kono
parents:
diff changeset
1074
kono
parents:
diff changeset
1075 -- Possible formats are "yyyy*mm*dd" or "yyyy*mm*dd hh:mm:ss"
kono
parents:
diff changeset
1076
kono
parents:
diff changeset
1077 if (D (5) /= '-' and then D (5) /= '/')
kono
parents:
diff changeset
1078 or else D (8) /= D (5)
kono
parents:
diff changeset
1079 then
kono
parents:
diff changeset
1080 raise Constraint_Error;
kono
parents:
diff changeset
1081 end if;
kono
parents:
diff changeset
1082
kono
parents:
diff changeset
1083 Year := Year_Number'Value (D (1 .. 4));
kono
parents:
diff changeset
1084 Month := Month_Number'Value (D (6 .. 7));
kono
parents:
diff changeset
1085 Day := Day_Number'Value (D (9 .. 10));
kono
parents:
diff changeset
1086 Time_Start := 12;
kono
parents:
diff changeset
1087
kono
parents:
diff changeset
1088 elsif D_Length = 11 or else D_Length = 20 then
kono
parents:
diff changeset
1089
kono
parents:
diff changeset
1090 -- Possible formats are "yyyy*mmm*dd"
kono
parents:
diff changeset
1091
kono
parents:
diff changeset
1092 if (D (5) /= '-' and then D (5) /= '/')
kono
parents:
diff changeset
1093 or else D (9) /= D (5)
kono
parents:
diff changeset
1094 then
kono
parents:
diff changeset
1095 raise Constraint_Error;
kono
parents:
diff changeset
1096 end if;
kono
parents:
diff changeset
1097
kono
parents:
diff changeset
1098 Year := Year_Number'Value (D (1 .. 4));
kono
parents:
diff changeset
1099 Month := Month_Name_To_Number (D (6 .. 8));
kono
parents:
diff changeset
1100 Day := Day_Number'Value (D (10 .. 11));
kono
parents:
diff changeset
1101 Time_Start := 13;
kono
parents:
diff changeset
1102
kono
parents:
diff changeset
1103 elsif D_Length = 12 or else D_Length = 21 then
kono
parents:
diff changeset
1104
kono
parents:
diff changeset
1105 -- Formats are "mmm dd, yyyy" or "mmm dd, yyyy hh:mm:ss"
kono
parents:
diff changeset
1106
kono
parents:
diff changeset
1107 if D (4) /= ' '
kono
parents:
diff changeset
1108 or else D (7) /= ','
kono
parents:
diff changeset
1109 or else D (8) /= ' '
kono
parents:
diff changeset
1110 then
kono
parents:
diff changeset
1111 raise Constraint_Error;
kono
parents:
diff changeset
1112 end if;
kono
parents:
diff changeset
1113
kono
parents:
diff changeset
1114 Year := Year_Number'Value (D (9 .. 12));
kono
parents:
diff changeset
1115 Month := Month_Name_To_Number (D (1 .. 3));
kono
parents:
diff changeset
1116 Day := Day_Number'Value (D (5 .. 6));
kono
parents:
diff changeset
1117 Time_Start := 14;
kono
parents:
diff changeset
1118
kono
parents:
diff changeset
1119 else
kono
parents:
diff changeset
1120 raise Constraint_Error;
kono
parents:
diff changeset
1121 end if;
kono
parents:
diff changeset
1122 end if;
kono
parents:
diff changeset
1123 end Extract_Date;
kono
parents:
diff changeset
1124
kono
parents:
diff changeset
1125 ------------------
kono
parents:
diff changeset
1126 -- Extract_Time --
kono
parents:
diff changeset
1127 ------------------
kono
parents:
diff changeset
1128
kono
parents:
diff changeset
1129 procedure Extract_Time
kono
parents:
diff changeset
1130 (Index : Positive;
kono
parents:
diff changeset
1131 Hour : out Hour_Number;
kono
parents:
diff changeset
1132 Minute : out Minute_Number;
kono
parents:
diff changeset
1133 Second : out Second_Number;
kono
parents:
diff changeset
1134 Check_Space : Boolean := False)
kono
parents:
diff changeset
1135 is
kono
parents:
diff changeset
1136 begin
kono
parents:
diff changeset
1137 -- If no time was specified in the string (do not allow trailing
kono
parents:
diff changeset
1138 -- character either)
kono
parents:
diff changeset
1139
kono
parents:
diff changeset
1140 if Index = D_Length + 2 then
kono
parents:
diff changeset
1141 Hour := 0;
kono
parents:
diff changeset
1142 Minute := 0;
kono
parents:
diff changeset
1143 Second := 0;
kono
parents:
diff changeset
1144
kono
parents:
diff changeset
1145 else
kono
parents:
diff changeset
1146 -- Not enough characters left ?
kono
parents:
diff changeset
1147
kono
parents:
diff changeset
1148 if Index /= D_Length - 7 then
kono
parents:
diff changeset
1149 raise Constraint_Error;
kono
parents:
diff changeset
1150 end if;
kono
parents:
diff changeset
1151
kono
parents:
diff changeset
1152 if Check_Space and then D (Index - 1) /= ' ' then
kono
parents:
diff changeset
1153 raise Constraint_Error;
kono
parents:
diff changeset
1154 end if;
kono
parents:
diff changeset
1155
kono
parents:
diff changeset
1156 if D (Index + 2) /= ':' or else D (Index + 5) /= ':' then
kono
parents:
diff changeset
1157 raise Constraint_Error;
kono
parents:
diff changeset
1158 end if;
kono
parents:
diff changeset
1159
kono
parents:
diff changeset
1160 Hour := Hour_Number'Value (D (Index .. Index + 1));
kono
parents:
diff changeset
1161 Minute := Minute_Number'Value (D (Index + 3 .. Index + 4));
kono
parents:
diff changeset
1162 Second := Second_Number'Value (D (Index + 6 .. Index + 7));
kono
parents:
diff changeset
1163 end if;
kono
parents:
diff changeset
1164 end Extract_Time;
kono
parents:
diff changeset
1165
kono
parents:
diff changeset
1166 -- Local Declarations
kono
parents:
diff changeset
1167
kono
parents:
diff changeset
1168 Success : Boolean;
kono
parents:
diff changeset
1169 Time_Start : Natural := 1;
kono
parents:
diff changeset
1170 Time : Ada.Calendar.Time;
kono
parents:
diff changeset
1171
kono
parents:
diff changeset
1172 -- Start of processing for Value
kono
parents:
diff changeset
1173
kono
parents:
diff changeset
1174 begin
kono
parents:
diff changeset
1175 -- Let's try parsing Date as a supported ISO-8861 format. If we do not
kono
parents:
diff changeset
1176 -- succeed, then retry using all the other GNAT supported formats.
kono
parents:
diff changeset
1177
kono
parents:
diff changeset
1178 Parse_ISO_8861_UTC (Date, Time, Success);
kono
parents:
diff changeset
1179
kono
parents:
diff changeset
1180 if Success then
kono
parents:
diff changeset
1181 return Time;
kono
parents:
diff changeset
1182 end if;
kono
parents:
diff changeset
1183
kono
parents:
diff changeset
1184 -- Length checks
kono
parents:
diff changeset
1185
kono
parents:
diff changeset
1186 if D_Length /= 8
kono
parents:
diff changeset
1187 and then D_Length /= 10
kono
parents:
diff changeset
1188 and then D_Length /= 11
kono
parents:
diff changeset
1189 and then D_Length /= 12
kono
parents:
diff changeset
1190 and then D_Length /= 17
kono
parents:
diff changeset
1191 and then D_Length /= 19
kono
parents:
diff changeset
1192 and then D_Length /= 20
kono
parents:
diff changeset
1193 and then D_Length /= 21
kono
parents:
diff changeset
1194 then
kono
parents:
diff changeset
1195 raise Constraint_Error;
kono
parents:
diff changeset
1196 end if;
kono
parents:
diff changeset
1197
kono
parents:
diff changeset
1198 -- After the correct length has been determined, it is safe to create
kono
parents:
diff changeset
1199 -- a local string copy in order to avoid String'First N arithmetic.
kono
parents:
diff changeset
1200
kono
parents:
diff changeset
1201 D (1 .. D_Length) := Date;
kono
parents:
diff changeset
1202
kono
parents:
diff changeset
1203 if D_Length /= 8 or else D (3) /= ':' then
kono
parents:
diff changeset
1204 Extract_Date (Year, Month, Day, Time_Start);
kono
parents:
diff changeset
1205 Extract_Time (Time_Start, Hour, Minute, Second, Check_Space => True);
kono
parents:
diff changeset
1206
kono
parents:
diff changeset
1207 else
kono
parents:
diff changeset
1208 declare
kono
parents:
diff changeset
1209 Discard : Second_Duration;
kono
parents:
diff changeset
1210 begin
kono
parents:
diff changeset
1211 Split (Clock, Year, Month, Day, Hour, Minute, Second,
kono
parents:
diff changeset
1212 Sub_Second => Discard);
kono
parents:
diff changeset
1213 end;
kono
parents:
diff changeset
1214
kono
parents:
diff changeset
1215 Extract_Time (1, Hour, Minute, Second, Check_Space => False);
kono
parents:
diff changeset
1216 end if;
kono
parents:
diff changeset
1217
kono
parents:
diff changeset
1218 -- Sanity checks
kono
parents:
diff changeset
1219
kono
parents:
diff changeset
1220 if not Year'Valid
kono
parents:
diff changeset
1221 or else not Month'Valid
kono
parents:
diff changeset
1222 or else not Day'Valid
kono
parents:
diff changeset
1223 or else not Hour'Valid
kono
parents:
diff changeset
1224 or else not Minute'Valid
kono
parents:
diff changeset
1225 or else not Second'Valid
kono
parents:
diff changeset
1226 then
kono
parents:
diff changeset
1227 raise Constraint_Error;
kono
parents:
diff changeset
1228 end if;
kono
parents:
diff changeset
1229
kono
parents:
diff changeset
1230 return Time_Of (Year, Month, Day, Hour, Minute, Second);
kono
parents:
diff changeset
1231 end Value;
kono
parents:
diff changeset
1232
kono
parents:
diff changeset
1233 --------------
kono
parents:
diff changeset
1234 -- Put_Time --
kono
parents:
diff changeset
1235 --------------
kono
parents:
diff changeset
1236
kono
parents:
diff changeset
1237 procedure Put_Time (Date : Ada.Calendar.Time; Picture : Picture_String) is
kono
parents:
diff changeset
1238 begin
kono
parents:
diff changeset
1239 Ada.Text_IO.Put (Image (Date, Picture));
kono
parents:
diff changeset
1240 end Put_Time;
kono
parents:
diff changeset
1241
kono
parents:
diff changeset
1242 end GNAT.Calendar.Time_IO;