Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 5 Jan 2010 21:14:48 +0000 (UTC)
From:      Edwin Groothuis <edwin@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r201613 - head/games/pom
Message-ID:  <201001052114.o05LEmmR014916@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: edwin
Date: Tue Jan  5 21:14:48 2010
New Revision: 201613
URL: http://svn.freebsd.org/changeset/base/201613

Log:
  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.

Modified:
  head/games/pom/pom.6
  head/games/pom/pom.c

Modified: head/games/pom/pom.6
==============================================================================
--- head/games/pom/pom.6	Tue Jan  5 21:09:59 2010	(r201612)
+++ head/games/pom/pom.6	Tue Jan  5 21:14:48 2010	(r201613)
@@ -32,15 +32,34 @@
 .\"	@(#)pom.6	8.1 (Berkeley) 5/31/93
 .\" $FreeBSD$
 .\"
-.TH POM 6 "May 31, 1993"
+.Dd May 31, 1993
+.Dt POM 6
 .UC 7
-.SH NAME
-pom \- display the phase of the moon
-.SH SYNOPSIS
-.B pom
-.SH DESCRIPTION
+.Sh NAME
+.Nm pom
+.Nd display the phase of the moon
+.Sh SYNOPSIS
+.Nm 
+.Op Fl d Ar yyyy.mm.dd
+.Op Fl t Ar hh:mm:ss
+.Sh DESCRIPTION
 The
-.I pom
+.Nm
 utility displays the current phase of the moon.
 Useful for selecting software completion target dates and predicting
 managerial behavior.
+.Pp
+Use the arguments
+.Fl d
+and
+.Fl o
+to specify a specific date and time for which the phase of the moon
+has to be calculated.
+If
+.Fl d
+but not
+.Fl t
+has been specified, it will calculate the phase of the moon on that
+day at midnight.
+.Sh SEE ALSO
+`Practical Astronomy with Your Calculator' by Duffett-Smith.

Modified: head/games/pom/pom.c
==============================================================================
--- head/games/pom/pom.c	Tue Jan  5 21:09:59 2010	(r201612)
+++ head/games/pom/pom.c	Tue Jan  5 21:14:48 2010	(r201613)
@@ -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]);
 
-	(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)
+	/* 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);
+	}
+
+	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);
+}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201001052114.o05LEmmR014916>