home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume30 / astrolog / part01 / data.c < prev    next >
C/C++ Source or Header  |  1992-06-19  |  27KB  |  768 lines

  1. /*
  2. ** Astrolog (Version 2.25) File: data.c
  3. **
  4. ** IMPORTANT: The planetary calculation routines used in this program
  5. ** have been Copyrighted and the core of this program is basically a
  6. ** conversion to C of the routines created by James Neely as listed in
  7. ** Michael Erlewine's 'Manual of Computer Programming for Astrologers',
  8. ** available from Matrix Software. The copyright gives us permission to
  9. ** use the routines for our own purposes but not to sell them or profit
  10. ** from them in any way.
  11. **
  12. ** IN ADDITION: the graphics database and chart display routines used in
  13. ** this program are Copyright (C) 1991-1992 by Walter D. Pullen. Permission
  14. ** is granted to freely use and distribute these routines provided one
  15. ** doesn't sell, restrict, or profit from them in any way. Modification
  16. ** is allowed provided these notices remain with any altered or edited
  17. ** versions of the program.
  18. */
  19.  
  20. #include "astrolog.h"
  21.  
  22. /*
  23. *******************************************************************************
  24. ** Global variables
  25. *******************************************************************************
  26. */
  27.  
  28. FILE *data;
  29. char *filename, *filename2;
  30.  
  31. int total    = TOTAL;
  32. int objects  = OBJECTS;
  33. int stars    = STARS;
  34. int aspects  = 5;
  35. int universe = FALSE;
  36. int siderial = FALSE;
  37. int right    = FALSE;
  38. int centerplanet   = 1;
  39. int todisplay      = 0;
  40. int housesystem    = DEFAULT_SYSTEM;
  41. int cusp           = FALSE;
  42. int uranian        = FALSE;
  43. int multiplyfactor = 1;
  44. int onasc     = 0;
  45. int flip      = FALSE;
  46. int decan     = FALSE;
  47. int geodetic  = FALSE;
  48. int graphstep = 5;
  49. int progress  = FALSE;
  50. int autom     = FALSE;
  51. int relation  = FALSE;
  52. int operation = 0;
  53. double progday = 365.25;
  54. double defzone = DEFAULT_ZONE;
  55. double deflong = DEFAULT_LONG;
  56. double deflat  = DEFAULT_LAT;
  57. double modulus = DEGREES;
  58.  
  59. double SD = 0.0, Mon, Day, Yea, Tim, Zon, Lon, Lat, Mon2, Yea2, Delta = 0.0,
  60.   M = 11.0, D = 19.0, Y = 1971.0, F = 11.01, X = 8.0, L5 = 122.20, LA = 47.36,
  61.   T, JD, Jdp;
  62.  
  63. double planet[TOTAL+1], planetalt[TOTAL+1], house[SIGNS+1], ret[TOTAL+1],
  64.   spacex[BASE+1], spacey[BASE+1], spacez[BASE+1];
  65. int inhouse[TOTAL+1], grid[TOTAL+1][TOTAL+1],
  66.   gridname[TOTAL+1][TOTAL+1], wheel[SIGNS][WHEELROWS],
  67.   inhouse1[TOTAL+1], inhouse2[TOTAL+1], starname[STARS+1];
  68. int ignore[TOTAL+1]
  69.   = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,                /* Planets  */
  70. #ifdef ASTEROIDS
  71.      0, 0, 0, 0, 0, 0, 0, 0, 0, 0,                   /* Minors   */
  72. #else
  73.      1, 1, 1, 1, 1, 0, 1, 0, 0, 1,
  74. #endif
  75.      0, 0, 0, 0,                                     /* Cusps    */
  76.      0, 0, 0, 0, 0, 0, 0, 0,                         /* Uranians */
  77.      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  /* Stars    */
  78.      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  79.  
  80.  
  81. /*
  82. *******************************************************************************
  83. ** Table data
  84. *******************************************************************************
  85. */
  86.  
  87. char *signname[]
  88.   = {"???", "Aries", "Taurus", "Gemini", "Cancer",
  89.        "Leo", "Virgo", "Libra", "Scorpio",
  90.        "Sagittarius", "Capricorn", "Aquarius", "Pisces"};
  91.  
  92. char signabbrev[][3]
  93.   = {"??",
  94.        "Ar", "Ta", "Ge", "Cn", "Le", "Vi", "Li", "Sc", "Sg", "Cp", "Aq", "Pi"};
  95.  
  96. char objectname[][12]
  97.   = {"Earth", "Sun", "Moon", "Mercury", "Venus", "Mars",      /* Planets   */
  98.        "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto",
  99.        "Chiron", "Ceres", "Pallas", "Juno", "Vesta",          /* Asteroids */
  100.        "Node", "Fortune", "Midheaven", "Ascendant", "Vertex", /* Others    */
  101.        "11th Cusp", "12th Cusp", "2nd Cusp", "3rd Cusp",      /* Cusps     */
  102.        "Cupido", "Hades", "Zeus", "Kronos",                   /* Uranians  */
  103.        "Apollo", "Admetos", "Vulkanus", "Poseidon",
  104.  
  105.        "Achernar", "Polaris", "Zeta Retic.", "Pleiades",      /* Stars     */
  106.        "Aldebaran", "Capella", "Rigel", "Bellatrix", "Alnath",
  107.        "Orion", "Betelgeuse", "Menkalinan", "Murzim",
  108.        "Canopus", "Alhena", "Sirius", "Adara", "Wezen",
  109.        "Castor", "Procyon", "Pollux", "Suhail", "Avior",
  110.        "Miaplacidus", "Alphard", "Regulus", "Dubhe", "Acrux",
  111.        "Gacrux", "Becrux", "Alioth", "Spica", "Alkaid",
  112.        "Agena", "Arcturus", "Kentaurus", "Antares", "Shaula",
  113.        "Sargas", "Australis", "Vega", "Altair", "Peacock",
  114.        "Deneb", "Alnair", "Fomalhaut"};
  115.  
  116. char *systemname[]
  117.   = {"Placidus", "Koch", "Equal", "Campanus", "Meridian",
  118.        "Regiomontanus", "Porphyry", "Morinus", "Topocentric", "Null"};
  119.  
  120. char *aspectname[]
  121.   = {"???", "Conjunct", "Opposite", "Square", "Trine", "Sextile",
  122.        "Inconjunct", "Semisextile", "Semisquare", "Sesquiquadrate",
  123.        "Quintile", "Biquintile",
  124.        "Semiquintile", "Septile", "Novile",
  125.        "Binovile", "Biseptile", "Triseptile", "Quatronovile"};
  126.  
  127. char *aspectglyph[]
  128.  = {"???", "Circle with extending line", "Two circles joined by line",
  129.       "Quadrilateral", "Triangle", "Six pointed asterisk", "'K' rotated right",
  130.       "'K' rotated left", "Acute angle", "Square with extending lines",
  131.       "Letter 'Q'", "'+' over '-'", "'-' over '+'", "Number '7'", "Number '9'",
  132.       "'9' under Roman 'II'", "'7' under Roman 'II'", "'7' under Roman 'III'",
  133.       "'9' under Roman 'IV'"};
  134.  
  135. char aspectabbrev[][4]
  136.   = {"   ", "Con", "Opp", "Squ", "Tri", "Sex",
  137.        "Inc", "SSx", "SSq", "Ses", "Qui", "BQn",
  138.        "SQn", "Sep", "Nov", "BNv", "BSp", "TSp", "QNv"};
  139.  
  140. double aspectangle[ASPECTS+1]
  141.   = {0, 0.0, 180.0, 90.0, 120.0, 60.0, 150.0, 30.0, 45.0, 135.0, 72.0, 144.0,
  142.        36.0, DEGREES/7.0, 40.0, 80.0, 720.0/7.0, 1080.0/7.0, 160.0};
  143.  
  144. double aspectorb[ASPECTS+1]
  145.   = {0, 7.0, 7.0, 7.0, 7.0, 6.0, 3.0, 3.0, 3.0, 3.0, 2.0, 2.0,
  146.        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
  147.  
  148. int ruler1[OBJECTS+1]
  149.   = {0, 5, 4,  3,  7,  1,  9, 10, 11, 12, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  150. int ruler2[OBJECTS+1]
  151.   = {0, 0, 0,  6,  2,  8, 12, 11,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  152. int exalt[OBJECTS+1]
  153.   = {0, 1, 2, 11, 12, 10,  4,  7,  8,  9, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  154.  
  155. char *element[] = {"Fire", "Earth", "Air", "Water"};
  156. char *mode[] = {"Cardinal", "Fixed", "Mutuable"};
  157.  
  158. char post[][3]
  159.   = {"",
  160.        "st", "nd", "rd", "th", "th", "th", "th", "th", "th", "th", "th", "th"};
  161.  
  162. char *monthname[]
  163.   = {"", "January", "February", "March", "April", "May", "June", "July",
  164.        "August", "September", "October", "November", "December"};
  165.  
  166. #ifdef X11
  167. char *signdraw[] = {"",
  168.   "ND4HU2HLGDFBR6EUHLGD2G", "BL3D2F2R2E2U2H2NE2L2NH2G2",
  169.   "BLU3LHBR7GLNL3D6NL3RFBL7ERU3", "BGNDHLGDFRNEFR2EREBU3NHDGLHUENRHL2GLG",
  170.   "BF4H2UEU2H2L2G2D2FDGH", "BF4HNGNHEU5GHND5HGND6HGND6H",
  171.   "BGNL3HUER2FDGR3BD2L8", "BH4FND6EFND6EFD6FREU",
  172.   "BG4E3NH2NF2E5NL2D2", "BH3NLNUD3FND2EU2ENF2UFERFDGLF2D2G",
  173.   "BG4EUEDFDEUEDFDEUEBU5GDGUHUGDGUHUGDG", "NL4NR4BH4F2D4G2BR8H2U4E2"};
  174.  
  175. char *objectdraw[] = {"ND4NL4NR4U4LGLDGD2FDRFR2ERUEU2HULHL", /* Earth */
  176.   "U0BH3DGD2FDRFR2ERUEU2HULHL2GL", /* Sun */
  177.   "BG3E2U2H2ER2FRDFD2GDLGL2H", /* Moon */
  178.   "BD4UNL2NR2U2REU2HNEL2NHGD2FR", /* Mercury */
  179.   "LHU2ER2FD2GLD2NL2NR2D2", /* Venus */
  180.   "HLG2DF2RE2UHE4ND2L2", /* Mars */
  181.   "BH3RFDGDGDR5NDNR2U6E", /* Jupiter */
  182.   "BH3R2NUNR2D3ND3RERFDGDF", /* Saturn */
  183.   "BD4NEHURBFULU3NUNR2L2NU2DGBU5NFBR6GD3F", /* Uranus */
  184.   "BD4U2NL2NR2U5NUNRLBL2NUNLDF2R2E2UNRU", /* Neptune */
  185.   "D2NL2NR2D2BU8GFEHBL3D2F2R2E2U2", /* Pluto */
  186.   "BG2LDFEULU3NURFRFBU5GLGLU2", /* Chiron */
  187.   "BD4UNL3NR3U2RE2UH2L2G", /* Ceres */
  188.   "BD4UNL3NR3UE2HUHNUGDGF2", /* Pallas Athena */
  189.   "BD4UNL2NR2U4NL4NR4NE3NF3NG3NH3U3", /* Juno */
  190.   "BU4DBG3NLFDF2E2UERBH2GDGHUH", /* Vesta */
  191.   "BG2LGFEU2HU2E2R2F2D2GD2FEHL", /* North Node */
  192.   "NE2NF2NG2H2GD2F2R2E2U2H2L2G", /* Part of Fortune */
  193.   "BG4U8F4E4D8", /* Midheaven */
  194.   "NR4L4ND4UE3R2F3D5", /* Ascendant */
  195.   "U2NHNEBD4NGNFU2L2NHNGR4NEF" /* Vertex */};
  196.  
  197. char *housedraw[] = {"",
  198.   "BD2NLNRU4L", "BHBUR2D2L2D2R2", "BHBUR2D2NL2D2L2",
  199.   "BHBUD2R2NU2D2", "BEBUL2D2R2D2L2", "NLRD2L2U4R2",
  200.   "BHBUR2DG2D", "NRLU2R2D4L2U2", "NRLU2R2D4L2",
  201.   "BH2NLD4NLRBR2U4R2D4L2", "BH2NLD4NLRBR2RNRU4L", "BH2NLD4NLRBR2NR2U2R2U2L2"};
  202.  
  203. char *aspectdraw[] = {"",
  204.   "HLG2DF2RE2UHE4", "BGL2GDFREU2E2U2ERFDGL2", "BH4R8D8L8U8",
  205.   "BU4GDGDGDGDR8UHUHUHUH", "BLNH3NG3RNU4ND4RNE3F3",
  206.   "BG4EUEUEUEUNL4NR4BDFDFDFDF", "BH4FDFDFDFDNL4NR4BUEUEUEUE", "BE4G8R8",
  207.   "BD2L3U6R6D6L3D2R2", "F4BU3U2HULHL2GLDGD2FDRFR2E3", "BD2U3NR3NU3L3BD5R6",
  208.   "BU2D3NR3ND3L3BU5R6", "BH3R6G6", "BR3L5HUER4FD4GL4H",
  209.   "BF2UHL2GFR3DGL3BE6LNLU2NRLBL4LNLD2NLR", "BL2R4G4BE6LNLU2NRLBL4LNLD2NLR",
  210.   "BL2R4G4BE6L7NLU2NLR3ND2R3ND2R", "BF2UHL2GFR3DGL3BU6LNLU2NLRBR2F2E2"};
  211. #endif
  212.  
  213. double starbright[] = {0,
  214.   0.46,2.02,5.24,5.09,0.85,0.08,0.12,1.64,1.65,1.70,0.50,1.90,1.98,-0.72,1.93,
  215.   -1.46,1.50,1.84,1.59,0.38,1.14,1.78,1.86,1.68,1.98,1.35,1.79,1.58,1.63,1.25,
  216.   1.77,0.98,1.86,0.61,-0.04,-0.01,0.96,1.63,1.87,1.85,0.03,0.77,1.94,1.25,1.74,
  217.   1.16};
  218.  
  219. double stardata[] = {
  220.  1,37,42.9,-57,14,12,   2,31,50.5, 89,15,51,   3,17,46.1,-62,34,32,
  221.  3,49,11.1, 24, 8,12,   4,35,55.2, 16,30,33,   5,16,41.3, 45,59,53,
  222.  5,14,32.2, -8,12, 6,   5,25, 7.8,  6,20,59,   5,26,17.5, 28,36,27,
  223.  5,36,12.7, -1,12, 7,   5,55,10.3,  7,24,25,   5,59,31.7, 44,56,51,
  224.  6,22,41.9,-17,57,22,   6,23,57.2,-52,41,44,   6,37,42.7, 16,23,57,
  225.  6,45, 8.9,-16,42,58,   6,58,37.5,-28,58,20,   7, 8,23.4,-26,23,35,
  226.  7,34,35.9, 31,53,18,   7,39,18.1,  5,13,30,   7,45,18.9, 28, 1,34,
  227.  8, 9,31.9,-47,20,12,   8,22,30.8,-59,30,34,   9,13,12.1,-69,43, 2,
  228.  9,27,35.2, -8,39,31,  10, 8,22.3, 11,58,2,   11, 3,43.6, 61,45, 3,
  229. 12,26,35.9,-63, 5,56,  12,31, 9.9,-57, 6,47,  12,47,43.3,-59,41,19,
  230. 12,54, 1.7, 55,57,35,  13,25,11.5,-11, 9,41,  13,47,32.3, 49,18,48,
  231. 14, 3,49.4,-60,22,22,  14,15,39.6, 19,10,57,  14,39,36.2,-60,50, 7,
  232. 16,29,24.4,-26,25,55,  17,33,36.4,-37, 6,13,  17,37,19.0,-42,59,52,
  233. 18,24,10.3,-34,23, 5,  18,36,56.2, 38,47, 1,  19,50,46.9,  8,52, 6,
  234. 20,25,38.8,-56,44, 7,  20,41,25.8, 45,16,49,  22, 8,13.9,-46,57,40,
  235. 22,57,39.0,-29,37,20};
  236.  
  237. int errorcount[PLANETS+1] = {0, 0, 0, 0, 0, 0, 11, 5, 4, 4, 4};
  238.  
  239. double planetdata[] = {
  240. 358.4758,35999.0498,-.0002,.01675,-.4E-4,0,1,101.2208,1.7192,.00045,0,0,0,0,0,
  241. 0, /* Sun/Earth */
  242. 102.2794,149472.515,0,.205614,.2E-4,0,.3871,28.7538,.3703,.0001,47.1459,1.1852,
  243. 0.0002,7.009,.00186,0, /* Mercury */
  244. 212.6032,58517.8039,.0013,.00682,-.5E-4,0,.7233,54.3842,.5082,-.14E-2,75.7796,
  245. 0.8999,.4E-3,3.3936,.1E-2,0, /* Venus */
  246. 319.5294,19139.8585,.2E-3,.09331,.9E-4,0,1.5237,285.4318,1.0698,.1E-3,48.7864,
  247. 0.77099,0,1.8503,-.7E-3,0, /* Mars */
  248. 225.4928,3033.6879,0,.04838,-.2E-4,0,5.2029,273.393,1.3383,0,99.4198,1.0583,0,
  249. 1.3097,-.52E-2,0, /* Jupiter */
  250. -.001,-.0005,.0045,.0051,581.7,-9.7,-.0005,2510.7,-12.5,-.0026,1313.7,-61.4,
  251. 0.0013,2370.79,-24.6,-.0013,3599.3,37.7,-.001,2574.7,31.4,-.00096,6708.2,
  252. -114.5,-.0006,5499.4,-74.97,-.0013,1419,54.2,.0006,6339.3,-109,.0007,4824.5,
  253. -50.9,.0020,-.0134,.0127,-.0023,676.2,.9,.00045,2361.4,174.9,.0015,1427.5,
  254. -188.8,.0006,2110.1,153.6,.0014,3606.8,-57.7,-.0017,2540.2,121.7,-.00099,
  255. 6704.8,-22.3,-.0006,5480.2,24.5,.00096,1651.3,-118.3,.0006,6310.8,-4.8,.0007,
  256. 4826.6,36.2, /* Jupiter error */
  257. 174.2153,1223.50796,0,.05423,-.2E-3,0,9.5525,338.9117,-.3167,0,112.8261,.8259,
  258. 0,2.4908,-.0047,0, /* Saturn */
  259. -.0009,.0037,0,.0134,1238.9,-16.4,-.00426,3040.9,-25.2,.0064,1835.3,36.1,
  260. -.0153,610.8,-44.2,-.0015,2480.5,-69.4,-.0014,.0026,0,.0111,1242.2,78.3,-.0045,
  261. 3034.96,62.8,-.0066,1829.2,-51.5,-.0078,640.6,24.2,-.0016,2363.4,-141.4,.0006,
  262. -.0002,0,-.0005,1251.1,43.7,.0005,622.8,13.7,.0003,1824.7,-71.1,.0001,2997.1,
  263. 78.2, /* Saturn error */
  264. 74.1757,427.2742,0,.04682,.00042,0,19.2215,95.6863,2.0508,0,73.5222,.5242,0,
  265. 0.7726,.1E-3,0, /* Uranus */
  266. -.0021,-.0159,0,.0299,422.3,-17.7,-.0049,3035.1,-31.3,-.0038,945.3,60.1,-.0023,
  267. 1227,-4.99,.0134,-.02186,0,.0317,404.3,81.9,-.00495,3037.9,57.3,.004,993.5,
  268. -54.4,-.0018,1249.4,79.2,-.0003,.0005,0,.0005,352.5,-54.99,.0001,3027.5,54.2,
  269. -.0001,1150.3,-88, /* Uranus error */
  270. 30.13294,240.45516,0,.00913,-.00127,0,30.11375,284.1683,-21.6329,0,130.68415,
  271. 1.1005,0,1.7794,-.0098,0, /* Neptune */
  272. 0.1832,-.6718,.2726,-.1923,175.7,31.8,.0122,542.1,189.6,.0027,1219.4,178.1,
  273. -.00496,3035.6,-31.3,-.1122,.166,-.0544,-.00496,3035.3,58.7,.0961,177.1,-68.8,
  274. -.0073,630.9,51,-.0025,1236.6,78,.00196,-.0119,.0111,.0001,3049.3,44.2,-.0002,
  275. 893.9,48.5,.00007,1416.5,-25.2, /* Neptune error */
  276. 229.781,145.1781,0,.24797,.002898,0,39.539,113.5366,.2086,0,108.944,1.3739,0,
  277. 17.1514,-.0161,0, /* Pluto */
  278. -.0426,.073,-.029,.0371,372,-331.3,-.0049,3049.6,-39.2,-.0108,566.2,318.3,
  279. 0.0003,1746.5,-238.3,-.0603,.5002,-.6126,.049,273.97,89.97,-.0049,3030.6,61.3,
  280. 0.0027,1075.3,-28.1,-.0007,1402.3,20.3,.0145,-.0928,.1195,.0117,302.6,-77.3,
  281. 0.00198,528.1,48.6,-.0002,1000.4,-46.1, /* Pluto error */
  282. 34.6127752,713.5756219,0,.382270369,-.004694073,0,13.66975144,337.407213,
  283. 2.163306646,0,208.1482658,1.247724355,0,6.911179715,.011236955,0, /* chiron */
  284. 108.2925,7820.36556,0,.0794314,0,0,2.7672273,71.0794444,0,0,80.23555556,
  285. 1.3960111,0,10.59694444,0,0, /* Ceres */
  286. 106.6641667,7806.531667,0,.2347096,0,0,2.7704955,310.166111,0,0,172.497222,
  287. 1.39601111,0,34.81416667,0,0, /* Pallas athena */
  288. 267.685,8256.081111,0,.2562318,0,0,2.6689897,245.3752778,0,0,170.137777,
  289. 1.396011111,.0003083333,13.01694444,0,0, /* Juno */
  290. 138.7733333,9924.931111,0,.0902807,0,0,2.360723,149.6386111,0,0,103.2197222,
  291. 1.396011111,.000308333,7.139444444,0,0, /* Vesta */
  292. 104.5959,138.5369,0,0,0,0,40.99837, 0,0,0,0,0,0,0,0,0, /* Cupido */
  293. 337.4517,101.2176,0,0,0,0,50.667443,0,0,0,0,0,0,0,0,0, /* Hades */
  294. 104.0904,80.4057, 0,0,0,0,59.214362,0,0,0,0,0,0,0,0,0, /* Zeus */
  295. 17.7346, 70.3863, 0,0,0,0,64.816896,0,0,0,0,0,0,0,0,0, /* Kronos */
  296. 138.0354,62.5,    0,0,0,0,70.361652,0,0,0,0,0,0,0,0,0, /* Apollo */
  297. -8.678,  58.3468, 0,0,0,0,73.736476,0,0,0,0,0,0,0,0,0, /* Admetos */
  298. 55.9826, 54.2986, 0,0,0,0,77.445895,0,0,0,0,0,0,0,0,0, /* Vulkanus */
  299. 165.3595,48.6486, 0,0,0,0,83.493733,0,0,0,0,0,0,0,0,0  /* Poseidon */
  300. };
  301.  
  302. #ifdef X11
  303. char *worlddata[] = {
  304. "-031+70",
  305. "LLRRHLLLLDULLGLLLDULGLLLGLRREDEGGLGGLGLGLLGDRLDRLFFRRERFDFRRREUEEHLUERERUERRF\
  306. GLGLDDFRRRRREFRLGLLLLLGEFDLHGDDLGHLGLLHGLHURDLRRELLLRHUGLDFDLGLLFHGGLGLLLDLLLD\
  307. RRFFDDGLLLLLLGDFGDDRRFRERREEUEREUEFRRERRFFFRFRDDLLLLRFRUREURULHLHHHEF",
  308. "5EUROPE",
  309. "+006+50", "RRERRRRUELLUHHLLREULLELLDGHDUFDEGRDRRLFDLLRGRRGGL", "5ENGLAND",
  310. "+008+55", "GLFGRRREUULL", "5IRELAND",
  311. "+023+64", "RRFRERRREHLLLLLGHLLRFLLRFL", "5ICELAND",
  312. "-011+80", "DDURFRERLGRRLLFRRREEFRRRLHGELLLHRRFRRRRERLLLLLLLLLLLDHGULLL",
  313. "5SVALBARD",
  314. "-014+45",
  315. "FRFRFDDFRDRRLLFRURFHHUERRRRRHUUEERRRRGRDERRLHLRRERRGGRFRFFGLLLLHLLLLGLLDLLLFG\
  316. RFFRERFRERDDDGDGLLDFFEUDDFFDFFDDFFFDFDDDRRERRERRRUERRERURUEEHHLHUGGLLLUUGUHUHU\
  317. RRFFRFRRRDRRFRRRRRRRF",
  318. "5MIDDLE EAST",
  319. "-009+41", "DDRUULEUGD", "5SARDINIA",
  320. "-024+35", "RRLL", "5CRETE",
  321. "-032+35", "RRLL", "5CYPRUS",
  322. "-052+37", "LLHUURHUHUHERERRRDDLLLFFDDURFLLDFDDL", "0CASPAIN SEA",
  323. "-060+44", "LLUEERDFLDL", "0ARAL SEA",
  324. "-068+24",
  325. "FRGFRREDDDDDFDFDDFDDFERUEUUUUEEEEEREURRREFDFRDDDDRREFDDFDDGDDRFDDFDFFRUHUUHHH\
  326. ULUEUUURDRFDFRDEEREUUUHHHUUEERRDDEURRERREREEEUEULLREUHUHLEERRHLGLULUREERDLDRER\
  327. RFGRFDGRRREUHHUREUE",
  328. "6ASIA S",
  329. "-140+36",
  330. "DEUUEUHURREREEGLLHHDDGLDRGDDGGLGLLLGGLDLRDFEUHRRGEERDLLRGLRERRERRE",
  331. "6JAPAN",
  332. "-121+25", "GDFUEUL", "6TAIWAN",
  333. "-080+10", "DDDDREUHH", "6SRI LANKA",
  334. "-121+18", "LDDDRDDRHRRFFDDDLLEHDULRHDFDDGERDDREUUULUUHHLHEUUL",
  335. "2PHILIPPINES",
  336. "-131+43",
  337. "EFREEREEEUUUEUHLLUDLULEERERERRRRRRERRFLRRRRLUERERRRDRERURRGDLGLGLGLGGDDFDFEUR\
  338. RUERUURULEEREDERRFRERERRRERRHLHLRRRREURDRRFRFRUURRHLLLDHHLLHLLHLLLLLLLDLLHRLLL\
  339. LLLLGHULLLLLLLLLLULLLGL",
  340. "6SIBERIA",
  341. "-145+71",
  342. "RELLRHLLLLGDHGHLLLLGLLHUHLLLLLDLLLLHLLLLLDULUDLGLLLLRRERERRRELHLLLLLLLELLLLGD\
  343. LLLLLUDLLLLLGLLLDLLLLLLLDFRDDHELLLLLLDRRLLHUDLGFGRRRRFRLHLLDGLGLLHRRREUHUUULLG\
  344. GLDRFGHLLLHLLLLRFGHLGLLLULGLLLGLLHRHLDDDLLLLDLLLFLLHUHLRRFRRRREHLLHLLLHLL",
  345. "6RUSSIA",
  346. "-143+54", "GDDDDDDDEDUUURUUHUU", "6SAKHALIN",
  347. "-180+72", "GRRRRULLL", "6WRANGEL I.",
  348. "-137+76", "DRRRRRRRELLLLLLLL", "6SIBERIAN I.",
  349. "-091+80", "FERDRRRRRRULLLLLRRULLLLGL", "6SEVERNAYA",
  350. "-101+79", "GRRRRELLLL", "6ZEMLYA",
  351. "-068+77", "LLGLLLLLLGLLGGLGLRFRRRRLHERERERRRERRRREL", "6NOVAYA",
  352. "+123+49",
  353. "FGULLFDDDGFDDDFFDFRFRFDFFFDLFFRDFFEHHHHUHHUFRDFFFRDFFFDFGFRFRFRRFRRRRFFRRFRFF\
  354. DRFFRFEUUGLHHUUEUHLLLLLEUUEULLLGDLLGLHHUHUUUEHEERERRFRRHRREFRRFDFDFEUUHUUUEERE\
  355. RUUUHFDEUHFEURRRELUERRE",
  356. "4NORTH AMERICA S",
  357. "+113+42", "FH", "0SALT LAKE",
  358. "+156+20", "DRULHLHL", "4HAWAII",
  359. "+085+22", "RERFRRFRGRRRRHLHLHLLLLLG", "4CUBA",
  360. "+070+18", "RRHHLLLFLLLFRRRRRR", "4HAITI",
  361. "+078+18", "RRHLLF", "4JAMAICA",
  362. "+066+18", "ELLDR", "4PUERTO RICO",
  363. "+078+24", "UD", "4NASSAU",
  364. "+067+45",
  365. "REFLGDERERREHDLLLHUELLLGLGLREEERRRRRRREERRGGDGRRRFEFUUHLLLEUUHHGLRELLHHUHHHDG\
  366. LGHHULLHLLLLLDFGFDDGLLFDDGHHUULLLLHLLHLLLUHUUEREEREERRRREUUHLLLDDGHULLLHLUHLGD\
  367. RFGGULLLLLLLLLHLLGFLHLLLLLRHLLLLLHLLLLLLHGLLLLGUGLLLHLL",
  368. "4CANADA",
  369. "+088+49",
  370. "LGLGRRRRRRRFLLLGRGDDREUURUFRGRFGFERERREEREERLGGLGLLLGRLLGLEUERHLLLHULHL",
  371. "0GREAT LAKES",
  372. "+117+61", "REHRFRRERGLGLLLL", "0SLAVE LAKE",
  373. "+125+66", "RRERRRGREDLFHGLLLERLLLL", "0BEAR LAKE",
  374. "+097+50", "UULHURFDFG", "0LAKE WINNIPEG",
  375. "+090+72",
  376. "FRRLLFRRRRRRRRRRFRRGLLGRREEFRFLGLFLLLLFRERFRFRRFRRHLHFRRRUHLHRRFRURELLHLLLHRR\
  377. HLHLHGHLHLLGLLEHFRRRHLLLLLLGLDFHLUELLGG",
  378. "4BAFFIN I.",
  379. "+125+72",
  380. "RFRREERRRLLGFFRRRRRLLLLLFRRRRRRRREFRRRRHRRLHLHHLRRULGLFLHLDLLULLLLHLLLLLLLDG",
  381. "4VICTORIA I.",
  382. "+141+70",
  383. "LLLLLLLLHGLHLLLHGLLGLLGLLDRRFRRDLLLULGLLFRRRRRRDLGLLGFDRRRDRRRRRGGGLLGLLGGLLR\
  384. RERERRRERREERRELEERRRLLGDRERRURRFRRRRRFRRFUDRUDDHFDURDURLURDDLFRULURDHFFRGFEGR\
  385. FFRFRFLHLHLFFRFE",
  386. "4ALASKA",
  387. "+045+60",
  388. "REUEREUERRRRERERRRERRRRERLLLLLLHRRRGERHFRRRRHLUDLLHLRERFRERLEUHRRHLEERLLURRRR\
  389. RRRRELLLLLLLLLLGLLLRERHGLRELLLLLLLELLLLLLLLLLGLLLLLLGLLLLLLGLULLLLLLLFRLLLLLGL\
  390. RRRGLLLLLLLGRRRRRRRGLLLLRRFRRRRRRRRRRFDFDLFREFRDLLLDERRFGLLGFFDRFFFRRRF",
  391. "4GREENLAND",
  392. "+080+10",
  393. "DRFDFDDGGGDDGRDGDDFFDFDFFDFFRFFFDDDDDDGDDDDGDDDDGDGFGDDDEUDDDGUDDLDRGDDDFDFRF\
  394. RRFERRLHLUHUURUEELHEREURULURREURREREUHUUDFRREEEEEUEUUEERERRREUEUEUUUUUEEEEUUUH\
  395. LHLHLLLLHLHLGEHLGEUHUUHLHLLLHHLHULEDLLELLGHLLHLGDDHUELLGLGDGHHL",
  396. "3SOUTH AMERICA",
  397. "+060-51", "LDRRELL", "3FALKLAND ISLANDS",
  398. "+092+00", "FUL", "3GALAPAGOS I.",
  399. "-032+32",
  400. "LLGLHLLLLHLGDGHLLHHLLHLEUULLLLLLLLLGLGLLLLHDGLGDGDGGLDGGGDGDFDDDDGDDFFFFDFRFF\
  401. RRRRRRRRERERRFFRRFFDDDGDFFFDFDDDFDGDGDDDFDFDFDDDFDFDFDDFFERRRRREEEEEEEUUEREUUH\
  402. UEEEREEUUUUHUUUHUEUEEEEEREEUEUEEUUULLLLGLLHUHHLHUHHUUHHUUHUHHUU",
  403. "1AFRICA",
  404. "-049-12", "DGGGLGDDDDGDDFFREUEUEUUUEUUUUH", "1MADAGASCAR",
  405. "-032+00", "DDDREUELLL", "0LAKE VICTORIA",
  406. "-014+14", "LRFLU", "0LAKE CHAD",
  407. "-124-16",
  408. "LGDGGLGLLGLDDDGFDDFDFDGFRRRERRRRURERRRRRRRFFFEEDDRFDFRFREFRERRUUEUEEUUUUUUUHH\
  409. HHHHHUUHHHUULDDDDGDGHLHLHEUELLLHLFLLULDRGDDLLHLGG",
  410. "2AUSTRALIA",
  411. "-173-35", "FFDGFDREURULHHHL", "2NEW ZEALAND N",
  412. "-174-41", "LLDGLGLGGRFREEUREEU", "2NEW ZEALAND S",
  413. "-145-41", "DFRRUUUDLLL", "2TASMANIA",
  414. "-178-17", "GRRURUGDH", "2FIJI",
  415. "-130+00", "FRFRLGFEFRFRFDGRRFRRUERFFFRRRLHHHHRHLHHLHLLHGGLHUHLGH",
  416. "2NEW GUINEA",
  417. "-115-04", "RUUEEURHUUEHHGGGGLLDDHLDDFDDRRDERF", "2BORNEO",
  418. "-095+06", "DFFFFFFDFFFFRUUUHFRHLHLUHHHHHLLH", "2SUMATRA",
  419. "-106-06", "GRFRRRRRRFRRHLHLLLLLHL", "2JAVA",
  420. "-120+00", "DGDDRDFHUEDFRHUHREFHLGHURRRRELLLLG", "2CELEBES",
  421. "+000-70",
  422. "ULDLLLLLLLLGLLGLLLGLLGLLLLGLGLLGLLLLGLLLLLHLGLLLLLHLLLLLHLLLLHLLUERLEUUUUUUEE\
  423. RRRULLGLLLLGLGGLLLDRUDRDLGHLLGLLFGRRFLLLLLLLDHLLLLHLLLLLGLLLLHLLLLLLLGRFDLLLUL\
  424. LLGHLLLLLLLLLLHGHLLGLLLLLLLGLLLLLLLLLLLGLLLGLLLLLLLLGLLLLLLLLLLLLLLLLLLLLL",
  425. "7ANTARCTICA W",
  426. "+180-78",
  427. "LLLLLLLHLLGHLLGHLUEERRERREHLLLLHLLLLLLHLLLLLLLLLLLHLHLLLLLHLLULDLLLLLDLLHLLLL\
  428. GHFLLLLLHLLLLLLGLHLLHLGLLLLHLGLLGLLLULLLGLLHDFLLLGLGLLLELLLLHLLLLLLLLLLHLLLHLL\
  429. LLGGHGHGLLLGLDLLLLHLLGHGLLLLLLLLLLLLLLHLGLLLLLLLLLLLLLL",
  430. "7ANTARCTICA E",
  431. "E", "", ""};
  432. #endif
  433.  
  434.  
  435. /*
  436. *******************************************************************************
  437. ** General and numeric routines
  438. *******************************************************************************
  439. */
  440.  
  441. void swapint(i1, i2)
  442. int *i1, *i2;
  443. {
  444.   int temp;
  445.   temp = *i1; *i1 = *i2; *i2 = temp;
  446. }
  447.  
  448. void swapdoub(f1, f2)
  449. double *f1, *f2;
  450. {
  451.   double temp;
  452.   temp = *f1; *f1 = *f2; *f2 = temp;
  453. }
  454.  
  455. int stringlen(line)
  456. char *line;
  457. {
  458.   int i;
  459.   for (i = 0; line[i] != 0; i++)
  460.     ;
  461.   return i;
  462. }
  463.  
  464. double dabs(A)
  465. double A;
  466. {
  467.   return A < 0.0 ? -A : A;
  468. }
  469.  
  470. double sgn(A)
  471. double A;
  472. {
  473.   return A < 0.0 ? -1.0 : (A > 0.0 ? 1.0 : 0.0);
  474. }
  475.  
  476. double dectodeg(A)
  477. double A;
  478. {
  479.   return sgn(A)*(floor(dabs(A))+(dabs(A)-floor(dabs(A)))*100.0/60.0);
  480. }
  481.  
  482. double mod(A)
  483. double A;
  484. {
  485.   return ((A)-(floor((A)/modulus)*modulus));
  486. }
  487.  
  488. int mod12(A)
  489. int A;
  490. {
  491.   return A > SIGNS ? A-SIGNS : (A < 1 ? A+SIGNS : A);
  492. }
  493.  
  494. double mindistance(deg1, deg2)
  495. double deg1, deg2;
  496. {
  497.   double i;
  498.   i = dabs(deg1-deg2);
  499.   return i < 180 ? i : DEGREES - i;
  500. }
  501.  
  502. double midpoint(deg1, deg2)
  503. double deg1, deg2;
  504. {
  505.   double mid;
  506.   mid = (deg1+deg2)/2.0;
  507.   return mindistance(deg1, mid) < 90 ? mid : mod(mid+180);
  508. }
  509.  
  510. char dignify(body, sign)
  511. int body, sign;
  512. {
  513.   if (body > 10)
  514.     return ' ';
  515.   if (ruler1[body] == sign || ruler2[body] == sign)
  516.     return 'R';
  517.   if (ruler1[body] == mod12(sign+6) || ruler2[body] == mod12(sign+6))
  518.     return 'F';
  519.   if (exalt[body] == sign)
  520.     return 'e';
  521.   if (exalt[body] == mod12(sign+6))
  522.     return 'd';
  523.   return '-';
  524. }
  525.  
  526. int dayinmonth(month, year)
  527. int month, year;
  528. {
  529.   return (month == 9 || month == 4 || month == 6 || month == 11 ? 30 :
  530.       (month != 2 ? 31 :
  531.        (year/4*4==year && (year/100*100!=year || year/400*400==year) ?
  532.         29 : 28)));
  533. }
  534.  
  535. double orb(body1, body2, aspect)
  536. int body1, body2, aspect;
  537. {
  538.   static int max = 1;
  539.   double orb;
  540.   if (aspect == 0)
  541.     return (max = 1-max);
  542.   if (max && (body1 == 16 || body1 == 17 || body1 == 20 || body1 > BASE ||
  543.           body2 == 16 || body2 == 17 || body2 == 20 || body2 > BASE))
  544.     orb = 2.0;
  545.   else
  546.     orb = aspectorb[aspect];
  547.   if (body1 <= 2) orb += 1.0;
  548.   if (body2 <= 2) orb += 1.0;
  549.   return orb;
  550. }
  551.  
  552.  
  553. /*
  554. *******************************************************************************
  555. ** IO routines
  556. *******************************************************************************
  557. */
  558.  
  559. void toofew(option)
  560. char *option;
  561. {
  562.   fprintf(stderr, "Too few options to switch -%s\n", option);
  563.   exit(1);
  564. }
  565.  
  566. char *stringlocation(Lon, Lat, norm)
  567. double Lon, Lat, norm;
  568. {
  569.   static char string[14];
  570.   int i, j;
  571.   i = (int) ((dabs(Lon)-floor(dabs(Lon)))*norm+0.1);
  572.   j = (int) ((dabs(Lat)-floor(dabs(Lat)))*norm+0.1);
  573.   sprintf(string, "%3.0f'%d%d%c %2.0f'%d%d%c",
  574.       floor(dabs(Lon)), i/10, i%10, Lon < 0.0 ? 'E' : 'W',
  575.       floor(dabs(Lat)), j/10, j%10, Lat < 0.0 ? 'S' : 'N');
  576.   return string;
  577. }
  578.  
  579. double readstardata(reset)
  580. int reset;
  581. {
  582.   static int datapointer = 0;
  583.   if (!reset)
  584.     return stardata[datapointer++];
  585.   return (double) (datapointer = 0);
  586. }
  587.  
  588. double readplanetdata(reset)
  589. int reset;
  590. {
  591.   static int datapointer = 0;
  592.   if (!reset)
  593.     return planetdata[datapointer++];
  594.   return (double) (datapointer = 0);
  595. }
  596.  
  597. #ifdef X11
  598. int readworlddata(nam, loc, lin)
  599. char **nam, **loc, **lin;
  600. {
  601.   static int datapointer = 0;
  602.   *loc = worlddata[datapointer++];
  603.   *lin = worlddata[datapointer++];
  604.   *nam = worlddata[datapointer++];
  605.   if (*loc[0] != 'E')
  606.     return 1;
  607.   return (datapointer = 0);
  608. }
  609. #endif
  610.  
  611. /*void printsecond(deg)
  612. double deg;
  613. {
  614.   int sign, d, m, s;
  615.   deg = mod(deg + 1.0/60.0/60.0/2.0);
  616.   sign = (int) (deg / 30.0);
  617.   d = (int) deg - sign*30;
  618.   m = (int) ((deg - floor(deg))*60.0);
  619.   s = (int) (((deg - floor(deg))*60 - (double) m)*60.0);
  620.   printf("%s%d%c%c%c%s%d'%s%d\"",
  621.      d < 10 ? "0" : "", d, SIGNAM(sign + 1),
  622.      m < 10 ? "0" : "", m, s < 10 ? "0" : "", s);
  623. }
  624.  
  625. void printtenth(deg)
  626. double deg;
  627. {
  628.   int sign, d, m;
  629.   deg = mod(deg + 1.0/60.0/10.0/2.0);
  630.   sign = (int) (deg / 30.0);
  631.   d = (int) deg - sign*30;
  632.   m = (int) ((deg - floor(deg))*600.0);
  633.   printf("%s%d%c%c%c%s%.1f",
  634.      d < 10 ? "0" : "", d, SIGNAM(sign + 1),
  635.      m < 100 ? "0" : "", (double) m / 10.0);
  636. }*/
  637.  
  638. void printminute(deg)
  639. double deg;
  640. {
  641.   int sign, d, m;
  642.   if (!right) {
  643.     deg = mod(deg + 1.0/60.0/2.0);
  644.     sign = (int) (deg / 30.0);
  645.     d = (int) deg - sign*30;
  646.     m = (int) ((deg - floor(deg))*60.0);
  647.     printf("%s%d%c%c%c%s%d",
  648.        d < 10 ? "0" : "", d, SIGNAM(sign + 1), m < 10 ? "0" : "", m);
  649.   } else {
  650.     deg = mod(deg + 1.0/4.0/2.0);
  651.     d = (int) (deg / 15.0);
  652.     m = (int) ((deg - (double)d*15.0)*60.0/24.0);
  653.     printf("%s%dh,%s%dm",
  654.        d < 10 ? "0" : "", d, m < 10 ? "0" : "", m);
  655.   }
  656. }
  657.  
  658. void printaltitude(deg)
  659. double deg;
  660. {
  661.   int d, m;
  662.   while (deg > 90.0)
  663.     deg -= 180.0;
  664.   while (deg < -90.0)
  665.     deg += 180.0;
  666.   putchar(deg < 0.0 ? '-' : '+');
  667.   deg = dabs(deg) + 1.0/60.0/2.0;
  668.   d = (int) deg;
  669.   m = (int) ((deg - floor(deg))*60.0);
  670.   printf("%s%d %s%d'", d < 10 ? "0" : "", d, m < 10 ? "0" : "", m);
  671. }
  672.  
  673. double input(prompt, low, high)
  674. char prompt[];
  675. double low, high;
  676. {
  677.   char line[80];
  678.   double x;
  679.   while (1) {
  680.     printf("%s > ", prompt);
  681.     if (gets(line) == (char *) NULL) {
  682.       printf("\nAstrolog terminated.\n");
  683.       exit(1);
  684.     }
  685.     sscanf(line, "%lf", &x);
  686.     if (x >= low && x <= high)
  687.       return x;
  688.     printf("Value out of range of from %.0f to %.0f.\n", low, high);
  689.   }
  690. }
  691.  
  692. void inputdata(filename)
  693. char *filename;
  694. {
  695.   char name[STRING], c;
  696.   int i;
  697.   double k, l, m;
  698. #ifdef TIME
  699.   struct tm curtime;
  700.   int curtimer;
  701.   if (filename[0] == 'n' && filename[1] == 'o' && filename[2] == 'w' &&
  702.       filename[3] == 0) {
  703.     autom = 1;
  704.     curtimer = (int) time((int *) 0);
  705.     curtime = *localtime(&curtimer);
  706.     M = (double) curtime.tm_mon + 1.0;
  707.     D = (double) curtime.tm_mday;
  708.     Y = (double) curtime.tm_year + 1900.0;
  709.     F = (double) curtime.tm_hour + (double) curtime.tm_min / 100.0 +
  710.       (double) curtime.tm_sec / 6000.0;
  711.     X = defzone; L5 = deflong; LA = deflat;
  712.     return;
  713.   }
  714. #endif
  715.   if (filename[0] == 't' && filename[1] == 't' && filename[2] == 'y' &&
  716.       filename[3] == 0) {
  717.     printf("** Astrolog version %s (cruiser1@milton.u.washington.edu) **\n",
  718.       VERSION);
  719. #ifdef SWITCHES
  720.     printf("   Invoke as 'astrolog -H' for brief list of command options.\n");
  721. #endif
  722.     M = input("Enter month of birth [MM]  ", 1.0, 12.0);
  723.     D = input("Enter date  of birth [DD]  ", 1.0, 31.0);
  724.     Y = input("Enter year  of birth [YYYY]", 0.0, 4000.0);
  725.     printf("Assuming a 24 hour clock below (0.00=midnight, 18.00=6pm, etc)\n");
  726.     printf("Subtract 1 from hour entered if Daylight Saving time then.\n");
  727.     F = input("Time of birth [HR.MIN - Add 12 for PM times]", -2.0, 24.0);
  728.     printf("Enter negative value below for time zones east of Greenwich.\n");
  729.     X = input("Time zone in hours off GMT [HR.MIN - 5=Eastern, 8=Pacific]",
  730.           -24.0, 24.0);
  731.     printf("Enter negative values below for eastern or southern locations.\n");
  732.     L5 = input("Longitude west of place: DEG.MIN", -180.0, 180.0);
  733.     LA = input("Latitude north of place: DEG.MIN", -90.0, 90.0);
  734.     printf("\n");
  735.     return;
  736.   }
  737.   autom = 1;
  738.   data = fopen(filename, "r");
  739.   if (data == NULL) {
  740.     sprintf(name, "%s%s", DEFAULT_DIR, filename);
  741.     data = fopen(name, "r");
  742.     if (data == NULL) {
  743.       fprintf(stderr, "File '%s' not found.\n", filename);
  744.       exit(1);
  745.     }
  746.   }
  747.   if ((c = getc(data)) != 'S') {
  748.     ungetc(c, data);
  749.     fscanf(data, "%lf%lf%lf%lf%lf%lf%lf", &M, &D, &Y, &F, &X, &L5, &LA);
  750.   } else {
  751.     M = -1.0;
  752.     for (i = 1; i <= objects; i++) {
  753.       fscanf(data, "%s%lf%lf%lf", name, &k, &l, &m);
  754.       planet[i] = (l-1.0)*30.0+k+m/60.0;
  755.       fscanf(data, "%s%lf%lf", name, &k, &l);
  756.       planetalt[i] = k+l/60.0;
  757.       ret[i] = DTOR(name[1] == 'D' ? 1.0 : -1.0);
  758.     }
  759.     for (i = 1; i <= SIGNS/2; i++) {
  760.       fscanf(data, "%s%lf%lf%lf", name, &k, &l, &m);
  761.       house[i+6] = mod((house[i] = mod((l-1.0)*30.0+k+m/60.0))+180.0);
  762.     }
  763.   }
  764.   fclose(data);
  765. }
  766.  
  767. /**/
  768.