home *** CD-ROM | disk | FTP | other *** search
/ Garbo / Garbo.cdr / pc / source / star.lzh / star.25 < prev    next >
Encoding:
Text File  |  1990-04-06  |  36.2 KB  |  1,425 lines

  1.  
  2. #! /bin/sh
  3. # This is a shell archive.  Remove anything before this line, then unpack
  4. # it by saving it into a file and typing "sh file".  To overwrite existing
  5. # files, type "sh file -c".  You can also feed this as standard input via
  6. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  7. # will see the following message at the end:
  8. #        "End of archive 25 (of 32)."
  9. # Contents:  dataconv/dataconv.c
  10. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  11. if test -f 'dataconv/dataconv.c' -a "${1}" != "-c" ; then 
  12.   echo shar: Will not clobber existing file \"'dataconv/dataconv.c'\"
  13. else
  14. echo shar: Extracting \"'dataconv/dataconv.c'\" \(34330 characters\)
  15. sed "s/^X//" >'dataconv/dataconv.c' <<'END_OF_FILE'
  16. X/*
  17. X * dataconv.c/precess -- convert between starchart data formats,
  18. X *                precess to other equator and equinox.
  19. X *              precession based formulae from
  20. X *                Astronomical Almanac, 1988, p B19
  21. X *
  22. X * Copyright (c) 1990 by Craig Counterman. All rights reserved.
  23. X *
  24. X * This software may be redistributed freely, not sold.
  25. X * This copyright notice and disclaimer of warranty must remain
  26. X *    unchanged. 
  27. X *
  28. X * No representation is made about the suitability of this
  29. X * software for any purpose.  It is provided "as is" without express or
  30. X * implied warranty, to the extent permitted by applicable law.
  31. X *
  32. X * DISCLAIMER OF WARRANTY
  33. X * ----------------------
  34. X * The author  disclaims all warranties  with regard to  this software to
  35. X * the   extent  permitted  by applicable   law,  including all   implied
  36. X * warranties  of merchantability  and  fitness. In  no event shall   the
  37. X * author be liable for any special, indirect or consequential damages or
  38. X * any  damages whatsoever resulting from  loss of use, data or  profits,
  39. X * whether in an action of contract, negligence or other tortious action,
  40. X * arising  out of  or in connection with the  use or performance of this
  41. X * software.
  42. X *
  43. X */
  44. X
  45. X
  46. Xstatic char rcsid[]="$Header: dataconv.c,v 2.12 90/02/25 16:13:50 ccount Exp $";
  47. X
  48. X
  49. X
  50. X#include <stdio.h>
  51. X#include <math.h>
  52. X#include <ctype.h>
  53. X
  54. X/* Defines for equinox */
  55. X#define EQLOW 1850.0
  56. X#define EQHI  2100.0
  57. X#define DEFEIN 1950.0
  58. X#define DEFEOUT 2000.0
  59. X
  60. X
  61. X/* other defines */
  62. X#define LINELEN 82
  63. X#define MAX(a,b) ((a)>(b)?(a):(b))
  64. X#define MIN(a,b) ((a)<(b)?(a):(b))
  65. X#define FALSE 0
  66. X#define TRUE 1
  67. X#define DEG_TO_RAD 0.01745329251994329600
  68. X#define RAD_TO_DEG 57.29577951308232
  69. X#define DSIN(x) (sin((x)*DEG_TO_RAD))
  70. X#define DCOS(x) (cos((x)*DEG_TO_RAD))
  71. X#define DTAN(x) (tan((x)*DEG_TO_RAD))
  72. X#define DASIN(x) (asin(x)*RAD_TO_DEG)
  73. X#define DACOS(x) (acos(x)*RAD_TO_DEG)
  74. X#define DATAN(x) (atan(x)*RAD_TO_DEG)
  75. X#define DATAN2(x,y) (atan2(x,y)*RAD_TO_DEG)
  76. X
  77. X/* File types */
  78. X#define LINEREAD 1
  79. X#define INDEXTYPE 2
  80. X#define BINFULL 3
  81. X#define BINOBJ 4
  82. X#define BINSTAR 5
  83. X#define SAOTYPE 6
  84. X#define SIFTYPE 7
  85. X#define GSCTYPE 8
  86. X
  87. X#define SEPCHAR ';'
  88. X
  89. X/* variables for data, filled by readstar and readsif */
  90. Xdouble obj_lat, obj_lon, obj_mag;
  91. Xchar obj_type[] ="SS", obj_color[3], obj_label[3];
  92. Xchar obj_constell[4], obj_name[LINELEN];
  93. Xchar *obj_commnt, fileline[LINELEN];
  94. X
  95. Xchar *usage =
  96. X"%s:\nargs: -i inname intype -o outname outtype\n\t[-sc] [-f from_equinox -t to_equinox]\n";
  97. X
  98. X
  99. Xint tr_type();
  100. Xint readstar();
  101. Xint readsif();
  102. Xvoid writelr();
  103. Xvoid wrbinfull();
  104. Xvoid wrbinstar();
  105. Xvoid wrbinobj();
  106. Xvoid writesif();
  107. Xint to_consindx();
  108. Xvoid initxform(), xform();
  109. X
  110. Xdouble into_range();
  111. Xvoid precess_f();
  112. X
  113. Xmain(argc, argv)
  114. X     int argc;
  115. X     char *argv[];
  116. X{
  117. X  char *inname = "", *outname = "";
  118. X  char *intypestr = "", *outtypestr = "";
  119. X  FILE *infile, *outfile;
  120. X  int intype, outtype;
  121. X  char sepchar = SEPCHAR;
  122. X  int i;
  123. X  double ein=0.0, eout=0.0, ra_out, de_out;
  124. X  int precess = FALSE;
  125. X
  126. X  if ((argc <  7)) {
  127. X    fprintf(stderr, usage, argv[0]);
  128. X    exit(1);
  129. X  }
  130. X
  131. X  i = 0;
  132. X  while (i < argc)
  133. X    if (argv[i][0] != '-') i++;
  134. X  else switch (argv[i][1]) {
  135. X  case 'f':
  136. X    ein=atof(argv[i+1]);
  137. X    precess = TRUE;
  138. X    i += 2;
  139. X    break;
  140. X  case 't':
  141. X    eout=atof(argv[i+1]);
  142. X    precess = TRUE;
  143. X    i += 2;
  144. X    break;
  145. X  case 'i':
  146. X    inname = argv[i+1];
  147. X    intypestr = argv[i+2];
  148. X    if (!(intype = tr_type(argv[i+2]))) {
  149. X      fprintf(stderr, usage, argv[0]);
  150. X      fprintf(stderr, "Invalid intype %s\n", argv[i+2]);
  151. X      exit(2);
  152. X    }
  153. X    i += 3;
  154. X    break;
  155. X  case 'o':
  156. X    outname = argv[i+1];
  157. X    outtypestr = argv[i+2];
  158. X    if (!(outtype = tr_type(argv[i+2]))) {
  159. X      fprintf(stderr, usage, argv[0]);
  160. X      fprintf(stderr, "Invalid outtype %s\n", argv[i+2]);
  161. X      exit(3);
  162. X    }
  163. X    if (outtype == GSCTYPE) {
  164. X      fprintf(stderr, "%s: cannot write gsc format files.\n", argv[0]);
  165. X      exit(3);
  166. X    }
  167. X    i += 3;
  168. X    break;
  169. X  case 's':
  170. X    if (argv[i][2]) sepchar = argv[i][2];
  171. X    i++;
  172. X    break;
  173. X  default:
  174. X    fprintf(stderr, usage, argv[0]);
  175. X    exit(4);
  176. X  }
  177. X
  178. X  if (precess && 
  179. X      ((ein < EQLOW) || (ein > EQHI) || (eout  < EQLOW) || (eout > EQHI))) {
  180. X    fprintf(stderr, usage, argv[0]);
  181. X    if ((ein > 0.0) || (eout > 0.0))
  182. X      fprintf(stderr, "equinox not in range [%.1f..%.1f]\n", EQLOW, EQHI);
  183. X    exit(5);
  184. X  }
  185. X
  186. X
  187. X#ifdef ATARI_ST
  188. X  if ((infile = fopen(inname, (intype == LINEREAD)?"r":"rb")) == NULL) {
  189. X    fprintf(stderr, "%s: Can't open input file %s\n", argv[0], inname);
  190. X    exit(6);
  191. X  }
  192. X
  193. X  if ((outfile = fopen(outname, "wb")) == NULL) {
  194. X    fprintf(stderr, "%s: Can't open output file %s\n", argv[0], outname);
  195. X    exit(7);
  196. X  }
  197. X#else
  198. X  if ((infile = fopen(inname, "r")) == NULL) {
  199. X    fprintf(stderr, "%s: Can't open input file %s\n", argv[0], inname);
  200. X    exit(6);
  201. X  }
  202. X
  203. X  if ((outfile = fopen(outname, "w")) == NULL) {
  204. X    fprintf(stderr, "%s: Can't open output file %s\n", argv[0], outname);
  205. X    exit(7);
  206. X  }
  207. X#endif
  208. X
  209. X
  210. X  fprintf(stderr,
  211. X      "%s:\n converting %s format file %s\n to %s format file %s\n",
  212. X      argv[0], intypestr, inname, outtypestr, outname);
  213. X  if ((intype == SIFTYPE) || (outtype == SIFTYPE))
  214. X    fprintf(stderr, "Separation character %c\n", sepchar);
  215. X
  216. X  if (precess)
  217. X    fprintf(stderr, "Precessing from equinox %.3f to %.3f\n",
  218. X        ein, eout);
  219. X
  220. X
  221. X  /* SIF must be read with readsif
  222. X     All others should be read with readstar
  223. X     */
  224. X  if (precess) {
  225. X    if (intype == SIFTYPE)
  226. X      switch (outtype) {
  227. X      case LINEREAD:
  228. X    for (;;) {
  229. X      if (readsif(infile, sepchar)) break;
  230. X      precess_f(ein, eout, obj_lon, obj_lat, &ra_out, &de_out);
  231. X      obj_lon = ra_out;
  232. X      obj_lat = de_out;
  233. X      writelr(outfile);
  234. X    }
  235. X    break;
  236. X      case BINFULL:
  237. X    for (;;) {
  238. X      if (readsif(infile, sepchar)) break;
  239. X      precess_f(ein, eout, obj_lon, obj_lat, &ra_out, &de_out);
  240. X      obj_lon = ra_out;
  241. X      obj_lat = de_out;
  242. X      wrbinfull(outfile);
  243. X    }
  244. X    break;
  245. X      case BINOBJ:
  246. X    for (;;) {
  247. X      if (readsif(infile, sepchar)) break;
  248. X      precess_f(ein, eout, obj_lon, obj_lat, &ra_out, &de_out);
  249. X      obj_lon = ra_out;
  250. X      obj_lat = de_out;
  251. X      wrbinobj(outfile);
  252. X    }
  253. X    break;
  254. X      case BINSTAR:
  255. X    for (;;) {
  256. X      if (readsif(infile, sepchar)) break;
  257. X      precess_f(ein, eout, obj_lon, obj_lat, &ra_out, &de_out);
  258. X      obj_lon = ra_out;
  259. X      obj_lat = de_out;
  260. X      wrbinstar(outfile);
  261. X    }
  262. X    break;
  263. X      }
  264. X    else /* Not SIF in */ 
  265. X      switch (outtype) {
  266. X      case LINEREAD:
  267. X    for (;;) {
  268. X      if (readstar(infile, intype)) break;
  269. X      precess_f(ein, eout, obj_lon, obj_lat, &ra_out, &de_out);
  270. X      obj_lon = ra_out;
  271. X      obj_lat = de_out;
  272. X      writelr(outfile);
  273. X    }
  274. X    break;
  275. X      case BINFULL:
  276. X    for (;;) {
  277. X      if (readstar(infile, intype)) break;
  278. X      precess_f(ein, eout, obj_lon, obj_lat, &ra_out, &de_out);
  279. X      obj_lon = ra_out;
  280. X      obj_lat = de_out;
  281. X      wrbinfull(outfile);
  282. X    }
  283. X    break;
  284. X      case BINOBJ:
  285. X    for (;;) {
  286. X      if (readstar(infile, intype)) break;
  287. X      precess_f(ein, eout, obj_lon, obj_lat, &ra_out, &de_out);
  288. X      obj_lon = ra_out;
  289. X      obj_lat = de_out;
  290. X      wrbinobj(outfile);
  291. X    }
  292. X    break;
  293. X      case BINSTAR:
  294. X    for (;;) {
  295. X      if (readstar(infile, intype)) break;
  296. X      precess_f(ein, eout, obj_lon, obj_lat, &ra_out, &de_out);
  297. X      obj_lon = ra_out;
  298. X      obj_lat = de_out;
  299. X      wrbinstar(outfile);
  300. X    }
  301. X    break;
  302. X      case SIFTYPE:
  303. X    for (;;) {
  304. X      if (readstar(infile, intype)) break;
  305. X      precess_f(ein, eout, obj_lon, obj_lat, &ra_out, &de_out);
  306. X      obj_lon = ra_out;
  307. X      obj_lat = de_out;
  308. X      writesif(outfile, sepchar);
  309. X    }
  310. X    break;
  311. X      }
  312. X  } else { /* not precess */
  313. X    if (intype == SIFTYPE)
  314. X      switch (outtype) {
  315. X      case LINEREAD:
  316. X    for (;;) {
  317. X      if (readsif(infile, sepchar)) break;
  318. X      writelr(outfile);
  319. X    }
  320. X    break;
  321. X      case BINFULL:
  322. X    for (;;) {
  323. X      if (readsif(infile, sepchar)) break;
  324. X      wrbinfull(outfile);
  325. X    }
  326. X    break;
  327. X      case BINOBJ:
  328. X    for (;;) {
  329. X      if (readsif(infile, sepchar)) break;
  330. X      wrbinobj(outfile);
  331. X    }
  332. X    break;
  333. X      case BINSTAR:
  334. X    for (;;) {
  335. X      if (readsif(infile, sepchar)) break;
  336. X      wrbinstar(outfile);
  337. X    }
  338. X    break;
  339. X      }
  340. X    else /* Not SIF in */ 
  341. X      switch (outtype) {
  342. X      case LINEREAD:
  343. X    for (;;) {
  344. X      if (readstar(infile, intype)) break;
  345. X      writelr(outfile);
  346. X    }
  347. X    break;
  348. X      case BINFULL:
  349. X    for (;;) {
  350. X      if (readstar(infile, intype)) break;
  351. X      wrbinfull(outfile);
  352. X    }
  353. X    break;
  354. X      case BINOBJ:
  355. X    for (;;) {
  356. X      if (readstar(infile, intype)) break;
  357. X      wrbinobj(outfile);
  358. X    }
  359. X    break;
  360. X      case BINSTAR:
  361. X    for (;;) {
  362. X      if (readstar(infile, intype)) break;
  363. X      wrbinstar(outfile);
  364. X    }
  365. X    break;
  366. X      case SIFTYPE:
  367. X    for (;;) {
  368. X      if (readstar(infile, intype)) break;
  369. X      writesif(outfile, sepchar);
  370. X    }
  371. X    break;
  372. X      }
  373. X  }
  374. X
  375. X  exit(0);
  376. X}
  377. X
  378. X
  379. X
  380. X
  381. X
  382. Xint tr_type(s)
  383. X     char *s;
  384. X{
  385. X  int i;
  386. X
  387. X  for (i = 0; s[i]; i++)
  388. X    if (isupper(s[i]))
  389. X      s[i] = tolower(s[i]);
  390. X
  391. X  if(!strcmp(s, "lineread")) return LINEREAD;
  392. X/*  else if (!strcmp(s, "indextype")) return INDEXTYPE;*/
  393. X  else if (!strcmp(s, "binfull")) return BINFULL;
  394. X  else if (!strcmp(s, "binobj")) return BINOBJ;
  395. X  else if (!strcmp(s, "binstar")) return BINSTAR;
  396. X  else if (!strcmp(s, "sif")) return SIFTYPE;
  397. X  else if (!strcmp(s, "gsc")) return GSCTYPE;
  398. X/*  else if (!strcmp(s, "saoformat")) return SAOFORMAT;*/
  399. X  else return 0;
  400. X}
  401. X
  402. X
  403. X/* constellation abbreviations */
  404. Xchar *con_table[] = {
  405. X  "   ",
  406. X  "AND",
  407. X  "ANT",
  408. X  "APS",
  409. X  "AQL",
  410. X  "AQR",
  411. X  "ARA",
  412. X  "ARI",
  413. X  "AUR",
  414. X  "BOO",
  415. X  "CAE",
  416. X  "CAM",
  417. X  "CAP",
  418. X  "CAR",
  419. X  "CAS",
  420. X  "CEN",
  421. X  "CEP",
  422. X  "CET",
  423. X  "CHA",
  424. X  "CIR",
  425. X  "CMA",
  426. X  "CMI",
  427. X  "CNC",
  428. X  "COL",
  429. X  "COM",
  430. X  "CRA",
  431. X  "CRB",
  432. X  "CRT",
  433. X  "CRU",
  434. X  "CRV",
  435. X  "CVN",
  436. X  "CYG",
  437. X  "DEL",
  438. X  "DOR",
  439. X  "DRA",
  440. X  "EQU",
  441. X  "ERI",
  442. X  "FOR",
  443. X  "GEM",
  444. X  "GRU",
  445. X  "HER",
  446. X  "HOR",
  447. X  "HYA",
  448. X  "HYI",
  449. X  "IND",
  450. X  "LAC",
  451. X  "LEO",
  452. X  "LEP",
  453. X  "LIB",
  454. X  "LMI",
  455. X  "LUP",
  456. X  "LYN",
  457. X  "LYR",
  458. X  "MEN",
  459. X  "MIC",
  460. X  "MON",
  461. X  "MUS",
  462. X  "NOR",
  463. X  "OCT",
  464. X  "OPH",
  465. X  "ORI",
  466. X  "PAV",
  467. X  "PEG",
  468. X  "PER",
  469. X  "PHE",
  470. X  "PIC",
  471. X  "PSA",
  472. X  "PSC",
  473. X  "PUP",
  474. X  "PYX",
  475. X  "RET",
  476. X  "SCL",
  477. X  "SCO",
  478. X  "SCT",
  479. X  "SER",
  480. X  "SEX",
  481. X  "SGE",
  482. X  "SGR",
  483. X  "TAU",
  484. X  "TEL",
  485. X  "TRA",
  486. X  "TRI",
  487. X  "TUC",
  488. X  "UMA",
  489. X  "UMI",
  490. X  "VEL",
  491. X  "VIR",
  492. X  "VOL",
  493. X  "VUL",
  494. X  ""
  495. X  };
  496. X
  497. X
  498. X/* typedefs for exact sizes of int */
  499. Xtypedef char int_8;
  500. Xtypedef short int int_16;
  501. Xtypedef long int int_32;
  502. X
  503. X/* BINFULL structure */
  504. Xstruct bfull_struct {
  505. X  int_32 lat;            /* RA in seconds * 1000 */
  506. X  int_32 lon;            /* Dec in seconds * 1000 */
  507. X  int_16 mag;            /* Mag * 1000 */
  508. X  char tycolb[6];        /* Type, color, label fields */
  509. X  int_8 consindx;        /* Index number of constellation */
  510. X  int_16 strlen;        /* length of name and comment field */
  511. X} binfull_in, binfull_out;
  512. X
  513. Xchar name_comment[LINELEN];
  514. X
  515. X/* BINOBJ structure */
  516. Xstruct bobj_struct {
  517. X  int_32 lat;            /* RA in seconds * 1000 */
  518. X  int_32 lon;            /* Dec in seconds * 1000 */
  519. X  int_16 mag;            /* Mag * 1000 */
  520. X  char type[2];            /* e.g. 'SD', 'CO' */
  521. X} binobj_in, binobj_out;
  522. X
  523. X/* BINSTAR structure */
  524. Xstruct bstar_struct {
  525. X  int_32 lat;            /* RA in seconds * 1000 */
  526. X  int_32 lon;            /* Dec in seconds * 1000 */
  527. X  int_16 mag;            /* Mag * 1000 */
  528. X} binstar_in, binstar_out;
  529. X
  530. X
  531. X/* readstar reads from the file the information for one object, and
  532. X   loads the following variables:
  533. Xdouble obj_lat, obj_lon, obj_mag;
  534. Xchar obj_type[] ="SS", obj_color[3], obj_label[3];
  535. Xchar obj_constell[4], obj_name[LINELEN];
  536. Xchar *obj_commnt, fileline[LINELEN];
  537. X
  538. Xonly lat, lon, and mag are required.  type should default to 'SS',
  539. Xcolor, label, constell default to "  ", and the rest default to ""
  540. X*/
  541. Xint readstar(file, ftype)
  542. X     FILE *file;
  543. X     int ftype;
  544. X{
  545. X  char *ptr;
  546. X  double rah, ram, ras, dld, dlm, dl, inten;
  547. X  int i, j;
  548. X  int nchars;
  549. X  char m1;
  550. X  static int GSC_seeked = FALSE;
  551. X  static int GSC_skip = FALSE;
  552. X  struct {
  553. X    double ra_deg, dec_deg, mag;
  554. X    int mag_band, class;
  555. X  } GSC[10];
  556. X  int GSC_nlines;
  557. X  static int GSC_ID = 0;
  558. X  char id_str[5];
  559. X
  560. X  if ((ftype != LINEREAD) && (ftype != BINFULL)
  561. X      && (ftype != BINOBJ) && (ftype != BINSTAR) && (ftype != GSCTYPE))
  562. X    return (TRUE);
  563. X  /* only LINEREAD, BINFULL, BINOBJ and BINSTAR and GSCTYPE
  564. X     supported at this time */
  565. X
  566. X  if (ftype == BINSTAR) {
  567. X    if (fread((char *) &binstar_in, sizeof(binstar_in), 1, file) != 1) {
  568. X      if (feof(file)) return TRUE;
  569. X      perror("Error reading input file");
  570. X      exit(2);
  571. X    }
  572. X
  573. X    obj_lat = ((double) binstar_in.lat) / 3600000L;
  574. X    obj_lon = ((double) binstar_in.lon) / 3600000L;
  575. X    obj_mag = ((double) binstar_in.mag) / 1000L;
  576. X    obj_type[0] = 'S';
  577. X    obj_type[1] = 'S';
  578. X    obj_color[0] = ' ';
  579. X    obj_color[1] = ' ';
  580. X    obj_label[0] = ' ';
  581. X    obj_label[1] = ' ';
  582. X    obj_constell[0] = ' ';
  583. X    obj_constell[1] = ' ';
  584. X    obj_constell[2] = ' ';
  585. X    obj_name[0] = '\0';
  586. X    obj_commnt = "";
  587. X
  588. X    strcpy(fileline, "");
  589. X  } else if (ftype == BINOBJ) {
  590. X    if (fread((char *) &binobj_in, sizeof(binobj_in), 1, file) != 1) {
  591. X      if (feof(file)) return TRUE;
  592. X      perror("Error reading input file");
  593. X      exit(2);
  594. X    }
  595. X
  596. X    obj_lat = ((double) binobj_in.lat) / 3600000L;
  597. X    obj_lon = ((double) binobj_in.lon) / 3600000L;
  598. X    obj_mag = ((double) binobj_in.mag) / 1000L;
  599. X    obj_type[0] = binobj_in.type[0];
  600. X    obj_type[1] = binobj_in.type[1];
  601. X    obj_color[0] = ' ';
  602. X    obj_color[1] = ' ';
  603. X    obj_label[0] = ' ';
  604. X    obj_label[1] = ' ';
  605. X    obj_constell[0] = ' ';
  606. X    obj_constell[1] = ' ';
  607. X    obj_constell[2] = ' ';
  608. X    obj_name[0] = '\0';
  609. X    obj_commnt = "";
  610. X
  611. X    strcpy(fileline, "");
  612. X  } else if (ftype == BINFULL) {
  613. X    if (fread((char *) &binfull_in, sizeof(binfull_in), 1, file) != 1) {
  614. X      if (feof(file)) return TRUE;
  615. X      perror("Error reading input file");
  616. X      exit(2);
  617. X    }
  618. X
  619. X    if (binfull_in.strlen == 0)
  620. X      strcpy(name_comment, "");
  621. X    else {
  622. X      if (fread((char *) name_comment, binfull_in.strlen, 1, file) != 1) {
  623. X    perror("Error reading input file");
  624. X    exit(2);
  625. X      }
  626. X      name_comment[binfull_in.strlen] = '\0';
  627. X    }
  628. X
  629. X    obj_lat = ((double) binfull_in.lat) / 3600000L;
  630. X    obj_lon = ((double) binfull_in.lon) / 3600000L;
  631. X    obj_mag = ((double) binfull_in.mag) / 1000L;
  632. X    obj_type[0] = binfull_in.tycolb[0];
  633. X    obj_type[1] = binfull_in.tycolb[1];
  634. X    obj_color[0] = binfull_in.tycolb[2];
  635. X    obj_color[1] = binfull_in.tycolb[3];
  636. X    obj_label[0] = binfull_in.tycolb[4];
  637. X    obj_label[1] = binfull_in.tycolb[5];
  638. X    strcpy(obj_constell,con_table[binfull_in.consindx]);
  639. X
  640. X    ptr = name_comment;
  641. X    i = 0;
  642. X    while (*ptr == ' ') ptr++;
  643. X    while (*ptr != ',' && *ptr != '\n' && *ptr)
  644. X      obj_name[i++] = *ptr++;
  645. X    obj_name[i] = '\0';
  646. X    if ((*ptr == ',') && (*++ptr) && name_comment[0]) obj_commnt = ptr;
  647. X    else obj_commnt = "";
  648. X
  649. X    strcpy(fileline, "");
  650. X  } else if (ftype == GSCTYPE) {
  651. X#define Val(ch) (ch - '0')
  652. X    if (!GSC_seeked) {
  653. X      fseek(file, 8640L, 0);
  654. X      GSC_seeked = TRUE;
  655. X      if (fread((char *) id_str, 5, 1, file) != 1) {
  656. X    if (feof(file)) return TRUE;
  657. X    perror("Error reading input file");
  658. X    exit(2);
  659. X      };
  660. X      GSC_ID = Val(id_str[0])*10000 +
  661. X    Val(id_str[1])*1000 +
  662. X    Val(id_str[2])*100 +
  663. X    Val(id_str[3])*10 +
  664. X    Val(id_str[4]);
  665. X    };
  666. X    GSC_skip = FALSE;
  667. X    do {
  668. X      if (id_str[0] == ' ') return TRUE;
  669. X      i = 0;
  670. X      do {
  671. X    if (fread((char *) fileline, 40, 1, file) != 1) {
  672. X      if (feof(file)) return TRUE;
  673. X      perror("Error reading input file");
  674. X      exit(2);
  675. X    };
  676. X    for (j = 0; j < 40; j++) if (fileline[j] == ' ') fileline[j] = '0';
  677. X    /* We care about RA_DEG, DEC_DEG, MAG, MAG_BAND, CLASS, MULTIPLE */
  678. X    /* We read the GSC_ID already to see if it is a continuation */
  679. X    GSC[i].ra_deg = Val(fileline[0]) * 100.0 +
  680. X      Val(fileline[1]) * 10.0 +
  681. X      Val(fileline[2]) +
  682. X      Val(fileline[4]) / 10.0 +
  683. X      Val(fileline[5]) / 100.0 +
  684. X      Val(fileline[6]) / 1000.0 +
  685. X      Val(fileline[7]) / 10000.0 +
  686. X      Val(fileline[8]) / 100000.0;
  687. X    if (fileline[10] == '-')
  688. X      GSC[i].dec_deg = -1 *
  689. X        (Val(fileline[11]) +
  690. X         Val(fileline[13]) / 10.0 +
  691. X         Val(fileline[14]) / 100.0 +
  692. X         Val(fileline[15]) / 1000.0 +
  693. X         Val(fileline[16]) / 10000.0 +
  694. X         Val(fileline[17]) / 100000.0);
  695. X    else
  696. X      GSC[i].dec_deg =  ((fileline[9] == '-') ? -1 : 1) *
  697. X        (Val(fileline[10]) * 10.0 +
  698. X         Val(fileline[11]) +
  699. X         Val(fileline[13]) / 10.0 +
  700. X         Val(fileline[14]) / 100.0 +
  701. X         Val(fileline[15]) / 1000.0 +
  702. X         Val(fileline[16]) / 10000.0 +
  703. X         Val(fileline[17]) / 100000.0);
  704. X    GSC[i].mag = Val(fileline[23]) * 10.0 +
  705. X      Val(fileline[24]) +
  706. X      Val(fileline[26]) / 10.0 +
  707. X      Val(fileline[27]) / 100.0;
  708. X    GSC[i].mag_band = Val(fileline[32])*10 + Val(fileline[33]);
  709. X    GSC[i].class = Val(fileline[34]);
  710. X    i++;
  711. X    if (fread((char *) id_str, 5, 1, file) != 1) {
  712. X      if (!feof(file)) {
  713. X        perror("Error reading input file");
  714. X        exit(2);
  715. X      };
  716. X    };
  717. X    if (!feof(file)) {
  718. X      j = Val(id_str[0])*10000 +
  719. X        Val(id_str[1])*1000 +
  720. X        Val(id_str[2])*100 +
  721. X        Val(id_str[3])*10 +
  722. X        Val(id_str[4]);
  723. X    };
  724. X      } while ((j == GSC_ID) && (!feof(file)) && (id_str[0] != ' '));
  725. X      GSC_nlines = i;
  726. X      GSC_ID = j;
  727. X      /* for now just use first */
  728. X/* There are many stars with class == 3, so we'll ignore class */
  729. X/*      if (GSC[0].class == 0) {*/    /* is a star if class == 0 */
  730. X    obj_lon = GSC[0].ra_deg;
  731. X    obj_lat = GSC[0].dec_deg;
  732. X    obj_mag = GSC[0].mag;
  733. X    obj_type[0] = 'S';
  734. X    obj_type[1] = 'S';
  735. X    obj_color[0] = ' ';
  736. X    obj_color[1] = ' ';
  737. X    obj_label[0] = ' ';
  738. X    obj_label[1] = ' ';
  739. X    obj_constell[0] = ' ';
  740. X    obj_constell[1] = ' ';
  741. X    obj_constell[2] = ' ';
  742. X    obj_name[0] = '\0';
  743. X/*    obj_commnt = &fileline[28];*/
  744. X    obj_commnt = "";
  745. X    fileline[0] = '\0';
  746. X    GSC_skip = FALSE;
  747. X/* Ignoring class seems to be the right thing */
  748. X/*      } else {*/            /* not a star, skip */
  749. X/*    GSC_skip = TRUE;
  750. X      };*/
  751. X    } while (GSC_skip);
  752. X  } else { /* LINEREAD */
  753. X
  754. X/*
  755. X * file formats:
  756. X * new
  757. X064509-1643-14SDA1a CMASirius
  758. X051432-0812015SDB8b ORIRigel
  759. X * old
  760. X064509-1643-146SSSirius
  761. X051432-08120015SSRigel
  762. X */
  763. X
  764. X    fgets(fileline, LINELEN, file);
  765. X    if (feof(file)) return(TRUE);    /* IS AN ERROR or eof */
  766. X    nchars = 0;
  767. X    while (fileline[nchars++]);
  768. X    nchars--;
  769. X    nchars--;
  770. X
  771. X/*
  772. X * sscanf of floats is TOOO slow:
  773. X *     sscanf(fileline, "%2f%2f%2f%c%2f%2f ... );
  774. X * use alternate:
  775. X */
  776. X#define F2(i) (((fileline[i]-'0')*10.0+fileline[i+1]-'0'))
  777. X#define F3(i) (((fileline[i]-'0')*100.0+(fileline[i+1]-'0')*10+fileline[i+2]-'0'))
  778. X#define F4(i) (((fileline[i]-'0')*1000.0+(fileline[i+1]-'0')*100+(fileline[i+2])-'0')*10+fileline[i+3]-'0')
  779. X#define F3M(i) (((fileline[i]-'A'+10.0)*100+(fileline[i+1]-'0')*10+fileline[i+2]-'0'))
  780. X    rah = F2(0);
  781. X    ram = F2(2);
  782. X    ras = F2(4);
  783. X    dld = F2(7);
  784. X    dlm = F2(9);
  785. X/*
  786. X * common code
  787. X */
  788. X#define DLDEGSEC 3600.0
  789. X#define DLMINSEC 60.0
  790. X#define RAHRSSEC 54000.0
  791. X#define RAMINSEC 900.0
  792. X#define RASECSEC 15.0
  793. X
  794. X
  795. X    obj_lon = (RAHRSSEC*rah + RAMINSEC*ram + RASECSEC*ras)/DLDEGSEC;
  796. X    dl = (DLDEGSEC*dld + DLMINSEC*dlm)/DLDEGSEC;
  797. X    obj_lat = (fileline[6]  == '-') ? -dl : dl;
  798. X    
  799. X    /* set unknowns to blanks */
  800. X    obj_color[0] = ' ';
  801. X    obj_color[1] = ' ';
  802. X    obj_color[2] = '\0';
  803. X    obj_label[0] = ' ';
  804. X    obj_label[1] = ' ';
  805. X    obj_label[2] = '\0';
  806. X    obj_constell[0] = ' ';
  807. X    obj_constell[1] = ' ';
  808. X    obj_constell[2] = ' ';
  809. X    obj_constell[3] = '\0';
  810. X    
  811. X    if  (isdigit(fileline[14])) {
  812. X    /*
  813. X     * old reduced Yale catalog
  814. X     */
  815. X      inten = F3(12);
  816. X      if (fileline[11] == '0' || fileline[11] == '+') obj_mag = inten/100.0;
  817. X      else if (fileline[11] == '-') obj_mag = -inten/100.0;
  818. X      else obj_mag = F4(11)/1000.0;    /* new feature for stars >= 10.0 mag */
  819. X      
  820. X      if (nchars > 15) {
  821. X    obj_type[0] = fileline[15];
  822. X    obj_type[1] = fileline[16];
  823. X    ptr = &fileline[MIN(17,nchars)];
  824. X    i = 0;
  825. X    while (*ptr == ' ') ptr++;
  826. X    while (*ptr != ',' && *ptr != '\n' && *ptr)
  827. X      obj_name[i++] = *ptr++;
  828. X    obj_name[i] = '\0';
  829. X    if (*++ptr) obj_commnt = ptr;
  830. X    else obj_commnt = "";
  831. X/* Next 2 lines Not in readfile.c readstar, not needed there */
  832. X    if (obj_commnt[strlen(obj_commnt) -1] == '\n')
  833. X      obj_commnt[strlen(obj_commnt) -1] = '\0';
  834. X      } else {
  835. X    obj_type[0] = obj_type[1] = 'S'; /* Default SS single star */
  836. X    obj_name[0] = '\0';
  837. X    obj_commnt = "";
  838. X      }
  839. X    } else {
  840. X      /*
  841. X       * new reduced Yale catalog
  842. X       */
  843. X      m1 = fileline[11];
  844. X      obj_mag = ((m1 == '-') ? -F2(12)/10.0 :
  845. X         (m1 <= '9') ? F3(11)/100.0 : F3M(11)/100.0);
  846. X      /* let's get Sirius */
  847. X    
  848. X      /*
  849. X       * extract color, label, constellation, name, and comment
  850. X       * Would be faster to just guarentee that the data file is correct
  851. X       */
  852. X      if (nchars > 22) {
  853. X    obj_constell[0] = fileline[20];
  854. X    obj_constell[1] = fileline[21];
  855. X    obj_constell[2] = fileline[22];
  856. X    obj_constell[3] = '\0';
  857. X      }
  858. X      if (nchars > 19) {
  859. X    obj_label[0] = fileline[18];
  860. X    obj_label[1] = fileline[19];
  861. X    obj_label[2] = '\0';
  862. X      }
  863. X      if (nchars > 17) {
  864. X    obj_color[0] = fileline[16]; 
  865. X    obj_color[1] = fileline[17];
  866. X    obj_color[2] = '\0';
  867. X      }
  868. X      if (nchars > 15) {
  869. X    obj_type[0] = fileline[14];
  870. X    obj_type[1] = fileline[15];
  871. X      }
  872. X
  873. X      ptr = &fileline[MIN(23,nchars)];
  874. X      i = 0;
  875. X      while (*ptr == ' ') ptr++;
  876. X      while (*ptr != ',' && *ptr != '\n' && *ptr)
  877. X    obj_name[i++] = *ptr++;
  878. X      obj_name[i] = '\0';
  879. X      if (*++ptr) obj_commnt = ptr;
  880. X      else obj_commnt = "";
  881. X/* Next 2 lines Not in readfile.c readstar, not needed there */
  882. X      if (obj_commnt[strlen(obj_commnt) -1] == '\n')
  883. X    obj_commnt[strlen(obj_commnt) -1] = '\0';
  884. X    }
  885. X  }
  886. X
  887. X  return(FALSE); /* NO error */
  888. X}
  889. X
  890. X
  891. X/* readsif reads standard starchart interchange format files,
  892. X   extracting the same data as readstar, if possible, and loading
  893. X   the same variables */
  894. Xint readsif(file, sepchar)
  895. X     FILE *file;
  896. X     char sepchar;
  897. X{
  898. X  static char inp_line[10*LINELEN];
  899. X  int i;
  900. X  char *cp;
  901. X  char *parsed_line[9];
  902. X  int num_parsed;
  903. X  double ra_h, ra_m, ra_s, de_d, de_m, de_s;
  904. X
  905. X  /* Get line */
  906. X  if (fgets(inp_line, 10*LINELEN, file) == NULL) return TRUE;
  907. X
  908. X  /* Remove newline */
  909. X  inp_line[strlen(inp_line)-1] = '\0';
  910. X
  911. X  /* split line into tokens */
  912. X  for (i = 0; i < 9; i++) parsed_line[i] = "";
  913. X
  914. X  i = 0;
  915. X  cp = inp_line;
  916. X  parsed_line[i++] = cp;
  917. X  while (*cp)
  918. X    if (*cp != sepchar) cp++;
  919. X    else if (i < 9) {
  920. X      *cp++ = '\0';
  921. X      parsed_line[i++] = cp;
  922. X    };
  923. X  num_parsed = i;
  924. X
  925. X  /* parse ra and dec */
  926. X  ra_h = ra_m = ra_s = 0.0;
  927. X  de_d = de_m = de_s = 0.0;
  928. X  sscanf(parsed_line[0], "%lf %lf %lf", &ra_h, &ra_m, &ra_s);
  929. X  i = 0; 
  930. X  while (i < strlen(parsed_line[1])) {
  931. X    if ((parsed_line[1][i] == '+') || (parsed_line[1][i] == '-')) {
  932. X      i++;
  933. X      while ((i < strlen(parsed_line[1])) && (parsed_line[1][i] == ' '))
  934. X    parsed_line[1][i++] = '0';
  935. X    } else i++;
  936. X  };
  937. X  sscanf(parsed_line[1], "%lf %lf %lf", &de_d, &de_m, &de_s);
  938. X
  939. X  /* set obj_ values */
  940. X  obj_lon = ra_h * 15.0 + ra_m / 4.0 + ra_s / (4.0 * 60.0);
  941. X  obj_lat = fabs(de_d) + de_m / 60.0 + de_s / 3600.0;
  942. X
  943. X  /* In order to assign the sign properly if de_d == 0,
  944. X     we must see if there is a negative sign before the first digit */
  945. X  if (de_d < 0.0) obj_lat = -obj_lat;
  946. X  else if (de_d == 0.0) {
  947. X    i = 0;
  948. X    while ((parsed_line[1][i] != '-') && (!isdigit(parsed_line[1][i]))) i++;
  949. X    if (parsed_line[1][i] == '-') obj_lat = -obj_lat;
  950. X  };
  951. X
  952. X  sscanf(parsed_line[2], "%lf", &obj_mag);
  953. X
  954. X  if (sscanf(parsed_line[3], "%2s", obj_type) == EOF) strcpy(obj_type, "SS");
  955. X  if (sscanf(parsed_line[4], "%2s", obj_color) == EOF) strcpy(obj_color, "  ");
  956. X  if (sscanf(parsed_line[5], "%2s", obj_label) == EOF) strcpy(obj_label, "  ");
  957. X  if (sscanf(parsed_line[6], "%3s", obj_constell) == EOF)
  958. X    strcpy(obj_constell, "   ");
  959. X
  960. X  if (!obj_type[1]) obj_type[1] = ' ';
  961. X  if (!obj_color[1]) obj_color[1] = ' ';
  962. X  if (!obj_label[1]) obj_label[1] = ' ';
  963. X  if (!obj_constell[1]) obj_constell[1] = ' ';
  964. X  if (!obj_constell[2]) obj_constell[2] = ' ';
  965. X
  966. X  obj_type[2] = '\0';
  967. X  obj_color[2] = '\0';
  968. X  obj_label[2] = '\0';
  969. X  obj_constell[3] = '\0';
  970. X
  971. X/* Magic for label:
  972. X   type and color should be left justified, constellation is 3 chars if valid,
  973. X   but label could be " X" or "X " with equal validity.
  974. X   If the label field is exactly two characters long including whitespace,
  975. X   and both characters are printable, use it verbatum. */
  976. X  if ((strlen(parsed_line[5]) == 2)  && isprint(parsed_line[5][0]) &&
  977. X       isprint(parsed_line[5][1])) strcpy(obj_label, parsed_line[5]);
  978. X
  979. X  /* Trim whitespace before and after name */
  980. X  while ((*parsed_line[7] == ' ') || (*parsed_line[7] == '\t'))
  981. X    parsed_line[7]++;
  982. X  i = strlen(parsed_line[7]) -1 ;
  983. X  while ((parsed_line[7][i]  == ' ') || (parsed_line[7][i] == '\t'))
  984. X    parsed_line[7][i] = '\0';
  985. X  if (!parsed_line[7][0]) strcpy(obj_name,"");
  986. X  else strcpy(obj_name,parsed_line[7]);
  987. X
  988. X  obj_commnt = parsed_line[8];
  989. X
  990. X  if (!to_consindx(obj_constell)) strcpy(obj_constell,"   ");
  991. X
  992. X  /* Commas should not appear in name field */
  993. X  i = 0;
  994. X  while (obj_name[i])
  995. X    if (obj_name[i++] == ',')
  996. X      fprintf(stderr, "Warning: comma in name field:\"%s\"\n", obj_name);
  997. X
  998. X  return FALSE;
  999. X}
  1000. X
  1001. X
  1002. X/* write lineread format */
  1003. Xvoid writelr(outfile)
  1004. X     FILE *outfile;
  1005. X{
  1006. X  int ra_h, ra_m, ra_s;
  1007. X  int de_d, de_m;
  1008. X  char outline[LINELEN];
  1009. X  char dsign;
  1010. X  char mstr[4];
  1011. X  int imag;
  1012. X
  1013. X  if ((obj_lon > 360.0) || (obj_lon < 0.0)) {
  1014. X    fprintf(stderr, "Error: R.A. out of range:\"%f\"\n", obj_lon/15.0);
  1015. X    obj_lon = 0.0;
  1016. X    obj_mag = 35.0;
  1017. X  };
  1018. X  if ((obj_lat > 90.0) || (obj_lat < -90.0)) {
  1019. X    fprintf(stderr, "Error: declination out of range:\"%f\"\n", obj_lat);
  1020. X    obj_lat = 0.0;
  1021. X    obj_mag = 35.0;
  1022. X  };
  1023. X  if (obj_mag > 35.0)
  1024. X    fprintf(stderr, "Warning: magnitude out of range:\"%f\"\n", obj_mag);
  1025. X  
  1026. X
  1027. X  ra_h = obj_lon/15.0;
  1028. X  ra_m = ((obj_lon/15.0) - ra_h) * 60 + (0.5 / 60);
  1029. X  ra_s = ((((obj_lon/15.0) - ra_h) * 60) - ra_m) * 60 + 0.5;
  1030. X
  1031. X  if (ra_s >= 60) {ra_s -= 60; ra_m++;};
  1032. X  if (ra_m >= 60) {ra_m -= 60; ra_h++;};
  1033. X
  1034. X
  1035. X  if (obj_lat < 0.0) {
  1036. X    obj_lat = -obj_lat;
  1037. X    dsign = '-';
  1038. X  } else dsign = '+';
  1039. X
  1040. X  de_d = obj_lat;
  1041. X  de_m = (obj_lat - de_d) * 60 + 0.5;
  1042. X
  1043. X  if (de_m >= 60) {de_m -= 60; de_d++;};
  1044. X
  1045. X  imag = fabs(obj_mag);
  1046. X  if (obj_mag <= -10.0)
  1047. X    sprintf(mstr, "-99");
  1048. X  else if (obj_mag < 0.0)
  1049. X    sprintf(mstr, "-%02d", (int) (-obj_mag * 10 + 0.5));
  1050. X  else if (imag >= 10) {
  1051. X    /* Hex+ format for stars dimmer than 9th mag */
  1052. X    sprintf(mstr, "%03d", (int) ((obj_mag - imag) * 100 + 0.5));
  1053. X    mstr[0] = 'A' - 10 + imag;
  1054. X    if (imag > 35)
  1055. X      mstr[0] = 'Z';
  1056. X  } else {
  1057. X    sprintf(mstr, "%03d", (int) (obj_mag * 100 + 0.5));
  1058. X  }
  1059. X
  1060. X  /* Try to trim off excess spaces */
  1061. X  if (!obj_commnt[0] && !obj_name[0] && !strcmp(obj_constell, "   "))
  1062. X    /* can trim constellation */
  1063. X    obj_constell[0] = '\0';
  1064. X
  1065. X  if (!obj_constell[0] && !strcmp(obj_label, "  "))
  1066. X    /* can trim label */
  1067. X    obj_label[0] = '\0';
  1068. X
  1069. X  if (!obj_label[0] && !strcmp(obj_color, "  "))
  1070. X    /* can trim color */
  1071. X    obj_color[0] = '\0';
  1072. X
  1073. X
  1074. X
  1075. X
  1076. X
  1077. X  if (obj_commnt[0])
  1078. X    sprintf(outline, "%02d%02d%02d%c%02d%02d%s%s%s%s%s%s,%s",
  1079. X        ra_h, ra_m, ra_s, dsign, de_d, de_m,
  1080. X        mstr,
  1081. X        obj_type, obj_color, obj_label, obj_constell,
  1082. X        obj_name, obj_commnt);
  1083. X  else
  1084. X    sprintf(outline, "%02d%02d%02d%c%02d%02d%s%s%s%s%s%s",
  1085. X        ra_h, ra_m, ra_s, dsign, de_d, de_m,
  1086. X        mstr,
  1087. X        obj_type, obj_color, obj_label, obj_constell, obj_name);
  1088. X
  1089. X  fprintf(outfile, "%s\n", outline);
  1090. X}
  1091. X
  1092. X
  1093. X/* write binfull format */
  1094. Xvoid wrbinfull(file)
  1095. X     FILE *file;
  1096. X{
  1097. X  int to_consindx();
  1098. X
  1099. X  if ((obj_lon > 360.0) || (obj_lon < 0.0)) {
  1100. X    fprintf(stderr, "Error: R.A. out of range:\"%f\"\n", obj_lon/15.0);
  1101. X    obj_lon = 0.0;
  1102. X    obj_mag = 35.0;
  1103. X  };
  1104. X  if ((obj_lat > 90.0) || (obj_lat < -90.0)) {
  1105. X    fprintf(stderr, "Error: declination out of range:\"%f\"\n", obj_lat);
  1106. X    obj_lat = 0.0;
  1107. X    obj_mag = 35.0;
  1108. X  };
  1109. X
  1110. X  strcpy(name_comment, obj_name);
  1111. X  if (obj_commnt[0]) {
  1112. X    strcat(name_comment, ",");
  1113. X    strcat(name_comment, obj_commnt);
  1114. X    if (name_comment[strlen(name_comment)-1] == '\n')
  1115. X      name_comment[strlen(name_comment)-1] = '\0';
  1116. X  }
  1117. X
  1118. X  binfull_out.lat = obj_lat * 3600 * 1000L;
  1119. X  binfull_out.lon = obj_lon * 3600 * 1000L;
  1120. X  binfull_out.mag = obj_mag * 1000L;
  1121. X  binfull_out.tycolb[0] = obj_type[0];
  1122. X  binfull_out.tycolb[1] = obj_type[1];
  1123. X  binfull_out.tycolb[2] = obj_color[0];
  1124. X  binfull_out.tycolb[3] = obj_color[1];
  1125. X  binfull_out.tycolb[4] = obj_label[0];
  1126. X  binfull_out.tycolb[5] = obj_label[1];
  1127. X  binfull_out.consindx = to_consindx(obj_constell);
  1128. X  binfull_out.strlen = strlen(name_comment);
  1129. X
  1130. X  if (fwrite((char *) &binfull_out, sizeof(binfull_out), 1, file) != 1) {
  1131. X    perror("Error writing output file");
  1132. X    exit(2);
  1133. X  }
  1134. X
  1135. X  if (name_comment[0] &&
  1136. X      (fwrite((char *) name_comment, binfull_out.strlen, 1, file) != 1)) {
  1137. X    perror("Error writing output file");
  1138. X    exit(2);
  1139. X  }
  1140. X}
  1141. X
  1142. Xint to_consindx(cons)
  1143. X     char *cons;
  1144. X{
  1145. X  int i;
  1146. X
  1147. X  if (!cons[0]) return 0;
  1148. X
  1149. X  i = -1;
  1150. X  while (con_table[++i][0])
  1151. X    if (!strcmp(cons, con_table[i])) break;
  1152. X
  1153. X  return (con_table[i][0] ? i : 0);
  1154. X}
  1155. X
  1156. X/* write binstar format */
  1157. Xvoid wrbinstar(file)
  1158. X     FILE *file;
  1159. X{
  1160. X  int to_consindx();
  1161. X
  1162. X  if ((obj_lon > 360.0) || (obj_lon < 0.0)) {
  1163. X    fprintf(stderr, "Error: R.A. out of range:\"%f\"\n", obj_lon/15.0);
  1164. X    obj_lon = 0.0;
  1165. X    obj_mag = 35.0;
  1166. X  };
  1167. X  if ((obj_lat > 90.0) || (obj_lat < -90.0)) {
  1168. X    fprintf(stderr, "Error: declination out of range:\"%f\"\n", obj_lat);
  1169. X    obj_lat = 0.0;
  1170. X    obj_mag = 35.0;
  1171. X  };
  1172. X
  1173. X  binstar_out.lat = obj_lat * 3600 * 1000L;
  1174. X  binstar_out.lon = obj_lon * 3600 * 1000L;
  1175. X  binstar_out.mag = obj_mag * 1000L;
  1176. X
  1177. X  if (fwrite((char *) &binstar_out, sizeof(binstar_out), 1, file) != 1) {
  1178. X    perror("Error writing output file");
  1179. X    exit(2);
  1180. X  }
  1181. X}
  1182. X
  1183. Xvoid wrbinobj(file)
  1184. X     FILE *file;
  1185. X{
  1186. X  int to_consindx();
  1187. X
  1188. X  if ((obj_lon > 360.0) || (obj_lon < 0.0)) {
  1189. X    fprintf(stderr, "Error: R.A. out of range:\"%f\"\n", obj_lon/15.0);
  1190. X    obj_lon = 0.0;
  1191. X    obj_mag = 35.0;
  1192. X  };
  1193. X  if ((obj_lat > 90.0) || (obj_lat < -90.0)) {
  1194. X    fprintf(stderr, "Error: declination out of range:\"%f\"\n", obj_lat);
  1195. X    obj_lat = 0.0;
  1196. X    obj_mag = 35.0;
  1197. X  };
  1198. X
  1199. X  binobj_out.lat = obj_lat * 3600 * 1000L;
  1200. X  binobj_out.lon = obj_lon * 3600 * 1000L;
  1201. X  binobj_out.mag = obj_mag * 1000L;
  1202. X  binobj_out.type[0] = obj_type[0];
  1203. X  binobj_out.type[1] = obj_type[1];
  1204. X
  1205. X  if (fwrite((char *) &binobj_out, sizeof(binobj_out), 1, file) != 1) {
  1206. X    perror("Error writing output file");
  1207. X    exit(2);
  1208. X  }
  1209. X}
  1210. X
  1211. X
  1212. X/* write sif format */
  1213. Xvoid writesif(file, sepchar)
  1214. X     FILE *file;
  1215. X     char sepchar;
  1216. X{
  1217. X  if ((obj_lon > 360.0) || (obj_lon < 0.0)) {
  1218. X    fprintf(stderr, "Error: R.A. out of range:\"%f\"\n", obj_lon/15.0);
  1219. X    obj_lon = 0.0;
  1220. X    obj_mag = 35.0;
  1221. X  };
  1222. X  if ((obj_lat > 90.0) || (obj_lat < -90.0)) {
  1223. X    fprintf(stderr, "Error: declination out of range:\"%f\"\n", obj_lat);
  1224. X    obj_lat = 0.0;
  1225. X    obj_mag = 35.0;
  1226. X  };
  1227. X
  1228. X  fprintf(file, "%.10f%c%.10f%c%f%c%s%c%s%c%s%c%3s%c%s%c%s\n",
  1229. X      obj_lon/15.0, sepchar,
  1230. X      obj_lat, sepchar,
  1231. X      obj_mag, sepchar,
  1232. X      obj_type, sepchar,
  1233. X      obj_color, sepchar,
  1234. X      obj_label, sepchar,
  1235. X      obj_constell, sepchar,
  1236. X      obj_name, sepchar,
  1237. X      obj_commnt);
  1238. X}
  1239. X
  1240. X
  1241. X/*  Old precession formula */
  1242. Xdouble M, N;
  1243. Xvoid initxform(ein, eout)
  1244. X     double ein, eout;
  1245. X{
  1246. X  double T;
  1247. X
  1248. X  T = (eout - ein) / 100.0;
  1249. X  M = (1.2812323 + (0.0003879 + 0.0000101 * T) * T) * T;
  1250. X  N = (0.5567530 - (0.0001185 - 0.0000116 * T) * T) * T;
  1251. X}
  1252. X
  1253. Xvoid xform(rin, din, rout, dout)
  1254. X     double rin, din, *rout, *dout;
  1255. X{
  1256. X  double am, dm, a2, d2;
  1257. X
  1258. X/* am = /alpha_m, dm = /delta_m */
  1259. X
  1260. X  am = rin + (M + N * DSIN(rin) * DTAN(din))/2.0;
  1261. X  dm = din + N*DCOS(am)/2.0;
  1262. X  a2 = rin + M + N*DSIN(am)*DTAN(dm);
  1263. X  d2 = din + N * DCOS(am);
  1264. X  
  1265. X  if (a2 >= 360.0) a2 -= 360.0;
  1266. X  if (a2 < 0.0) a2 += 360.0;
  1267. X
  1268. X  *rout = a2;
  1269. X  *dout = d2;
  1270. X}
  1271. X
  1272. X/* Rigorous precession */
  1273. X/* From Astronomical Ephemeris 1989, p. B18 */
  1274. X/*
  1275. Xfrom t_0 to t:
  1276. X
  1277. XA = 
  1278. Xsin(alpha - z_A) cos(delta) = sin(alpha_0 + zeta_A) cos(delta_0);
  1279. XB =
  1280. Xcos(alpha - z_A) cos(delta) = cos(alpha_0 + zeta_A) cos(theta_A) cos(delta_0)
  1281. X                - sin(theta_A) sin(delta_0);
  1282. XC =
  1283. X                 sin(delta) = cos(alpha_0 + zeta_A) sin(theta_A) cos(delta_0)
  1284. X                + cos(theta_A) sin(delta_0);
  1285. X
  1286. Xdelta = asin(C);
  1287. Xalpha = atan2(A/B) + z_A;
  1288. X
  1289. X
  1290. X
  1291. Xfrom t to t_0:
  1292. X
  1293. XA =
  1294. Xsin(alpha_0 + zeta_A) cos(delta_0) = sin(alpha - z_A) cos(delta);
  1295. X
  1296. XB =
  1297. Xcos(alpha_0 + zeta_A) cos(delta_0) = cos(alpha - z_A) cos(theta_A) cos(delta)
  1298. X                + sin(theta_A) sin(delta);
  1299. XC =
  1300. X                      sin(delta_0) = -cos(alpha - z_A) sin(theta_A) cos(delta)
  1301. X                + cos(theta_A) sin(delta)
  1302. X
  1303. Xdelta_0 = asin(C);
  1304. Xalpha_0 = atan2(A,B) - zeta_A;
  1305. X*/
  1306. X
  1307. X
  1308. X
  1309. X/* For reduction with respect to the standard epoch t_0 = J2000.0
  1310. Xzeta_A  = 0.6406161* T + 0.0000839* T*T + 0.0000050* T*T*T
  1311. X   Z_A  = 0.6406161* T + 0.0003041* T*T + 0.0000051* T*T*T
  1312. Xtheta_A = 0.5567530* T - 0.0001185* T*T + 0.0000116* T*T*T
  1313. X
  1314. Xin degrees.
  1315. X
  1316. XT = (jd - 2451545.0)/36525.0;
  1317. X
  1318. Xalpha2000 = alpha_0;
  1319. Xdelta2000 = delta_0;
  1320. X*/
  1321. X
  1322. X
  1323. Xvoid precess_f(from_equinox, to_equinox,
  1324. X         alpha_in, delta_in, alpha_out, delta_out)
  1325. X     double from_equinox, to_equinox,
  1326. X       alpha_in, delta_in, *alpha_out, *delta_out;
  1327. X{
  1328. X  double zeta_A, z_A, theta_A;
  1329. X  double T;
  1330. X  double A, B, C;
  1331. X  double alpha, delta;
  1332. X  double alpha2000, delta2000;
  1333. X  double into_range();
  1334. X
  1335. X
  1336. X  /* From from_equinox to 2000.0 */
  1337. X  if (from_equinox != 2000.0) {
  1338. X    T = (from_equinox - 2000.0)/100.0;
  1339. X    zeta_A  = 0.6406161* T + 0.0000839* T*T + 0.0000050* T*T*T;
  1340. X    z_A     = 0.6406161* T + 0.0003041* T*T + 0.0000051* T*T*T;
  1341. X    theta_A = 0.5567530* T - 0.0001185* T*T + 0.0000116* T*T*T;
  1342. X
  1343. X    A = DSIN(alpha_in - z_A) * DCOS(delta_in);
  1344. X    B = DCOS(alpha_in - z_A) * DCOS(theta_A) * DCOS(delta_in)
  1345. X      + DSIN(theta_A) * DSIN(delta_in);
  1346. X    C = -DCOS(alpha_in - z_A) * DSIN(theta_A) * DCOS(delta_in)
  1347. X      + DCOS(theta_A) * DSIN(delta_in);
  1348. X
  1349. X    alpha2000 = into_range(DATAN2(A,B) - zeta_A);
  1350. X    delta2000 = DASIN(C);
  1351. X  } else {
  1352. X    /* should get the same answer, but this could improve accruacy */
  1353. X    alpha2000 = alpha_in;
  1354. X    delta2000 = delta_in;
  1355. X  };
  1356. X
  1357. X
  1358. X  /* From 2000.0 to to_equinox */
  1359. X  if (to_equinox != 2000.0) {
  1360. X    T = (to_equinox - 2000.0)/100.0;
  1361. X    zeta_A  = 0.6406161* T + 0.0000839* T*T + 0.0000050* T*T*T;
  1362. X    z_A     = 0.6406161* T + 0.0003041* T*T + 0.0000051* T*T*T;
  1363. X    theta_A = 0.5567530* T - 0.0001185* T*T + 0.0000116* T*T*T;
  1364. X
  1365. X    A = DSIN(alpha2000 + zeta_A) * DCOS(delta2000);
  1366. X    B = DCOS(alpha2000 + zeta_A) * DCOS(theta_A) * DCOS(delta2000)
  1367. X      - DSIN(theta_A) * DSIN(delta2000);
  1368. X    C = DCOS(alpha2000 + zeta_A) * DSIN(theta_A) * DCOS(delta2000)
  1369. X      + DCOS(theta_A) * DSIN(delta2000);
  1370. X
  1371. X    alpha = into_range(DATAN2(A,B) + z_A);
  1372. X    delta = DASIN(C);
  1373. X  } else {
  1374. X    /* should get the same answer, but this could improve accruacy */
  1375. X    alpha = alpha2000;
  1376. X    delta = delta2000;
  1377. X  };
  1378. X
  1379. X  *alpha_out = alpha;
  1380. X  *delta_out = delta;
  1381. X}
  1382. X
  1383. X
  1384. Xdouble into_range(ang)
  1385. X     double ang;
  1386. X{
  1387. X  int i;
  1388. X
  1389. X  while (ang < 0.0) ang += 360.0;
  1390. X  /* Shouldn't be more than once */
  1391. X
  1392. X  i = ang/360.0;
  1393. X
  1394. X  ang = ang - i * 360;
  1395. X
  1396. X  return(ang);
  1397. X}
  1398. X
  1399. X
  1400. END_OF_FILE
  1401. if test 34330 -ne `wc -c <'dataconv/dataconv.c'`; then
  1402.     echo shar: \"'dataconv/dataconv.c'\" unpacked with wrong size!
  1403. fi
  1404. # end of 'dataconv/dataconv.c'
  1405. fi
  1406. echo shar: End of archive 25 \(of 32\).
  1407. cp /dev/null ark25isdone
  1408. MISSING=""
  1409. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ; do
  1410.     if test ! -f ark${I}isdone ; then
  1411.     MISSING="${MISSING} ${I}"
  1412.     fi
  1413. done
  1414. if test "${MISSING}" = "" ; then
  1415.     echo You have unpacked all 32 archives.
  1416.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1417. else
  1418.     echo You still need to unpack the following archives:
  1419.     echo "        " ${MISSING}
  1420. fi
  1421. ##  End of shell archive.
  1422. exit 0
  1423.  
  1424.  
  1425.