diff options
author | edwin <edwin@FreeBSD.org> | 2010-01-05 21:14:48 +0000 |
---|---|---|
committer | edwin <edwin@FreeBSD.org> | 2010-01-05 21:14:48 +0000 |
commit | c309e354e02589a88594800cef4cd8169f53fa06 (patch) | |
tree | d8969dddca82f25837113069477e84feee72eb69 /games/pom/pom.c | |
parent | fa4a3591591d0365fabb6cf510d007be10d39412 (diff) | |
download | FreeBSD-src-c309e354e02589a88594800cef4cd8169f53fa06.zip FreeBSD-src-c309e354e02589a88594800cef4cd8169f53fa06.tar.gz |
Be able to specify a certain date and/or time for which to calculate
the phase of the moon.
While not worlds best improvements, it will help calendar(1) later on.
Diffstat (limited to 'games/pom/pom.c')
-rw-r--r-- | games/pom/pom.c | 72 |
1 files changed, 64 insertions, 8 deletions
diff --git a/games/pom/pom.c b/games/pom/pom.c index d245f34..fd82f68 100644 --- a/games/pom/pom.c +++ b/games/pom/pom.c @@ -57,9 +57,13 @@ __FBSDID("$FreeBSD$"); * */ -#include <time.h> #include <stdio.h> +#include <stdlib.h> #include <math.h> +#include <string.h> +#include <sysexits.h> +#include <time.h> +#include <unistd.h> #ifndef PI #define PI 3.14159265358979323846 @@ -76,20 +80,62 @@ __FBSDID("$FreeBSD$"); static void adj360(double *); static double dtor(double); static double potm(double); +static void usage(char *progname); int -main(void) +main(int argc, char **argv) { time_t tt; - struct tm *GMT; + struct tm GMT, tmd; double days, today, tomorrow; int cnt; + char *odate = NULL, *otime = NULL, ch; + + while ((ch = getopt(argc, argv, "d:t:")) != -1) + switch (ch) { + case 'd': + odate = optarg; + break; + case 't': + otime = optarg; + break; + default: + usage(argv[0]); + } + + argc -= optind; + argv += optind; + + if (argc) + usage(argv[0]); + + /* Adjust based on users preferences */ + time(&tt); + if (otime != NULL || odate != NULL) { + /* Save today in case -d isn't specified */ + localtime_r(&tt, &tmd); + + if (odate != NULL) { + tmd.tm_year = strtol(odate, NULL, 10) - 1900; + tmd.tm_mon = strtol(odate + 5, NULL, 10) - 1; + tmd.tm_mday = strtol(odate + 8, NULL, 10); + /* Use midnight as the middle of the night */ + tmd.tm_hour = 0; + tmd.tm_min = 0; + tmd.tm_sec = 0; + } + if (otime != NULL) { + tmd.tm_hour = strtol(otime, NULL, 10); + tmd.tm_min = strtol(otime + 3, NULL, 10); + tmd.tm_sec = strtol(otime + 6, NULL, 10); + } + tt = mktime(&tmd); + } - (void) time(&tt); - GMT = gmtime(&tt); - days = (GMT->tm_yday + 1) + ((GMT->tm_hour + - (GMT->tm_min / 60.0) + (GMT->tm_sec / 3600.0)) / 24.0); - for (cnt = EPOCH; cnt < GMT->tm_year; ++cnt) + gmtime_r(&tt, &GMT); + days = (GMT.tm_yday + 1) + ((GMT.tm_hour + + (GMT.tm_min / 60.0) + (GMT.tm_sec / 3600.0)) / 24.0); + for (cnt = EPOCH; cnt < GMT.tm_year; ++cnt) days += isleap(1900 + cnt) ? 366 : 365; today = potm(days) + .5; (void)printf("The Moon is "); @@ -160,6 +206,7 @@ potm(double days) static double dtor(double deg) { + return(deg * PI / 180); } @@ -170,6 +217,7 @@ dtor(double deg) static void adj360(double *deg) { + for (;;) if (*deg < 0) *deg += 360; @@ -178,3 +226,11 @@ adj360(double *deg) else break; } + +static void +usage(char *progname) +{ + + fprintf(stderr, "Usage: %s [-d yyyy.mm.dd] [-t hh:mm:ss]\n", progname); + exit(EX_USAGE); +} |