// // utc.exe - Display local time, UTC, and MJD. // // - also ${UTC} keyword substitution filter (for web pages) // // 22-Feb-2007 tvb // #include #include #include #include void main (int argc, char *argv[]) { int mode, sed; char *utc (int mode); void subst (char *key, char *value); sed = 0; if (argc > 1 && strcmp(argv[1], "/s") == 0) { argc -= 1; argv += 1; sed = 1; } mode = (argc > 1) ? atoi(argv[1]) : 7; if (sed) { subst("${UTC}", utc(mode)); } else { printf("%s\n", utc(mode)); } } // // Generate UTC or MJD string. // #define MJD_1970_01_01 40587 #define UNIX_TIME_TO_MJD(t) ( MJD_1970_01_01 + ((t) / 86400.0) ) char *utc (int mode) { double mjd; time_t now; struct tm *tm; char *zonename (char *name); char *p; static char utc[100]; // STATIC time(&now); mjd = UNIX_TIME_TO_MJD(now); // Display local time. tm = localtime(&now); p = utc; if (mode & 1) { p += sprintf(p, "%.24s %s", ctime(&now), zonename(_tzname[tm->tm_isdst])); } // One way to display UTC is jam timezone to zero. _timezone = 0; _daylight = 0; if (mode & 2) { if (p != utc) { p += sprintf(p, " = "); } p += sprintf(p, "%.24s %s", ctime(&now), "UTC"); } // Display MJD (Modified Julian Date). if (mode & 4) { if (p != utc) { p += sprintf(p, " = "); } p += sprintf(p, "MJD %.6lf", mjd); } return utc; // STATIC } // // Extract short abbreviation from full time zone name. // char *zonename (char *name) { int i; char *p; static char zone[4]; i = 0; for (p = name; *p && i < 3; p += 1) { if (*p >= 'A' && *p <= 'Z') { zone[i] = *p; i += 1; } } zone[i] = '\0'; return zone; } // // A sed-like stdin-stdout filter for keyword substitution. // void subst (char *key, char *value) { int i, k, n; char line[1000], *p; k = strlen(key); while (fgets(line, sizeof(line), stdin) != NULL) { p = strstr(line, key); if (p != NULL) { i = p - line; n = strlen(line); fwrite(line, i, 1, stdout); fwrite(value, strlen(value), 1, stdout); fwrite(line + i + k, n - i - k, 1, stdout); } else { fputs(line, stdout); } } }