xref: /plan9/sys/src/cmd/astro/main.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier #include "astro.h"
23e12c5d1SDavid du Colombier 
33e12c5d1SDavid du Colombier char*	herefile = "/lib/sky/here";
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier void
63e12c5d1SDavid du Colombier main(int argc, char *argv[])
73e12c5d1SDavid du Colombier {
83e12c5d1SDavid du Colombier 	int i, j;
93e12c5d1SDavid du Colombier 	double d;
103e12c5d1SDavid du Colombier 
113e12c5d1SDavid du Colombier 	pi = atan(1.0)*4;
123e12c5d1SDavid du Colombier 	pipi = 2*pi;
133e12c5d1SDavid du Colombier 	radian = pi/180;
143e12c5d1SDavid du Colombier 	radsec = radian/3600;
153e12c5d1SDavid du Colombier 
163e12c5d1SDavid du Colombier 	fmtinstall('R', Rconv);
173e12c5d1SDavid du Colombier 	fmtinstall('D', Dconv);
183e12c5d1SDavid du Colombier 
193e12c5d1SDavid du Colombier 	args(argc, argv);
203e12c5d1SDavid du Colombier 	init();
213e12c5d1SDavid du Colombier 	deld = PER/NPTS;
223e12c5d1SDavid du Colombier 
233e12c5d1SDavid du Colombier loop:
243e12c5d1SDavid du Colombier 	d = day;
253e12c5d1SDavid du Colombier 	pdate(d);
263e12c5d1SDavid du Colombier 	if(flags['p']) {
273e12c5d1SDavid du Colombier 		print(" ");
283e12c5d1SDavid du Colombier 		ptime(d);
293e12c5d1SDavid du Colombier 	}
303e12c5d1SDavid du Colombier 	print("\n");
313e12c5d1SDavid du Colombier 	for(i=0; i<=NPTS+1; i++) {
323e12c5d1SDavid du Colombier 		setime(d);
333e12c5d1SDavid du Colombier 
343e12c5d1SDavid du Colombier 		for(j=0; objlst[j]; j++) {
353e12c5d1SDavid du Colombier 			(*objlst[j]->obj)();
363e12c5d1SDavid du Colombier 			setobj(&objlst[j]->point[i]);
373e12c5d1SDavid du Colombier 			if(flags['p']) {
383e12c5d1SDavid du Colombier 				if(flags['m'])
393e12c5d1SDavid du Colombier 					if(strcmp(objlst[j]->name, "Comet"))
403e12c5d1SDavid du Colombier 						continue;
413e12c5d1SDavid du Colombier 				output(objlst[j]->name, &objlst[j]->point[i]);
423e12c5d1SDavid du Colombier 			}
433e12c5d1SDavid du Colombier 		}
443e12c5d1SDavid du Colombier 
453e12c5d1SDavid du Colombier 		if(flags['p']) {
463e12c5d1SDavid du Colombier 			if(flags['e']) {
473e12c5d1SDavid du Colombier 				d = dist(&osun.point[0], &omoon.point[0]);
483e12c5d1SDavid du Colombier 				print(" dist = %.4f\n", d);
493e12c5d1SDavid du Colombier 			}
503e12c5d1SDavid du Colombier 			break;
513e12c5d1SDavid du Colombier 		}
523e12c5d1SDavid du Colombier 		d += deld;
533e12c5d1SDavid du Colombier 	}
543e12c5d1SDavid du Colombier 	if(!(flags['p']))
553e12c5d1SDavid du Colombier 		search();
563e12c5d1SDavid du Colombier 	day += PER;
573e12c5d1SDavid du Colombier 	nperiods -= 1;
583e12c5d1SDavid du Colombier 	if(nperiods > 0)
593e12c5d1SDavid du Colombier 		goto loop;
603e12c5d1SDavid du Colombier 	exits(0);
613e12c5d1SDavid du Colombier }
623e12c5d1SDavid du Colombier 
633e12c5d1SDavid du Colombier void
643e12c5d1SDavid du Colombier args(int argc, char *argv[])
653e12c5d1SDavid du Colombier {
663e12c5d1SDavid du Colombier 	char *p;
673e12c5d1SDavid du Colombier 	long t;
683e12c5d1SDavid du Colombier 	int f;
693e12c5d1SDavid du Colombier 
703e12c5d1SDavid du Colombier 	memset(flags, 0, sizeof(flags));
713e12c5d1SDavid du Colombier 	ARGBEGIN {
723e12c5d1SDavid du Colombier 	default:
733e12c5d1SDavid du Colombier 		fprint(2, "unknown option '%c'\n", ARGC());
743e12c5d1SDavid du Colombier 		break;
753e12c5d1SDavid du Colombier 
763e12c5d1SDavid du Colombier 	case 'c':
773e12c5d1SDavid du Colombier 		nperiods = 1;
783e12c5d1SDavid du Colombier 		p = ARGF();
793e12c5d1SDavid du Colombier 		if(p)
803e12c5d1SDavid du Colombier 			nperiods = atol(p);
813e12c5d1SDavid du Colombier 		break;
823e12c5d1SDavid du Colombier 	case 'd':
833e12c5d1SDavid du Colombier 	case 'l':
843e12c5d1SDavid du Colombier 	case 'e':
853e12c5d1SDavid du Colombier 	case 'p':
863e12c5d1SDavid du Colombier 	case 's':
873e12c5d1SDavid du Colombier 	case 'a':
883e12c5d1SDavid du Colombier 	case 't':
893e12c5d1SDavid du Colombier 	case 'o':
903e12c5d1SDavid du Colombier 	case 'k':
913e12c5d1SDavid du Colombier 	case 'm':
923e12c5d1SDavid du Colombier 		flags[ARGC()]++;
933e12c5d1SDavid du Colombier 		break;
943e12c5d1SDavid du Colombier 	} ARGEND
953e12c5d1SDavid du Colombier 	if(argc);
96*219b2ee8SDavid du Colombier 	if(*argv){
97*219b2ee8SDavid du Colombier 		fprint(2, "usage: astro [-dlepsatokm] [-c nday]\n");
98*219b2ee8SDavid du Colombier 		exits("usage");
99*219b2ee8SDavid du Colombier 	}
1003e12c5d1SDavid du Colombier 
1013e12c5d1SDavid du Colombier 	t = time(0);
1023e12c5d1SDavid du Colombier 	day = t/86400. + 25567.5;
1033e12c5d1SDavid du Colombier 	if(flags['d'])
1043e12c5d1SDavid du Colombier 		day = readate();
1053e12c5d1SDavid du Colombier 	deltat = day * .001704;
1063e12c5d1SDavid du Colombier 	if(flags['t'])
1073e12c5d1SDavid du Colombier 		deltat = readdt();
1083e12c5d1SDavid du Colombier 
1093e12c5d1SDavid du Colombier 	if(flags['l']) {
1103e12c5d1SDavid du Colombier 		print("nlat wlong elev\n");
1113e12c5d1SDavid du Colombier 		readlat(0);
1123e12c5d1SDavid du Colombier 	} else {
1133e12c5d1SDavid du Colombier 		f = open(herefile, OREAD);
1143e12c5d1SDavid du Colombier 		if(f < 0) {
1153e12c5d1SDavid du Colombier 			fprint(2, "%s?\n", herefile);
1163e12c5d1SDavid du Colombier 			/* btl mh */
1173e12c5d1SDavid du Colombier 			nlat = (40 + 41.06/60)*radian;
1183e12c5d1SDavid du Colombier 			awlong = (74 + 23.98/60)*radian;
1193e12c5d1SDavid du Colombier 			elev = 150 * 3.28084;
1203e12c5d1SDavid du Colombier 		} else {
1213e12c5d1SDavid du Colombier 			readlat(f);
1223e12c5d1SDavid du Colombier 			close(f);
1233e12c5d1SDavid du Colombier 		}
1243e12c5d1SDavid du Colombier 	}
1253e12c5d1SDavid du Colombier }
1263e12c5d1SDavid du Colombier 
1273e12c5d1SDavid du Colombier double
1283e12c5d1SDavid du Colombier readate(void)
1293e12c5d1SDavid du Colombier {
1303e12c5d1SDavid du Colombier 	int i;
1313e12c5d1SDavid du Colombier 	Tim t;
1323e12c5d1SDavid du Colombier 
1333e12c5d1SDavid du Colombier 	print("year mo da hr min\n");
1343e12c5d1SDavid du Colombier 	rline(0);
1353e12c5d1SDavid du Colombier 	for(i=0; i<5; i++)
1363e12c5d1SDavid du Colombier 		t.ifa[i] = atof(skip(i));
1373e12c5d1SDavid du Colombier 	return convdate(&t);
1383e12c5d1SDavid du Colombier }
1393e12c5d1SDavid du Colombier 
1403e12c5d1SDavid du Colombier double
1413e12c5d1SDavid du Colombier readdt(void)
1423e12c5d1SDavid du Colombier {
1433e12c5d1SDavid du Colombier 
1443e12c5d1SDavid du Colombier 	print("ΔT (sec)\n");
1453e12c5d1SDavid du Colombier 	rline(0);
1463e12c5d1SDavid du Colombier 	return atof(skip(0));
1473e12c5d1SDavid du Colombier }
1483e12c5d1SDavid du Colombier 
1493e12c5d1SDavid du Colombier double
1503e12c5d1SDavid du Colombier etdate(long year, int mo, double day)
1513e12c5d1SDavid du Colombier {
1523e12c5d1SDavid du Colombier 	Tim t;
1533e12c5d1SDavid du Colombier 
1543e12c5d1SDavid du Colombier 	t.ifa[0] = year;
1553e12c5d1SDavid du Colombier 	t.ifa[1] = mo;
1563e12c5d1SDavid du Colombier 	t.ifa[2] = day;
1573e12c5d1SDavid du Colombier 	t.ifa[3] = 0;
1583e12c5d1SDavid du Colombier 	t.ifa[4] = 0;
1593e12c5d1SDavid du Colombier 	return convdate(&t) + 2415020;
1603e12c5d1SDavid du Colombier }
1613e12c5d1SDavid du Colombier 
1623e12c5d1SDavid du Colombier void
1633e12c5d1SDavid du Colombier readlat(int f)
1643e12c5d1SDavid du Colombier {
1653e12c5d1SDavid du Colombier 
1663e12c5d1SDavid du Colombier 	rline(f);
1673e12c5d1SDavid du Colombier 	nlat = atof(skip(0)) * radian;
1683e12c5d1SDavid du Colombier 	awlong = atof(skip(1)) * radian;
1693e12c5d1SDavid du Colombier 	elev = atof(skip(2)) * 3.28084;
1703e12c5d1SDavid du Colombier }
1713e12c5d1SDavid du Colombier 
1723e12c5d1SDavid du Colombier double
1733e12c5d1SDavid du Colombier fmod(double a, double b)
1743e12c5d1SDavid du Colombier {
1753e12c5d1SDavid du Colombier 	return a - floor(a/b)*b;
1763e12c5d1SDavid du Colombier }
177