home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / xplatfrm / tierra / arg.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-04-26  |  4.0 KB  |  175 lines

  1. /* arg.c  4-10-91  bookeeping functions for the tierra simulator */
  2. /** Tierra Simulator V3.0: Copyright (c) 1991 Tom Uffner **/
  3. #include "license.h"
  4.  
  5. #ifndef lint
  6. static char sccsid[] = "@(#)arg.c    1.6     9/19/91";
  7. #endif
  8.  
  9. #include "tierra.h"
  10. #include "declare.h"
  11. #include "arginst.h"
  12. #include <errno.h>
  13.  
  14. #ifdef unix
  15. char *malloc();
  16. #endif
  17.  
  18. int  hangup = 0;
  19.  
  20. int main(argc, argv)
  21.     int   argc;
  22.     char  *argv[];
  23. {
  24.     I8s  com, *mod, *u = "usage:  arg c|r[vo12] afile size file [file...]\n\
  25. \targ x[vo12] afile [genotype [genotype...]]\n\targ t[v] afile\n";
  26.     I8s  *file = 0, hbuf[5];
  27.     int i, v = 0, o = 0, f = 1, size = 0;
  28.     FILE *afp = 0;
  29. #ifdef __TURBOC__
  30.     float  z = sin(0);
  31. #endif
  32.  
  33.     struct g_list *g = 0;
  34.     head_t head;
  35.     indx_t *indx;
  36.  
  37.     if (argc < 3) {
  38.     fprintf(stderr, u);
  39.     exit(1);
  40.     }
  41.     switch (com = *argv[1]) {
  42.     case 'c':
  43.     case 'r':
  44.     if (argc < 5) {
  45.         fprintf(stderr, u);
  46.         exit(2);
  47.     }
  48.     if (!sscanf(argv[3], "%d", &size)) {
  49.         fprintf(stderr, u);
  50.         exit(3);
  51.     }
  52.     case 't':
  53.     case 'x':
  54.     break;
  55.     default:
  56.     fprintf(stderr, u);
  57.     exit(4);
  58.     }
  59.     for (mod = ++argv[1]; *mod; mod++)
  60.     switch (*mod) {
  61.     case 'v':
  62.         ++v;
  63.         break;
  64.     case 'o':
  65.         ++o;
  66.         break;
  67.     case '1':
  68.     case '2':
  69.     case '3':
  70.     case '4':
  71.     case '5':
  72.     case '6':
  73.     case '7':
  74.     case '8':
  75.     case '9':
  76.         f = *mod - '0';
  77.         break;
  78.     default:
  79.         fprintf(stderr, u);
  80.         exit(5);
  81.     }
  82.     file = argv[2];
  83.  
  84.     switch (com) {
  85.     case 'c':
  86.     fprintf(stdout, "creating archive \"%s\"\n", file);
  87.     case 'r':
  88.     if (!(afp = open_ar(file, size, f, com == 'c' ? 1 : 0))) {
  89.         perror(argv[0]);
  90.         exit(6);
  91.     }
  92.     head = read_head(afp);
  93.     indx = read_indx(afp, &head);
  94.     g = (struct g_list *) calloc(1, sizeof(struct g_list));
  95.     for (i=4; i < argc; i++) {
  96.         int j;
  97.         o ? GetGenFormat(g, argv[i]) : GetAscGen(g, argv[i]);
  98.         if (head.size != g->gen.size) {
  99.         fprintf(stderr, "%s is wrong size\n", g->gen.label);
  100.         continue;
  101.         }
  102.         j = add_gen(afp, &head, &indx, g);
  103.         if (v)
  104.         ; /* verbose mode */
  105.         else fprintf(stdout, "%c - %s\n", j?'r':'a', g->gen.label);
  106.     }
  107.     free(g);
  108.     fclose(afp);
  109.     break;
  110.     case 't':
  111.     if (!(afp = fopen(file, "rb"))) {
  112.         perror(argv[0]);
  113.         exit(7);
  114.     }
  115.     head = read_head(afp);
  116.     if (strncmp(head.magic, "tie", 3) || head.magic[3] - '0' != f) {
  117.         fprintf(stderr, "%s: bad magic number", *argv);
  118.         exit(8);
  119.     }
  120.     indx = read_indx(afp, &head);
  121.         hbuf[0] = head.magic[0]; hbuf[1] = head.magic[1];
  122.         hbuf[2] = head.magic[2]; hbuf[3] = head.magic[3]; hbuf[4] = 0;
  123.     fprintf(stdout, "Format: %s, Size: %d, # of entries: %d\n\n",
  124.             hbuf, head.size, head.n);
  125.     for (i = 0; i < head.n; i++)
  126.         if (v)
  127.         ; /* verbose mode */
  128.         else fprintf(stdout, "%.3s\n", indx[i].gen);
  129.     break;
  130.     case 'x':
  131.     if (!(afp = fopen(file, "rb"))) {
  132.         perror(argv[0]);
  133.         exit(9);
  134.     }
  135.     head = read_head(afp);
  136.     if (strncmp(head.magic, "tie", 3) || head.magic[3] - '0' != f) {
  137.         fprintf(stderr, "%s: bad magic number", *argv);
  138.         exit(10);
  139.     }
  140.     indx = read_indx(afp, &head);
  141.     if (argc > 3)
  142.         for (i=3; i<argc; i++) {
  143.         int j;
  144.         if ((j = find_gen(indx, argv[i], head.n)) == head.n) {
  145.             fprintf(stderr, "%s not in archive\n", argv[i]);
  146.             continue;
  147.         }
  148.         g = get_gen(afp, &head, &indx[j], j);
  149.         file = malloc(8);
  150.                 sprintf(file, "%04d%s", head.size, g->gen.label);
  151.         o ? WritGenFile(g, file) : WritAscFile(g, file);
  152.         if (v)
  153.             ; /* verbose mode */
  154.         else fprintf(stdout, "x - %s\n", g->gen.label);
  155.         free(file);
  156.         free(g->genome);
  157.         free(g);
  158.         }
  159.     else
  160.        for (i=0; i<head.n; i++) {
  161.         g = get_gen(afp, &head, &indx[i], i);
  162.         file = malloc(12);
  163.                 sprintf(file, "%04d%s", head.size, g->gen.label);
  164.         o ? WritGenFile(g, file) : WritAscFile(g, file);
  165.         if (v)
  166.             ; /* verbose mode */
  167.         else fprintf(stdout, "x - %s\n", g->gen.label);
  168.         free(file);
  169.         free(g->genome);
  170.         free(g);
  171.         }
  172.     break;
  173.     }
  174. }
  175.