unsigned int dgc_randomize(int *argc, char ***argv) {
    long long int user_seed;
    unsigned int seed;
    int bytes_to_move;
    int i;
    char *endptr;

    for (i = 0; i < *argc - 1; i++) {
        if (strcmp((*argv)[i], "--seed") == 0) {
            user_seed = strtoll((*argv)[i + 1], &endptr, 0);
            seed = (unsigned int) user_seed;
            if (endptr && *endptr != '\0') {
                dgc_warning("Bad random seed %s.\n", (*argv)[i + 1]);
                seed = dgc_generate_random_seed();
            }
            else if (seed != user_seed) {
                dgc_warning("Random seed too large: %s.\n", (*argv)[i + 1]);
                seed = dgc_generate_random_seed();
            }
            else {
                if (i < *argc - 2) {
                    bytes_to_move = (*argc - 2 - i) * sizeof(char *);
                    memmove((*argv) + i, (*argv) + i + 2, bytes_to_move);
                }
                (*argc) -= 2;
                srandom(seed);
            }
            return seed;
        }
    }
    seed = dgc_generate_random_seed();
    return seed;
}
unsigned int dgc_generate_random_seed(void) {
    FILE *random_fp;
    unsigned int seed;
    int ints;

    random_fp = fopen("/dev/random", "r");
    if (random_fp == NULL) {
        dgc_warning("Could not open /dev/random for reading: %s\n"
            "Using time ^ PID\n", strerror(errno));
        seed = time(NULL) ^ getpid();
        srandom(seed);
        return seed;
    }

    ints = fread(&seed, sizeof(int), 1, random_fp);
    if (ints != 1) {
        dgc_warning("Could not read an int from /dev/random: %s\n"
            "Using time ^ PID\n", strerror(errno));
        seed = time(NULL) ^ getpid();
        srandom(seed);
        return seed;
    }
    fclose(random_fp);
    srandom(seed);
    return seed;
}
double dgc_get_time() {
    struct timeval tv;
    double t;

    if (gettimeofday(&tv, NULL) < 0) dgc_warning("dgc_get_time encountered error in gettimeofday : %s\n", strerror(
            errno));
    t = tv.tv_sec + tv.tv_usec / 1000000.0;
    return t;
}
static char* get_from_bin_host() {
    FILE *bin_Host;
    char hostname[255];

    if (getenv("HOST") == NULL) {
        if (getenv("HOSTNAME") != NULL) setenv("HOST", getenv("HOSTNAME"), 1);
        else if (getenv("host") != NULL) setenv("HOST", getenv("host"), 1);
        else if (getenv("hostname") != NULL) setenv("HOST", getenv("hostname"), 1);
        else {
            bin_Host = popen("/bin/hostname", "r");
            if (bin_Host == NULL) return NULL;
            if (fscanf(bin_Host, "%s", hostname) == 0) dgc_warning(
                    "/bin/hostname didn't return a hostname, HOST will be set to \"\"");
            setenv("HOST", hostname, 1);
            pclose(bin_Host);
        }
    }
    return getenv("HOST");
}
int dgc_transform_write(dgc_transform_t t, const char *filename)
{
  FILE *fp;
  double x, y, z;
  double rx, ry, rz;
  
  fp = fopen(filename, "w");
  if(fp == NULL) {
    dgc_warning("Error: could not open transform file %s for writing.\n", filename);
    return -1;
  }
  
  dgc_transform_get_rotation(t, &rx, &ry, &rz);
  dgc_transform_get_translation(t, &x, &y, &z);
  
  fprintf(fp,"RX RAD %lf\n", rx);
  fprintf(fp,"RY RAD %lf\n", ry);
  fprintf(fp,"RZ RAD %lf\n", rz);
  fprintf(fp,"T M %lf %lf %lf\n", x, y, z);
  
  fclose(fp);
  return 0;
}
int dgc_transform_read(dgc_transform_t t, const char *filename)
{
  FILE *fp;
  char *err, *mark, *unit, line[1001];
  double arg, x, y, z;
  
  /* start with identity transform */
  dgc_transform_identity(t);
  fp = fopen(filename, "r");
  if(fp == NULL) {
    dgc_warning("Error: could not open transform file %s.\n", filename);
    return -1;
  }
  do {
    err = fgets(line, 1000, fp);
    if(err != NULL) {
      unit = dgc_next_word(line);
      mark = dgc_next_word(unit);
      if(strncasecmp(line, "rx ", 3) == 0) {
        arg = strtod(mark, &mark);
        if(strncasecmp(unit, "deg", 3) == 0)
          arg = dgc_d2r(arg);
	dgc_transform_rotate_x(t, arg);	
      }
      else if(strncasecmp(line, "ry ", 3) == 0) {
        arg = strtod(mark, &mark);
        if(strncasecmp(unit, "deg", 3) == 0)
          arg = dgc_d2r(arg);
	dgc_transform_rotate_y(t, arg);
      }
      else if(strncasecmp(line, "rz ", 3) == 0) {
        arg = strtod(mark, &mark);
        if(strncasecmp(unit, "deg", 3) == 0)
          arg = dgc_d2r(arg);
	dgc_transform_rotate_z(t, arg);
      }
      else if(strncasecmp(line, "t ", 2) == 0) {
	char *a = strdup("test");
	x = strtod(mark, &mark);
	y = strtod(mark, &mark);
        z = strtod(mark, &mark);
	
        if(strncasecmp(unit, "in", 2) == 0) {
          x *= 0.0254;
          y *= 0.0254;
          z *= 0.0254;
        }
        else if(strncasecmp(unit, "cm", 2) == 0) {
          x *= 0.01;
          y *= 0.01;
          z *= 0.01;
        }
        dgc_transform_translate(t, x, y, z);
      }
      else {
        dgc_warning("Error: could not parse line \"%s\" from %s\n", 
		    line, filename);
        return -1;
      }
      
    }
  } while(err != NULL);
  fclose(fp);
  return 0;
}
int dgc_transform_read_string(dgc_transform_t t, char *str)
{
  int done;
  char *end, *mark, *mark2, *unit;
  char line[1001];
  double arg, x, y, z;

  /* start with identity transform */
  dgc_transform_identity(t);

  if(str != NULL) {
    mark = str;
    done = 0;
    do {
      end = strchr(mark, '\n');
      if(end == NULL) {
        strcpy(line, mark);
        done = 1;
      }
      else {
        strncpy(line, mark, end - mark + 1);
        line[end - mark + 1] = '\0';
        mark = end + 1;
      }

      if(strlen(line) > 0) {
        unit = dgc_next_word(line);
        mark2 = dgc_next_word((char *)unit);
        
        if(strncasecmp(line, "rx ", 3) == 0) {
          arg = strtod(mark2, &mark2);
          if(strncasecmp(unit, "deg", 3) == 0)
            arg = dgc_d2r(arg);
          dgc_transform_rotate_x(t, arg);
        }
        else if(strncasecmp(line, "ry ", 3) == 0) {
          arg = strtod(mark2, &mark2);
          if(strncasecmp(unit, "deg", 3) == 0)
            arg = dgc_d2r(arg);
          dgc_transform_rotate_y(t, arg);
        }
        else if(strncasecmp(line, "rz ", 3) == 0) {
          arg = strtod(mark2, &mark2);
          if(strncasecmp(unit, "deg", 3) == 0)
            arg = dgc_d2r(arg);
          dgc_transform_rotate_z(t, arg);
        }
        else if(strncasecmp(line, "t ", 2) == 0) {
          x = strtod(mark2, &mark2);
          y = strtod(mark2, &mark2);
          z = strtod(mark2, &mark2);
          if(strncasecmp(unit, "in", 2) == 0) {
            x *= 0.0254;
            y *= 0.0254;
            z *= 0.0254;
          }
          else if(strncasecmp(unit, "cm", 2) == 0) {
            x *= 0.01;
            y *= 0.01;
            z *= 0.01;
          }
          dgc_transform_translate(t, x, y, z);
        }
        else {
          dgc_warning("Error: could not parse line \"%s\" from transform\n", 
		      line);
          return -1;
        }
      }
    } while(!done);
  }
  return 0;
}