home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource1 / ast40dos / intrpret.c < prev    next >
C/C++ Source or Header  |  1994-01-04  |  22KB  |  643 lines

  1. /*
  2. ** Astrolog (Version 4.00) File: intrpret.c
  3. **
  4. ** IMPORTANT NOTICE: the graphics database and chart display routines
  5. ** used in this program are Copyright (C) 1991-1993 by Walter D. Pullen
  6. ** (cruiser1@stein.u.washington.edu). Permission is granted to freely
  7. ** use and distribute these routines provided one doesn't sell,
  8. ** restrict, or profit from them in any way. Modification is allowed
  9. ** provided these notices remain with any altered or edited versions of
  10. ** the program.
  11. **
  12. ** The main planetary calculation routines used in this program have
  13. ** been Copyrighted and the core of this program is basically a
  14. ** conversion to C of the routines created by James Neely as listed in
  15. ** Michael Erlewine's 'Manual of Computer Programming for Astrologers',
  16. ** available from Matrix Software. The copyright gives us permission to
  17. ** use the routines for personal use but not to sell them or profit from
  18. ** them in any way.
  19. **
  20. ** The PostScript code within the core graphics routines are programmed
  21. ** and Copyright (C) 1992-1993 by Brian D. Willoughby
  22. ** (brianw@sounds.wa.com). Conditions are identical to those above.
  23. **
  24. ** The extended accurate ephemeris databases and formulas are from the
  25. ** calculation routines in the program "Placalc" and are programmed and
  26. ** Copyright (C) 1989,1991,1993 by Astrodienst AG and Alois Treindl
  27. ** (alois@azur.ch). The use of that source code is subject to
  28. ** regulations made by Astrodienst Zurich, and the code is not in the
  29. ** public domain. This copyright notice must not be changed or removed
  30. ** by any user of this program.
  31. **
  32. ** Initial programming 8/28,30, 9/10,13,16,20,23, 10/3,6,7, 11/7,10,21/1991.
  33. ** X Window graphics initially programmed 10/23-29/1991.
  34. ** PostScript graphics initially programmed 11/29-30/1992.
  35. ** Last code change made 12/31/1993.
  36. */
  37.  
  38. #include "astrolog.h"
  39.  
  40. #ifdef INTERPRET
  41.  
  42. /*
  43. ******************************************************************************
  44. ** Interpretation Subroutines.
  45. ******************************************************************************
  46. */
  47.  
  48. /* This function is used by the interpretation routines to print out lines  */
  49. /* of text with newlines inserted just before the end of screen is reached. */
  50.  
  51. void FieldWord(string)
  52. char *string;
  53. {
  54.   static char line[STRING*4];
  55.   static int cursor = 0;
  56.   int i, j;
  57.  
  58.   /* Hack: Dump buffer if function called with a null string. */
  59.  
  60.   if (*string == 0) {
  61.     line[cursor] = 0;
  62.     fprintf(S, "%s\n", line);
  63.     cursor = 0;
  64.     return;
  65.   }
  66.   if (cursor)
  67.     line[cursor++] = ' ';
  68.   for (i = 0; (line[cursor] = string[i]); i++, cursor++)
  69.     ;
  70.  
  71.   /* When buffer overflows 80 columns, print out one line and start over. */
  72.  
  73.   while (cursor >= screenwidth-1) {
  74.     for (i = screenwidth-1; line[i] != ' '; i--)
  75.       ;
  76.     line[i] = 0;
  77.     fprintf(S, "%s\n", line);
  78.     line[0] = line[1] = ' ';
  79.     for (j = 2; (line[j] = line[i+j-1]) != 0; j++)
  80.       ;
  81.     cursor -= (i-1);
  82.   }
  83. }
  84.  
  85.  
  86. /* Display a general interpretation of what each sign of the zodiac, house, */
  87. /* and planet or object means. This is called to do the -I0 switch table.   */
  88.  
  89. void InterpretGeneral()
  90. {
  91.   char string[STRING];
  92.   int i;
  93.  
  94.   fprintf(S,
  95.     "Signs of the zodiac represent psychological characteristics.\n\n");
  96.   for (i = 1; i <= SIGNS; i++) {
  97.     AnsiColor(signansi(i));
  98.     sprintf(string, "%s is", signname[i]); FieldWord(string);
  99.     sprintf(string, "%s, and", description[i]); FieldWord(string);
  100.     sprintf(string, "%s.", desire[i]); FieldWord(string);
  101.     FieldWord("");
  102.   }
  103.   AnsiColor(DEFAULT);
  104.   fprintf(S, "\nHouses represent different areas within one's life.\n\n");
  105.   for (i = 1; i <= SIGNS; i++) {
  106.     AnsiColor(signansi(i));
  107.     sprintf(string, "The %d%s House is the area of life dealing with",
  108.       i, post[i]); FieldWord(string);
  109.     sprintf(string, "%s.", lifearea[i]); FieldWord(string);
  110.     FieldWord("");
  111.   }
  112.   AnsiColor(DEFAULT);
  113.   fprintf(S, "\nPlanets represent various parts of one's mind or self.\n\n");
  114.   for (i = 1; i <= OBJECTI; i++) {
  115.     if (ignore[i] || IsCusp(i))
  116.       continue;
  117.     AnsiColor(objectansi[i]);
  118.     sprintf(string, "%s%s%s%s represents one's",
  119.       i < 3 || (i >= THINGS && i <= OBJECTS) ? "The " : "",
  120.       i == _NOD ? "North " : (i == _FOR ? "Part of " : ""), objectname[i],
  121.       i == 13 ? " Athena" : ""); FieldWord(string);
  122.     sprintf(string, "%s.", mindpart[i]); FieldWord(string);
  123.     FieldWord("");
  124.   }
  125.   AnsiColor(DEFAULT);
  126. }
  127.  
  128.  
  129. /* Display a general interpretation of what each aspect type means. This */
  130. /* is called when printing the interpretation table in the -I0 switch.   */
  131.  
  132. void InterpretAspectGeneral()
  133. {
  134.   char string[STRING];
  135.   int i;
  136.  
  137.   fprintf(S, "\nAspects are different relationships between planets.\n\n");
  138.   for (i = 1; i <= MIN(aspects, ASPECTI); i++) {
  139.     AnsiColor(aspectansi[i]);
  140.     sprintf(string, "When planets are %s, one", aspectname[i]);
  141.     FieldWord(string); sprintf(string, interact[i], ""); FieldWord(string);
  142.     FieldWord("another.");
  143.     if (therefore[i][0]) {
  144.       sprintf(string, "%s.", therefore[i]); FieldWord(string);
  145.     }
  146.     FieldWord("");
  147.   }
  148.   return;
  149. }
  150.  
  151.  
  152. /* Print the interpretation of each planet in sign and house, as specified */
  153. /* with the -I switch. This is basically array accessing combining the     */
  154. /* meanings of each planet, sign, and house, and a couple of other things. */
  155.  
  156. void InterpretLocation()
  157. {
  158.   char string[STRING], c;
  159.   int i, j;
  160.  
  161.   printl();
  162.   for (i = 1; i <= OBJECTI; i++) {
  163.     if (ignore[i] || IsCusp(i))
  164.       continue;
  165.     AnsiColor(objectansi[i]);
  166.     j = ZTOS(planet[i]); c = Dignify(i, j);
  167.     sprintf(string, "%s%s%s%s in %s", ret[i] < 0.0 ? "Retrograde " : "",
  168.       i == _NOD ? "North " : (i == _FOR ? "Part of " : ""), objectname[i],
  169.       i == 13 ? " Athena" : "", signname[j]);
  170.     FieldWord(string);
  171.     sprintf(string, "and %d%s House:", inhouse[i], post[inhouse[i]]);
  172.     FieldWord(string);
  173.     FieldWord("This person's"); FieldWord(mindpart[i]); FieldWord("is");
  174.     if (((int) planet[i]) % 30 < 10)
  175.       FieldWord("very");
  176.     sprintf(string, "%s, and", description[j]); FieldWord(string);
  177.     sprintf(string, "%s.", desire[j]); FieldWord(string);
  178.     FieldWord("Most often this manifests");
  179.     if (ret[i] < 0.0 && i != _NOD)
  180.       FieldWord("in an independent, backward, introverted manner, and");
  181.     FieldWord("in the area of life dealing with");
  182.     sprintf(string, "%s.", lifearea[inhouse[i]]); FieldWord(string);
  183.  
  184.     /* Extra information if planet is in its ruling, falling, etc, sign. */
  185.  
  186.     if (c == 'R')
  187.       FieldWord("This is a major aspect of the person's psyche!");
  188.     else if (c == 'F')
  189.       FieldWord("(This bit plays only a minor part in the person's psyche.)");
  190.     else if (c == 'e')
  191.       FieldWord("It is easy for them to express this part of themself.");
  192.     else if (c == 'd')
  193.       FieldWord("It is difficult for them to express this part of themself.");
  194.     FieldWord("");
  195.   }
  196. }
  197.  
  198.  
  199. /* Print an interpretation for a particular aspect in effect in a chart. */
  200. /* This is called from the InterpretGrid and ChartAspect routines.       */
  201.  
  202. void InterpretAspect(x, y)
  203. int x, y;
  204. {
  205.   char string[STRING*2];
  206.   int n;
  207.  
  208.   n = grid->n[x][y];
  209.   if (n < 1 || n > ASPECTI ||
  210.     IsCusp(x) || IsCusp(y) || x > OBJECTI || y > OBJECTI)
  211.     return;
  212.   AnsiColor(aspectansi[n]);
  213.   sprintf(string, "%s %s %s: This person's", objectname[x],
  214.     aspectname[n], objectname[y]);
  215.   FieldWord(string); FieldWord(mindpart[x]);
  216.   sprintf(string, interact[n],
  217.     modifier[MIN(abs(grid->v[x][y])/150, 2)][n-1]);
  218.   FieldWord(string);
  219.   sprintf(string, "their %s.", mindpart[y]); FieldWord(string);
  220.   if (therefore[n][0]) {
  221.     sprintf(string, "%s.", therefore[n]); FieldWord(string);
  222.   }
  223.   FieldWord("");
  224. }
  225.  
  226.  
  227. /* Print the interpretation of each aspect in the aspect grid, as specified */
  228. /* with the -g -I switch. Again, this is done by basically array accessing  */
  229. /* of the meanings of the two planets in aspect and of the aspect itself.   */
  230.  
  231. void InterpretGrid()
  232. {
  233.   int i, j;
  234.  
  235.   for