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

  1. /* indivs.v - print out short form info about an individual
  2.  * Written by Jim McBeath (jimmc) at SCI
  3.  *
  4.  * Revision history:
  5.  * 24-Jan-85    Jim McBeath    add include stdio
  6.  * 27-Jan-85    Jim McBeath    use fgbslist
  7.  * 18.Aug.87  jimmc  Use Gflag instead in indexes flag
  8.  * 25.Aug.87  jimmc  Add buried info
  9.  * 27.Oct.87  jimmc  General cleanup; call fggen to get GEN
  10.  *  8.Jan.88  jimmc  Lint cleanup
  11.  */
  12.  
  13. #include <stdio.h>
  14. #include "geneal.h"
  15. #include "xalloc.h"
  16.  
  17. int            /* 0 if OK */
  18. indivs(ac,av)
  19. int ac;
  20. int *av;
  21. {
  22.     int i,t;
  23.  
  24.     t = 0;
  25.     for (i=0; i<ac; i++) {
  26.         if (i>0) fprintf(outfp,sepstr);
  27.         t += indivs1(av[i]);
  28.     }
  29.     return t;
  30. }
  31.  
  32. int            /* 0 if OK */
  33. indivs1(n)
  34. int n;            /* the person's ID number */
  35. {
  36.     char *ss;
  37.     int pnum;    /* parent family number */
  38.     int fnum;    /* father's number */
  39.     int mnum;    /* mother's number */
  40.     int mgnum;    /* marriage number */
  41.     int snum;    /* spouse's number */
  42.     int mhnum, mwnum;
  43.     int i;        /* loop counter */
  44.     int t;        /* random numbers and status */
  45.     char *spousestr;
  46.     int scount, slist[1000];
  47.     char *gen;
  48.  
  49.     t = fgtype(n);
  50.     if (t!='I') {
  51.         warning("id %d is not an individual");
  52.         return 1;
  53.     }
  54.     ss = fgfname(n);
  55.     fprintf(outfp,"Name: %s\n", ss);
  56.     ss = fgbirth(n);
  57.     if (ss && *ss) fprintf(outfp,"%s\n", ss);
  58.     ss = fgdeath(n);
  59.     if (ss && *ss) fprintf(outfp,"%s\n", ss);
  60.     ss = fgburied(n);
  61.     if (ss && *ss) fprintf(outfp,"%s\n", ss);
  62.     pnum = fgnum(n,"P");    /* get number of parent family */
  63.     if (pnum>0) {            /* if we got a family */
  64.         if (Gflag['n']) fprintf(outfp,"Parent family: %d\n", pnum);
  65.         fnum = fgnum(pnum,"H");
  66.         if (fnum>=0) {
  67.             ss = fgfname(fnum);
  68.             fprintf(outfp,"  Father: %s\n", ss);
  69.             ss = fgbrtdeath(fnum);
  70.             if (ss && *ss) fprintf(outfp,"  %s\n", ss);
  71.         }
  72.         mnum = fgnum(pnum,"W");
  73.         if (mnum>=0) {
  74.             ss = fgfname(mnum);
  75.             fprintf(outfp,"  Mother: %s\n", ss);
  76.             ss = fgbrtdeath(mnum);
  77.             if (ss && *ss) fprintf(outfp,"  %s\n", ss);
  78.         }
  79.         ss = fgmarriage(pnum);
  80.         if (ss) fprintf(outfp,"Parent's marriage: %s\n", ss);
  81.         doiclist(pnum,"Sibling","Siblings",n);    /* do the siblings */
  82.     }
  83.     else {    /* no parent in this record */
  84.         if (Gflag['n']) fprintf(outfp,"No parent family specified\n");
  85.     }
  86.     scount = fgbslist(n,slist);
  87.     for (i=0; i<scount; i++) {    /* look at marriages */
  88.         mgnum = slist[i];
  89.         if (Gflag['n']) fprintf(outfp,"Marriage %d: %d\n", i, mgnum);
  90.         mhnum = fgnum(mgnum,"H");    /* are we the husband? */
  91.         mwnum = fgnum(mgnum,"W");    /*  or the wife */
  92.         if (n!=mhnum && n!= mwnum)
  93. warning("person %d claims marriage %d, but not vice-versa",
  94.                 n, mgnum);
  95.         if (n==mhnum) {
  96.             snum = mwnum;
  97.             spousestr = "Wife";
  98.         }
  99.         else {
  100.             snum = mhnum;
  101.             spousestr = "Husband";
  102.         }
  103.         if (snum>0) {
  104.             ss = fgbname(snum);
  105.             fprintf(outfp," %s: %s\n", spousestr, ss);
  106.             ss = fgbrtdeath(snum);
  107.             if (ss && *ss) fprintf(outfp," %s\n", ss);
  108.         }
  109.         ss = fgmarriage(mgnum);
  110.         if (ss && *ss) fprintf(outfp," %s\n", ss);
  111.         doiclist(mgnum,"Child","Children",-1);
  112.     }
  113.     gen = fggen(mgnum);
  114.     if (gen && *gen) fprintf(outfp,"General:\n%s\n",gen);
  115.     if (gen) XFREE(gen);
  116.     return 0;            /* finished it all OK */
  117. }
  118.  
  119. /*..........*/
  120.  
  121. doiclist(pnum,c1,cm,xn)        /* print out info about children */
  122. int pnum;            /* the family to deal with */
  123. char *c1;            /* string to use if one child */
  124. char *cm;            /* string to use if more than one child */
  125. int xn;        /* number of special sibling, or -1 if none */
  126. {
  127.     int i;
  128.     int t;
  129.     char *ss;
  130.     int *clist;
  131.     int cflag=0;
  132.  
  133.     t = fgclist(pnum,&clist);    /* get list of kids */
  134.     if (t==0) {
  135.         if (Gflag['n']) fprintf(outfp,"No %s specified\n", cm);
  136.         if (xn>0)
  137. warning("person %d claims parents %d but not vice-versa", xn, pnum);
  138.     }
  139.     else {
  140.         if (t==1) fprintf(outfp,"  1 %s:\n",c1);
  141.         else fprintf(outfp,"  %d %s:\n",t,cm);
  142.         for (i=0; i<t; i++) {    /* for each child */
  143.             if (clist[i]==xn) cflag++;
  144.                 /* note found special sibling */
  145.             if (Gflag['n']) fprintf(outfp,"  %s %d:", c1, i);
  146.             ss = fgtname(clist[i]);
  147.             fprintf(outfp,"  %s%s\n",(clist[i]==xn?"*":""),ss);
  148.             ss = fgbrtdeath(clist[i]);
  149.             if (ss&&*ss) fprintf(outfp,"  %s\n", ss);
  150.         }
  151.         if (xn>0 && cflag==0)
  152. warning("person %d claims parents %d but not vice-versa", xn, pnum);
  153.     }
  154. }
  155.  
  156. /* end */
  157.