From 236fc62bb31e2f29e310a3ab854cb66ad0a74259 Mon Sep 17 00:00:00 2001 From: sinetek Date: Fri, 3 Jul 2015 13:25:25 +0700 Subject: [PATCH] pom - sync with FreeBSD 2.0 --- rootfs.manifest | 2 + src/games/Makefile | 2 +- src/games/pom/Makefile | 31 +++++++ src/games/pom/pom.6 | 45 +++++++++++ src/games/pom/pom.c | 178 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 257 insertions(+), 1 deletion(-) create mode 100644 src/games/pom/Makefile create mode 100644 src/games/pom/pom.6 create mode 100644 src/games/pom/pom.c diff --git a/rootfs.manifest b/rootfs.manifest index 33c115b..43d3ca5 100644 --- a/rootfs.manifest +++ b/rootfs.manifest @@ -664,6 +664,7 @@ file /games/mille file /games/monop file /games/morse file /games/number +file /games/pom file /games/ppt file /games/primes file /games/quiz @@ -1539,6 +1540,7 @@ file /share/man/cat6/hangman.0 file /share/man/cat6/mille.0 file /share/man/cat6/monop.0 file /share/man/cat6/number.0 +file /share/man/cat6/pom.0 file /share/man/cat6/quiz.0 file /share/man/cat6/rain.0 file /share/man/cat6/robots.0 diff --git a/src/games/Makefile b/src/games/Makefile index a76bfbc..47866d8 100644 --- a/src/games/Makefile +++ b/src/games/Makefile @@ -12,7 +12,7 @@ CFLAGS += -Werror -Wall -Os # Programs that live in subdirectories, and have makefiles of their own. # SUBDIR = adventure atc backgammon battlestar boggle btlgammon \ - caesar cribbage fortune hangman mille monop quiz robots \ + caesar cribbage fortune hangman mille monop pom quiz robots \ rogue sail snake trek # C programs that live in the current directory and do not need diff --git a/src/games/pom/Makefile b/src/games/pom/Makefile new file mode 100644 index 0000000..9d349f3 --- /dev/null +++ b/src/games/pom/Makefile @@ -0,0 +1,31 @@ +# @(#)Makefile 4.2 (Berkeley) 9/7/85 +# +TOPSRC = $(shell cd ../../..; pwd) +include $(TOPSRC)/target.mk +#include $(TOPSRC)/cross.mk +#CFLAGS = -O -DCROSS -Werror -Wall + +#CFLAGS += -Werror -Wall + +LIBS = -lm -lc + +OBJS = pom.o +MAN = pom.0 + +all: pom $(MAN) + +pom: $(OBJS) + $(CC) $(LDFLAGS) -o $@.elf $(OBJS) $(LIBS) + $(OBJDUMP) -S $@.elf > $@.dis + $(SIZE) $@.elf + $(ELF2AOUT) $@.elf $@ && rm $@.elf + +$(MAN): pom.6 + nroff -man $< > $@ + +clean: + rm -f *.o core pom *.0 *.dis + +install: all + install pom $(DESTDIR)/games/ + install -m 644 $(MAN) $(DESTDIR)/share/man/cat6/ diff --git a/src/games/pom/pom.6 b/src/games/pom/pom.6 new file mode 100644 index 0000000..238694b --- /dev/null +++ b/src/games/pom/pom.6 @@ -0,0 +1,45 @@ +.\" Copyright (c) 1989, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)pom.6 8.1 (Berkeley) 5/31/93 +.\" +.TH POM 6 "May 31, 1993" +.UC 7 +.SH NAME +pom \- display the phase of the moon +.SH SYNOPSIS +.B pom +.SH DESCRIPTION +The +.I pom +utility displays the current phase of the moon. +Useful for selecting software completion target dates and predicting +managerial behavior. diff --git a/src/games/pom/pom.c b/src/games/pom/pom.c new file mode 100644 index 0000000..01fcf7d --- /dev/null +++ b/src/games/pom/pom.c @@ -0,0 +1,178 @@ +/* + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software posted to USENET. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char copyright[] = +"@(#) Copyright (c) 1989, 1993\n\ + The Regents of the University of California. All rights reserved.\n"; +#endif /* not lint */ + +#ifndef lint +static char sccsid[] = "@(#)pom.c 8.1 (Berkeley) 5/31/93"; +#endif /* not lint */ + +/* + * Phase of the Moon. Calculates the current phase of the moon. + * Based on routines from `Practical Astronomy with Your Calculator', + * by Duffett-Smith. Comments give the section from the book that + * particular piece of code was adapted from. + * + * -- Keith E. Brandt VIII 1984 + * + */ + +#include +#include +#include +#include + +#define PI 3.141592654 +#define EPOCH 85 +#define EPSILONg 279.611371 /* solar ecliptic long at EPOCH */ +#define RHOg 282.680403 /* solar ecliptic long of perigee at EPOCH */ +#define ECCEN 0.01671542 /* solar orbit eccentricity */ +#define lzero 18.251907 /* lunar mean long at EPOCH */ +#define Pzero 192.917585 /* lunar mean long of perigee at EPOCH */ +#define Nzero 55.204723 /* lunar mean long of node at EPOCH */ + +double dtor(), potm(), adj360(); + +main() +{ + extern int errno; + struct timeval tp; + struct timezone tzp; + struct tm *GMT, *gmtime(); + double days, today, tomorrow; + int cnt; + char *strerror(); + + if (gettimeofday(&tp,&tzp)) { + (void)fprintf(stderr, "pom: %s\n", strerror(errno)); + exit(1); + } + GMT = gmtime(&tp.tv_sec); + 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(cnt) ? 366 : 365; + today = potm(days) + .5; + (void)printf("The Moon is "); + if ((int)today == 100) + (void)printf("Full\n"); + else if (!(int)today) + (void)printf("New\n"); + else { + tomorrow = potm(days + 1); + if ((int)today == 50) + (void)printf("%s\n", tomorrow > today ? + "at the First Quarter" : "at the Last Quarter"); + else { + (void)printf("%s ", tomorrow > today ? + "Waxing" : "Waning"); + if (today > 50) + (void)printf("Gibbous (%1.0f%% of Full)\n", + today); + else if (today < 50) + (void)printf("Crescent (%1.0f%% of Full)\n", + today); + } + } +} + +/* + * potm -- + * return phase of the moon + */ +double +potm(days) + double days; +{ + double N, Msol, Ec, LambdaSol, l, Mm, Ev, Ac, A3, Mmprime; + double A4, lprime, V, ldprime, D, Nm; + + N = 360 * days / 365.2422; /* sec 42 #3 */ + adj360(&N); + Msol = N + EPSILONg - RHOg; /* sec 42 #4 */ + adj360(&Msol); + Ec = 360 / PI * ECCEN * sin(dtor(Msol)); /* sec 42 #5 */ + LambdaSol = N + Ec + EPSILONg; /* sec 42 #6 */ + adj360(&LambdaSol); + l = 13.1763966 * days + lzero; /* sec 61 #4 */ + adj360(&l); + Mm = l - (0.1114041 * days) - Pzero; /* sec 61 #5 */ + adj360(&Mm); + Nm = Nzero - (0.0529539 * days); /* sec 61 #6 */ + adj360(&Nm); + Ev = 1.2739 * sin(dtor(2*(l - LambdaSol) - Mm)); /* sec 61 #7 */ + Ac = 0.1858 * sin(dtor(Msol)); /* sec 61 #8 */ + A3 = 0.37 * sin(dtor(Msol)); + Mmprime = Mm + Ev - Ac - A3; /* sec 61 #9 */ + Ec = 6.2886 * sin(dtor(Mmprime)); /* sec 61 #10 */ + A4 = 0.214 * sin(dtor(2 * Mmprime)); /* sec 61 #11 */ + lprime = l + Ev + Ec - Ac + A4; /* sec 61 #12 */ + V = 0.6583 * sin(dtor(2 * (lprime - LambdaSol))); /* sec 61 #13 */ + ldprime = lprime + V; /* sec 61 #14 */ + D = ldprime - LambdaSol; /* sec 63 #2 */ + return(50 * (1 - cos(dtor(D)))); /* sec 63 #3 */ +} + +/* + * dtor -- + * convert degrees to radians + */ +double +dtor(deg) + double deg; +{ + return(deg * PI / 180); +} + +/* + * adj360 -- + * adjust value so 0 <= deg <= 360 + */ +double +adj360(deg) + double *deg; +{ + for (;;) + if (*deg < 0) + *deg += 360; + else if (*deg > 360) + *deg -= 360; + else + break; +}