Date: Fri, 27 Oct 1995 11:22:05 -0400 From: "Garrett A. Wollman" <wollman@lcs.mit.edu> To: Dave Andersen <angio@aros.net> Cc: freebsd-questions@freebsd.org Subject: Re: Help -- Stupid "C" question. Message-ID: <9510271522.AA22958@halloran-eldar.lcs.mit.edu> In-Reply-To: <199510270354.VAA27065@terra.aros.net> References: <v02130500acb5df16dbb7@[199.183.109.242]> <199510270354.VAA27065@terra.aros.net>
next in thread | previous in thread | raw e-mail | index | archive | help
Hey, it's portable programming time!
<<On Thu, 26 Oct 1995 21:54:43 -0600 (MDT), Dave Andersen <angio@aros.net> said:
> Time requires a NULL argument to be passed to it.
Actually, let's be slightly more accurate here.
time(3) takes as its only argument a pointer to type `time_t'. If
that pointer is not null (NB: not `not NULL'), then it fills in that
location with the current time. In any case, it also returns a value
of type `time_t'. (Old systems spelled `time_t' l-o-n-g, but you
should use `time_t' and define it yourself if the system doesn't.
FreeBSD always has.) Depending on your preferred style of
programming, you might want to write either:
time_t thetime;
time(&thetime);
or
time_t thetime;
thetime = time((time_t *)0);
Note that the `(time_t *)' case is important for portable programs,
unless you can guarantee that a complete prototype of the `time'
function is in scope. (I consider it to be good style anyway.) The
second form has the benefit of permitting `thetime' to be stored in a
register.
The reason why `time' works this way goes back to Sixth Edition Unix.
In v6, the `long' type had not yet been added to the C language. As a
result, all functions dating back to that era which deal with times
originally expected a pointer to the first element of an array of two
`int' elements, and would perform the 32-bit arithmetic by hand.
(Ever wonder about PDP_ENDIAN in <machine/endian.h>?) When `long' was
added to the language, the calling convention of the time routines was
left the same to ensure binary compatibility. Of course, `time' could
not return its value directly until the language had `long', since in
C one still cannot return array values.
So that is why time(3), gmtime(3), localtime(3), and ctime(3) all take
their arguments as pointers rather than as values.
> long int thetime;
> thetime = time(NULL);
> printf("It is now %s\n", ctime(&thetime));
Actually, a newline is not necessary here, since the buffer filled in
by `ctime' always ends with a newline. This is because the original
implementation of the `date' program was something like:
------------------------------------
#include <stdio.h>
extern time();
extern char *ctime();
int
main()
{
int thetime[2]
time(thetime);
fputs(ctime(thetime), stdout);
return 0;
}
------------------------------------
Obviously, you wouldn't ever want to copy this in a modern program.
-GAWollman
--
Garrett A. Wollman | Shashish is simple, it's discreet, it's brief. ...
wollman@lcs.mit.edu | Shashish is the bonding of hearts in spite of distance.
Opinions not those of| It is a bond more powerful than absence. We like people
MIT, LCS, ANA, or NSA| who like Shashish. - Claude McKenzie + Florent Vollant
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?9510271522.AA22958>
