/*+JMJ * ZOTIME - Print date and time in user's local time zone * Copyright 2011 David Meyer <papa@twenex.org> * * TOPS-20 DAYTIME prints only the time in host's local * time without zone designation. */ #include <stdio.h> #include <string.h> #include <time.h> #define INIFILE "zotime.ini" 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() { FILE *inif; char zostr[7], outstr[7]; int hrset, num, stri, zosign, zohr, zomin; time_t timer; struct tm *now; timer = time(NULL); inif = fopen(INIFILE, "r"); /* What do we do with empty or non-existent inifile? */ while (fgets(zostr, 7, inif) != NULL) { hrset = num = stri = zohr = zomin = 0; zosign = 1; for (stri = 0; stri < strlen(zostr); stri ++) { switch (zostr[stri]) { case '-': if (stri == 0) zosign = -1; else /* error */; break; case '+': if (stri != 0) /* error */; break; case ':': if (hrset) /* error */; else { zohr = num * zosign; hrset = 1; } break; default: if ('0' <= zostr[stri] <= '9') num = num * 10 + (int) (zostr[stri] - '0'); else /* error */; } } if (hrset) zomin = num * zosign; else zohr = num * zosign; /* construct TZ string and print date/time */ timer += (zohr * 3600 + zomin * 60); now = gmtime(&timer); if (zohr || zomin) if (zomin) sprintf(outstr, "%+d:%0d", zohr, abs(zomin)); else sprintf(outstr, "%+d", zohr); else strcpy(outstr, ""); /* printf("%s\n", zostr); */ 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, outstr); } fclose(inif); exit(0); }