diff options
author | wkj <devnull@localhost> | 2004-04-21 02:16:43 +0000 |
---|---|---|
committer | wkj <devnull@localhost> | 2004-04-21 02:16:43 +0000 |
commit | cd5bae7871bc0f0bc68b4d2a84703929a7a3c9d1 (patch) | |
tree | 336db54785d2b77113a6e570574be715c7eb7d1d /src/cmd/astro/main.c | |
parent | 95f57b01e21feb457e79eaf52d593422c318024f (diff) | |
download | plan9port-cd5bae7871bc0f0bc68b4d2a84703929a7a3c9d1.tar.gz plan9port-cd5bae7871bc0f0bc68b4d2a84703929a7a3c9d1.tar.bz2 plan9port-cd5bae7871bc0f0bc68b4d2a84703929a7a3c9d1.zip |
Astro with some minor changes to placate Unix.
Diffstat (limited to 'src/cmd/astro/main.c')
-rw-r--r-- | src/cmd/astro/main.c | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/src/cmd/astro/main.c b/src/cmd/astro/main.c new file mode 100644 index 00000000..687695c8 --- /dev/null +++ b/src/cmd/astro/main.c @@ -0,0 +1,223 @@ +#include "astro.h" + +char* herefile = SYS9 "/lib/sky/here"; + +int +main(int argc, char *argv[]) +{ + int i, j; + double d; + + pi = atan(1.0)*4; + pipi = pi*2; + radian = pi/180; + radsec = radian/3600; + converge = 1.0e-14; + + fmtinstall('R', Rconv); + fmtinstall('D', Dconv); + + per = PER; + deld = PER/NPTS; + init(); + args(argc, argv); + init(); + +loop: + d = day; + pdate(d); + if(flags['p'] || flags['e']) { + print(" "); + ptime(d); + pstime(d); + } + print("\n"); + for(i=0; i<=NPTS+1; i++) { + setime(d); + + for(j=0; objlst[j]; j++) { + (*objlst[j]->obj)(); + setobj(&objlst[j]->point[i]); + if(flags['p']) { + if(flags['m']) + if(strcmp(objlst[j]->name, "Comet")) + continue; + output(objlst[j]->name, &objlst[j]->point[i]); + } + } + if(flags['e']) { + d = dist(&eobj1->point[i], &eobj2->point[i]); + print("dist %s to %s = %.4f\n", eobj1->name, eobj2->name, d); + } +// if(flags['p']) { +// pdate(d); +// print(" "); +// ptime(d); +// print("\n"); +// } + if(flags['p'] || flags['e']) + break; + d += deld; + } + if(!(flags['p'] || flags['e'])) + search(); + day += per; + nperiods -= 1; + if(nperiods > 0) + goto loop; + exits(0); + return 0; /* gcc */ +} + +void +args(int argc, char *argv[]) +{ + char *p; + long t; + int f, i; + Obj2 *q; + + memset(flags, 0, sizeof(flags)); + ARGBEGIN { + default: + fprint(2, "astro [-adeklmopst] [-c nperiod] [-C tperiod]\n"); + exits(0); + + case 'c': + nperiods = 1; + p = ARGF(); + if(p) + nperiods = atol(p); + flags['c']++; + break; + case 'C': + p = ARGF(); + if(p) + per = atof(p); + break; + case 'e': + eobj1 = nil; + eobj2 = nil; + p = ARGF(); + if(p) { + for(i=0; q=objlst[i]; i++) { + if(strcmp(q->name, p) == 0) + eobj1 = q; + if(strcmp(q->name1, p) == 0) + eobj1 = q; + } + p = ARGF(); + if(p) { + for(i=0; q=objlst[i]; i++) { + if(strcmp(q->name, p) == 0) + eobj2 = q; + if(strcmp(q->name1, p) == 0) + eobj2 = q; + } + } + } + if(eobj1 && eobj2) { + flags['e']++; + break; + } + fprint(2, "cant recognize eclipse objects\n"); + exits("eflag"); + + case 'a': + case 'd': + case 'j': + case 'k': + case 'l': + case 'm': + case 'o': + case 'p': + case 's': + case 't': + flags[ARGC()]++; + break; + } ARGEND + if(*argv){ + fprint(2, "usage: astro [-dlpsatokm] [-c nday] [-e obj1 obj2]\n"); + exits("usage"); + } + + t = time(0); + day = t/86400. + 25567.5; + if(flags['d']) + day = readate(); + if(flags['j']) + print("jday = %.4f\n", day); + deltat = day * .001704; + if(deltat > 32.184) // assume date is utc1 + deltat = 32.184; // correct by leap sec + if(flags['t']) + deltat = readdt(); + + if(flags['l']) { + fprint(2, "nlat wlong elev\n"); + readlat(0); + } else { + f = open(herefile, OREAD); + if(f < 0) { + fprint(2, "%s?\n", herefile); + /* btl mh */ + nlat = (40 + 41.06/60)*radian; + awlong = (74 + 23.98/60)*radian; + elev = 150 * 3.28084; + } else { + readlat(f); + close(f); + } + } +} + +double +readate(void) +{ + int i; + Tim t; + + fprint(2, "year mo da hr min\n"); + rline(0); + for(i=0; i<5; i++) + t.ifa[i] = atof(skip(i)); + return convdate(&t); +} + +double +readdt(void) +{ + + fprint(2, "ΔT (sec) (%.3f)\n", deltat); + rline(0); + return atof(skip(0)); +} + +double +etdate(long year, int mo, double day) +{ + Tim t; + + t.ifa[0] = year; + t.ifa[1] = mo; + t.ifa[2] = day; + t.ifa[3] = 0; + t.ifa[4] = 0; + return convdate(&t) + 2415020; +} + +void +readlat(int f) +{ + + rline(f); + nlat = atof(skip(0)) * radian; + awlong = atof(skip(1)) * radian; + elev = atof(skip(2)) * 3.28084; +} + +double +fmod(double a, double b) +{ + return a - floor(a/b)*b; +} |