xref: /plan9/sys/src/cmd/astro/main.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 #include "astro.h"
2 
3 char*	herefile = "/lib/sky/here";
4 
5 void
6 main(int argc, char *argv[])
7 {
8 	int i, j;
9 	double d;
10 
11 	pi = atan(1.0)*4;
12 	pipi = 2*pi;
13 	radian = pi/180;
14 	radsec = radian/3600;
15 
16 	fmtinstall('R', Rconv);
17 	fmtinstall('D', Dconv);
18 
19 	args(argc, argv);
20 	init();
21 	deld = PER/NPTS;
22 
23 loop:
24 	d = day;
25 	pdate(d);
26 	if(flags['p']) {
27 		print(" ");
28 		ptime(d);
29 	}
30 	print("\n");
31 	for(i=0; i<=NPTS+1; i++) {
32 		setime(d);
33 
34 		for(j=0; objlst[j]; j++) {
35 			(*objlst[j]->obj)();
36 			setobj(&objlst[j]->point[i]);
37 			if(flags['p']) {
38 				if(flags['m'])
39 					if(strcmp(objlst[j]->name, "Comet"))
40 						continue;
41 				output(objlst[j]->name, &objlst[j]->point[i]);
42 			}
43 		}
44 
45 		if(flags['p']) {
46 			if(flags['e']) {
47 				d = dist(&osun.point[0], &omoon.point[0]);
48 				print(" dist = %.4f\n", d);
49 			}
50 			break;
51 		}
52 		d += deld;
53 	}
54 	if(!(flags['p']))
55 		search();
56 	day += PER;
57 	nperiods -= 1;
58 	if(nperiods > 0)
59 		goto loop;
60 	exits(0);
61 }
62 
63 void
64 args(int argc, char *argv[])
65 {
66 	char *p;
67 	long t;
68 	int f;
69 
70 	memset(flags, 0, sizeof(flags));
71 	ARGBEGIN {
72 	default:
73 		fprint(2, "unknown option '%c'\n", ARGC());
74 		break;
75 
76 	case 'c':
77 		nperiods = 1;
78 		p = ARGF();
79 		if(p)
80 			nperiods = atol(p);
81 		break;
82 	case 'd':
83 	case 'l':
84 	case 'e':
85 	case 'p':
86 	case 's':
87 	case 'a':
88 	case 't':
89 	case 'o':
90 	case 'k':
91 	case 'm':
92 		flags[ARGC()]++;
93 		break;
94 	} ARGEND
95 	if(argc);
96 	if(*argv){
97 		fprint(2, "usage: astro [-dlepsatokm] [-c nday]\n");
98 		exits("usage");
99 	}
100 
101 	t = time(0);
102 	day = t/86400. + 25567.5;
103 	if(flags['d'])
104 		day = readate();
105 	deltat = day * .001704;
106 	if(flags['t'])
107 		deltat = readdt();
108 
109 	if(flags['l']) {
110 		print("nlat wlong elev\n");
111 		readlat(0);
112 	} else {
113 		f = open(herefile, OREAD);
114 		if(f < 0) {
115 			fprint(2, "%s?\n", herefile);
116 			/* btl mh */
117 			nlat = (40 + 41.06/60)*radian;
118 			awlong = (74 + 23.98/60)*radian;
119 			elev = 150 * 3.28084;
120 		} else {
121 			readlat(f);
122 			close(f);
123 		}
124 	}
125 }
126 
127 double
128 readate(void)
129 {
130 	int i;
131 	Tim t;
132 
133 	print("year mo da hr min\n");
134 	rline(0);
135 	for(i=0; i<5; i++)
136 		t.ifa[i] = atof(skip(i));
137 	return convdate(&t);
138 }
139 
140 double
141 readdt(void)
142 {
143 
144 	print("ΔT (sec)\n");
145 	rline(0);
146 	return atof(skip(0));
147 }
148 
149 double
150 etdate(long year, int mo, double day)
151 {
152 	Tim t;
153 
154 	t.ifa[0] = year;
155 	t.ifa[1] = mo;
156 	t.ifa[2] = day;
157 	t.ifa[3] = 0;
158 	t.ifa[4] = 0;
159 	return convdate(&t) + 2415020;
160 }
161 
162 void
163 readlat(int f)
164 {
165 
166 	rline(f);
167 	nlat = atof(skip(0)) * radian;
168 	awlong = atof(skip(1)) * radian;
169 	elev = atof(skip(2)) * 3.28084;
170 }
171 
172 double
173 fmod(double a, double b)
174 {
175 	return a - floor(a/b)*b;
176 }
177