156893Sfenner/* Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc. 256893SfennerThis file is part of GNU Fortran libU77 library. 356893Sfenner 456893SfennerThis library is free software; you can redistribute it and/or modify it 5127668Sbmsunder the terms of the GNU Library General Public License as published 656893Sfennerby the Free Software Foundation; either version 2 of the License, or 756893Sfenner(at your option) any later version. 856893Sfenner 9127668SbmsGNU Fortran is distributed in the hope that it will be useful, 1056893Sfennerbut WITHOUT ANY WARRANTY; without even the implied warranty of 1156893SfennerMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12127668SbmsLibrary General Public License for more details. 1356893Sfenner 1456893SfennerYou should have received a copy of the GNU Library General Public 1556893SfennerLicense along with GNU Fortran; see the file COPYING.LIB. If 16127668Sbmsnot, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 1756893SfennerBoston, MA 02111-1307, USA. */ 1856893Sfenner 1956893Sfenner#ifdef HAVE_CONFIG_H 2056893Sfenner#include "config.h" 21127668Sbms#endif 2256893Sfenner#include <stdio.h> 2356893Sfenner#if TIME_WITH_SYS_TIME 2456893Sfenner# include <sys/time.h> 25127668Sbms# include <time.h> 2656893Sfenner#else 2756893Sfenner# if HAVE_SYS_TIME_H 2856893Sfenner# include <sys/time.h> 2956893Sfenner# else 3056893Sfenner# include <time.h> 3156893Sfenner# endif 3256893Sfenner#endif 3356893Sfenner#include "f2c.h" 3456893Sfenner 3556893Sfenner#ifdef KR_headers 3656893SfennerVOID s_copy (); 3756893Sfenner#else 3856893Sfennervoid s_copy(register char *a, register char *b, ftnlen la, ftnlen lb); 39276788Sdelphij#endif 40276788Sdelphij 4156893Sfennerint G77_date_and_time_0 (char *date, char *fftime, char *zone, 4256893Sfenner integer *values, ftnlen date_len, 43127668Sbms ftnlen fftime_len, ftnlen zone_len) 44127668Sbms{ 4556893Sfenner time_t lt=time(<); 4656893Sfenner struct tm ltime = *localtime(<), gtime = *gmtime(<); 4756893Sfenner char dat[9], zon[6], ftim[11]; 4856893Sfenner int i, vals[8]; 4956893Sfenner 5056893Sfenner vals[0] = 1900 + ltime.tm_year; 51146775Ssam vals[1] = 1 + ltime.tm_mon; 52146775Ssam vals[2] = ltime.tm_mday; 5356893Sfenner /* fixme: year boundaries */ 5456893Sfenner vals[3] = (ltime.tm_min - gtime.tm_min + 55146775Ssam 60*(ltime.tm_hour - gtime.tm_hour + 56146775Ssam 24*(ltime.tm_yday -gtime.tm_yday))); 57146775Ssam vals[4] = ltime.tm_hour; 58146775Ssam vals[5] = ltime.tm_min; 5956893Sfenner vals[6] = ltime.tm_sec; 6056893Sfenner vals[7] = 0; /* no STDC way to get this */ 6156893Sfenner /* GNUish way; maybe use `ftime' on other systems. */ 6256893Sfenner#if HAVE_GETTIMEOFDAY 6356893Sfenner { 6456893Sfenner struct timeval tp; 6556893Sfenner#if HAVE_STRUCT_TIMEZONE 6656893Sfenner struct timezone tzp; 6756893Sfenner /* This is still not strictly correct on some systems such as HPUX, 6856893Sfenner which does have struct timezone, but gettimeofday takes void* as 6956893Sfenner the 2nd arg. However, the effect of passing anything other than a null 7056893Sfenner pointer is unspecified on HPUX. */ 7156893Sfenner if (! gettimeofday (&tp, &tzp)) 7256893Sfenner#else 7356893Sfenner if (! gettimeofday (&tp, (void *) 0)) 7456893Sfenner#endif 7556893Sfenner vals[7] = tp.tv_usec/1000; 7656893Sfenner } 7756893Sfenner#endif 7856893Sfenner if (values) /* null pointer for missing optional */ 7956893Sfenner for (i=0; i<=7; i++) 8056893Sfenner values[i] = vals[i]; 8156893Sfenner sprintf (dat, "%04d%02d%02d", vals[0], vals[1], vals[2]); 8256893Sfenner s_copy(date, dat, date_len, 8); 8356893Sfenner if (zone) { 8456893Sfenner sprintf(zon, "%+03d%02d", vals[3] / 60, abs(vals[3] % 60)); 8556893Sfenner s_copy(zone, zon, zone_len, 5); 8656893Sfenner } 8756893Sfenner if (fftime) { 8856893Sfenner sprintf (ftim, "%02d%02d%02d.%03d", vals[4], vals[5], vals[6], vals[7]); 8956893Sfenner s_copy(fftime, ftim, fftime_len, 10); 9056893Sfenner } 9156893Sfenner return 0; 9256893Sfenner} 9356893Sfenner