]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/astro/main.c
astro: fix typo
[plan9front.git] / sys / src / cmd / astro / main.c
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 = pi*2;
13         radian = pi/180;
14         radsec = radian/3600;
15         converge = 1.0e-14;
16
17         fmtinstall('R', Rconv);
18         fmtinstall('D', Dconv);
19
20         per = PER;
21         deld = PER/NPTS;
22         init();
23         args(argc, argv);
24         init();
25
26 loop:
27         d = day;
28         pdate(d);
29         if(flags['p'] || flags['e']) {
30                 print(" ");
31                 ptime(d);
32                 pstime(d);
33         }
34         print("\n");
35         for(i=0; i<=NPTS+1; i++) {
36                 setime(d);
37
38                 for(j=0; objlst[j]; j++) {
39                         (*objlst[j]->obj)();
40                         setobj(&objlst[j]->point[i]);
41                         if(flags['p']) {
42                                 if(flags['m'])
43                                         if(strcmp(objlst[j]->name, "Comet"))
44                                                 continue;
45                                 output(objlst[j]->name, &objlst[j]->point[i]);
46                         }
47                 }
48                 if(flags['e']) {
49                         d = dist(&eobj1->point[i], &eobj2->point[i]);
50                         print("dist %s to %s = %.4f\n", eobj1->name, eobj2->name, d);
51                 }
52 //              if(flags['p']) {
53 //                      pdate(d);
54 //                      print(" ");
55 //                      ptime(d);
56 //                      print("\n");
57 //              }
58                 if(flags['p'] || flags['e'])
59                         break;
60                 d += deld;
61         }
62         if(!(flags['p'] || flags['e']))
63                 search();
64         day += per;
65         nperiods -= 1;
66         if(nperiods > 0)
67                 goto loop;
68         exits(0);
69 }
70
71 void
72 args(int argc, char *argv[])
73 {
74         char *p;
75         long t;
76         int f, i;
77         Obj2 *q;
78
79         memset(flags, 0, sizeof(flags));
80         ARGBEGIN {
81         default:
82                 fprint(2, "astro [-adeklmopst] [-c nperiod] [-C tperiod]\n");
83                 exits(0);
84
85         case 'c':
86                 nperiods = 1;
87                 p = ARGF();
88                 if(p)
89                         nperiods = atol(p);
90                 flags['c']++;
91                 break;
92         case 'C':
93                 p = ARGF();
94                 if(p)
95                         per = atof(p);
96                 break;
97         case 'e':
98                 eobj1 = nil;
99                 eobj2 = nil;
100                 p = ARGF();
101                 if(p) {
102                         for(i=0; q=objlst[i]; i++) {
103                                 if(strcmp(q->name, p) == 0)
104                                         eobj1 = q;
105                                 if(strcmp(q->name1, p) == 0)
106                                         eobj1 = q;
107                         }
108                         p = ARGF();
109                         if(p) {
110                                 for(i=0; q=objlst[i]; i++) {
111                                         if(strcmp(q->name, p) == 0)
112                                                 eobj2 = q;
113                                         if(strcmp(q->name1, p) == 0)
114                                                 eobj2 = q;
115                                 }
116                         }
117                 }
118                 if(eobj1 && eobj2) {
119                         flags['e']++;
120                         break;
121                 }
122                 fprint(2, "cant recognize eclipse objects\n");
123                 exits("eflag");
124
125         case 'a':
126         case 'd':
127         case 'j':
128         case 'k':
129         case 'l':
130         case 'm':
131         case 'o':
132         case 'p':
133         case 's':
134         case 't':
135                 flags[ARGC()]++;
136                 break;
137         } ARGEND
138         if(*argv){
139                 fprint(2, "usage: astro [-dlpsatokm] [-c nday] [-e obj1 obj2]\n");
140                 exits("usage");
141         }
142
143         t = time(0);
144         day = t/86400. + 25567.5;
145         if(flags['d'])
146                 day = readate();
147         if(flags['j'])
148                 print("jday = %.4f\n", day);
149         deltat = day * .001704;
150         if(deltat > 32.184)             // assume date is utc1
151                 deltat = 32.184;        // correct by leap sec
152         if(flags['t'])
153                 deltat = readdt();
154
155         if(flags['l']) {
156                 fprint(2, "nlat wlong elev\n");
157                 readlat(0);
158         } else {
159                 f = open(herefile, OREAD);
160                 if(f < 0) {
161                         fprint(2, "%s?\n", herefile);
162                         /* btl mh */
163                         nlat = (40 + 41.06/60)*radian;
164                         awlong = (74 + 23.98/60)*radian;
165                         elev = 150 * 3.28084;
166                 } else {
167                         readlat(f);
168                         close(f);
169                 }
170         }
171 }
172
173 double
174 readate(void)
175 {
176         int i;
177         Tim t;
178
179         fprint(2, "year mo da hr min\n");
180         rline(0);
181         for(i=0; i<5; i++)
182                 t.ifa[i] = atof(skip(i));
183         return convdate(&t);
184 }
185
186 double
187 readdt(void)
188 {
189
190         fprint(2, "ΔT (sec) (%.3f)\n", deltat);
191         rline(0);
192         return atof(skip(0));
193 }
194
195 double
196 etdate(long year, int mo, double day)
197 {
198         Tim t;
199
200         t.ifa[0] = year;
201         t.ifa[1] = mo;
202         t.ifa[2] = day;
203         t.ifa[3] = 0;
204         t.ifa[4] = 0;
205         return convdate(&t) + 2415020;
206 }
207
208 void
209 readlat(int f)
210 {
211
212         rline(f);
213         nlat = atof(skip(0)) * radian;
214         awlong = atof(skip(1)) * radian;
215         elev = atof(skip(2)) * 3.28084;
216 }
217
218 double
219 fmod(double a, double b)
220 {
221         return a - floor(a/b)*b;
222 }