v07i085: Whales and Plankton, part 12/13
Brandon S. Allbery - comp.sources.misc
allbery at uunet.UU.NET
Wed Jul 19 11:43:32 AEST 1989
Posting-number: Volume 7, Issue 85
Submitted-by: loy at gtx.UUCP (Bob Loy)
Archive-name: whpl/part12
# whpl12of13.shar
#---cut here---cut here---cut here---cut here---cut here---
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files.
# This archive created: Sat Jan 14 04:05:23 MST 1989
export PATH; PATH=/bin:$PATH
echo shar: extracting "'symmet.c'" '(25953 characters)'
if test -f 'symmet.c'
then
echo shar: will not over-write existing file "'symmet.c'"
else
sed 's/^X//' << \SHAR_EOF > 'symmet.c'
X
X#ifndef lint
X static char sccsid[] = " %M% %I% ";
X static char dateid[] = " %E% ";
X#endif
X
X/*@#==========================================================================*
X@@#
X@@@#@^ symmet.c
X@#
X@# Purpose:
X@@# Multiplies whales by 4, shifting genesets 90, 180, & 270 degrees,
X@@# and/or multiplies whales by 2, creating whale(s) of opposite sex.
X@#
X@#@^Options:
X@#@^ -g takes each whale from input file and writes out: it, and three new
X@#@^ whales with rotated genes. This is also the default if neither
X@#@^ -g nor -s is specified.
X@#@^ -s takes each whale from input file and writes out: it, and one new
X@#@^ whale of the opposite sex.
X@#@^ Both the above used together will create 7 new whales for each input
X@#@^ whale, two sexes for both the original and rotated gene sets.
X@#@^ -i infile name. Must be specified.
X@#@^ -o outfile name, optional. See Examples for default.
X@#@^ -r similar to the -r opt in whpl.c. Adds to DATRUN in whpl.h.
X@#@^
X@# Examples:
X@# symmet -i infile -o outfile -s
X@# sex-clones only in outfile, no gene-clones
X@# symmet -i infile -r 1704
X@# output file will be similar to whpl.c "whc" & "whs" files; lead-
X@# ing string will be "whg"; e.g., whg121704, a file of gene-clones.
X@#
X@# Compiling:
X@# cc -O symmet.c -o symmet
X@#
X@# Dependencies:
X@# whpl.h, include file
X@#
X@# Functions:
X@# void gophandle();
X@# void whalewrite();
X@# void checkwhale();
X@# void whaleread();
X@# void genesex();
X@# void main();
X@#
X@# General Comments:
X@# The name of this program is short for "symmetry." Most whales'
X@# genesets will have a tendency to move the whale in one of the four
X@# directions. This program will create "clones" of whales read from
X@# a file which have the genesets "rotated" to the other three possible
X@# directions. Both the original whale and clones are written out to
X@# a new file.
X@# As a further option, "sex-clones" can also be output. The genes are
X@# the same, but the sex of the new whale is oppoosite. The theory
X@# behind this is that males and females have somewhat different mating
X@# opportunities. Successful females produce offspring more steadily,
X@# once per mating cycle, while a successful male may nevertheless go
X@# a few cycles without mating at all, and then produce many offspring
X@# all at once. Giving two whales the same genes but opposite sex
X@# reduces the element of luck for those genes.
X@# In order to create unique whale ID's, certain changes must be made to
X@# the new cloned whales' ID strings.
X@# For gene-cloned whales, the mutate field for all whales, including the
X@# original one, is incremented to 2000000000. Also the "clonees"
X@# have their gennum field incremented by 100000000, 200000000, &
X@# 300000000, respectively, to create unique ID's.
X@# For sex-cloned whales, the gennum field for the orignial whale is in-
X@# cremented to 2000000000, while the clonee's is bumped to 3000000000.
X@# Admittedly, changing any field in the original whale makes it a "diff-
X@# erent" whale. That is why only the highest order, easily checked
X@# digit in either the gennum or mutate field is affected for this
X@# whale. But changing these fields allows this program to warn if
X@# this whale is ever used for cloning purposes again.
X@#
X@# Note: Makes all whales in output file "Live," even if they were dead
X@# in the original file. The program automatically multiplies the
X@# Number & Live fields in the output file header by 2, 4, or 8.
X@#
X@#---------------------------------------------------------------------------*/
X
X/*---------------------------------------------------------------------------*
X Top-level Declaration - includes, defines, externs & globals.
X*----------------------------------------------------------------------------*/
X
X#include <stdio.h>
X#include "whpl.h"
X
X /* EXTERNS FROM */
X /* Functions From libraries: */
X extern char *malloc();
X extern FILE *fopen();
X extern int fclose();
X
X /* GLOBALS */
X static whale_type *whale; /* Start of array of whale structs */
X static Uint whale_size = sizeof(whale_type); /* Whale struct size */
X static Uint limit;
X static int debug = 5; /* Debug level from 0 - 9; 9 prints all */
X static int daterun = DATRUN; /* ID stamp for output filename */
X static FILE *whin; /* Pointer to whale input file */
X static char whinfile[40]; /* Holds name of whale in-file */
X static char whinstr[99]; /* For lines read from whale in-file */
X static FILE *whou; /* Pointer to whale output file */
X static char whoutfile[40]; /* Holds name of whale out-file */
X static short infileflg = FALSE;
X static short outfileflg = FALSE;
X static short geneflg = FALSE;
X static short sexflg = FALSE;
X static Uint selfd;
X static Uint selfg;
X static Uint selfm;
X static char genes[7];
X static char die[2];
X static char sex[2];
X static int age;
X static int ofr;
X static int rtg;
X static int erec[20];
X static short edex;
X static short hg[16];
X static short fg[16];
X static int lsr;
X static short df[20];
X static short tl[20];
X static short rk[20];
X static int asav;
X static short amax;
X static short amin;
X static Uint fathd;
X static Uint fathg;
X static Uint fathm;
X static char fgns[7];
X static Uint mothd;
X static Uint mothg;
X static Uint mothm;
X static char mgns[7];
X static short chidex;
X static short alchldn;
X static Uint ofd[50];
X static Uint ofg[50];
X static Uint ofm[50];
X static char ogns[50][7];
X static char cgns[7];
X
X
X/*---------------------------------------------------------------------------*
X@
X@@ void gophandle(argc, argv); Decipher command line arguments.
X@ output: Sets flags & loads values into variables
X@ caller: main()
X@ calls : getopt(), may call exit()
X@
X@*---------------------------------------------------------------------------*/
X
Xvoid
Xgophandle(argc, argv)
X int argc;
X char *argv[];
X{
X extern int optind;
X extern char *optarg;
X int cc;
X int run;
X
X /* check command line arguments */
X while ((cc = getopt(argc, argv, "gi:o:r:s")) != EOF)
X switch(cc)
X {
X case 'g':
X case 'G':
X geneflg = TRUE;
X break;
X case 'i':
X case 'I':
X strncpy(whinfile, optarg, 39);
X infileflg = TRUE;
X break;
X case 'o':
X case 'O':
X strncpy(whoutfile, optarg, 39);
X outfileflg = TRUE;
X break;
X case 's':
X case 'S':
X sexflg = TRUE;
X break;
X case 'r':
X case 'R':
X run = atoi(optarg);
X daterun += run;
X break;
X default:
X if (debug >= 1)
X {
X fprintf(stderr, "\n");
X fprintf(stderr, "usage: ");
X fprintf(stderr,
X "symmet -i<input file name> -o<output file name>\n");
X fprintf(stderr,
X " -g(do genes) -s(do sex) -r<run number>\n");
X fprintf(stderr, "\n");
X }
X exit(2);
X break;
X }
X}
X
X/*---------------------------------------------------------------------------*
X@
X@@ void whalewrite(whale number, whale, fname, limit); Outputs whale record.
X@ input : Individual whale number, file for output
X@ output: See "WHALE FILE BODY" note in fileout() in whio.c
X@ caller: genesex()
X@ calls : fprintf()
X@
X@*---------------------------------------------------------------------------*/
X
Xvoid
Xwhalewrite(num, j, whout, lim)
X int num;
X int j;
X FILE *whout;
X short lim;
X{
X register int k;
X char genes[7];
X
X genes[0] = whale[j].hunttype;
X genes[1] = whale[j].hgperchr;
X genes[2] = whale[j].feedtype;
X genes[3] = whale[j].fgperchr;
X genes[4] = whale[j].countgene;
X genes[5] = whale[j].extragene;
X genes[6] = '\0';
X if (!lim)
X {
X fprintf(whout, "\n# %4d", num);
X fprintf(whout, "\nwh ");
X }
X fprintf(whout, " %10u", whale[j].self.datrun);
X fprintf(whout, " %10u", whale[j].self.gennum);
X fprintf(whout, " %10u", whale[j].self.mutate);
X fprintf(whout, " %s", genes);
X fprintf(whout, "\n");
X if (lim)
X return;
X fprintf(whout, " L");
X fprintf(whout, " %c", whale[j].sex);
X fprintf(whout, " %3d", whale[j].age);
X fprintf(whout, " %5d", whale[j].offratio);
X fprintf(whout, " %7d", whale[j].rating);
X fprintf(whout, "\n");
X fprintf(whout, " ");
X for (k = 0; k < 16; k++)
X fprintf(whout, " %2hd", whale[j].huntgene[k]);
X fprintf(whout, "\n");
X fprintf(whout, " ");
X for (k = 0; k < 16; k++)
X fprintf(whout, " %2hd", whale[j].feedgene[k]);
X fprintf(whout, "\n");
X fprintf(whout, "en ");
X fprintf(whout, " %2hd\n", whale[j].endex);
X for (k = 0; k < whale[j].endex; k++)
X fprintf(whout, " %7d\n", whale[j].enrec[k]);
X fprintf(whout, "rat ");
X fprintf(whout, " %7d\n", whale[j].lastrat);
X for (k = 0; k < 4; k++)
X fprintf(whout, "%6hd %3hd %4hd ", whale[j].comp[k].diff,
X whale[j].comp[k].totl, whale[j].comp[k].rank);
X fprintf(whout, "\n");
X for (k = 4; k < 8; k++)
X fprintf(whout, "%6hd %3hd %4hd ", whale[j].comp[k].diff,
X whale[j].comp[k].totl, whale[j].comp[k].rank);
X fprintf(whout, "\n");
X for (k = 8; k < 12; k++)
X fprintf(whout, "%6hd %3hd %4hd ", whale[j].comp[k].diff,
X whale[j].comp[k].totl, whale[j].comp[k].rank);
X fprintf(whout, "\n");
X for (k = 12; k < 16; k++)
X fprintf(whout, "%6hd %3hd %4hd ", whale[j].comp[k].diff,
X whale[j].comp[k].totl, whale[j].comp[k].rank);
X fprintf(whout, "\n");
X for (k = 16; k < 20; k++)
X fprintf(whout, "%6hd %3hd %4hd ", whale[j].comp[k].diff,
X whale[j].comp[k].totl, whale[j].comp[k].rank);
X fprintf(whout, "\n");
X fprintf(whout, "anc ");
X fprintf(whout, " %7d", whale[j].ancesave);
X fprintf(whout, " %3hd", whale[j].ancesmax);
X fprintf(whout, " %3hd", whale[j].ancesmin);
X fprintf(whout, "\n");
X fprintf(whout, " %10u", whale[j].father.datrun);
X fprintf(whout, " %10u", whale[j].father.gennum);
X fprintf(whout, " %10u", whale[j].father.mutate);
X fprintf(whout, " %s", whale[j].father.gns);
X fprintf(whout, "\n");
X fprintf(whout, " %10u", whale[j].mother.datrun);
X fprintf(whout, " %10u", whale[j].mother.gennum);
X fprintf(whout, " %10u", whale[j].mother.mutate);
X fprintf(whout, " %s", whale[j].mother.gns);
X fprintf(whout, "\n");
X fprintf(whout, "off ");
X fprintf(whout, " %2hd", whale[j].childex);
X fprintf(whout, " %4hd", whale[j].allchldn);
X fprintf(whout, "\n");
X for (k = 0; k < whale[j].childex; k++)
X {
X fprintf(whout, " %10u", whale[j].offspr[k].datrun);
X fprintf(whout, " %10u", whale[j].offspr[k].gennum);
X fprintf(whout, " %10u", whale[j].offspr[k].mutate);
X fprintf(whout, " %s\n", whale[j].offspr[k].gns);
X }
X fprintf(whout, "\n");
X}
X
X/*---------------------------------------------------------------------------*
X@
X@@ void checkwhale(); Checks to see if whale has been cloner/clonee before.
X@ output: Warning message
X@ caller: whaleread()
X@
X@*---------------------------------------------------------------------------*/
X
Xvoid
Xcheckwhale(j)
X int j;
X{
X if (sexflg)
X {
X if (whale[j].self.gennum >= 2000000000)
X {
X if (debug >= 2)
X {
X fprintf(stderr, "\ncheckwhale(): whale.gennum = %u\n",
X whale[j].self.gennum);
X fprintf(stderr,
X " This whale already sex-cloned at one time!\n");
X fprintf(stderr,
X " Program output may duplicate previous whales.\n");
X }
X }
X }
X if (geneflg)
X {
X if (whale[j].self.mutate >= 2000000000)
X {
X if (debug >= 2)
X {
X fprintf(stderr, "\ncheckwhale(): whale.mutate = %u\n",
X whale[j].self.mutate);
X fprintf(stderr,
X " This whale already gene-cloned at one time!\n");
X fprintf(stderr,
X " Program output may duplicate previous whales.\n");
X }
X }
X }
X}
X
X/*---------------------------------------------------------------------------*
X@
X@@ void whaleread(whale, how); Fills whale structures. From whpl.c.
X@ output: Filled structure for given whale
X@ caller: main()
X@ calls : checkwhale(); fgets(), sscanf()
X@
X@*---------------------------------------------------------------------------*/
X
Xvoid
Xwhaleread(j, how)
X register int j;
X short how;
X{
X register int k;
X static char blankgns[7] = " ";
X
X if (how == 1)
X {
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%*s%u%u%u%s",
X &selfd, &selfg, &selfm, genes);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%s%s%d%d%d", die, sex, &age, &ofr, &rtg);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd",
X &hg[0],&hg[1],&hg[2],&hg[3],&hg[4],&hg[5],&hg[6],&hg[7],
X &hg[8],&hg[9],&hg[10],&hg[11],&hg[12],&hg[13],&hg[14],&hg[15]);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd",
X &fg[0],&fg[1],&fg[2],&fg[3],&fg[4],&fg[5],&fg[6],&fg[7],
X &fg[8],&fg[9],&fg[10],&fg[11],&fg[12],&fg[13],&fg[14],&fg[15]);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%*s%hd", &edex);
X for (k = 0; k < edex; k++)
X {
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%d", &erec[k]);
X }
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%*s%d", &lsr);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd",
X &df[0],&tl[0],&rk[0], &df[1],&tl[1],&rk[1],
X &df[2],&tl[2],&rk[2], &df[3],&tl[3],&rk[3]);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd",
X &df[4],&tl[4],&rk[4], &df[5],&tl[5],&rk[5],
X &df[6],&tl[6],&rk[6], &df[7],&tl[7],&rk[7]);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd",
X &df[8],&tl[8],&rk[8], &df[9],&tl[9],&rk[9],
X &df[10],&tl[10],&rk[10], &df[11],&tl[11],&rk[11]);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd",
X &df[12],&tl[12],&rk[12], &df[13],&tl[13],&rk[13],
X &df[14],&tl[14],&rk[14], &df[15],&tl[15],&rk[15]);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd",
X &df[16],&tl[16],&rk[16], &df[17],&tl[17],&rk[17],
X &df[18],&tl[18],&rk[18], &df[19],&tl[19],&rk[19]);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%*s%d%hd%hd", &asav, &amax, &amin);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%u%u%u%s", &fathd, &fathg, &fathm, fgns);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%u%u%u%s", &mothd, &mothg, &mothm, mgns);
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%*s%hd%hd", &chidex, &alchldn);
X for (k = 0; k < chidex; k++)
X {
X fgets(whinstr, 97, whin);
X sscanf(whinstr, "%u%u%u%s", &ofd[k], &ofg[k], &ofm[k], cgns);
X strncpy(&ogns[k][0], cgns, 7);
X }
X /* Begin assigning input to whale[j]: */
X for (k = 0; k < 20; k++)
X {
X if (k < edex)
X whale[j].enrec[k] = erec[k];
X else
X whale[j].enrec[k] = 0;
X }
X if (edex == 20)
X {
X if (debug >= 2)
X {
X fprintf(stderr,
X "\nwhaleload(): wh[%d].enrec array is FULL\n", j);
X fprintf(stderr, " *** WILL OVERWRITE IN PROGRAM ***\n");
X }
X edex = 19;
X }
X whale[j].endex = edex;
X whale[j].age = age;
X whale[j].sex = sex[0];
X for (k = 0; k < 20; k++)
X {
X whale[j].comp[k].diff = df[k];
X whale[j].comp[k].totl = tl[k];
X whale[j].comp[k].rank = rk[k];
X }
X whale[j].ancesave = asav;
X whale[j].ancesmax = amax;
X whale[j].ancesmin = amin;
X whale[j].father.datrun = fathd;
X whale[j].father.gennum = fathg;
X whale[j].father.mutate = fathm;
X strncpy(whale[j].father.gns, fgns, 7);
X whale[j].mother.datrun = mothd;
X whale[j].mother.gennum = mothg;
X whale[j].mother.mutate = mothm;
X strncpy(whale[j].mother.gns, mgns, 7);
X whale[j].self.datrun = selfd;
X whale[j].self.gennum = selfg;
X whale[j].self.mutate = selfm;
X strncpy(whale[j].self.gns, genes, 7);
X if (chidex == 49)
X {
X if (debug >= 2)
X {
X fprintf(stderr,
X "\nwhaleload(): wh[%d].offspr array is FULL\n", j);
X fprintf(stderr, " *** MAY WRAP AROUND IN PROGRAM ***\n");
X }
X }
X for (k = 0; k < 50; k++)
X {
X if (k < chidex)
X {
X whale[j].offspr[k].datrun = ofd[k];
X whale[j].offspr[k].gennum = ofg[k];
X whale[j].offspr[k].mutate = ofm[k];
X strncpy(whale[j].offspr[k].gns, &ogns[k][0], 7);
X }
X else
X {
X whale[j].offspr[k].datrun = 0;
X whale[j].offspr[k].gennum = 0;
X whale[j].offspr[k].mutate = 0;
X strncpy(whale[j].offspr[k].gns, blankgns, 7);
X }
X }
X whale[j].childex = chidex;
X whale[j].allchldn = alchldn;
X whale[j].hunttype = genes[0];
X whale[j].hgperchr = genes[1];
X whale[j].feedtype = genes[2];
X whale[j].fgperchr = genes[3];
X for (k = 0; k < 16; k++)
X whale[j].huntgene[k] = hg[k];
X for (k = 0; k < 16; k++)
X whale[j].feedgene[k] = fg[k];
X whale[j].countgene = genes[4];
X whale[j].extragene = genes[5];
X }
X whale[j].sortfield = 0;
X whale[j].energy = 1000000;
X whale[j].die = 0;
X whale[j].offratio = 0;
X whale[j].rating = 0;
X whale[j].lastrat = 0;
X whale[j].huntdex = 0;
X whale[j].feeddex = 0;
X whale[j].lastfed = 1000000;
X whale[j].huntfeed = 'H';
X whale[j].locatn = 0;
X checkwhale(j);
X /* Change structure fields to 2XXXXXXXXX to show cloning */
X if (geneflg)
X whale[j].self.mutate += 1000000000;
X if (sexflg)
X whale[j].self.gennum += 1000000000;
X}
X
X/*---------------------------------------------------------------------------*
X@
X@@ void genesex(); Sets up genes and sexes for cloned whales for output.
X@ input : globals geneflg, sexflg
X@ caller: main()
X@ calls : whalewrite()
X@
X@*---------------------------------------------------------------------------*/
X
Xvoid
Xgenesex()
X{
X register int j, k;
X static int wh = 0;
X short gen;
X
X if (sexflg)
X {
X if (whale[0].sex == 'M')
X {
X whale[1].sex = 'F';
X }
X else if (whale[0].sex == 'F')
X {
X whale[1].sex = 'M';
X }
X whale[1].self.gennum += 1000000000;
X }
X if (geneflg && sexflg)
X {
X if (whale[0].sex == 'M')
X {
X whale[3].sex = 'F';
X whale[5].sex = 'F';
X whale[7].sex = 'F';
X }
X else if (whale[0].sex == 'F')
X {
X whale[3].sex = 'M';
X whale[5].sex = 'M';
X whale[7].sex = 'M';
X }
X whale[3].self.gennum += 1000000000;
X whale[5].self.gennum += 1000000000;
X whale[7].self.gennum += 1000000000;
X }
X if (geneflg && sexflg)
X {
X gen = 1;
X for (j = 2; j < limit; j += 2)
X {
X for (k = 0; k < 16; k++)
X {
X hg[k] += 16;
X if (hg[k] > 63)
X hg[k] = hg[k] - 64;
X whale[j].huntgene[k] = hg[k];
X whale[j + 1].huntgene[k] = hg[k];
X fg[k] += 16;
X if (fg[k] > 63)
X fg[k] = fg[k] - 64;
X whale[j].feedgene[k] = fg[k];
X whale[j + 1].feedgene[k] = fg[k];
X }
X whale[j].self.gennum += 100000000 * gen;
X whale[j + 1].self.gennum += 100000000 * gen;
X gen++;
X }
X }
X else if (geneflg)
X {
X for (j = 1; j < limit; j++)
X {
X for (k = 0; k < 16; k++)
X {
X hg[k] += 16;
X if (hg[k] > 63)
X hg[k] = hg[k] - 64;
X whale[j].huntgene[k] = hg[k];
X fg[k] += 16;
X if (fg[k] > 63)
X fg[k] = fg[k] - 64;
X whale[j].feedgene[k] = fg[k];
X }
X whale[j].self.gennum += 100000000 * j;
X }
X }
X for (j = 0; j < limit; j++)
X whalewrite(wh + j, j, whou, 0);
X wh += limit;
X}
X
X/*---------------------------------------------------------------------------*
X@
X@@ void main(argc, argv); Calling function for symmet.c
X@ input : Constants from whpl.h and command line arguments.
X@ calls : gophandle(), whaleread() genesex(); malloc(), fopen(), exit()
X@
X@*---------------------------------------------------------------------------*/
X
Xvoid
Xmain(argc, argv)
X int argc;
X char *argv[];
X{
X register int k;
X int j = FNMTRUNC - 1;
X char datr[11];
X char temp[11];
X short numinfile = 0;
X short livinfile = 0;
X char *test = whinstr;
X short foundin = 0;
X short firstflg = TRUE;
X Uint numwh = NUMWH;
X
X gophandle(argc, argv); /* Handle command line arguments */
X if (!geneflg && !sexflg)
X geneflg = TRUE;
X if (!outfileflg)
X {
X if (debug >= 4)
X fprintf(stderr, "\n No output file specified on command line\n");
X sprintf(temp, "%8u", daterun);
X do{
X j++;
X datr[j - FNMTRUNC] = temp[j];
X } while (temp[j] != '\0');
X strcat(whoutfile, "whg");
X strcat(whoutfile, datr);
X if (debug >= 4)
X fprintf(stdout, " output filename: %s\n", whoutfile);
X }
X if ((whou = fopen(whoutfile, "w")) == NULL)
X if (debug >= 2)
X fprintf(stderr, "\n WARNING: did not open output file %s\n\n");
X/* FOR TEST:
X whou = stdout;
X*/
X if (infileflg) /* Read one input whale file */
X {
X if ((whin = fopen(whinfile, "r")) != NULL)
X {
X while ((test = fgets(whinstr, 97, whin)) != NULL)
X {
X if (whinstr[0] == '#')
X {
X test = fgets(whinstr, 97, whin);
X if (whinstr[0] == 'w' && whinstr[1] == 'h')
X {
X test = NULL;
X break;
X }
X else
X {
X fprintf(stderr, "\n Bad Input Whale File\n");
X fprintf(stderr, " Program exiting.\n\n");
X exit(1);
X }
X }
X if (firstflg)
X fputs(whinstr, whou);
X if (whinstr[2] == 'I' && whinstr[3] == 'N')
X {
X foundin++;
X break;
X }
X }
X if (test == NULL)
X rewind(whin);
X }
X else
X {
X if (debug >= 2)
X {
X fprintf(stderr, "\n WARNING: did not open input file %s\n\n",
X whinfile);
X fprintf(stderr, " Program exiting.\n\n");
X }
X exit(1);
X }
X }
X else
X {
X if (debug >= 2)
X {
X fprintf(stderr, "\n No INPUT FILE specified on command line\n");
X fprintf(stderr, " Program exiting.\n\n");
X }
X exit(1);
X }
X if (!foundin)
X {
X if (debug >= 2)
X fprintf(stderr, "\n Warning: not a standard Whale File\n");
X }
X /* Make room for whales */
X if (geneflg && sexflg)
X limit = 8;
X else if (geneflg)
X limit = 4;
X else if (sexflg)
X limit = 2;
X whale = (whale_type *) malloc(limit * whale_size);
X if (whale == NULL)
X {
X if (debug >= 2)
X fprintf(stderr, "\nWhale malloc problems.\n");
X exit(9);
X }
X /* Read in whales from file if proper flags set */
X j = 0;
X k = 0;
X while (fgets(whinstr, 97, whin) != NULL)
X {
X if (whinstr[0] == '#')
X firstflg = 0;
X if (firstflg)
X {
X if (whinstr[4] == 'N' && whinstr[5] == 'u')
X {
X sscanf(whinstr, "%*s%hd", &numinfile);
X if (geneflg)
X numinfile *= 4;
X if (sexflg)
X numinfile *= 2;
X fprintf(whou, " Number %4d\n", numinfile);
X k++;
X }
X if (whinstr[4] == 'L' && whinstr[5] == 'i')
X {
X fprintf(whou, " Live %4d\n", numinfile);
X k++;
X }
X if (!k)
X fputs(whinstr, whou);
X k = 0;
X }
X if (whinstr[0] == '#') /* Found a whale */
X {
X whaleread(j, 1); /* Fill whale struct from whale file rec */
X if (geneflg && sexflg)
X whale[j + 7] = whale[j + 6] = whale[j + 5] = whale[j + 4] =
X whale[j + 3] = whale[j + 2] = whale[j + 1] = whale[j];
X else if (geneflg)
X whale[j + 3] = whale[j + 2] = whale[j + 1] = whale[j];
X else if (sexflg)
X whale[j + 1] = whale[j];
X genesex();
X }
X }
X fclose(whin);
X fclose(whou);
X if (debug >= 4)
X fprintf(stdout, "\nFINISHED\n\n");
X}
SHAR_EOF
if test 25953 -ne "`wc -c < 'symmet.c'`"
then
echo shar: error transmitting "'symmet.c'" '(should have been 25953 characters)'
fi
fi # end of overwriting check
# End of shell archive
exit 0
---
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
Bob Loy | Life is the detour you take on the
...!sun!sunburn!gtx!loy | way to where you're really going.
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
More information about the Comp.sources.misc
mailing list