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; }