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

  1. /* geneal - manipulate family trees, etc.
  2.  * Written by Jim McBeath (jimmc) at SCI
  3.  *
  4.  * Revision history:
  5.  * 24-Jan-85    Jim McBeath    Use real dpoint instead of int for gendp.
  6.  *                Add -C switch for consistency check.
  7.  * v2.0 27-Jan-85 Jim McBeath    Add -a, -d, -V switches; add version string;
  8.  *                add GENEALDAT environment var. check.
  9.  * v2.1 29-Jan-85 Jim McBeath    7-char-distinct names
  10.  * v2.2  2-Feb-85 Jim McBeath    Adopt the .A convention for adopted items.
  11.  * v2.3 12-Feb-85 Jim McBeath    Include usage line in help message; change
  12.  *                default filename to geneal.dat (suggestions
  13.  *                of Ian Darwin)
  14.  * v2.4  8-Mar-85 Jim McBeath    minor fixes in other modules
  15.  * v2.5  2.Aug.87  jimmc  Modify -t switch to be suitable for famtree program
  16.  * v2.6 13.Aug.87  jimmc  Add -T switch
  17.  * v3.0 17.Aug.87  jimmc  Convert to genie interface
  18.  * v3.1 28.Aug.87  jimmc  Add GENEALLABEL check
  19.  * v3.2 17.Oct.87  jimmc  Convert to spin interface
  20.  *      27.Oct.87  jimmc  Add outfp
  21.  * v3.3  4.Jan.88  jimmc  Add Pfamilyh, PBDlist, PAnnlist, LRange, LAll,
  22.  *                LFieldMatch, LRefs
  23.  * v3.4  8.Jan.88  jimmc  Add GSetOutput, GGetOutput, GFlushOutput; modify
  24.  *                remaining P output routines to output to outfp;
  25.  *                add GSetSep, GGetSep; modify fampage output
  26.  *                routines to accept list of id numbers;
  27.  *                lint cleanup
  28.  *      18.Jan.88  jimmc  Make LAnc, LDesc take input list args, plus limit
  29.  *      19.Jan.88  jimmc  Clean up data file access stuff
  30.  * v3.5  1.Mar.88  jimmc  Make GVersion return a string instead of printing it
  31.  */
  32. char *genealVersion="geneal v3.5 1-Mar-88";
  33.  
  34. #define MAIN
  35.  
  36. #include <stdio.h>
  37. #include <ctype.h>
  38. #include "spin.h"
  39. #include "geneal.h"
  40.  
  41. extern char *rindex(), *getenv();
  42. extern char *getData();
  43.  
  44. extern char *Label;
  45.  
  46. char *Progname;        /* name of the program */
  47. char *defdatfile="geneal.dat";    /* default datafile name */
  48. char *gendatfile=0;    /* filename for data file */
  49. FILE *outfp=stdout;    /* stream to output to */
  50.  
  51. main(argc,argv)
  52. int argc;
  53. char *argv[];
  54. {
  55. char *estr;
  56. char *s;
  57. int i,j;
  58. char *execval=NULL;
  59.  
  60.     Progname = rindex(argv[0],'/');
  61.     if (Progname) Progname++; else Progname=argv[0];
  62.  
  63.     if (!gendatfile)    /* if he didn't specify a file... */
  64.     {
  65.         estr = getenv("GENEALDAT"); /* look for data file */
  66.         if (estr && *estr) gendatfile=estr;
  67.         else gendatfile=defdatfile;
  68.     }
  69.     fgsetfn(gendatfile);
  70.  
  71.     s = getenv("GENEALLABEL");
  72.     if (s) Label = strsav(s);
  73.  
  74.     sepstr = strsav("\f");    /* default separator string */
  75.     GSetOutput("stdout");
  76.  
  77.     applinit();
  78.     SPinitsubs();
  79.  
  80.     for (i=1; i<argc; i++) {
  81.         if (argv[i][0]=='-') for (j=1; j>0 && argv[i][j]; j++) {
  82.             switch (argv[i][j]) {
  83.             case 'e':    /* execute */
  84.                 if (argv[i][++j]) execval = argv[i]+j;
  85.                 else if (++i<argc) execval = argv[i];
  86.                 else fatalerr("not enough args for -e");
  87.                 j = -1;
  88.                 break;
  89.             default:
  90.                 fatalerr("unknown switch %c", argv[i][j]);
  91.             }
  92.         }
  93.         else {    /* not a switch */
  94.             fatalerr("unknown argument %s", argv[i]);
  95.         }
  96.     }
  97.  
  98.     if (execval) { SPmainstring(execval); }
  99.     SPmainfile(stdin);
  100.     exit(0);
  101. }
  102.  
  103. /*
  104.  * arg types are:
  105.  * i - integer
  106.  * s - string
  107.  * f - float (double)
  108.  * L - application list
  109.  */
  110.  
  111. #define BB(name,func,args) { \
  112.     extern func(); \
  113.     SPdeffunc("name",args,func); \
  114. }
  115.  
  116. #define B(name,args) BB(name,name,args)
  117.  
  118. #define BBS(name,func,args) { \
  119.     extern char *func(); \
  120.     SPdeffunc("name",args,func); \
  121. }
  122.  
  123. #define BS(name,args) BBS(name,name,args)
  124.  
  125. #define BBL(name,func,args) { \
  126.     extern SPtoken *func(); \
  127.     SPdeffunc("name",args,func); \
  128. }
  129.  
  130. #define BL(name,args) BBL(name,name,args)
  131.  
  132. applinit()
  133. {
  134. /* routines to output data pages */
  135. BB(PFamily,gfamily,"iV");
  136. BB(PFamilyh,gfamilyh,"iV");    /* alternate format family page */
  137. BB(PF,gfamily,"iV");    /* an alias */
  138. BB(PIndiv,gindivs,"iV");
  139. BB(PI,gindivs,"iV");    /* an alias */
  140. BB(P,GPfi,"iV");        /* useful for browsing */
  141. BB(PAtree,famatree,"ii");
  142. BB(PDtree,famdtree,"ii");
  143. BB(PFamtree,gfamntree,"iV");
  144. BB(PBDlist,gbdlist,"iV");
  145. BB(PAnnlist,gannlist,"iV");
  146.  
  147. /* DB dependent list generation and manipulation routines */
  148. BL(LAll,"L");
  149. BL(LAnc,"LVI-1");
  150. BL(LDesc,"LVI-1");
  151. BL(LRefs,"LVs");
  152. BL(LFieldMatch,"LVss");
  153.  
  154. /* DB independent list manipulation routines */
  155. BL(LRange,"Lii");
  156. BL(LUnion,"LVV");
  157. BL(LIntersect,"LVV");
  158. BL(LAndNot,"LVV");
  159.  
  160. /* browsing commands */
  161. B(TCurrent,"iI0");
  162. B(TFamily,"iI0");
  163. B(TFather,"iI0");
  164. B(TMother,"iI0");
  165.  
  166. /* miscellaneous routines */
  167. BS(GFlags,"ss");
  168. B(GSetLabel,"vs");
  169. BS(GGetLabel,"s");
  170. BS(GVersion,"s");
  171. B(GSetOutput,"is");
  172. BS(GGetOutput,"s");
  173. B(GFlushOutput,"v");
  174. B(GSetSep,"vs");
  175. BS(GGetSep,"s");
  176. BB(GConsist,gconsist,"i");
  177.  
  178. /* for debugging */
  179. BBS(fgstr,fgstr,"sis");
  180. }
  181.  
  182. /* end */
  183.