phase of the moon
rs at mirror.UUCP
rs at mirror.UUCP
Sat May 18 04:48:00 AEST 1985
The recent posting by Robert Bond with the sunrise/sunset
programs led me to dig out this old chestnut that had been
floating around MIT for a while. It /seems/ correct to
me, but I ain't no "loup-garou" :-)
--------
Rich $alz { mit-eddie, ihnp4!inmet, wjh12, cca, datacube } ! mirror!rs
Mirror Systems
2067 Massachusetts Ave. "I've seen this happen
Cambridge, MA, 02140 in other people's lives
617-661-0777 and now it's happening in mine."
# -----------------CUT HERE---------------------
#!/bin/sh
# This is a shell archive. Remove anything before this line,
# then unpack it by saving it in a file and typing "sh file".
#
# Wrapped by mirror!rs on Fri May 17 14:38:21 EDT 1985
# Contents: pom.c
echo x - pom.c
sed 's/^XX//' > "pom.c" <<'@//E*O*F pom.c//'
XX/*$The phase of the moon, for your safety and convenience.
XX**
XX** Stolen from ArchMach & converted from PL/I by Brian Hess.
XX** Extensively cleaned up by Rich $alz.
XX**
XX** If you can figure out how this program works, then YOU deserve
XX** to be working on it, sucker! Here's a hint: The epoch is 13:23,
XX** 10/1/78.
XX*/
XX#include <math.h>
XX#include <sys/types.h>
XX#include <time.h>
XX/* Globals. */
XXlong Day;
XXlong Hour;
XXlong Minute;
XXdouble Fraction;
XXchar *Moon[] =
XX{
XX "new",
XX "first quarter of the",
XX "full moon",
XX "last quarter of the"
XX};
XX/* Linked in later. */
XXchar *rindex();
XXtime_t time();
XXstruct tm *localtime();
XX#define LINES 24
XX#define WIDTH 80
XX#define CENTER ((WIDTH - 2 * LINES) / 2)
XX#define BRIGHT '@'
XX#define LEDGE '('
XX#define REDGE ')'
XX#define FULL 0.5
XX#define TwoPi (2 * 3.14159)
XX#define ZERO 0.03
XX#define Plural(X) if (X != 1) printf("s");
XX/*!*/
XXlong
XXCalculate()
XX{
XX register struct tm *tm;
XX register long Length;
XX register long Phase;
XX register long DeltaH;
XX register long Delta;
XX register long offset;
XX time_t tick;
XX long julian;
XX long year;
XX long hour;
XX long minute;
XX tick = time((time_t *)0);
XX tm = localtime(&tick);
XX julian = tm->tm_yday + 1;
XX year = tm->tm_year - 78;
XX hour = tm->tm_hour;
XX minute = tm->tm_min;
XX Length = (double)2551 / 60 * 1000 + (double)443 / 60;
XX offset = ((year * 365L + julian) * 24L + hour) * 60L + minute;
XX Delta = offset - (273L * 24L + 13L) * 60L + 23L;
XX Phase = Delta - (Delta / Length) * Length;
XX Fraction = Phase / Length;
XX Length = Length / 4;
XX Phase = Phase / Length;
XX Delta = Delta - (Delta / Length) * Length;
XX DeltaH = Delta / 60;
XX Minute = Delta - DeltaH * 60;
XX Day = DeltaH / 24;
XX Hour = DeltaH - Day * 24;
XX return(Phase);
XX}
XX/*!*/
XXint
XXCharPos(x)
XX double x;
XX{
XX register int i;
XX i = x * LINES + 0.5;
XX if ((i += LINES + CENTER) < 1)
XX i = 1;
XX return(i);
XX}
XXvoid
XXDraw()
XX{
XX register char *p;
XX register int i;
XX register int end;
XX register double y;
XX register double cht;
XX register double squisher;
XX register double horizon;
XX register double terminator;
XX char Buffer[256];
XX /* Clear screen? */
XX if (Fraction < FULL)
XX squisher = cos(TwoPi * Fraction);
XX else
XX squisher = cos(TwoPi * (Fraction - FULL));
XX cht = (double)2.0 / (LINES - 6.0);
XX for (y = 0.93; y > -1.0; y -= cht)
XX {
XX for (i = sizeof Buffer, p = Buffer; --i >= 0; )
XX *p++ = ' ';
XX horizon = sqrt(1.0 - y * y);
XX Buffer[ CharPos(-horizon)] = LEDGE;
XX Buffer[i = CharPos( horizon)] = REDGE;
XX Buffer[++i] = '\0';
XX terminator = horizon * squisher;
XX if (Fraction > ZERO && Fraction < (1.0 - ZERO))
XX {
XX if (Fraction < FULL)
XX {
XX i = CharPos( terminator);
XX end = CharPos( horizon);
XX }
XX else
XX {
XX i = CharPos(-horizon);
XX end = CharPos( terminator);
XX }
XX while (i <= end)
XX Buffer[i++] = BRIGHT;
XX }
XX printf(" %s\n", Buffer);
XX }
XX}
XX/*!*/
XXmain(ac)
XX int ac;
XX{
XX register long Phase;
XX Phase = Calculate();
XX if (ac == 1)
XX Draw();
XX printf("\nIt is ");
XX if (Day == 0 && Hour == 0 && Minute == 0)
XX printf("exactly");
XX else
XX {
XX if (Day)
XX {
XX printf("%ld day", Day);
XX Plural(Day);
XX if (Hour | Day)
XX printf(", ");
XX }
XX if (Hour)
XX {
XX printf("%ld hour", Hour);
XX Plural(Hour);
XX if (Minute)
XX printf(", ");
XX }
XX if (Minute)
XX {
XX printf("%ld minute", Minute);
XX Plural(Minute);
XX }
XX printf(" since");
XX }
XX printf(" the %s moon.\n", Moon[Phase]);
XX exit(0);
XX}
@//E*O*F pom.c//
chmod u=rw,g=rw,o=r pom.c
echo Inspecting for damage in transit...
temp=/tmp/shar$$; dtemp=/tmp/.shar$$
trap "rm -f $temp $dtemp; exit" 0 1 2 3 15
cat > $temp <<\!!!
188 565 3569 pom.c
!!!
wc pom.c | sed 's=[^ ]*/==' | diff -b $temp - >$dtemp
if [ -s $dtemp ]
then echo "Ouch [diff of wc output]:" ; cat $dtemp
else echo "No problems found."
fi
exit 0
More information about the Comp.sources.unix
mailing list