comparison src/corefcn/time.cc @ 15039:e753177cde93

maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory * __contourc__.cc, __dispatch__.cc, __lin_interpn__.cc, __pchip_deriv__.cc, __qp__.cc, balance.cc, besselj.cc, betainc.cc, bsxfun.cc, cellfun.cc, colloc.cc, conv2.cc, daspk.cc, dasrt.cc, dassl.cc, det.cc, dlmread.cc, dot.cc, eig.cc, fft.cc, fft2.cc, fftn.cc, filter.cc, find.cc, gammainc.cc, gcd.cc, getgrent.cc, getpwent.cc, getrusage.cc, givens.cc, hess.cc, hex2num.cc, inv.cc, kron.cc, lookup.cc, lsode.cc, lu.cc, luinc.cc, matrix_type.cc, max.cc, md5sum.cc, mgorth.cc, nproc.cc, pinv.cc, quad.cc, quadcc.cc, qz.cc, rand.cc, rcond.cc, regexp.cc, schur.cc, spparms.cc, sqrtm.cc, str2double.cc, strfind.cc, sub2ind.cc, svd.cc, syl.cc, time.cc, tril.cc, typecast.cc: Move functions from DLD-FUNCTIONS/ to corefcn/ directory. Include "defun.h", not "defun-dld.h". Change docstring to refer to these as "Built-in Functions". * build-aux/mk-opts.pl: Generate options code with '#include "defun.h"'. Change option docstrings to refer to these as "Built-in Functions". * corefcn/module.mk: List of functions to build in corefcn/ dir. * DLD-FUNCTIONS/config-module.awk: Update to new build system. * DLD-FUNCTIONS/module-files: Remove functions which are now in corefcn/ directory. * src/Makefile.am: Update to build "convenience library" in corefcn/. Octave program now links against all other libraries + corefcn libary. * src/find-defun-files.sh: Strip $srcdir from filename. * src/link-deps.mk: Add REGEX and FFTW link dependencies for liboctinterp. * type.m, which.m: Change failing tests to use 'amd', still a dynamic function, rather than 'dot', which isn't.
author Rik <rik@octave.org>
date Fri, 27 Jul 2012 15:35:00 -0700
parents src/DLD-FUNCTIONS/time.cc@60e5cf354d80
children
comparison
equal deleted inserted replaced
15038:ab18578c2ade 15039:e753177cde93
1 /*
2
3 Copyright (C) 1996-2012 John W. Eaton
4
5 This file is part of Octave.
6
7 Octave is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 3 of the License, or (at your
10 option) any later version.
11
12 Octave is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with Octave; see the file COPYING. If not, see
19 <http://www.gnu.org/licenses/>.
20
21 */
22
23 #ifdef HAVE_CONFIG_H
24 #include <config.h>
25 #endif
26
27 #include <string>
28
29 #include "defun.h"
30 #include "error.h"
31 #include "oct-map.h"
32 #include "oct-time.h"
33 #include "ov.h"
34 #include "oct-obj.h"
35
36 // Date and time functions.
37
38 static octave_scalar_map
39 mk_tm_map (const octave_base_tm& t)
40 {
41 octave_scalar_map m;
42
43 m.assign ("usec", static_cast<double> (t.usec ()));
44 m.assign ("sec", static_cast<double> (t.sec ()));
45 m.assign ("min", static_cast<double> (t.min ()));
46 m.assign ("hour", static_cast<double> (t.hour ()));
47 m.assign ("mday", static_cast<double> (t.mday ()));
48 m.assign ("mon", static_cast<double> (t.mon ()));
49 m.assign ("year", static_cast<double> (t.year ()));
50 m.assign ("wday", static_cast<double> (t.wday ()));
51 m.assign ("yday", static_cast<double> (t.yday ()));
52 m.assign ("isdst", static_cast<double> (t.isdst ()));
53 m.assign ("zone", t.zone ());
54
55 return m;
56 }
57
58 static inline int
59 intfield (const octave_scalar_map& m, const std::string& k)
60 {
61 int retval = 0;
62
63 octave_value v = m.getfield (k);
64
65 if (! v.is_empty ())
66 retval = v.int_value ();
67
68 return retval;
69 }
70
71 static inline std::string
72 stringfield (const octave_scalar_map& m, const std::string& k)
73 {
74 std::string retval;
75
76 octave_value v = m.getfield (k);
77
78 if (! v.is_empty ())
79 retval = v.string_value ();
80
81 return retval;
82 }
83
84 static octave_base_tm
85 extract_tm (const octave_scalar_map& m)
86 {
87 octave_base_tm tm;
88
89 tm.usec (intfield (m, "usec"));
90 tm.sec (intfield (m, "sec"));
91 tm.min (intfield (m, "min"));
92 tm.hour (intfield (m, "hour"));
93 tm.mday (intfield (m, "mday"));
94 tm.mon (intfield (m, "mon"));
95 tm.year (intfield (m, "year"));
96 tm.wday (intfield (m, "wday"));
97 tm.yday (intfield (m, "yday"));
98 tm.isdst (intfield (m, "isdst"));
99 tm.zone (stringfield (m, "zone"));
100
101 return tm;
102 }
103
104 DEFUN (time, args, ,
105 "-*- texinfo -*-\n\
106 @deftypefn {Built-in Function} {@var{seconds} =} time ()\n\
107 Return the current time as the number of seconds since the epoch. The\n\
108 epoch is referenced to 00:00:00 CUT (Coordinated Universal Time) 1 Jan\n\
109 1970. For example, on Monday February 17, 1997 at 07:15:06 CUT, the\n\
110 value returned by @code{time} was 856163706.\n\
111 @seealso{strftime, strptime, localtime, gmtime, mktime, now, date, clock, datenum, datestr, datevec, calendar, weekday}\n\
112 @end deftypefn")
113 {
114 octave_value retval;
115
116 if (args.length () == 0)
117 retval = octave_time ();
118 else
119 print_usage ();
120
121 return retval;
122 }
123
124 /*
125 %!assert (time () > 0)
126 */
127
128 DEFUN (gmtime, args, ,
129 "-*- texinfo -*-\n\
130 @deftypefn {Built-in Function} {@var{tm_struct} =} gmtime (@var{t})\n\
131 Given a value returned from @code{time}, or any non-negative integer,\n\
132 return a time structure corresponding to CUT (Coordinated Universal Time).\n\
133 For example:\n\
134 \n\
135 @example\n\
136 @group\n\
137 gmtime (time ())\n\
138 @result{} @{\n\
139 usec = 0\n\
140 sec = 6\n\
141 min = 15\n\
142 hour = 7\n\
143 mday = 17\n\
144 mon = 1\n\
145 year = 97\n\
146 wday = 1\n\
147 yday = 47\n\
148 isdst = 0\n\
149 zone = CST\n\
150 @}\n\
151 @end group\n\
152 @end example\n\
153 @seealso{strftime, strptime, localtime, mktime, time, now, date, clock, datenum, datestr, datevec, calendar, weekday}\n\
154 @end deftypefn")
155 {
156 octave_value retval;
157
158 if (args.length () == 1)
159 {
160 double tmp = args(0).double_value ();
161
162 if (! error_state)
163 retval = octave_value (mk_tm_map (octave_gmtime (tmp)));
164 }
165 else
166 print_usage ();
167
168 return retval;
169 }
170
171 /*
172 %!test
173 %! ts = gmtime (time ());
174 %! assert (isstruct (ts));
175 %! assert (isfield (ts, "usec"));
176 %! assert (isfield (ts, "year"));
177 %! assert (isfield (ts, "mon"));
178 %! assert (isfield (ts, "mday"));
179 %! assert (isfield (ts, "sec"));
180 %! assert (isfield (ts, "min"));
181 %! assert (isfield (ts, "wday"));
182 %! assert (isfield (ts, "hour"));
183 %! assert (isfield (ts, "isdst"));
184 %! assert (isfield (ts, "yday"));
185
186 %!error gmtime ()
187 %!error gmtime (1, 2)
188 */
189
190 DEFUN (localtime, args, ,
191 "-*- texinfo -*-\n\
192 @deftypefn {Built-in Function} {@var{tm_struct} =} localtime (@var{t})\n\
193 Given a value returned from @code{time}, or any non-negative integer,\n\
194 return a time structure corresponding to the local time zone.\n\
195 \n\
196 @example\n\
197 @group\n\
198 localtime (time ())\n\
199 @result{} @{\n\
200 usec = 0\n\
201 sec = 6\n\
202 min = 15\n\
203 hour = 1\n\
204 mday = 17\n\
205 mon = 1\n\
206 year = 97\n\
207 wday = 1\n\
208 yday = 47\n\
209 isdst = 0\n\
210 zone = CST\n\
211 @}\n\
212 @end group\n\
213 @end example\n\
214 @seealso{strftime, strptime, gmtime, mktime, time, now, date, clock, datenum, datestr, datevec, calendar, weekday}\n\
215 @end deftypefn")
216 {
217 octave_value retval;
218
219 if (args.length () == 1)
220 {
221 double tmp = args(0).double_value ();
222
223 if (! error_state)
224 retval = octave_value (mk_tm_map (octave_localtime (tmp)));
225 }
226 else
227 print_usage ();
228
229 return retval;
230 }
231
232 /*
233 %!test
234 %! ts = localtime (time ());
235 %! assert (isstruct (ts));
236 %! assert (isfield (ts, "usec"));
237 %! assert (isfield (ts, "year"));
238 %! assert (isfield (ts, "mon"));
239 %! assert (isfield (ts, "mday"));
240 %! assert (isfield (ts, "sec"));
241 %! assert (isfield (ts, "min"));
242 %! assert (isfield (ts, "wday"));
243 %! assert (isfield (ts, "hour"));
244 %! assert (isfield (ts, "isdst"));
245 %! assert (isfield (ts, "yday"));
246
247 %!error localtime ()
248 %!error localtime (1, 2)
249 */
250
251 DEFUN (mktime, args, ,
252 "-*- texinfo -*-\n\
253 @deftypefn {Built-in Function} {@var{seconds} =} mktime (@var{tm_struct})\n\
254 Convert a time structure corresponding to the local time to the number\n\
255 of seconds since the epoch. For example:\n\
256 \n\
257 @example\n\
258 @group\n\
259 mktime (localtime (time ()))\n\
260 @result{} 856163706\n\
261 @end group\n\
262 @end example\n\
263 @seealso{strftime, strptime, localtime, gmtime, time, now, date, clock, datenum, datestr, datevec, calendar, weekday}\n\
264 @end deftypefn")
265 {
266 octave_value retval;
267
268 if (args.length () == 1)
269 {
270 octave_scalar_map map = args(0).scalar_map_value ();
271
272 if (! error_state)
273 {
274 octave_base_tm tm = extract_tm (map);
275
276 if (! error_state)
277 retval = octave_time (tm);
278 else
279 error ("mktime: invalid TM_STRUCT argument");
280 }
281 else
282 error ("mktime: TM_STRUCT argument must be a structure");
283 }
284 else
285 print_usage ();
286
287 return retval;
288 }
289
290 /*
291 %!test
292 %! t = time ();
293 %! assert (fix (mktime (localtime (t))) == fix (t));
294
295 ## These tests fail on systems with mktime functions of limited
296 ## intelligence:
297 %!assert (datestr (datenum (1969, 1, 1), 0), "01-Jan-1969 00:00:00")
298 %!assert (datestr (datenum (1901, 1, 1), 0), "01-Jan-1901 00:00:00")
299 %!assert (datestr (datenum (1795, 1, 1), 0), "01-Jan-1795 00:00:00")
300
301 %!error mktime ()
302 %!error mktime (1, 2, 3)
303 */
304
305 DEFUN (strftime, args, ,
306 "-*- texinfo -*-\n\
307 @deftypefn {Built-in Function} {} strftime (@var{fmt}, @var{tm_struct})\n\
308 Format the time structure @var{tm_struct} in a flexible way using the\n\
309 format string @var{fmt} that contains @samp{%} substitutions\n\
310 similar to those in @code{printf}. Except where noted, substituted\n\
311 fields have a fixed size; numeric fields are padded if necessary.\n\
312 Padding is with zeros by default; for fields that display a single\n\
313 number, padding can be changed or inhibited by following the @samp{%}\n\
314 with one of the modifiers described below. Unknown field specifiers are\n\
315 copied as normal characters. All other characters are copied to the\n\
316 output without change. For example:\n\
317 \n\
318 @example\n\
319 @group\n\
320 strftime (\"%r (%Z) %A %e %B %Y\", localtime (time ()))\n\
321 @result{} \"01:15:06 AM (CST) Monday 17 February 1997\"\n\
322 @end group\n\
323 @end example\n\
324 \n\
325 Octave's @code{strftime} function supports a superset of the ANSI C\n\
326 field specifiers.\n\
327 \n\
328 @noindent\n\
329 Literal character fields:\n\
330 \n\
331 @table @code\n\
332 @item %%\n\
333 % character.\n\
334 \n\
335 @item %n\n\
336 Newline character.\n\
337 \n\
338 @item %t\n\
339 Tab character.\n\
340 @end table\n\
341 \n\
342 @noindent\n\
343 Numeric modifiers (a nonstandard extension):\n\
344 \n\
345 @table @code\n\
346 @item - (dash)\n\
347 Do not pad the field.\n\
348 \n\
349 @item _ (underscore)\n\
350 Pad the field with spaces.\n\
351 @end table\n\
352 \n\
353 @noindent\n\
354 Time fields:\n\
355 \n\
356 @table @code\n\
357 @item %H\n\
358 Hour (00-23).\n\
359 \n\
360 @item %I\n\
361 Hour (01-12).\n\
362 \n\
363 @item %k\n\
364 Hour (0-23).\n\
365 \n\
366 @item %l\n\
367 Hour (1-12).\n\
368 \n\
369 @item %M\n\
370 Minute (00-59).\n\
371 \n\
372 @item %p\n\
373 Locale's AM or PM.\n\
374 \n\
375 @item %r\n\
376 Time, 12-hour (hh:mm:ss [AP]M).\n\
377 \n\
378 @item %R\n\
379 Time, 24-hour (hh:mm).\n\
380 \n\
381 @item %s\n\
382 Time in seconds since 00:00:00, Jan 1, 1970 (a nonstandard extension).\n\
383 \n\
384 @item %S\n\
385 Second (00-61).\n\
386 \n\
387 @item %T\n\
388 Time, 24-hour (hh:mm:ss).\n\
389 \n\
390 @item %X\n\
391 Locale's time representation (%H:%M:%S).\n\
392 \n\
393 @item %Z\n\
394 Time zone (EDT), or nothing if no time zone is determinable.\n\
395 @end table\n\
396 \n\
397 @noindent\n\
398 Date fields:\n\
399 \n\
400 @table @code\n\
401 @item %a\n\
402 Locale's abbreviated weekday name (Sun-Sat).\n\
403 \n\
404 @item %A\n\
405 Locale's full weekday name, variable length (Sunday-Saturday).\n\
406 \n\
407 @item %b\n\
408 Locale's abbreviated month name (Jan-Dec).\n\
409 \n\
410 @item %B\n\
411 Locale's full month name, variable length (January-December).\n\
412 \n\
413 @item %c\n\
414 Locale's date and time (Sat Nov 04 12:02:33 EST 1989).\n\
415 \n\
416 @item %C\n\
417 Century (00-99).\n\
418 \n\
419 @item %d\n\
420 Day of month (01-31).\n\
421 \n\
422 @item %e\n\
423 Day of month ( 1-31).\n\
424 \n\
425 @item %D\n\
426 Date (mm/dd/yy).\n\
427 \n\
428 @item %h\n\
429 Same as %b.\n\
430 \n\
431 @item %j\n\
432 Day of year (001-366).\n\
433 \n\
434 @item %m\n\
435 Month (01-12).\n\
436 \n\
437 @item %U\n\
438 Week number of year with Sunday as first day of week (00-53).\n\
439 \n\
440 @item %w\n\
441 Day of week (0-6).\n\
442 \n\
443 @item %W\n\
444 Week number of year with Monday as first day of week (00-53).\n\
445 \n\
446 @item %x\n\
447 Locale's date representation (mm/dd/yy).\n\
448 \n\
449 @item %y\n\
450 Last two digits of year (00-99).\n\
451 \n\
452 @item %Y\n\
453 Year (1970-).\n\
454 @end table\n\
455 @seealso{strptime, localtime, gmtime, mktime, time, now, date, clock, datenum, datestr, datevec, calendar, weekday}\n\
456 @end deftypefn")
457 {
458 octave_value retval;
459
460 if (args.length () == 2)
461 {
462 std::string fmt = args(0).string_value ();
463
464 if (! error_state)
465 {
466 octave_scalar_map map = args(1).scalar_map_value ();
467
468 if (! error_state)
469 {
470 octave_base_tm tm = extract_tm (map);
471
472 if (! error_state)
473 retval = tm.strftime (fmt);
474 else
475 error ("strftime: invalid TM_STRUCT argument");
476 }
477 else
478 error ("strftime: TM_STRUCT must be a structure");
479 }
480 else
481 error ("strftime: FMT must be a string");
482 }
483 else
484 print_usage ();
485
486 return retval;
487 }
488
489 /*
490 %!assert (ischar (strftime ("%%%n%t%H%I%k%l", localtime (time ()))));
491 %!assert (ischar (strftime ("%M%p%r%R%s%S%T", localtime (time ()))));
492 %!assert (ischar (strftime ("%X%Z%z%a%A%b%B", localtime (time ()))));
493 %!assert (ischar (strftime ("%c%C%d%e%D%h%j", localtime (time ()))));
494 %!assert (ischar (strftime ("%m%U%w%W%x%y%Y", localtime (time ()))));
495
496 %!error strftime ()
497 %!error strftime ("foo", localtime (time ()), 1)
498 */
499
500 DEFUN (strptime, args, ,
501 "-*- texinfo -*-\n\
502 @deftypefn {Built-in Function} {[@var{tm_struct}, @var{nchars}] =} strptime (@var{str}, @var{fmt})\n\
503 Convert the string @var{str} to the time structure @var{tm_struct} under\n\
504 the control of the format string @var{fmt}.\n\
505 \n\
506 If @var{fmt} fails to match, @var{nchars} is 0; otherwise, it is set to the\n\
507 position of last matched character plus 1. Always check for this unless\n\
508 you're absolutely sure the date string will be parsed correctly.\n\
509 @seealso{strftime, localtime, gmtime, mktime, time, now, date, clock, datenum, datestr, datevec, calendar, weekday}\n\
510 @end deftypefn")
511 {
512 octave_value_list retval;
513
514 if (args.length () == 2)
515 {
516 std::string str = args(0).string_value ();
517
518 if (! error_state)
519 {
520 std::string fmt = args(1).string_value ();
521
522 if (! error_state)
523 {
524 octave_strptime t (str, fmt);
525
526 retval(1) = t.characters_converted ();
527 retval(0) = octave_value (mk_tm_map (t));
528 }
529 else
530 error ("strptime: FMT must be a string");
531 }
532 else
533 error ("strptime: argument STR must be a string");
534 }
535 else
536 print_usage ();
537
538 return retval;
539 }