home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume11 / starchart / part04 < prev    next >
Encoding:
Text File  |  1990-03-15  |  48.4 KB  |  1,766 lines

  1. Newsgroups: comp.sources.misc
  2. subject: v11i032: starchart 3.2 Part 04/32
  3. from: ccount@ATHENA.MIT.EDU
  4. Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  5.  
  6. Posting-number: Volume 11, Issue 32
  7. Submitted-by: ccount@ATHENA.MIT.EDU
  8. Archive-name: starchart/part04
  9.  
  10. #! /bin/sh
  11. # This is a shell archive.  Remove anything before this line, then unpack
  12. # it by saving it into a file and typing "sh file".  To overwrite existing
  13. # files, type "sh file -c".  You can also feed this as standard input via
  14. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  15. # will see the following message at the end:
  16. #        "End of archive 4 (of 32)."
  17. # Contents:  observe/README observe/astlib.c observe/outaltaz.c
  18. #   observe/outeph.c observe/riseset.c starchart/parse_input.c
  19. #   starchart/parse_input.h starchart/star3.h
  20. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  21. if test -f 'observe/README' -a "${1}" != "-c" ; then 
  22.   echo shar: Will not clobber existing file \"'observe/README'\"
  23. else
  24. echo shar: Extracting \"'observe/README'\" \(5694 characters\)
  25. sed "s/^X//" >'observe/README' <<'END_OF_FILE'
  26. X1)
  27. Xdescrip.mms is for VMS; Observe.MSC  is for Microsoft  C on the IBMPC;
  28. XAstring.h is  for  use  on  the  Atari  ST where   it should  be named
  29. X'strings.h', since this header is apparently not provided with MWC.
  30. X
  31. X2)
  32. XYou may need to change things in main.c, especially the time functions
  33. Xand default location.
  34. X
  35. X3)
  36. XThe following awk scripts may be useful.  They are for use in editing
  37. Xthe .sif files produced when "observe" is used for a range of dates.
  38. XUse dataconv to produce a 'lineread' or 'binfull' file from the
  39. Xresulting editted .sif file.
  40. X
  41. XIf you don't have and can't get awk, you can edit the program to
  42. Xproduce the output you usually want.
  43. X
  44. Xvelim removes the labels from vector commands,
  45. Xe.g. 
  46. Xawk -f velim.awk jan.sif > jan.sif2
  47. Xdataconv -i jan.sif2 sif -o jan.binfull binfull
  48. X
  49. XTo eliminate all the symbols from the file, use 
  50. Xawk '($4 ~ /V./) {print $0}' FS=";" OFS=";" jan.sif > jan.sif2
  51. Xdataconv -i jan.sif2 sif -o jan.binfull binfull
  52. X
  53. Xrange.awk removes all but the first and last labels for each planet,
  54. Xand all but every Nth symbol.  M must equal the number of days in the
  55. Xrange of dates.
  56. Xe.g.
  57. Xawk -f range.awk N=7 M=31 jan.sif > jan.sif2
  58. Xdataconv -i jan.sif2 sif -o jan.binfull binfull
  59. X
  60. X
  61. Xaltaz.awk selects fields from the .altaz file.  Fields are printed in
  62. Xthe order azi alt, for obect NAME at time TIME, where TIME is
  63. X"sunset", "evetwil", morntwil", or "sunrise".
  64. Xe.g.
  65. Xawk -f altaz.awk TIME="evetwil" NAME="Austin" aus.altaz > aus.data
  66. X
  67. Xtimetable.awk selects fields from an .eph file for object NAME.  The
  68. Xfields may be specified as TIME ("rise", "trans", "set" ) or FIELD
  69. Xnumber, e.g.
  70. X
  71. Xawk -f timetable.awk NAME="Austin"  TIME="set" aus.eph > aus.set_times
  72. Xawk -f timetable.awk NAME="Austin"  FIELD=9 aus.eph > aus.mag
  73. X
  74. X
  75. X Copyright (c) 1990 by Craig Counterman. All rights reserved.
  76. X
  77. X This software may be redistributed freely, not sold.
  78. X This copyright notice and disclaimer of warranty must remain
  79. X    unchanged. 
  80. X
  81. X No representation is made about the suitability of this
  82. X software for any purpose.  It is provided "as is" without express or
  83. X implied warranty, to the extent permitted by applicable law.
  84. X
  85. X DISCLAIMER OF WARRANTY
  86. X ----------------------
  87. X The author  disclaims all warranties  with regard to  this software to
  88. X the   extent  permitted  by applicable   law,  including all   implied
  89. X warranties  of merchantability  and  fitness. In  no event shall   the
  90. X author be liable for any special, indirect or consequential damages or
  91. X any  damages whatsoever resulting from  loss of use, data or  profits,
  92. X whether in an action of contract, negligence or other tortious action,
  93. X arising  out of  or in connection with the  use or performance of this
  94. X software.
  95. X
  96. X#! /bin/sh
  97. X# This is a shell archive.  Remove anything before this line, then unpack
  98. X# it by saving it into a file and typing "sh file".  To overwrite existing
  99. X# files, type "sh file -c".  You can also feed this as standard input via
  100. X# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  101. X# will see the following message at the end:
  102. X#        "End of shell archive."
  103. X# Contents:  altaz.awk range.awk timetable.awk velim.awk
  104. XPATH=/bin:/usr/bin:/usr/ucb ; export PATH
  105. Xif test -f 'altaz.awk' -a "${1}" != "-c" ; then 
  106. X  echo shar: Will not clobber existing file \"'altaz.awk'\"
  107. Xelse
  108. Xecho shar: Extracting \"'altaz.awk'\" \(214 characters\)
  109. Xsed "s/^X//" >'altaz.awk' <<'END_OF_FILE'
  110. XXNR == 1 {if (TIME == "sunset")
  111. XX        var = 2
  112. XX    else if (TIME == "evetwil")
  113. XX        var = 4;
  114. XX    else if (TIME == "morntwil")
  115. XX        var = 6;
  116. XX    else if (TIME == "sunrise")
  117. XX        var = 8;
  118. XX    else
  119. XX        var = 4
  120. XX}
  121. XX$1 == NAME {print $(var+1), $var}
  122. XEND_OF_FILE
  123. Xif test 214 -ne `wc -c <'altaz.awk'`; then
  124. X    echo shar: \"'altaz.awk'\" unpacked with wrong size!
  125. Xfi
  126. X# end of 'altaz.awk'
  127. Xfi
  128. Xif test -f 'range.awk' -a "${1}" != "-c" ; then 
  129. X  echo shar: Will not clobber existing file \"'range.awk'\"
  130. Xelse
  131. Xecho shar: Extracting \"'range.awk'\" \(414 characters\)
  132. Xsed "s/^X//" >'range.awk' <<'END_OF_FILE'
  133. XXBEGIN {FS = OFS = ";";
  134. XX    i = 0}
  135. XX# eliminate labels from vectors
  136. XX$4 ~ /V./ {$8 = ""}
  137. XX# eliminate labels except from first and last
  138. XX# NPS = n planet symbol, number of planet lines for this planet 
  139. XX{NPS = 1+(NR-1)/2 - M*i}
  140. XX#{print NPS, (NPS % N)}
  141. XX(($4 ~ /P./) && ((NPS != 1) && (NPS != M))) {$8 = ""}
  142. XX
  143. XX(($4 ~ /V./) || (($4 ~ /P./) && ((NPS == 1) || (NPS == M) || ((NPS % N) == 1)))) {print $0}
  144. XX
  145. XX(NPS == M) {i = i + 1}
  146. XEND_OF_FILE
  147. Xif test 414 -ne `wc -c <'range.awk'`; then
  148. X    echo shar: \"'range.awk'\" unpacked with wrong size!
  149. Xfi
  150. X# end of 'range.awk'
  151. Xfi
  152. Xif test -f 'timetable.awk' -a "${1}" != "-c" ; then 
  153. X  echo shar: Will not clobber existing file \"'timetable.awk'\"
  154. Xelse
  155. Xecho shar: Extracting \"'timetable.awk'\" \(324 characters\)
  156. Xsed "s/^X//" >'timetable.awk' <<'END_OF_FILE'
  157. XXfunction hrtodec(t) {
  158. XX    split(t, tsplit, ":"); return tsplit[1] + (tsplit[2]/60.0)
  159. XX}
  160. XXBEGIN {i = 0}
  161. XXNR == 1  {if (TIME == "rise")
  162. XX        field = 6
  163. XX    else if (TIME == "trans")
  164. XX        field = 7
  165. XX    else if (TIME == "set")
  166. XX        field = 8
  167. XX    else if (FIELD != "")
  168. XX        field = FIELD
  169. XX    else
  170. XX        field = 7
  171. XX}
  172. XX$1 == NAME {i = i + 1; print i, hrtodec($field)}
  173. XEND_OF_FILE
  174. Xif test 324 -ne `wc -c <'timetable.awk'`; then
  175. X    echo shar: \"'timetable.awk'\" unpacked with wrong size!
  176. Xfi
  177. X# end of 'timetable.awk'
  178. Xfi
  179. Xif test -f 'velim.awk' -a "${1}" != "-c" ; then 
  180. X  echo shar: Will not clobber existing file \"'velim.awk'\"
  181. Xelse
  182. Xecho shar: Extracting \"'velim.awk'\" \(54 characters\)
  183. Xsed "s/^X//" >'velim.awk' <<'END_OF_FILE'
  184. XXBEGIN {FS = OFS = ";"}
  185. XX$4 ~ /V./ {$8 = ""}
  186. XX{print $0}
  187. XEND_OF_FILE
  188. Xif test 54 -ne `wc -c <'velim.awk'`; then
  189. X    echo shar: \"'velim.awk'\" unpacked with wrong size!
  190. Xfi
  191. X# end of 'velim.awk'
  192. Xfi
  193. Xecho shar: End of shell archive.
  194. Xexit 0
  195. END_OF_FILE
  196. if test 5694 -ne `wc -c <'observe/README'`; then
  197.     echo shar: \"'observe/README'\" unpacked with wrong size!
  198. fi
  199. # end of 'observe/README'
  200. fi
  201. if test -f 'observe/astlib.c' -a "${1}" != "-c" ; then 
  202.   echo shar: Will not clobber existing file \"'observe/astlib.c'\"
  203. else
  204. echo shar: Extracting \"'observe/astlib.c'\" \(5704 characters\)
  205. sed "s/^X//" >'observe/astlib.c' <<'END_OF_FILE'
  206. X/*
  207. X * astlib.c
  208. X * misc functions, including precession
  209. X *
  210. X * Copyright (c) 1990 by Craig Counterman. All rights reserved.
  211. X *
  212. X * This software may be redistributed freely, not sold.
  213. X * This copyright notice and disclaimer of warranty must remain
  214. X *    unchanged. 
  215. X *
  216. X * No representation is made about the suitability of this
  217. X * software for any purpose.  It is provided "as is" without express or
  218. X * implied warranty, to the extent permitted by applicable law.
  219. X *
  220. X */
  221. X
  222. X
  223. X#ifndef  lint
  224. Xstatic char rcsid[] =
  225. X  "$Header: astlib.c,v 1.7 90/02/23 00:16:22 ccount Exp $";
  226. X#endif
  227. X
  228. X
  229. X#include <math.h>
  230. X#include "degree.h"
  231. X
  232. X/* Rigorous precession */
  233. X/* From Astronomical Ephemeris 1989, p. B18 */
  234. X/*
  235. Xfrom t_0 to t:
  236. X
  237. XA = 
  238. Xsin(alpha - z_A) cos(delta) = sin(alpha_0 + zeta_A) cos(delta_0);
  239. XB =
  240. Xcos(alpha - z_A) cos(delta) = cos(alpha_0 + zeta_A) cos(theta_A) cos(delta_0)
  241. X                - sin(theta_A) sin(delta_0);
  242. XC =
  243. X                 sin(delta) = cos(alpha_0 + zeta_A) sin(theta_A) cos(delta_0)
  244. X                + cos(theta_A) sin(delta_0);
  245. X
  246. Xdelta = asin(C);
  247. Xalpha = atan2(A/B) + z_A;
  248. X
  249. X
  250. X
  251. Xfrom t to t_0:
  252. X
  253. XA =
  254. Xsin(alpha_0 + zeta_A) cos(delta_0) = sin(alpha - z_A) cos(delta);
  255. X
  256. XB =
  257. Xcos(alpha_0 + zeta_A) cos(delta_0) = cos(alpha - z_A) cos(theta_A) cos(delta)
  258. X                + sin(theta_A) sin(delta);
  259. XC =
  260. X                      sin(delta_0) = -cos(alpha - z_A) sin(theta_A) cos(delta)
  261. X                + cos(theta_A) sin(delta)
  262. X
  263. Xdelta_0 = asin(C);
  264. Xalpha_0 = atan2(A,B) - zeta_A;
  265. X*/
  266. X
  267. X
  268. X
  269. X/* For reduction with respect to the standard epoch t_0 = J2000.0
  270. Xzeta_A  = 0.6406161* T + 0.0000839* T*T + 0.0000050* T*T*T
  271. X   Z_A  = 0.6406161* T + 0.0003041* T*T + 0.0000051* T*T*T
  272. Xtheta_A = 0.5567530* T - 0.0001185* T*T + 0.0000116* T*T*T
  273. X
  274. Xin degrees.
  275. X
  276. XT = (jd - 2451545.0)/36525.0;
  277. X
  278. Xalpha2000 = alpha_0;
  279. Xdelta2000 = delta_0;
  280. X*/
  281. X
  282. X
  283. Xvoid precess(from_equinox, to_equinox,
  284. X         alpha_in, delta_in, alpha_out, delta_out)
  285. X     double from_equinox, to_equinox,
  286. X       alpha_in, delta_in, *alpha_out, *delta_out;
  287. X{
  288. X  double zeta_A, z_A, theta_A;
  289. X  double T;
  290. X  double A, B, C;
  291. X  double alpha, delta;
  292. X  double alpha2000, delta2000;
  293. X  double into_range();
  294. X
  295. X
  296. X  /* From from_equinox to 2000.0 */
  297. X  if (from_equinox != 2000.0) {
  298. X    T = (from_equinox - 2000.0)/100.0;
  299. X    zeta_A  = 0.6406161* T + 0.0000839* T*T + 0.0000050* T*T*T;
  300. X    z_A     = 0.6406161* T + 0.0003041* T*T + 0.0000051* T*T*T;
  301. X    theta_A = 0.5567530* T - 0.0001185* T*T + 0.0000116* T*T*T;
  302. X
  303. X    A = DSIN(alpha_in - z_A) * DCOS(delta_in);
  304. X    B = DCOS(alpha_in - z_A) * DCOS(theta_A) * DCOS(delta_in)
  305. X      + DSIN(theta_A) * DSIN(delta_in);
  306. X    C = -DCOS(alpha_in - z_A) * DSIN(theta_A) * DCOS(delta_in)
  307. X      + DCOS(theta_A) * DSIN(delta_in);
  308. X
  309. X    alpha2000 = into_range(DATAN2(A,B) - zeta_A);
  310. X    delta2000 = DASIN(C);
  311. X  } else {
  312. X    /* should get the same answer, but this could improve accruacy */
  313. X    alpha2000 = alpha_in;
  314. X    delta2000 = delta_in;
  315. X  };
  316. X
  317. X
  318. X  /* From 2000.0 to to_equinox */
  319. X  if (to_equinox != 2000.0) {
  320. X    T = (to_equinox - 2000.0)/100.0;
  321. X    zeta_A  = 0.6406161* T + 0.0000839* T*T + 0.0000050* T*T*T;
  322. X    z_A     = 0.6406161* T + 0.0003041* T*T + 0.0000051* T*T*T;
  323. X    theta_A = 0.5567530* T - 0.0001185* T*T + 0.0000116* T*T*T;
  324. X
  325. X    A = DSIN(alpha2000 + zeta_A) * DCOS(delta2000);
  326. X    B = DCOS(alpha2000 + zeta_A) * DCOS(theta_A) * DCOS(delta2000)
  327. X      - DSIN(theta_A) * DSIN(delta2000);
  328. X    C = DCOS(alpha2000 + zeta_A) * DSIN(theta_A) * DCOS(delta2000)
  329. X      + DCOS(theta_A) * DSIN(delta2000);
  330. X
  331. X    alpha = into_range(DATAN2(A,B) + z_A);
  332. X    delta = DASIN(C);
  333. X  } else {
  334. X    /* should get the same answer, but this could improve accruacy */
  335. X    alpha = alpha2000;
  336. X    delta = delta2000;
  337. X  };
  338. X
  339. X  *alpha_out = alpha;
  340. X  *delta_out = delta;
  341. X}
  342. X
  343. X
  344. X/* Obliquity epsilon 
  345. Xepsilon = 23.439291 - 0.0130042* T - 0.00000016* T*T - 0.000000504* T*T*T;
  346. X*/
  347. Xdouble obl_jd(jd)
  348. Xdouble jd;
  349. X{
  350. X  double T = (jd - 2451545.0)/36525.0;
  351. X
  352. X  return (23.439291 - 0.0130042* T - 0.00000016* T*T - 0.000000504* T*T*T);
  353. X}
  354. X
  355. Xdouble obl_year(year)
  356. Xdouble year;
  357. X{
  358. X  double T = (year - 2000.0)/100.0;
  359. X
  360. X  return (23.439291 - 0.0130042* T - 0.00000016* T*T - 0.000000504* T*T*T);
  361. X}
  362. X
  363. Xvoid anom_calc(M, e, E_p, nu_p)
  364. X     double M, e, *E_p, *nu_p;
  365. X{
  366. X  double corr, e_0, E_0, E_1;
  367. X
  368. X  e_0 = e * RAD_TO_DEG;
  369. X
  370. X  corr = 1;
  371. X  E_0 = M;
  372. X  while (corr > 0.000001) {
  373. X    corr = (M + e_0 * DSIN(E_0) - E_0)/(1 - e * DCOS(E_0));
  374. X    E_1 = E_0 + corr;
  375. X    if (corr < 0) corr *= -1.0;
  376. X    E_0 = E_1;
  377. X  };
  378. X    
  379. X  *E_p = E_1;
  380. X
  381. X  *nu_p = 2.0 * RAD_TO_DEG * atan(sqrt((1+e)/(1-e))*DTAN(E_1/2));
  382. X}
  383. X
  384. X
  385. X/* 
  386. XGMST = 24110.54841 + 8640184.812866 * T_u + 0.093104 *T_u*T_u - 6.2e-6*T_u*T_u*T_u
  387. X
  388. XT_u = (jd - 2451545.0)/36525.0
  389. X
  390. X1.00273790934
  391. XGAST = apparent siderial time
  392. X = GMST + (total nutation in longitude)cos epsilon
  393. X*/
  394. Xdouble gmst0_degrees(jd)
  395. X     double jd;
  396. X{
  397. X  double T;
  398. X  double secs;
  399. X  double into_range();
  400. X
  401. X  T = (jd - 2451545.0)/36525.0;
  402. X  
  403. X  secs = 24110.54841 + 8640184.812866 * T + 0.093104 *T*T - 6.2e-6*T*T*T;
  404. X
  405. X  return into_range(secs/240.0);
  406. X}
  407. X
  408. X
  409. Xdouble into_range(ang)
  410. X     double ang;
  411. X{
  412. X  long i;
  413. X
  414. X  while (ang < 0.0) ang += 360.0;
  415. X  /* Shouldn't be more than once */
  416. X
  417. X  i = (long)floor(ang/360.0);
  418. X
  419. X  ang = ang - i * 360;
  420. X
  421. X  return(ang);
  422. X}
  423. X
  424. Xvoid altaz(jd, lat, lon, zone, height, alpha, delta, hour, alt, azi)
  425. X     double jd;
  426. X     double lat, lon, zone, height;
  427. X     double alpha, delta;
  428. X     double hour;
  429. X     double *alt, *azi;
  430. X{
  431. X  double jd0;
  432. X  double ha;
  433. X
  434. X  jd0 = ((long) (jd + 0.5001)) - .5; /* round to nearest midnight */
  435. X
  436. X  ha = gmst0_degrees(jd0) + (hour*15.0 - zone*15.0) * 1.00273790934
  437. X    + lon - alpha;
  438. X
  439. X  *alt = DASIN(DSIN(delta)*DSIN(lat) + DCOS(delta)*DCOS(lat)*DCOS(ha));
  440. X  *azi = DATAN2(-DCOS(delta)*DSIN(ha),
  441. X           DSIN(delta)*DCOS(lat) - DCOS(delta)*DCOS(ha)*DSIN(lat));
  442. X  *azi = (*azi < 0.0 ? 360 + *azi: *azi);
  443. X}
  444. END_OF_FILE
  445. if test 5704 -ne `wc -c <'observe/astlib.c'`; then
  446.     echo shar: \"'observe/astlib.c'\" unpacked with wrong size!
  447. fi
  448. # end of 'observe/astlib.c'
  449. fi
  450. if test -f 'observe/outaltaz.c' -a "${1}" != "-c" ; then 
  451.   echo shar: Will not clobber existing file \"'observe/outaltaz.c'\"
  452. else
  453. echo shar: Extracting \"'observe/outaltaz.c'\" \(4310 characters\)
  454. sed "s/^X//" >'observe/outaltaz.c' <<'END_OF_FILE'
  455. X/*
  456. X * outaltaz.c
  457. X * output altaz file
  458. X *
  459. X * Copyright (c) 1990 by Craig Counterman. All rights reserved.
  460. X *
  461. X * This software may be redistributed freely, not sold.
  462. X * This copyright notice and disclaimer of warranty must remain
  463. X *    unchanged. 
  464. X *
  465. X * No representation is made about the suitability of this
  466. X * software for any purpose.  It is provided "as is" without express or
  467. X * implied warranty, to the extent permitted by applicable law.
  468. X *
  469. X */
  470. X
  471. X#ifndef  lint
  472. Xstatic char rcsid[] =
  473. X  "$Header: outaltaz.c,v 1.3 90/02/19 17:20:53 ccount Exp $";
  474. X#endif
  475. X
  476. X
  477. X#include <stdio.h>
  478. X#ifndef SYSV
  479. X#include <strings.h>
  480. X#else
  481. X#include <string.h>
  482. X#endif
  483. X#include "observe.h"
  484. X#include "date.h"
  485. X
  486. X#ifndef FALSE
  487. X#define FALSE 0
  488. X#endif
  489. X#ifndef TRUE
  490. X#define TRUE 1
  491. X#endif
  492. X
  493. X
  494. Xchar *malloc();
  495. X
  496. Xvoid altaz();
  497. X
  498. X
  499. X/* Output altaz file for object(s) */
  500. Xvoid out_altaz(o_altaz, one_day, jd,
  501. X           lon, lat, zone, height,
  502. X           sun_data, moon_data, planets, bodies, nbodies, objects, nobjects)
  503. X     FILE *o_altaz;
  504. X     int one_day;        /* only doing one day */
  505. X     double jd;
  506. X     double lon, lat, zone, height;
  507. X     sun_data_t sun_data;
  508. X     moon_data_t moon_data;
  509. X     planet_data_t planets[];
  510. X     wanderer_data_t bodies[];
  511. X     int nbodies;
  512. X     obj_data_t objects[];
  513. X     int nobjects;
  514. X{
  515. X  int i;
  516. X  char datestr[15];
  517. X  double rise_hr, set_hr, eve_twil, morn_twil;
  518. X  double alt1, az1, alt2, az2, alt3, az3, alt4, az4;
  519. X
  520. X  jd_to_str(jd, datestr);
  521. X  if (!one_day) fprintf(o_altaz, "%s  %.3f\n", datestr, jd);
  522. X
  523. X  rise_hr = sun_data.rise_hour;
  524. X  set_hr = sun_data.set_hour;
  525. X  morn_twil = morntwil(jd, lon, lat, zone, height, sun_data);
  526. X  eve_twil = evetwil(jd, lon, lat, zone, height, sun_data);
  527. X  fprintf(o_altaz,
  528. X"name       at sun set    eve. twil.   morn. twil.   at sun rise\n");
  529. X
  530. X
  531. X  altaz(jd, lat, lon, zone, height, sun_data.alpha, sun_data.delta,
  532. X    set_hr, &alt1, &az1);
  533. X  altaz(jd, lat, lon, zone, height, sun_data.alpha, sun_data.delta,
  534. X    eve_twil, &alt2, &az2);
  535. X  altaz(jd, lat, lon, zone, height, sun_data.alpha, sun_data.delta,
  536. X    morn_twil, &alt3, &az3);
  537. X  altaz(jd, lat, lon, zone, height, sun_data.alpha, sun_data.delta,
  538. X    rise_hr, &alt4, &az4);
  539. X  
  540. X  fprintf(o_altaz,
  541. X      "%-7.7s %6.1f %6.1f %6.1f %6.1f %6.1f %6.1f %6.1f %6.1f\n",
  542. X      "Sun",
  543. X      alt1, az1,
  544. X      alt2, az2,
  545. X      alt3, az3,
  546. X      alt4, az4
  547. X      );
  548. X
  549. X  for (i = 0; i < 7; i++)
  550. X    if (planets[i].name[0]) {
  551. X      altaz(jd, lat, lon, zone, height, planets[i].alpha, planets[i].delta,
  552. X        set_hr, &alt1, &az1);
  553. X      altaz(jd, lat, lon, zone, height, planets[i].alpha, planets[i].delta,
  554. X        eve_twil, &alt2, &az2);
  555. X      altaz(jd, lat, lon, zone, height, planets[i].alpha, planets[i].delta,
  556. X        morn_twil, &alt3, &az3);
  557. X      altaz(jd, lat, lon, zone, height, planets[i].alpha, planets[i].delta,
  558. X        rise_hr, &alt4, &az4);
  559. X      fprintf(o_altaz,
  560. X          "%-7.7s %6.1f %6.1f %6.1f %6.1f %6.1f %6.1f %6.1f %6.1f\n",
  561. X          planets[i].name,
  562. X          alt1, az1,
  563. X          alt2, az2,
  564. X          alt3, az3,
  565. X          alt4, az4
  566. X          );
  567. X    };
  568. X
  569. X
  570. X  for (i = 0; i < nbodies; i++) {
  571. X      altaz(jd, lat, lon, zone, height, bodies[i].alpha, bodies[i].delta,
  572. X        set_hr, &alt1, &az1);
  573. X      altaz(jd, lat, lon, zone, height, bodies[i].alpha, bodies[i].delta,
  574. X        eve_twil, &alt2, &az2);
  575. X      altaz(jd, lat, lon, zone, height, bodies[i].alpha, bodies[i].delta,
  576. X        morn_twil, &alt3, &az3);
  577. X      altaz(jd, lat, lon, zone, height, bodies[i].alpha, bodies[i].delta,
  578. X        rise_hr, &alt4, &az4);
  579. X      fprintf(o_altaz,
  580. X          "%-7.7s %6.1f %6.1f %6.1f %6.1f %6.1f %6.1f %6.1f %6.1f\n",
  581. X          bodies[i].name,
  582. X          alt1, az1,
  583. X          alt2, az2,
  584. X          alt3, az3,
  585. X          alt4, az4
  586. X          );
  587. X  };
  588. X
  589. X  for (i = 0; i < nobjects; i++) {
  590. X      altaz(jd, lat, lon, zone, height, objects[i].alpha, objects[i].delta,
  591. X        set_hr, &alt1, &az1);
  592. X      altaz(jd, lat, lon, zone, height, objects[i].alpha, objects[i].delta,
  593. X        eve_twil, &alt2, &az2);
  594. X      altaz(jd, lat, lon, zone, height, objects[i].alpha, objects[i].delta,
  595. X        morn_twil, &alt3, &az3);
  596. X      altaz(jd, lat, lon, zone, height, objects[i].alpha, objects[i].delta,
  597. X        rise_hr, &alt4, &az4);
  598. X      fprintf(o_altaz,
  599. X          "%-7.7s %6.1f %6.1f %6.1f %6.1f %6.1f %6.1f %6.1f %6.1f\n",
  600. X          objects[i].name,
  601. X          alt1, az1,
  602. X          alt2, az2,
  603. X          alt3, az3,
  604. X          alt4, az4
  605. X          );
  606. X  };
  607. X
  608. X  if (!one_day) fprintf(o_altaz, "\f\n");
  609. X}
  610. END_OF_FILE
  611. if test 4310 -ne `wc -c <'observe/outaltaz.c'`; then
  612.     echo shar: \"'observe/outaltaz.c'\" unpacked with wrong size!
  613. fi
  614. # end of 'observe/outaltaz.c'
  615. fi
  616. if test -f 'observe/outeph.c' -a "${1}" != "-c" ; then 
  617.   echo shar: Will not clobber existing file \"'observe/outeph.c'\"
  618. else
  619. echo shar: Extracting \"'observe/outeph.c'\" \(5903 characters\)
  620. sed "s/^X//" >'observe/outeph.c' <<'END_OF_FILE'
  621. X/*
  622. X * outeph.c
  623. X * output ephemeris file
  624. X *
  625. X * Copyright (c) 1990 by Craig Counterman. All rights reserved.
  626. X *
  627. X * This software may be redistributed freely, not sold.
  628. X * This copyright notice and disclaimer of warranty must remain
  629. X *    unchanged. 
  630. X *
  631. X * No representation is made about the suitability of this
  632. X * software for any purpose.  It is provided "as is" without express or
  633. X * implied warranty, to the extent permitted by applicable law.
  634. X *
  635. X */
  636. X
  637. X#ifndef  lint
  638. Xstatic char rcsid[] =
  639. X  "$Header: outeph.c,v 1.11 90/03/06 00:09:35 ccount Exp $";
  640. X#endif
  641. X
  642. X
  643. X#include <stdio.h>
  644. X#ifndef SYSV
  645. X#include <strings.h>
  646. X#else
  647. X#include <string.h>
  648. X#endif
  649. X#include "observe.h"
  650. X#include "date.h"
  651. X
  652. X#ifndef FALSE
  653. X#define FALSE 0
  654. X#endif
  655. X#ifndef TRUE
  656. X#define TRUE 1
  657. X#endif
  658. X
  659. X
  660. Xvoid raformat(), decformat(), timeformat();
  661. Xchar *malloc();
  662. X
  663. X
  664. X/* Output ephemeris file for object(s) */
  665. Xvoid out_eph(o_eph, one_day, jd,
  666. X         sun_data, moon_data, planets, bodies, nbodies, objects, nobjects)
  667. X     FILE *o_eph;
  668. X     int one_day;        /* only doing one day */
  669. X     double jd;
  670. X     sun_data_t sun_data;
  671. X     moon_data_t moon_data;
  672. X     planet_data_t planets[];
  673. X     wanderer_data_t bodies[];
  674. X     int nbodies;
  675. X     obj_data_t objects[];
  676. X     int nobjects;
  677. X{
  678. X  int i;
  679. X  char datestr[15];
  680. X  char rastr1[15], rastr2[15];
  681. X  char decstr1[15], decstr2[15];
  682. X  char risestr[6], setstr[6], transitstr[6];
  683. X  char Delta_str[6], r_str[6];
  684. X
  685. X
  686. X  jd_to_str(jd, datestr);
  687. X  if (!one_day) fprintf(o_eph, "%s  %.3f\n", datestr, jd);
  688. X
  689. X
  690. X  fprintf(o_eph,
  691. X"name   RA2000.0  Dec2000.0  RA epoch  Dec epoch  rise  trans set   mag    size   elong. phase Delta r\n");
  692. X
  693. X  raformat(sun_data.alpha2000/15.0, rastr1);
  694. X  raformat(sun_data.alpha/15.0, rastr2);
  695. X  decformat(sun_data.delta2000, decstr1);
  696. X  decformat(sun_data.delta, decstr2);
  697. X  timeformat(sun_data.rise_hour, risestr);
  698. X  timeformat(sun_data.transit_hour, transitstr);
  699. X  timeformat(sun_data.set_hour, setstr);
  700. X  fprintf(o_eph,
  701. X      "%-7.7s %s %s %s %s %s %s %s %5.1f %6.1f              %5.2f\n",
  702. X      "Sun",
  703. X      rastr1, decstr1,
  704. X      rastr2, decstr2,
  705. X      risestr, transitstr, setstr,
  706. X      -26.0, sun_data.size, sun_data.R);
  707. X
  708. X  raformat(moon_data.alpha2000/15.0, rastr1);
  709. X  raformat(moon_data.alpha/15.0, rastr2);
  710. X  decformat(moon_data.delta2000, decstr1);
  711. X  decformat(moon_data.delta, decstr2);
  712. X  timeformat(moon_data.rise_hour, risestr);
  713. X  timeformat(moon_data.transit_hour, transitstr);
  714. X  timeformat(moon_data.set_hour, setstr);
  715. X  fprintf(o_eph,
  716. X     "%-7.7s %s %s %s %s %s %s %s %5.1f %6.1f        %5.3f %5.2f\n",
  717. X      "Moon",
  718. X      rastr1, decstr1,
  719. X      rastr2, decstr2,
  720. X      risestr, transitstr, setstr,
  721. X      moon_data.mag, moon_data.size, moon_data.illum_frac,
  722. X      moon_data.Delta/10000.0);
  723. X
  724. X
  725. X  for (i = 0; i < 7; i++)
  726. X    if (planets[i].name[0]) {
  727. X      raformat(planets[i].alpha2000/15.0, rastr1);
  728. X      raformat(planets[i].alpha/15.0, rastr2);
  729. X      decformat(planets[i].delta2000, decstr1);
  730. X      decformat(planets[i].delta, decstr2);
  731. X      timeformat(planets[i].eventlist[0].hour, risestr);
  732. X      timeformat(planets[i].eventlist[3].hour, transitstr);
  733. X      timeformat(planets[i].eventlist[6].hour, setstr);
  734. X      fprintf(o_eph,
  735. X        "%-7.7s %s %s %s %s %s %s %s %5.2f %6.1f %6.1f %5.3f %5.2f %5.2f\n",
  736. X          planets[i].name,
  737. X          rastr1, decstr1,
  738. X          rastr2, decstr2,
  739. X          risestr, transitstr, setstr,
  740. X          planets[i].mag, planets[i].size,
  741. X          planets[i].psi, planets[i].illum_frac,
  742. X          planets[i].Delta, planets[i].r);
  743. X    };
  744. X
  745. X
  746. X  for (i = 0; i < nbodies; i++) {
  747. X    raformat(bodies[i].alpha2000/15.0, rastr1);
  748. X    raformat(bodies[i].alpha/15.0, rastr2);
  749. X    decformat(bodies[i].delta2000, decstr1);
  750. X    decformat(bodies[i].delta, decstr2);
  751. X    timeformat(bodies[i].eventlist[0].hour, risestr);
  752. X    timeformat(bodies[i].eventlist[3].hour, transitstr);
  753. X    timeformat(bodies[i].eventlist[6].hour, setstr);
  754. X    if (bodies[i].Delta < 0.0) {
  755. X      strcpy(Delta_str, "-----");
  756. X    } else {
  757. X      sprintf(Delta_str, "%5.2f", bodies[i].Delta);
  758. X    };
  759. X    if (bodies[i].r < 0.0) {
  760. X      strcpy(r_str, "-----");
  761. X    } else {
  762. X      sprintf(r_str, "%5.2f", bodies[i].r);
  763. X    };
  764. X
  765. X    fprintf(o_eph,
  766. X      "%-7.7s %s %s %s %s %s %s %s %5.2f                     %s %s\n",
  767. X        bodies[i].name,
  768. X        rastr1, decstr1,
  769. X        rastr2, decstr2,
  770. X        risestr, transitstr, setstr,
  771. X        bodies[i].mag, Delta_str, r_str);
  772. X  };
  773. X
  774. X  for (i = 0; i < nobjects; i++) {
  775. X    raformat(objects[i].alpha2000/15.0, rastr1);
  776. X    raformat(objects[i].alpha/15.0, rastr2);
  777. X    decformat(objects[i].delta2000, decstr1);
  778. X    decformat(objects[i].delta, decstr2);
  779. X    timeformat(objects[i].rise_hour, risestr);
  780. X    timeformat(objects[i].transit_hour, transitstr);
  781. X    timeformat(objects[i].set_hour, setstr);
  782. X    fprintf(o_eph,
  783. X      "%-7.7s %s %s %s %s %s %s %s %5.2f %6.1f\n",
  784. X        objects[i].name,
  785. X        rastr1, decstr1,
  786. X        rastr2, decstr2,
  787. X        risestr, transitstr, setstr, objects[i].mag, objects[i].size);
  788. X  };
  789. X  if (!one_day) fprintf(o_eph, "\f\n");
  790. X}
  791. X
  792. Xvoid raformat(ra, str)
  793. X     double ra;
  794. X     char str[];
  795. X{
  796. X  int h, m, s;
  797. X
  798. X  h = ra;
  799. X  m = (ra-h)*60;
  800. X  s = ((ra-h)*60 - m)*60 + .5;
  801. X  if (s == 60) {
  802. X    s = 0;
  803. X    m++;
  804. X  };
  805. X  if (m == 60) {
  806. X    m = 0;
  807. X    h++;
  808. X  }
  809. X  if (h == 24) h = 0;
  810. X  sprintf(str, "%02dh%02dm%02ds", h, m, s);
  811. X}
  812. X
  813. Xvoid decformat(dec, str)
  814. X     double dec;
  815. X     char str[];
  816. X{
  817. X  int h, m, s;
  818. X  char sign_char = ' ';
  819. X
  820. X  if (dec < 0) {
  821. X    sign_char = '-';
  822. X    dec = -dec;
  823. X  };
  824. X
  825. X  h = dec;
  826. X  m = (dec-h)*60;
  827. X  s = ((dec-h)*60 - m)*60 + .5;
  828. X  if (s == 60) {
  829. X    s = 0;
  830. X    m++;
  831. X  };
  832. X  if (m == 60) {
  833. X    m = 0;
  834. X    h++;
  835. X  }
  836. X
  837. X  sprintf(str, "%c%02dd%02dm%02ds", sign_char, h, m, s);
  838. X}
  839. X
  840. Xvoid timeformat(time, str)
  841. X     double time;        /* Hours */
  842. X     char str[];
  843. X{
  844. X  int hrs, mins;
  845. X
  846. X  if (time < 0.0) strcpy(str, "-----");
  847. X  else {
  848. X    hrs = time;
  849. X    mins = (time-hrs)*60.0 + 0.5;
  850. X    if (mins == 60)
  851. X      {
  852. X       hrs = (hrs == 23) ? 0 :(hrs+1);
  853. X       mins = 0;
  854. X      }
  855. X    sprintf(str, "%02d:%02d", hrs, mins);
  856. X  };
  857. X}
  858. END_OF_FILE
  859. if test 5903 -ne `wc -c <'observe/outeph.c'`; then
  860.     echo shar: \"'observe/outeph.c'\" unpacked with wrong size!
  861. fi
  862. # end of 'observe/outeph.c'
  863. fi
  864. if test -f 'observe/riseset.c' -a "${1}" != "-c" ; then 
  865.   echo shar: Will not clobber existing file \"'observe/riseset.c'\"
  866. else
  867. echo shar: Extracting \"'observe/riseset.c'\" \(5175 characters\)
  868. sed "s/^X//" >'observe/riseset.c' <<'END_OF_FILE'
  869. X/*
  870. X * riseset.c
  871. X * calculate rise and set times of objects, sun, moon
  872. X *
  873. X * Copyright (c) 1990 by Craig Counterman. All rights reserved.
  874. X *
  875. X * This software may be redistributed freely, not sold.
  876. X * This copyright notice and disclaimer of warranty must remain
  877. X *    unchanged. 
  878. X *
  879. X * No representation is made about the suitability of this
  880. X * software for any purpose.  It is provided "as is" without express or
  881. X * implied warranty, to the extent permitted by applicable law.
  882. X *
  883. X */
  884. X
  885. X#ifndef  lint
  886. Xstatic char rcsid[] =
  887. X  "$Header: riseset.c,v 1.6 90/02/23 00:17:03 ccount Exp $";
  888. X#endif
  889. X
  890. X#include <math.h>
  891. X
  892. X#include "observe.h"
  893. X#include "degree.h"
  894. X
  895. X#ifndef FALSE
  896. X#define FALSE 0
  897. X#endif
  898. X#ifndef TRUE
  899. X#define TRUE 1
  900. X#endif
  901. X
  902. Xdouble gmst0_degrees();
  903. X
  904. Xdouble risetime(rise, jd, alt, lat, lon, zone, height, alpha, delta)
  905. X     int rise;
  906. X     double jd;
  907. X     double alt;
  908. X     double lat, lon, zone, height;
  909. X     double alpha, delta;
  910. X{
  911. X  double H_0;
  912. X  double jd0;
  913. X  double cos_term;
  914. X  double hour;
  915. X
  916. X  jd0 = ((long) (jd + 0.5001)) - .5; /* round to nearest midnight */
  917. X
  918. X  cos_term = (DSIN(alt) - DSIN(lat) * DSIN(delta))/(DCOS(lat)*DCOS(delta));
  919. X
  920. X  if (cos_term < -1.0)        /* Never rises or sets */
  921. X    return -1.0;
  922. X  if (cos_term > 1.0)        /* Never rises or sets */
  923. X    return -1.0;
  924. X
  925. X  H_0 = RAD_TO_DEG * acos(cos_term);
  926. X
  927. X  if (rise) H_0 *= -1.0;
  928. X
  929. X  hour = (H_0 + alpha - gmst0_degrees(jd0) - lon) / 1.00273790934 + zone*15.0;
  930. X
  931. X  hour = into_range(hour);
  932. X
  933. X  return (hour/15.0);
  934. X}
  935. X
  936. Xdouble sunrise(jd, lon, lat, zone, height, sun_data)
  937. X     double jd;
  938. X     double lon, lat, zone, height;
  939. X     sun_data_t sun_data;
  940. X{
  941. X  return risetime(TRUE, jd, -0.566666667, lat, lon, zone, height,
  942. X          sun_data.alpha, sun_data.delta);
  943. X}
  944. X
  945. Xdouble suntransit(jd, lon, lat, zone, height, sun_data)
  946. X     double jd;
  947. X     double lon, lat, zone, height;
  948. X     sun_data_t sun_data;
  949. X{
  950. X  double hour;
  951. X  double jd0;
  952. X
  953. X
  954. X  jd0 = ((long) (jd + 0.5001)) - .5; /* round to nearest midnight */
  955. X
  956. X  hour = (sun_data.alpha - gmst0_degrees(jd0) - lon) / 1.00273790934
  957. X    + zone*15.0;
  958. X  hour = into_range(hour);
  959. X
  960. X  return (hour/15.0);
  961. X}
  962. X
  963. Xdouble sunset(jd, lon, lat, zone, height, sun_data)
  964. X     double jd;
  965. X     double lon, lat, zone, height;
  966. X     sun_data_t sun_data;
  967. X{
  968. X  return risetime(FALSE, jd, -0.566666667, lat, lon, zone, height,
  969. X          sun_data.alpha, sun_data.delta);
  970. X}
  971. X
  972. X
  973. Xdouble morntwil(jd, lon, lat, zone, height, sun_data)
  974. X     double jd;
  975. X     double lon, lat, zone, height;
  976. X     sun_data_t sun_data;
  977. X{
  978. X  return risetime(TRUE, jd, -18.0, lat, lon, zone, height,
  979. X          sun_data.alpha, sun_data.delta);
  980. X}
  981. X
  982. X
  983. Xdouble evetwil(jd, lon, lat, zone, height, sun_data)
  984. X     double jd;
  985. X     double lon, lat, zone, height;
  986. X     sun_data_t sun_data;
  987. X{
  988. X  return risetime(FALSE, jd, -18.0, lat, lon, zone, height,
  989. X          sun_data.alpha, sun_data.delta);
  990. X}
  991. X
  992. X
  993. Xdouble moonrise(jd, lon, lat, zone, height, moon_data)
  994. X     double jd;
  995. X     double lon, lat, zone, height;
  996. X     moon_data_t moon_data;
  997. X{
  998. X  return risetime(TRUE, jd, -0.566666667, lat, lon, zone, height,
  999. X          moon_data.alpha, moon_data.delta);
  1000. X}
  1001. X
  1002. Xdouble moontransit(jd, lon, lat, zone, height, moon_data)
  1003. X     double jd;
  1004. X     double lon, lat, zone, height;
  1005. X     moon_data_t moon_data;
  1006. X{
  1007. X  double hour;
  1008. X  double jd0;
  1009. X
  1010. X
  1011. X  jd0 = ((long) (jd + 0.5001)) - .5; /* round to nearest midnight */
  1012. X
  1013. X  hour = (moon_data.alpha - gmst0_degrees(jd0) - lon) / 1.00273790934
  1014. X    + zone*15.0;
  1015. X  hour = into_range(hour);
  1016. X
  1017. X  return (hour/15.0);
  1018. X}
  1019. X
  1020. Xdouble moonset(jd, lon, lat, zone, height, moon_data)
  1021. X     double jd;
  1022. X     double lon, lat, zone, height;
  1023. X     moon_data_t moon_data;
  1024. X{
  1025. X  return risetime(FALSE, jd, -0.566666667, lat, lon, zone, height,
  1026. X          moon_data.alpha, moon_data.delta);
  1027. X}
  1028. X
  1029. Xdouble objrise(jd, lon, lat, zone, height, alpha, delta)
  1030. X     double jd, lon, lat, zone, height, alpha, delta;
  1031. X{
  1032. X  return risetime(TRUE, jd, -0.566666667, lat, lon, zone, height,
  1033. X          alpha, delta);
  1034. X}
  1035. X
  1036. Xdouble objrise20(jd, lon, lat, zone, height, alpha, delta)
  1037. X     double jd, lon, lat, zone, height, alpha, delta;
  1038. X{
  1039. X  return risetime(TRUE, jd, 20.0, lat, lon, zone, height, alpha, delta);
  1040. X}
  1041. X
  1042. Xdouble objrise30(jd, lon, lat, zone, height, alpha, delta)
  1043. X     double jd, lon, lat, zone, height, alpha, delta;
  1044. X{
  1045. X  return risetime(TRUE, jd, 30.0, lat, lon, zone, height, alpha, delta);
  1046. X}
  1047. X
  1048. Xdouble objtransit(jd, lon, lat, zone, height, alpha, delta)
  1049. X     double jd, lon, lat, zone, height, alpha, delta;
  1050. X{
  1051. X  double hour;
  1052. X  double jd0;
  1053. X
  1054. X
  1055. X  jd0 = ((long) (jd + 0.5001)) - .5; /* round to nearest midnight */
  1056. X
  1057. X  hour = (alpha - gmst0_degrees(jd0) - lon) / 1.00273790934 + zone*15.0;
  1058. X
  1059. X  hour = into_range(hour);
  1060. X
  1061. X  return (hour/15.0);
  1062. X}
  1063. X
  1064. Xdouble objset30(jd, lon, lat, zone, height, alpha, delta)
  1065. X     double jd, lon, lat, zone, height, alpha, delta;
  1066. X{
  1067. X  return risetime(FALSE, jd, 30.0, lat, lon, zone, height, alpha, delta);
  1068. X}
  1069. X
  1070. Xdouble objset20(jd, lon, lat, zone, height, alpha, delta)
  1071. X     double jd, lon, lat, zone, height, alpha, delta;
  1072. X{
  1073. X  return risetime(FALSE, jd, 20.0, lat, lon, zone, height, alpha, delta);
  1074. X}
  1075. X
  1076. Xdouble objset(jd, lon, lat, zone, height, alpha, delta)
  1077. X     double jd, lon, lat, zone, height, alpha, delta;
  1078. X{
  1079. X  return risetime(FALSE, jd, -0.566666667, lat, lon, zone, height,
  1080. X          alpha, delta);
  1081. X}
  1082. X
  1083. X
  1084. END_OF_FILE
  1085. if test 5175 -ne `wc -c <'observe/riseset.c'`; then
  1086.     echo shar: \"'observe/riseset.c'\" unpacked with wrong size!
  1087. fi
  1088. # end of 'observe/riseset.c'
  1089. fi
  1090. if test -f 'starchart/parse_input.c' -a "${1}" != "-c" ; then 
  1091.   echo shar: Will not clobber existing file \"'starchart/parse_input.c'\"
  1092. else
  1093. echo shar: Extracting \"'starchart/parse_input.c'\" \(5244 characters\)
  1094. sed "s/^X//" >'starchart/parse_input.c' <<'END_OF_FILE'
  1095. X/*
  1096. X * Parse .rc file and interactive input
  1097. X *
  1098. X * Copyright (c) 1990 by Craig Counterman. All rights reserved.
  1099. X *
  1100. X * This software may be redistributed freely, not sold.
  1101. X * This copyright notice and disclaimer of warranty must remain
  1102. X *    unchanged. 
  1103. X *
  1104. X * No representation is made about the suitability of this
  1105. X * software for any purpose.  It is provided "as is" without express or
  1106. X * implied warranty, to the extent permitted by applicable law.
  1107. X *
  1108. X */
  1109. X
  1110. X
  1111. X
  1112. Xstatic char rcsid[]="$Header: parse_input.c,v 1.5 90/02/19 17:52:54 ccount Exp $";
  1113. X
  1114. X#include <ctype.h>
  1115. X#include "star3.h"
  1116. X#define PARSE_INPUT
  1117. X#include "parse_input.h"
  1118. X  
  1119. X#define LINELEN 81
  1120. X
  1121. Xstatic char var_name[LINELEN];
  1122. X
  1123. X/* Parse input line, return data from keyword map in pointers,
  1124. X   c_buf is always set to the string after the = if any,
  1125. X   otherwise c_buf = v_name
  1126. X   return value is TRUE if valid input, FALSE if not.
  1127. X   validity of input is determined by the variable_type field in keyword_map
  1128. X   if the string can be parsed as that type, return TRUE */
  1129. Xint parse_line(sbuf, v_name, r_code, var_type, c_buf, f_buf, i_buf, l_buf)
  1130. X     char *sbuf;
  1131. X     char **v_name;
  1132. X     int *r_code;
  1133. X     int *var_type;
  1134. X     char **c_buf;        /* parsed as character string */
  1135. X     double *f_buf;        /* parsed as double */
  1136. X     int *i_buf;        /* parsed as integer */
  1137. X     int *l_buf;        /* parsed as logical (TRUE or FALSE) */
  1138. X{
  1139. X  char *cp;
  1140. X  char tbuf1[LINELEN];
  1141. X  int i;
  1142. X  int i_flag, f_flag, l_flag;    /* parsing successful */
  1143. X
  1144. X  /* remove trailing \n */
  1145. X  i = strlen(sbuf);
  1146. X  if (sbuf[i-1] == '\n') sbuf[i-1] = '\0';
  1147. X
  1148. X  /* eliminate comments */
  1149. X  for (i=0; ((i <= LINELEN) && (sbuf[i])); i++)
  1150. X    if (sbuf[i] == '#') sbuf[i] = '\0';
  1151. X  
  1152. X  /* Convert "var_name=value" to "var_name value" */
  1153. X  for (i=0; ((i <= LINELEN) && (sbuf[i])); i++)
  1154. X      if (sbuf[i] == '=') sbuf[i] = ' ';
  1155. X  sbuf[i] = '\0';    
  1156. X  
  1157. X  /* scan variable name, value */
  1158. X  /* everything to first space is var_name */
  1159. X  for (i=0; ((i<=LINELEN) && (sbuf[i] != ' ') && (sbuf[i] != '\t')
  1160. X         && (sbuf[i])); i++)
  1161. X    var_name[i] = sbuf[i];
  1162. X  var_name[i++] = '\0';
  1163. X
  1164. X  /* everything after is value, put in cp */
  1165. X  if (var_name[0]) cp = &sbuf[i];
  1166. X  else cp = var_name;
  1167. X
  1168. X  /* Remove leading and trailing spaces, newlines and tabs from cp */
  1169. X  while ((cp[0] == ' ') || (cp[0] == '\t')) cp++;
  1170. X  for (i = strlen(cp) - 1;  ((i >= 0) && ((cp[i] == ' ') || (cp[i] == '\t')));
  1171. X       i--);
  1172. X  if (i != 0) cp[i+1] = '\0';
  1173. X
  1174. X
  1175. X  /* lowercase var_name */
  1176. X  for (i = 0; var_name[i]; i++)
  1177. X    if (isupper(var_name[i]))
  1178. X      var_name[i] = tolower(var_name[i]);
  1179. X  
  1180. X  
  1181. X  
  1182. X  /* variable value may be a string, double, integer, or logical value */
  1183. X  f_flag = (sscanf(sbuf,"%*s%lf", f_buf) == 1);
  1184. X  i_flag = (sscanf(sbuf,"%*s%d", i_buf) == 1);
  1185. X  if (i_flag) {
  1186. X    l_flag = TRUE;
  1187. X    *l_buf = ((*i_buf == 0) ? FALSE : TRUE);
  1188. X  } else {
  1189. X    l_flag = FALSE;
  1190. X  };
  1191. X
  1192. X  i = 0;
  1193. X  while (tbuf1[i] = cp[i]) i++;
  1194. X  /* lowercase tbuf1 */
  1195. X  for (i = 0; tbuf1[i]; i++)
  1196. X    if (isupper(tbuf1[i]))
  1197. X      tbuf1[i] = tolower(tbuf1[i]);
  1198. X
  1199. X  if ((!strcmp(tbuf1,"true"))  || (!strcmp(tbuf1,"on"))) {
  1200. X    l_flag = TRUE;
  1201. X    *l_buf = TRUE;
  1202. X  } else if ((!strcmp(tbuf1,"false")) || (!strcmp(tbuf1,"off"))) {
  1203. X    l_flag = TRUE;
  1204. X    *l_buf = FALSE;
  1205. X  }
  1206. X  *v_name = var_name;
  1207. X  *c_buf = cp;
  1208. X
  1209. X  /* Check validity, may be blank line */
  1210. X  if ((var_name[0] == 0) && (cp[0] == 0)) {
  1211. X    *r_code = R_NONE;
  1212. X    *var_type = V_NONE;
  1213. X    return TRUE;
  1214. X  }
  1215. X  
  1216. X  i = 0;
  1217. X  while (keyword_map[i].word[0]) {
  1218. X    if (!strcmp(var_name, keyword_map[i].word)) {
  1219. X      *r_code = keyword_map[i].return_code;
  1220. X      switch (keyword_map[i].variable_type) {
  1221. X      case V_NONE:
  1222. X    *c_buf = var_name;
  1223. X    return TRUE;
  1224. X    break;
  1225. X      case V_CHAR:
  1226. X    return TRUE;
  1227. X    break;
  1228. X      case V_FLOAT:
  1229. X    return f_flag;
  1230. X    break;
  1231. X      case V_INT:
  1232. X    return i_flag;
  1233. X    break;
  1234. X      case V_BOOL:
  1235. X    return l_flag;
  1236. X    break;
  1237. X      default:
  1238. X    return FALSE;
  1239. X      };
  1240. X    }
  1241. X    i++;
  1242. X  }
  1243. X
  1244. X  return FALSE;
  1245. X}
  1246. X
  1247. X
  1248. Xstatic char *tr_vtype(v_ty)
  1249. Xint v_ty;
  1250. X{
  1251. X  switch (v_ty) {
  1252. X  case V_NONE:
  1253. X    return " (keyword)";
  1254. X    break;
  1255. X  case V_CHAR:
  1256. X    return " = string";
  1257. X  case V_FLOAT:
  1258. X    return " = floating point (e.g. 3.14 or 6e23)";
  1259. X  case V_INT:
  1260. X    return " = integer";
  1261. X  case V_BOOL:
  1262. X    return " = boolean (e.g. 1 or false or off)";
  1263. X  default:
  1264. X    return "";
  1265. X  }
  1266. X}
  1267. X
  1268. X/* send to stdout the keyword_map table */
  1269. Xhelp_vars(word)
  1270. Xchar *word;
  1271. X{
  1272. X  int i;
  1273. X
  1274. X
  1275. X  printf("Word = Expected value type\n");
  1276. X
  1277. X  if (word[0]) {
  1278. X    i = 0;
  1279. X    while (keyword_map[i].word[0]) {
  1280. X      if (!strcmp(word, keyword_map[i].word)) {
  1281. X    if (keyword_map[i].synonym[0])
  1282. X      printf("%-20s: synonym for %s\n", word, keyword_map[i].synonym);
  1283. X    else
  1284. X      if (keyword_map[i].doc[0])
  1285. X        printf("%-20s%s\n", word, keyword_map[i].doc);
  1286. X      else
  1287. X        printf("%-20s%s\n", word, tr_vtype(keyword_map[i].variable_type));
  1288. X    return;
  1289. X      }
  1290. X      i++;
  1291. X    };
  1292. X    printf("%-20s is not a valid keyword\n", word);
  1293. X  } else {
  1294. X    i = 0;
  1295. X    while (keyword_map[i].word[0]) {
  1296. X    if (keyword_map[i].synonym[0])
  1297. X      printf("%-20s: synonym for %s\n", keyword_map[i].word,
  1298. X         keyword_map[i].synonym);
  1299. X    else
  1300. X      if (keyword_map[i].doc[0])
  1301. X        printf("%-20s%s\n", keyword_map[i].word, keyword_map[i].doc);
  1302. X      else
  1303. X        printf("%-20s%s\n", keyword_map[i].word,
  1304. X           tr_vtype(keyword_map[i].variable_type));
  1305. X      i++;
  1306. X    }
  1307. X  }
  1308. X}
  1309. X
  1310. END_OF_FILE
  1311. if test 5244 -ne `wc -c <'starchart/parse_input.c'`; then
  1312.     echo shar: \"'starchart/parse_input.c'\" unpacked with wrong size!
  1313. fi
  1314. # end of 'starchart/parse_input.c'
  1315. fi
  1316. if test -f 'starchart/parse_input.h' -a "${1}" != "-c" ; then 
  1317.   echo shar: Will not clobber existing file \"'starchart/parse_input.h'\"
  1318. else
  1319. echo shar: Extracting \"'starchart/parse_input.h'\" \(5360 characters\)
  1320. sed "s/^X//" >'starchart/parse_input.h' <<'END_OF_FILE'
  1321. X/* Header for parse input */
  1322. X/*
  1323. X *
  1324. X * $Header: parse_input.h,v 1.3 90/01/10 02:06:52 ccount Exp $
  1325. X * 
  1326. X*/
  1327. X/* Variable setting */
  1328. X
  1329. X/* RETURN CODES */
  1330. X#define TINT 1000
  1331. X#define TFLO 1001
  1332. X#define TBOOL 1002
  1333. X#define TNONE 1003
  1334. X#define TCHAR 1004
  1335. X#define TREPORT 1005
  1336. X
  1337. X#define EXIT 101
  1338. X#define END_INPUT 103
  1339. X#define HELP_ME 104
  1340. X#define SHOW_ME 105
  1341. X#define WRITE_RC_FILE 110
  1342. X
  1343. X#define R_NONE 0
  1344. X#define R_RA 1
  1345. X#define R_DEC 2
  1346. X#define R_SCALE 3
  1347. X#define R_NAMELIM 4
  1348. X#define R_MAGLIM 5
  1349. X#define R_GKLIM 6
  1350. X#define R_TITLE 7
  1351. X#define R_STARFILE 8
  1352. X#define R_INDEXFILE 9
  1353. X#define R_NEBFILE 10
  1354. X#define R_PLANETFILE 11
  1355. X#define R_USERFILE 12
  1356. X#define R_MAPFILE 13
  1357. X#define R_CONSTFILE 14
  1358. X#define R_FINDCONST 15
  1359. X#define R_BOUNDFILE 16
  1360. X#define R_PATTERNFILE 17
  1361. X#define R_CONSTLNAMEFILE 18
  1362. X#define R_LAYERS 19
  1363. X#define R_POLARMODE 20
  1364. X#define R_BIGFLAG 21
  1365. X#define R_PROJECTION_MODE 22
  1366. X#define R_INVERT 23
  1367. X#define R_CHART_TYPE 24
  1368. X#define R_VRANGE 25
  1369. X#define R_VMAGS 26
  1370. X#define R_GRID 27
  1371. X#define R_NOGRID 28
  1372. X#define R_NOGRID_RA 29
  1373. X#define R_NOGRID_DEC 30
  1374. X#define R_NOMAGLBLS 31
  1375. X#define R_DRIVER_CONTROL 32
  1376. X#define R_WRITE_MAPWIN_FILE 33
  1377. X#define R_READ_MAPWIN_FILE 34
  1378. X#define R_PRECESS_TO 35
  1379. X
  1380. X/* VARIABLE TYPES */
  1381. X#define V_NONE 0
  1382. X#define V_CHAR 1
  1383. X#define V_FLOAT 2
  1384. X#define V_INT 3
  1385. X#define V_BOOL 4
  1386. X
  1387. Xtypedef struct {
  1388. X  char *word;
  1389. X  int return_code;
  1390. X  int variable_type;
  1391. X  char *synonym;
  1392. X  char *doc;
  1393. X} keyword;
  1394. X
  1395. X#ifdef PARSE_INPUT
  1396. Xkeyword keyword_map[] =
  1397. X{
  1398. X/*
  1399. X  {"int", TINT, V_INT, "", ""},
  1400. X  {"bool", TBOOL, V_BOOL, "", "Test doc string"},
  1401. X  {"none", TNONE, V_NONE, "", ""},
  1402. X  {"flo", TFLO, V_FLOAT, "", ""},
  1403. X  {"char", TCHAR, V_CHAR, "", ""},
  1404. X*/
  1405. X  {"exit", EXIT, V_NONE, "", "Exit the program"},
  1406. X  {"quit", EXIT, V_NONE, "exit", ""},
  1407. X  {"end_input", END_INPUT, V_NONE, "", "End input, display chart"},
  1408. X  {"done_input", END_INPUT, V_NONE, "end_input", ""},
  1409. X  {"done", END_INPUT, V_NONE, "end_input", ""},
  1410. X  {"draw", END_INPUT, V_NONE, "end_input", ""},
  1411. X  {"help", HELP_ME, V_NONE, "", ""},
  1412. X  {"?", HELP_ME, V_NONE, "help", ""},
  1413. X  {"show", SHOW_ME, V_NONE, "", ""},
  1414. X  {"ra", R_RA, V_FLOAT, "", "Right Ascension of center of map"},
  1415. X  {"dec", R_DEC, V_FLOAT, "", "Declination of center of map"},
  1416. X  {"scale", R_SCALE, V_FLOAT, "", "Scale of center of map"},
  1417. X  {"title", R_TITLE, V_CHAR, "", "Title of chart"},
  1418. X  {"findconst", R_FINDCONST, V_CHAR, "",
  1419. X     "Constellation, specification in constfile"},
  1420. X  {"constfile", R_CONSTFILE, V_CHAR, "",
  1421. X     "Filename for constellation location"},
  1422. X  {"namelim", R_NAMELIM, V_FLOAT, "", "Limiting magnitude for object names"},
  1423. X  {"lbllim", R_NAMELIM, V_FLOAT, "namelim", ""},
  1424. X  {"gklim", R_GKLIM, V_FLOAT, "", "Limiting magnitude for object label"},
  1425. X  {"maglim", R_MAGLIM, V_FLOAT, "", "Limiting magnitude for object"},
  1426. X  {"starfile", R_STARFILE, V_CHAR, "", "Filename for stars"},
  1427. X  {"indexfile", R_INDEXFILE, V_CHAR, "", "Filename for SAO stars"},
  1428. X  {"nebfile", R_NEBFILE, V_CHAR, "", "Filename for nebulae"},
  1429. X  {"planetfile", R_PLANETFILE, V_CHAR, "", "Filename for planets"},
  1430. X  {"userfile", R_USERFILE, V_CHAR, "", "Filename for user file"},
  1431. X  {"mapfile", R_MAPFILE, V_CHAR, "",
  1432. X     "Filenames for files to replaces starfile etc."},
  1433. X  {"boundfile", R_BOUNDFILE, V_CHAR, "",
  1434. X     "Filename for constellation boundaries"},
  1435. X  {"patternfile", R_PATTERNFILE, V_CHAR, "",
  1436. X     "Filename for constellation patterns"},
  1437. X  {"constlnamefile", R_CONSTLNAMEFILE, V_CHAR, "",
  1438. X     "Filename for constellation names"},
  1439. X  {"layers", R_LAYERS, V_CHAR, "",
  1440. X     "Order for layers drawn in each window of the chart"},
  1441. X  {"all_layer", R_LAYERS, V_CHAR, "layers", ""},
  1442. X  {"polarmode", R_POLARMODE, V_BOOL, "", "Use stereographic projection"},
  1443. X  {"projection_mode", R_PROJECTION_MODE, V_CHAR, "",
  1444. X     "Projection mode (sansons, stereographic, gnomonic, etc."},
  1445. X  {"invert", R_INVERT, V_BOOL, "", "Flip north and south"},
  1446. X  {"precess_to", R_PRECESS_TO, V_FLOAT, "",
  1447. X     "Precess to equinox and ecliptic of year."},
  1448. X  {"bigflag", R_BIGFLAG, V_BOOL, "", "Chart contains one large window"},
  1449. X  {"chart_type", R_CHART_TYPE, V_CHAR, "",
  1450. X     "fullpage for one large window, threepart for thumbscale map\n\
  1451. X\t\t\t\tand legend"},
  1452. X  {"vrange", R_VRANGE, V_FLOAT, "",
  1453. X     "label stars with magnitudes if in range"},
  1454. X  {"vmags", R_VMAGS, V_FLOAT, "",
  1455. X     "label stars with magnitudes if within (arg2) of (arg1)"},
  1456. X  {"grid", R_GRID, V_FLOAT, "",
  1457. X     "draw grid: grid ra_space dec_space [ra_start] [dec_start]"},
  1458. X  {"nogrid", R_NOGRID, V_BOOL, "", "Don't draw grids"},
  1459. X  {"nogrid_ra", R_NOGRID_RA, V_BOOL, "", "Don't draw grid in R.A."},
  1460. X  {"nogrid_dec", R_NOGRID_DEC, V_BOOL, "", "Don't draw grid in dec."},
  1461. X  {"nomaglbls", R_NOMAGLBLS, V_BOOL, "", "Don't label stars with magnitudes"},
  1462. X  {"driver_control", R_DRIVER_CONTROL, V_CHAR, "",
  1463. X     "special control string for device driver"},
  1464. X  {"drivercontrol", R_DRIVER_CONTROL, V_CHAR, "driver_control", ""},
  1465. X  {"additional", R_DRIVER_CONTROL, V_CHAR, "driver_control", ""},
  1466. X  {"write_rc_file", WRITE_RC_FILE, V_CHAR, "",
  1467. X     "Write current state to .starrc file"},
  1468. X  {"write_mapwin_file", R_WRITE_MAPWIN_FILE, V_CHAR, "",
  1469. X     "write detailed specification of chart to given filename"},
  1470. X  {"read_mapwin_file", R_READ_MAPWIN_FILE, V_CHAR, "",
  1471. X     "read detailed specification of chart from given filename"},
  1472. X/*  {"report", R_REPORT, V_NONE, "", ""},*/
  1473. X  {"", R_NONE, V_NONE, "", ""}
  1474. X};
  1475. X
  1476. X/* longest word  17 characters */
  1477. X#endif
  1478. END_OF_FILE
  1479. if test 5360 -ne `wc -c <'starchart/parse_input.h'`; then
  1480.     echo shar: \"'starchart/parse_input.h'\" unpacked with wrong size!
  1481. fi
  1482. # end of 'starchart/parse_input.h'
  1483. fi
  1484. if test -f 'starchart/star3.h' -a "${1}" != "-c" ; then 
  1485.   echo shar: Will not clobber existing file \"'starchart/star3.h'\"
  1486. else
  1487. echo shar: Extracting \"'starchart/star3.h'\" \(5818 characters\)
  1488. sed "s/^X//" >'starchart/star3.h' <<'END_OF_FILE'
  1489. X/* Header for starchart 3.x */
  1490. X/*
  1491. X * 
  1492. X * $Header: star3.h,v 2.8 90/02/19 17:58:03 ccount Exp $
  1493. X *
  1494. X*/
  1495. X/*
  1496. X *
  1497. X * Copyright (c) 1990 by Craig Counterman. All rights reserved.
  1498. X *
  1499. X * This software may be redistributed freely, not sold.
  1500. X * This copyright notice and disclaimer of warranty must remain
  1501. X *    unchanged. 
  1502. X *
  1503. X * No representation is made about the suitability of this
  1504. X * software for any purpose.  It is provided "as is" without express or
  1505. X * implied warranty, to the extent permitted by applicable law.
  1506. X *
  1507. X * DISCLAIMER OF WARRANTY
  1508. X * ----------------------
  1509. X * The author  disclaims all warranties  with regard to  this software to
  1510. X * the   extent  permitted  by applicable   law,  including all   implied
  1511. X * warranties  of merchantability  and  fitness. In  no event shall   the
  1512. X * author be liable for any special, indirect or consequential damages or
  1513. X * any  damages whatsoever resulting from  loss of use, data or  profits,
  1514. X * whether in an action of contract, negligence or other tortious action,
  1515. X * arising  out of  or in connection with the  use or performance of this
  1516. X * software.
  1517. X *
  1518. X */
  1519. X
  1520. X
  1521. X#define FALSE 0
  1522. X#define TRUE 1
  1523. X
  1524. X#ifdef MSDOS
  1525. X#include "pcstar.h"
  1526. X#endif
  1527. X
  1528. X/* Line Styles */
  1529. X/* SOLID is defined for HP's, maybe some others. */
  1530. X#ifndef SOLID
  1531. X#define SOLID 1
  1532. X#define DOTTED 2
  1533. X#define DASHED 3
  1534. X#define VECSOLID 4
  1535. X#define VECDOT 5
  1536. X#define VECDASH 6
  1537. X#define MAXSTLNS 7
  1538. X#define CURNTSTY 100
  1539. X#else
  1540. X#define DOTTED 2
  1541. X#define DASHED 3
  1542. X#define VECSOLID 4
  1543. X#define VECDOT 5
  1544. X#define VECDASH 6
  1545. X#define MAXSTLNS 7
  1546. X#define CURNTSTY 100
  1547. X#endif
  1548. X
  1549. X/* Functions */
  1550. X#define CHRTOUTLN 1
  1551. X#define CHRTHTICK 2
  1552. X#define CHRTVTICK 3
  1553. X#define GRID_RA 4
  1554. X#define GRID_DEC 5
  1555. X#define ECLIPT 6
  1556. X#define CONSTBOUND 7
  1557. X#define CONSTPATTRN 8
  1558. X#define CONSTNAME 9
  1559. X#define CHARTFILE 10
  1560. X
  1561. X
  1562. X/* Fonts */
  1563. X#define CURNTFONT 100
  1564. X#define TIMESROMAN 10
  1565. X#define TIMESBOLD 11
  1566. X#define TIMESITAL 12
  1567. X#define TIMESBOLDITAL 13
  1568. X#define HELV 20
  1569. X#define HELVBOLD 21
  1570. X#define HELVITAL 22
  1571. X#define HELVBOLDITAL 23
  1572. X#define COURIER 30
  1573. X#define COURBOLD 31
  1574. X#define COURITAL 32
  1575. X#define COURITALBOLD 33
  1576. X
  1577. X#define NAMESIZE 10
  1578. X
  1579. X/* Chart types */
  1580. X#define THREEPART 1
  1581. X#define FULLPAGE 2
  1582. X#define OTHERTYPE 3
  1583. X
  1584. X/* Inverse Chart types */
  1585. Xstatic char *inv_ctypes[] = {
  1586. X  "none",
  1587. X  "threepart",
  1588. X  "fullpage",
  1589. X  "none"
  1590. X  };
  1591. X
  1592. X
  1593. X/* File types */
  1594. X#define LINEREAD 1
  1595. X#define INDEXTYPE 2
  1596. X#define BINFULL 3
  1597. X#define BINOBJ 4
  1598. X#define BINSTAR 5
  1599. X#define SAOFORMAT 6
  1600. X#define GSCTYPE 7
  1601. X
  1602. X/* inverse file types */
  1603. Xstatic char *inv_ftypes[] = {
  1604. X  "none",
  1605. X  "lineread",
  1606. X  "indextype",
  1607. X  "binfull",
  1608. X  "binobj",
  1609. X  "binstar",
  1610. X  "saoformat",
  1611. X  "gsc"
  1612. X  };
  1613. X
  1614. X/* Projection Modes */
  1615. X#define SANSONS 1
  1616. X#define STEREOGR 2
  1617. X#define GNOMONIC 3
  1618. X#define ORTHOGR 4
  1619. X#define RECTANGULAR 5
  1620. X#define OTHERPROJ 6
  1621. X
  1622. X/* inverse projection mode */
  1623. Xstatic char *inv_projs[] = {
  1624. X  "",
  1625. X  "sansons",
  1626. X  "stereogr",
  1627. X  "gnomonic",
  1628. X  "orthogr",
  1629. X  "rectangular",
  1630. X  "otherproj"
  1631. X  };
  1632. X
  1633. X/* map types */
  1634. X#define MAINMAP 0
  1635. X#define FULLPAGEMAP 1
  1636. X#define THUMBNAIL 2
  1637. X
  1638. X/* Layers */
  1639. X#define OUTLINE 1
  1640. X#define RA_GRID 2
  1641. X#define DEC_GRID 3
  1642. X#define ECLIPTIC 4
  1643. X#define BOUNDARIES 5
  1644. X#define PATTERNS 6
  1645. X#define CONSTLNAMES 7
  1646. X#define ALLFILES 8
  1647. X#define ALLGLYPHS 9
  1648. X#define ALLNAMES 10
  1649. X#define ALLMAGLBLS 11
  1650. X#define ALLVECTORS 12
  1651. X#define ALLAREAS 13
  1652. X#define LEGENDS    14
  1653. X#define SKIP 0
  1654. X
  1655. X/* inverse layers types */
  1656. Xstatic char *inv_layrs[] = {
  1657. X  "skip",
  1658. X  "outline",
  1659. X  "ra_grid",
  1660. X  "dec_grid",
  1661. X  "ecliptic",
  1662. X  "boundaries",
  1663. X  "patterns",
  1664. X  "constlnames",
  1665. X  "allfiles",
  1666. X  "allglyphs",
  1667. X  "allnames",
  1668. X  "allmaglbls",
  1669. X  "allvectors",
  1670. X  "allareas",
  1671. X  "legends"
  1672. X  };
  1673. X
  1674. X
  1675. X/* Order of standard files in mapfiles */
  1676. X#define YALEF 0
  1677. X#define INDXF 1
  1678. X#define NEBF 2
  1679. X#define PLANF 3
  1680. X#define NUMFS 4
  1681. X
  1682. X#define MAXLAYRS 20
  1683. X
  1684. X#define MAXUFILES 10                /* Maximum number of user supplied files */
  1685. X#define MAXMAPFILES (MAXUFILES+NUMFS) /* Maximum total number of files
  1686. X                     user + standard */
  1687. X
  1688. Xtypedef struct {
  1689. X  char *name;                /* file name */
  1690. X  int type;                /* file type */
  1691. X  double maglim, lbllim, gklim;        /* limiting mag for glyph, name,
  1692. X                       lable */
  1693. X  int draw_maglbl;            /* Label with the magnitude */
  1694. X  double maglmin, maglmax;        /* Minimum and maximum mag to be labeled */
  1695. X} datafile;
  1696. X
  1697. X/* The variables in the first few lines MUST be set by driver */
  1698. Xtypedef struct {
  1699. X  int width, height, x_offset, y_offset; /* Size and position,
  1700. X                        in integer device coords */
  1701. X  double maglim, lbllim, gklim;        /* default limiting mag for glyph, name,
  1702. X                       and lable for files */
  1703. X
  1704. X/* The next several variables SHOULD be set by the driver,
  1705. X   but are only used by the driver */
  1706. X  int map_type;                /* Type of map: THUMBNAIL may have
  1707. X                       some restrictions */
  1708. X  int tag;                /* May be used by driver for whatever */
  1709. X  char *tag_field;            /* May be used by driver for whatever */
  1710. X
  1711. X/* The next several variables may be set by the driver, but the main routines
  1712. X   may reset them (and the driver routines may then override that) */
  1713. X  int proj_mode;            /* Projection mode for this map */
  1714. X  int draw_ragrid, draw_decgrid;    /* Draw grids */
  1715. X  double ra_step, dec_step;        /* grid step size */
  1716. X  double ra_strt, dec_strt;        /* grid origin */
  1717. X
  1718. X  int invert;                /* Invert (flip north south) */
  1719. X
  1720. X/* The following are set by the main routines */
  1721. X  double racen, dlcen, scale;        /* R.A. and decl. of center,
  1722. X                       scale in degrees */
  1723. X  double c_scale;            /* One second of arc
  1724. X                       in display units */
  1725. X  int layer[MAXLAYRS];            /* layer order */
  1726. X  int nlayers;                /* number of layers */
  1727. X  datafile file[MAXMAPFILES];        /* files in this map and their controls */
  1728. X  int numfiles;                /* number of files */
  1729. X} mapwindow;
  1730. X#define MAXWINDOWS 10
  1731. X
  1732. X
  1733. Xdouble modup(), moddown();
  1734. Xdouble ftod(), dtof(), htod();
  1735. Xlong size_obj();
  1736. X
  1737. X/* declared here for VMS and pure-ANSI systems (declared in stdlib.h there) */
  1738. Xdouble atof();
  1739. X
  1740. X
  1741. END_OF_FILE
  1742. if test 5818 -ne `wc -c <'starchart/star3.h'`; then
  1743.     echo shar: \"'starchart/star3.h'\" unpacked with wrong size!
  1744. fi
  1745. # end of 'starchart/star3.h'
  1746. fi
  1747. echo shar: End of archive 4 \(of 32\).
  1748. cp /dev/null ark4isdone
  1749. MISSING=""
  1750. 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
  1751.     if test ! -f ark${I}isdone ; then
  1752.     MISSING="${MISSING} ${I}"
  1753.     fi
  1754. done
  1755. if test "${MISSING}" = "" ; then
  1756.     echo You have unpacked all 32 archives.
  1757.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1758. else
  1759.     echo You still need to unpack the following archives:
  1760.     echo "        " ${MISSING}
  1761. fi
  1762. ##  End of shell archive.
  1763. exit 0
  1764.  
  1765.