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