#include #include #include #include #include #include #include "ephlib.h" extern const char *__progname; static double et; static int ntarg; static int nctr; static int ncoord; static int * const tvec[3] = { &ntarg, &nctr, &ncoord }; static double xi; static char *line = 0; static int linelen = 0; static int linealloc = 0; static int lineno = 0; static void plaint(const char *, ...) __attribute__((__format__(__printf__,1,2))); static void plaint(const char *fmt, ...) { va_list ap; va_start(ap,fmt); fprintf(stderr,"%s: %d: ",__progname,lineno); vfprintf(stderr,fmt,ap); fprintf(stderr,"\n"); va_end(ap); } static char *getline(int mustget) { int c; lineno ++; linelen = 0; while (1) { c = getchar(); if (c == EOF) { if (mustget) { plaint("unexpected EOF"); exit(1); } if (linelen > 0) plaint("partial last line ignored"); return(0); } if (linealloc >= linelen) line = realloc(line,linealloc=linelen+16); if (c == '\n') { line[linelen] = '\0'; return(line); } line[linelen++] = c; } } int main(int, char **); int main(int ac, char **av) { int c; int i; double r[6]; double err; void *h; if (ac != 2) { fprintf(stderr,"Usage: %s ephemeris-file (with test data on stdin)\n",__progname); exit(1); } do getline(1); while (strcmp(line,"EOT")); h = eph_open(av[1]); if (h == 0) { fprintf(stderr,"%s: can't open %s: %s\n",__progname,av[1],strerror(errno)); exit(1); } printf(" JPL TEST-EPHEMERIS program. Last modified July 1997.\n"); printf(" line -- jed -- t# c# x# --- jpl value" " --- --- user value -- -- difference --\n\n"); while (getline(0)) { if (strlen(line) < 15+10+(3*3)+1) { plaint("input line too short: %s",line); continue; } c = line[15+10]; line[15+10] = '\0'; et = atof(line+15); line[15+10] = c; for (i=0;i<3;i++) { c = line[15+10+(3*i)+3]; line[15+10+(3*i)+3] = '\0'; *tvec[i] = atoi(line+15+10+(3*i)); line[15+10+(3*i)+3] = c; } xi = atof(line+15+10+(3*3)); switch (eph_lookup(h,et,ntarg,nctr,&r[0])) { case 0: err = fabs(r[ncoord-1]-xi); if ((ntarg == 15) && (ncoord == 3)) err /= (.23 * (et - 2451545)); if (((lineno % 100) == 0) || (err > 1e-13)) { printf("%6d%10.1f%5d%5d%5d%20.13f%20.13f%20.13f%s\n", lineno,et,ntarg,nctr,ncoord,xi,r[ncoord-1],err, (err>1e-13)?" **** ERROR":""); } break; case EPHL_ERR_RANGE: break; default: abort(); break; } } exit(0); }