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

  1. /* famdtree.c - produce descendant trees
  2.  * Written by Jim McBeath (jimmc) at SCI
  3.  *
  4.  * Revision history:
  5.  * 27-Jan-85    Jim McBeath    Initial definition
  6.  * 14-Feb-85    (Ian Darwin)    return error counter e instead of 0
  7.  * 26.Oct.87  jimmc  Just a little cleaning up
  8.  *  8.Jan.88  jimmc  Direct output to outfp instead of stdout
  9.  */
  10.  
  11. #include <stdio.h>
  12. #include "geneal.h"
  13. #include "ctype.h"
  14.  
  15. #define INDENTOFFSET 4    /* how far each generation is offset */
  16.  
  17. int        /* 0 means OK */
  18. famdtree(n)
  19. int n;        /* the person to do a tree for */
  20. {
  21.     char *ss;
  22.     char buf[1000];
  23.     int t;
  24.  
  25.     switch ((t=fgtype(n))) {
  26.     case 'I':
  27.         ss = fgbname(n);
  28.         strup(ss);        /* make it upper case */
  29.         fprintf(outfp,"Descendant tree for %s\n\n", ss);
  30.         break;
  31.     case 'F':
  32.         fgbstr(n,"N",buf);
  33.         strup(buf);
  34.         fprintf(outfp,"Descendant tree for family %s\n\n", buf);
  35.         break;
  36.     default:
  37.         warning("bad record type %c for dtree\n", t);
  38.         return 1;    /* error */
  39.     }
  40.     return famdtrr(n,0);    /* use recursive routine */
  41. }
  42.  
  43. /*..........*/
  44.  
  45. int
  46. famdtrr(n,indent)    /* recursive descendant routine */
  47. int n;            /* the person or family to do */
  48. int indent;        /* the indentation for this level */
  49. {
  50.     char buf[200];
  51.     int ccount, clist[1000];
  52.     int e;        /* error count */
  53.     int i;
  54.     char *ss, *bd, *md;
  55.     int snum;
  56.  
  57.     e = 0;
  58.     fgbstr(n,"T",buf);
  59.     if (strcmp(buf,"F")==0) {    /* if a family */
  60.         ccount = fgbclist(n,clist);    /* get list of children */
  61.         for (i=0; i<ccount; i++)
  62.             e += famdtrr(clist[i],indent);
  63.     }
  64.     else if (strcmp(buf,"I")==0) {    /* if an individual */
  65.         ss = fgbname(n);    /* get his name */
  66.         bd = fgbrtdeath(n);    /* and vital dates */
  67.         fprintf(outfp,"%*s%s%s\n", indent, "", ss, bd );
  68.         ccount = fgbslist(n,clist);    /* get list of marriages */
  69.         for (i=0; i<ccount; i++) {    /* for each marriage */
  70.             snum = fgnum(clist[i],"H");
  71.             if (snum==n) snum = fgnum(clist[i],"W"); /* spouse */
  72.             ss = fgbname(snum);    /* name of spouse */
  73.             if (ss==0 || ss[0]==0) ss = "???";
  74.             bd = fgbrtdeath(snum);
  75.             if (bd==0) bd="";
  76.             md = fgstr(clist[i],"M");    /* date of marriage */
  77.             if (md==0) md="";
  78.             fprintf(outfp,"%*s m: %s to %s%s\n",
  79.                 indent, "", md, ss, bd);
  80.             e += famdtrr(clist[i],indent+INDENTOFFSET);
  81.                 /* do the family */
  82.         }
  83.     }
  84.     else {
  85.         warning("bad record type \"%s\" in record %d", buf, n);
  86.         e++;        /* this counts as an error */
  87.     }
  88.     return e;
  89. }
  90.  
  91. /* end */
  92.