home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume18 / geneal / part01 / famatree.c < prev    next >
C/C++ Source or Header  |  1989-03-08  |  4KB  |  134 lines

  1. /* famatree.c - simple ancestor tree generator
  2.  * Written by Jim McBeath (jimmc) at SCI
  3.  *
  4.  * Revision history:
  5.  * 27-Jan-85    Jim McBeath    Initial defintion
  6.  *  8-Mar-85    Jim McBeath    add return 0 in famatrr
  7.  * 26.Oct.87  jimmc  A little cleanup
  8.  *  8.Jan.88  jimmc  Direct output to outfp instead of stdout
  9.  */
  10.  
  11. #include <stdio.h>
  12. #include "geneal.h"
  13.  
  14. #define NOLINE 0    /* don't draw any line from this person */
  15. #define LINEUP 1    /* draw a line up from this person */
  16. #define LINEDN 2    /* draw a line down from this person */
  17. #define INDENTOFFSET 3    /* distance each generation is offset */
  18. #define LINEOFFSET (INDENTOFFSET-2)    /* distance to a line */
  19.  
  20. extern char Gflag[];
  21.  
  22. int lines[1000];    /* column number to draw lines in */
  23. int linecount;        /* number of entries in lines */
  24.  
  25. int        /* 0 means OK */
  26. famatree(n)
  27. int n;        /* the person to make the tree for */
  28. {
  29.     char *ss;
  30.  
  31.     if (fgtype(n)!='I') {
  32.         warning("record %d is not an individual", n);
  33.         return 1;
  34.     }
  35.     ss = fgbname(n);
  36.     strup(ss);
  37.     fprintf(outfp,"Ancestor tree for %s\n\n", ss);
  38.     linecount = 0;
  39.     return famatrr(n,0,NOLINE);        /* use recursive routine */
  40. }
  41.  
  42. /*..........*/
  43.  
  44. int            /* 0 means OK */
  45. famatrr(n,indent,lineflag)    /* recursive tree printer */
  46. int n;            /* the person to print the tree for */
  47. int indent;        /* indentation for this person */
  48. int lineflag;        /* flag to indicate a line from this person */
  49. {
  50.     int pp, ff, mm;
  51.     int i;
  52.     int ccount, clist[1000], cflag;
  53.  
  54.     pp = fgnum(n,"P");    /* get parents */
  55.     if (pp>0) {
  56.         ff = fgnum(pp,"H");        /* get father */
  57.         if (ff>0) {    /* print father and ancestors */
  58.             if (lineflag==LINEUP)
  59.                 lines[linecount++] = indent+LINEOFFSET;
  60.             famatrr(ff,indent+INDENTOFFSET,LINEDN);
  61.             if (lineflag==LINEUP) linecount--;
  62.         }
  63.     }
  64.     if (Gflag['s']>1 && pp>0) {
  65.             /* if he wants siblings and we have them... */
  66.         ccount = fgbclist(pp,clist);    /* get a child list */
  67.         cflag= -1;
  68.         for (i=0; i<ccount; i++) {
  69.             if (clist[i]==n) cflag=0;
  70.             famatrp(clist[i],indent,lineflag,cflag);
  71.             if (clist[i]==n) cflag=1;
  72.         }
  73.     }
  74.     else {
  75.         famatrp(n,indent,lineflag,0);
  76.         /* print up info for this person */
  77.     }
  78.     if (pp>0) {
  79.         mm = fgnum(pp,"W");        /* get mother */
  80.         if (mm>0) {    /* print mother and ancestors */
  81.             if (lineflag==LINEDN)
  82.                 lines[linecount++] = indent+LINEOFFSET;
  83.             famatrr(mm,indent+INDENTOFFSET,LINEUP);
  84.             if (lineflag==LINEDN) linecount--;
  85.         }
  86.     }
  87.     return 0;    /* we have no error counter, so always return OK */
  88. }
  89.  
  90. /*..........*/
  91.  
  92. famatrp(n,indent,lineflag,cflag)
  93. int n;            /* the person of interest */
  94. int indent;        /* indent level */
  95. int lineflag;        /* flags to tell how to draw lines */
  96. int cflag;        /* flag to indicate lines for siblings */
  97. /* -1 means we are above the sibling in the ancestry */
  98. /* 0 means this is the sibling in the ancestry */
  99. /* 1 means we are below th sibling in the ancestry */
  100. {
  101.     int i;
  102.     int lastl;
  103.     char *ss, *bd;
  104.     char *xstr;
  105.  
  106.     lastl = 0;    /* adjust the left/right position by changing this */
  107.     for (i=0; i<linecount; i++) {        /* put in the extra lines */
  108.         fprintf(outfp,"%*s|", lines[i]-lastl-1, "");
  109.         lastl = lines[i];
  110.     }
  111.     fprintf(outfp,"%*s", indent-lastl, "");
  112.     ss = fgbname(n);
  113.     bd = fgbrtdeath(n);
  114.     if (lineflag==NOLINE) {
  115.         if (cflag==0) xstr="*-";
  116.         else if (cflag== 1) xstr = " '";
  117.         else xstr = " ,";
  118.     }
  119.     else if (lineflag==LINEUP) {
  120.         if (cflag==0) xstr="\\-";
  121.         else if (cflag== -1) xstr="|,";
  122.         else xstr=" '";
  123.     }
  124.     else {    /* must be lineflag==LINEDN */
  125.         if (cflag==0) xstr="/-";
  126.         else if (cflag== 1) xstr="|'";
  127.         else xstr=" ,";
  128.     }
  129.     fprintf(outfp,"%s%s%s\n", xstr, ss, bd);
  130.         /* print info for this person */
  131. }
  132.  
  133. /* end */
  134.