/*+JMJ
* ZOTIME - Print date and time in user's local time zone
* Copyright 2011 David Meyer <
[email protected]>
*
* TOPS-20 DAYTIME prints only the time in host's local
* time without zone designation.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "krcompat.h"
#define INIFILE "zotime.ini"
#define DEFAULT_OFFSET "0"
void print_zotime PARAMS((time_t timer, char *zoffset));
char* month[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
char* wkday[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
int main(argc, argv)
int argc;
char *argv[];
{
FILE *inif;
char zostr[7];
int argi;
time_t timer = time(NULL);
if (argc > 1)
{
for (argi = 1; argi < argc; ++ argi)
print_zotime(timer, argv[argi]);
}
else if ((inif = fopen(INIFILE, "r")) != NULL)
{
while (fscanf(inif, "%6s", zostr) == 1)
print_zotime(timer, zostr);
fclose(inif);
}
else
{
strcpy(zostr, DEFAULT_OFFSET);
print_zotime(timer, zostr);
}
exit(0);
}
void print_zotime(timer, zoffset)
time_t timer;
char *zoffset;
{
int zohr, zomin, zosec;
char zoout[7];
struct tm *now;
zohr = zomin = 0;
if (strstr(zoffset, ":") != NULL)
sscanf(zoffset, "%d:%d", &zohr, &zomin);
else
sscanf(zoffset, "%d", &zohr);
if (-12 <= zohr && zohr <= 12 && 0 <= zomin && zomin <= 60)
{
zosec = (abs(zohr) *60 + zomin) * (zohr < 0 ? -60 : 60);
timer += zosec;
now = gmtime(&timer);
if (zomin != 0)
sprintf(zoout, "%+d:%02d", zohr, zomin);
else if (zohr != 0)
sprintf(zoout, "%+d", zohr);
else
strcpy(zoout, "");
printf(" %s, %s %d, %04d %02d:%02d:%02d UTC%s\n", wkday[now->tm_wday], month[now->tm_mon], now->tm_mday, now->tm_year + 1900, now->tm_hour, now->tm_min, now->tm_sec, zoout);
}
else
fprintf(stderr, "Time zone offset format error: %s\n", zoffset);
}