⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 diskbank.c

📁 地球模拟器
💻 C
字号:
/* diskbank.c   9-9-92  disk genebank manager for the Tierra Simulator *//* Tierra Simulator V4.0: Copyright (c) 1991, 1992 Tom Ray & Virtual Life */#ifndef lintstatic char sccsid[] = "@(#)diskbank.c	1.0        7/21/92";#endif#include "license.h"#include "tierra.h"#include "extern.h"#include <errno.h>#include <sys/types.h>#ifdef unix#include <dirent.h>#endif               /* unix */#ifdef __TURBOC__#include <dir.h>#include <dos.h>#define d_name ff_name#endif               /* __TURBOC__ */#ifdef MEM_CHK#include <memcheck.h>#endifvoid Inject(g, size, sad, tol, disk, rrpi)FpInst  g;     /* pointer to genome */I32s    size;  /* size of genome */I32s    sad;   /* suggested address for placement of genome */I32s    tol;   /* tolerance placement of genome */I32s    disk;  /* 1 = this genome comes from the disk */float   *rrpi; /* reap rand prop for injection */{   float   tReapRndProp = ReapRndProp;    I32s    osize, j, k;    I16s   gi;    Pcells  ce;    FpInst  si;    Event    SizGen;    GlIndex  GiHash;    ce = GetFreeCell();   /* get a cell structure */    ce->ld = 1;    ce->d.gen.size = ce->mm.s = size;    ReapRndProp = *rrpi;   /* allocate the needed memory */    while ((ce->mm.p = MemAlloc(size, sad, tol)) < 0)        reaper(1,sad);    ReapRndProp = tReapRndProp;    ce->c.ip = ce->mm.p;    si = ce->d.genome = soup + ce->c.ip;    if (ce == &cells[0][2])    {   ce->q.p_reap = TopDummy->q.this;        ce->q.n_reap = BottomDummy->q.this;        TopDummy->q.n_reap = ce->q.this;        BottomDummy->q.p_reap = ce->q.this;    }    else    {   EntBotSlicer(ce);        EntBotReaper(ce);    }    ce->d.is = 1;    for (j = 0; j < size; j++, si++) /* put genome in soup */#if PLOIDY == 1        si[0] = g[j];#else  /* PLOIDY == 1 */    for (k = 0; k < PLOIDY; k++)        si[0][k] = g[j][k];#endif /* PLOIDY == 1 */    if (GeneBnker) /* determine genotype, record in genebanker */    {   GiHash = CheckGenotype(ce->d, 21);    /* check .gen files */        ce->d.hash = GiHash.si;        ce->d.gi = gi = GiHash.gi;        strcpy(ce->d.gen.label, Int2Lbl(GiHash.gi));        ce->d.parent = sl[size]->g[gi]->parent;        SizGen = DivGenBook(NULL, ce, InstExe, reaped, 0, 0, disk);        NumGenotypes += SizGen.i;        NumSizes += SizGen.m;    }    OutDisk((I32s) 'b', ce);}void InjectFromBank(crit, sad, tol)    I8s     *crit;    I32s    sad;   /* suggested address for placement of genome */    I32s    tol;   /* tolerance placement of genome */{    float  rrpi = 1;    I32s   size;    GList  *g;    g = GetAGen(crit);    sscanf(crit, "%4ld", &size);    Inject(g->genome, size, sad, tol, 1, &rrpi);    FreeGen(g);}void FreeGen(g)    GList  *g;{   if (g)    {   if (g->genome)        {   tfree(g->genome);            g->genome = NULL;        }        if (g->gbits)        {   tfree(g->gbits);            g->gbits = NULL;        }        tfree(g);        g = NULL;    }}GList * GetAGen(crit)    I8s     *crit;{    I32s   size;    I16s   n;    GList  *g;    char   cpath[128], gen[4];    FILE   *fp;    head_t head;    indx_t *indx, *tindx, gindx;    sscanf(crit, "%4ld%3s", &size, gen);    sprintf(cpath, "%s%04ld.gen", GenebankPath, size);    if (!(fp = open_ar(cpath, size, GFormat, 0)))    {   FEError(-1306,EXIT,NOWRITE,            "Tierra InjectFromBank() unable to open genome file %s\n",cpath);    }    head = read_head(fp);#ifdef __TURBOC__    indx = &gindx;    n = find_gen(fp, indx, gen, head.n);    tindx = indx;#else  /* __TURBOC__ */    indx = read_indx(fp, &head);    n = find_gen(fp, indx, gen, head.n);    tindx = &indx[n];#endif /* __TURBOC__ */    g = get_gen(fp, &head, tindx, n);    fclose(fp);#ifndef __TURBOC__    if (indx)    {   thfree(indx);        indx = NULL;    }#endif  /* __TURBOC__ */    return g;}void extract(ce)    Pcells ce;{    I16u i, j;    I32s size;    I32s ip;    Pgl g;    FILE *fp;    head_t head;    indx_t *indx, gindx;    if (!GeneBnker)        return;    isolate = 0;#ifdef IBM3090    sprintf(Buff, "%04ld.gen.d", ce->d.gen.size);#else    sprintf(Buff, "%s%04ld.gen", GenebankPath, ce->d.gen.size);#endif    size = ce->d.gen.size;    g = sl[size]->g[ce->d.gi];    sprintf(ExtrG, "%04ld%s @ %ld", g->gen.size, g->gen.label, g->pop);#if FRONTEND == STDIOsprintf(mes[0], "extract: %s", ExtrG);FEMessage(1,mes);#else /* FRONTEND == STDIO */    if (Log) fprintf(tfp_log, "ex = %s\n", ExtrG);#endif /* FRONTEND == STDIO *//* DAN open an archive, if it does not exist, create it */    if (!(fp = open_ar(Buff, ce->d.gen.size, GFormat, -1)))    {   FEError(-200,EXIT,NOWRITE,            "Tierra extract() Unable to open extract file %s",Buff);    }    head = read_head(fp);#ifdef __TURBOC__    indx = &gindx;#else  /* __TURBOC__ */    indx = read_indx(fp, &head);#endif /* __TURBOC__ */    add_gen(fp, &head, &indx, g);#ifndef __TURBOC__    if (indx)    {   thfree(indx);        indx = NULL;    }#endif /* __TURBOC__ */    fclose(fp);    NumGenDG++;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -