/* Split a line at = sign into name and value pair Remove " ", TAB and Newline from around names and values Return NULL for name and value if there is no = sign in line Return newly allocated strings otherwise Used by: esimmon_internal_text_to_name_value_pairs */ static void splitnamevalue (const char * line, int linelen, char **name, char **value) { char *equal; // position of first = sign in line equal = strchr (line, '='); if (equal && equal != line) { /* 1. name */ // from first char to before = *name = remove_whitespace ((char*)line, equal-1); //printf (" --name=[%s]\n", *name); /* 2. value */ // from after = to the last character of line *value = remove_whitespace (equal+1, (char*)line+linelen-1); //printf (" --value=[%s]\n", *value); } else if (equal != line) { /* check if it as name without = value statement */ *name = remove_whitespace ((char*)line, (char*)line+linelen-1); //printf (" --name only=[%s]\n", *name); *value = NULL; } else { // funny text starting with =. E.g. "=value" *name = NULL; *value = NULL; } }
long my_strtol(const char *str, char **endptr, int base) { int sign; unsigned long result_long; const long max_long = (long)(((unsigned long)(-1)) / 2); const long min_long = -max_long - 1; remove_whitespace(&str); sign = 1; if (*str == '-') { sign = -1; str++; } result_long = my_strtoul(str, endptr, base); if (sign == 1 && result_long > max_long) return max_long; else if (sign == -1 && result_long > (max_long - 1)) return min_long; else return (sign * (long)result_long); }
int main(int argc, char **argv) { char *s = strdup(" the \tinternet\t\nis a series of tubes "); char *newstr = remove_whitespace(s); printf("%s\n", newstr); free(newstr); free(s); return 0; }
Fasta_entry Fasta_reader::getNext() { string sequence; string header; #pragma omp critical (FileReader) { header = this->_lastline; this->_lastline = ""; while ((! this->_filereader.eof()) && this->_lastline[0] != '>') { getline(this->_filereader, this->_lastline); if (this->_lastline[0] != '>') { sequence += this->_lastline; } } } sequence = remove_whitespace(sequence); transform(sequence.begin(), sequence.end(), sequence.begin(), ::toupper); Fasta_entry fe(header, sequence); return(fe); }
/* current line has first token removed (instruction) and comments * removed. Now go through the rest and assume they're instructions * separated with ',' */ struct instruction *get_operands(struct instruction *cur) { int cur_op_num; char *buf; /* check for operands */ cur_op_num = 0; while ((buf = (char *) strtok(NULL, comma))) { remove_whitespace(buf); //remove any tabs etc. if (strlen(buf) > 0) { if (!cur->operands) cur->operands = (char **) malloc(sizeof( char *)); else cur->operands = (char **) realloc(cur->operands, (sizeof(char *)*(cur_op_num+1))); capitalize(buf); cur->operands[cur_op_num] = (char *) malloc(strlen(buf) ); strcpy(cur->operands[cur_op_num], buf); cur->op_num = ++cur_op_num; } } cur->op_num = cur_op_num; return cur; }
static string make_public_string(string str, int len){ len = remove_whitespace(str, len); string masked = string_replace_all_in_sized(str, len, "\n", "\n§"); string result; asprintf(&result, "§%s", masked); free(masked); return result; }
void ra_dec_from_string(char *radec, int *h_or_d, int *m, double *s) /* Return a values for hours or degrees, minutes and seconds */ /* given a properly formatted RA or DEC string. */ /* radec is a string with J2000 RA in the format 'hh:mm:ss.ssss' */ /* or a string with J2000 DEC in the format 'dd:mm:ss.ssss' */ { radec = remove_whitespace(radec); sscanf(radec, "%d:%d:%lf\n", h_or_d, m, s); if (radec[0]=='-' && *h_or_d==0) { *m = -*m; *s = -*s; } }
static int http_get_parse(char *req, int len, get_ret_t *ret) { char *s = req, *e, *end; char *path; int path_len, minor_version; end = req + len; if (memcmp_fail_loc(s, "GET ", len, 4, &e)) goto malformed_request; path = remove_whitespace(e, len); e = find_whitespace(path, len - (path-s)); path_len = e-path; e = remove_whitespace(e, len - (e-s)); if (get_http_version(e, len - (e-s), &e, &minor_version)) goto malformed_request; if (minor_version != 0 && minor_version != 1) { /* This should be seen as an error: */ e = s; goto malformed_request; } ret->head_flags = 0; if (http_find_header_end(e, len - (e-s), &e, ret->head_flags)) goto malformed_request; ret->end = e; ret->path = path; ret->path_len = path_len; return 0; malformed_request: ret->path = NULL; ret->path_len = -1; ret->end = e; return -1; }
/* * Advances the lexer one token forward, returning true if one exists */ bool lexer::next(void) { // remove whitespace from stream remove_whitespace(); text.clear(); // Parse next character in stream to determine the tokens likely type if(!buff.has_next()) type = token::END; else if(isdigit(buff.get_current())) number(); else if(isalpha(buff.get_current())) phrase(); else symbol(); return true; }
inline static int get_http_version(char *s, int len, char **ret, int *minor_version) { char *c; char http_str[] = "HTTP/1."; int http_sz = sizeof(http_str)-1; // -1 for \n c = remove_whitespace(s, len); if (memcmp_fail_loc(c, http_str, len, http_sz, ret) || 0 == (len - (*ret-s))) { *minor_version = -1; return 1; } c += http_sz; *minor_version = ((int)*c) - (int)'0'; c++; if (http_end_line(c, len - (c-s))) c += 2; *ret = c; return 0; }
void ra_dec_from_string(char *radec, int *h_or_d, int *m, double *s) /* Return a values for hours or degrees, minutes and seconds */ /* given a properly formatted RA or DEC string. */ /* radec is a string with J2000 RA in the format 'hh:mm:ss.ssss' */ /* or a string with J2000 DEC in the format 'dd:mm:ss.ssss' */ { int retval; radec = remove_whitespace(radec); retval = sscanf(radec, "%d:%d:%lf\n", h_or_d, m, s); if (retval != 3) { char tmp[100]; sprintf(tmp, "Error: can not convert '%s' to RA or DEC in ra_dec_from_string()\n", radec); perror(tmp); exit(1); } if (radec[0]=='-' && *h_or_d==0) { *m = -*m; *s = -*s; } }
int main(int argc, char *argv[]) { float minval = SMALLNUM, maxval = LARGENUM, inx = 0, iny = 0; int centern, offsetn; int zoomlevel, maxzoom = 0, minzoom, xid, psid; char *rootfilenm, inchar; datapart *lodp; dataview *dv; basicstats *statvals; if (argc == 1) { printf("\nusage: exploredat datafilename\n\n"); exit(0); } printf("\n\n"); printf(" Interactive Data Explorer\n"); printf(" by Scott M. Ransom\n"); printf(" November, 2001\n"); print_help(); { int hassuffix = 0; char *suffix; hassuffix = split_root_suffix(argv[1], &rootfilenm, &suffix); if (hassuffix) { if (strcmp(suffix, "dat") != 0) { printf ("\nInput file ('%s') must be a single PRESTO data file ('.dat')!\n\n", argv[1]); free(suffix); exit(0); } free(suffix); } else { printf("\nInput file ('%s') must be a PRESTO data file ('.dat')!\n\n", argv[1]); exit(0); } } /* Read the info file */ readinf(&idata, rootfilenm); if (idata.object) { printf("Examining %s data from '%s'.\n\n", remove_whitespace(idata.object), argv[1]); } else { printf("Examining data from '%s'.\n\n", argv[1]); } #ifdef USEMMAP mmap_file = open(argv[1], O_RDONLY); { int rt; struct stat buf; rt = fstat(mmap_file, &buf); if (rt == -1) { perror("\nError in fstat() in exploredat.c"); printf("\n"); exit(-1); } Ndat = buf.st_size / sizeof(float); } lodp = get_datapart(0, Ndat); #else { int numsamp; datfile = chkfopen(argv[1], "rb"); Ndat = chkfilelen(datfile, sizeof(float)); numsamp = (Ndat > MAXPTS) ? (int) MAXPTS : (int) Ndat; lodp = get_datapart(0, numsamp); } #endif /* Plot the initial data */ centern = 0.5 * INITIALNUMPTS; if (centern > lodp->nn) centern = lodp->nn / 2; zoomlevel = LOGMAXDISPNUM - LOGINITIALNUMPTS; minzoom = LOGMAXDISPNUM - LOGMAXPTS; maxzoom = LOGMAXDISPNUM - LOGMINDISPNUM; dv = get_dataview(centern, zoomlevel, lodp); /* Prep the XWIN device for PGPLOT */ xid = cpgopen("/XWIN"); if (xid <= 0) { free_datapart(lodp); #ifdef USEMMAP close(mmap_file); #else fclose(datfile); #endif free(dv); exit(EXIT_FAILURE); } cpgask(0); cpgpage(); offsetn = plot_dataview(dv, minval, maxval, 1.0); do { cpgcurs(&inx, &iny, &inchar); if (DEBUGOUT) printf("You pressed '%c'\n", inchar); switch (inchar) { case ' ': /* Toggle stats and sample plotting on/off */ /* 0 = both, 1 = stats only, 2 = data only */ plotstats++; plotstats = plotstats % 3; cpgpage(); offsetn = plot_dataview(dv, minval, maxval, 1.0); break; case 'M': /* Toggle between median and average */ case 'm': usemedian = (usemedian) ? 0 : 1; free(dv); dv = get_dataview(centern, zoomlevel, lodp); cpgpage(); offsetn = plot_dataview(dv, minval, maxval, 1.0); break; case 'A': /* Zoom in */ case 'a': centern = inx + offsetn; case 'I': case 'i': if (DEBUGOUT) printf(" Zooming in (zoomlevel = %d)...\n", zoomlevel); if (zoomlevel < maxzoom) { zoomlevel++; free(dv); dv = get_dataview(centern, zoomlevel, lodp); cpgpage(); offsetn = plot_dataview(dv, minval, maxval, 1.0); } else printf(" Already at maximum zoom level (%d).\n", zoomlevel); break; case 'X': /* Zoom out */ case 'x': case 'O': case 'o': if (DEBUGOUT) printf(" Zooming out (zoomlevel = %d)...\n", zoomlevel); if (zoomlevel > minzoom) { zoomlevel--; free(dv); dv = get_dataview(centern, zoomlevel, lodp); cpgpage(); offsetn = plot_dataview(dv, minval, maxval, 1.0); } else printf(" Already at minimum zoom level (%d).\n", zoomlevel); break; case '<': /* Shift left 1 full screen */ centern -= dv->numsamps + dv->numsamps / 8; case ',': /* Shift left 1/8 screen */ if (DEBUGOUT) printf(" Shifting left...\n"); centern -= dv->numsamps / 8; { /* Should probably get the previous chunk from the datfile... */ double lowestr; lowestr = 0.5 * dv->numsamps; if (centern < lowestr) centern = lowestr; } free(dv); dv = get_dataview(centern, zoomlevel, lodp); cpgpage(); offsetn = plot_dataview(dv, minval, maxval, 1.0); break; case '>': /* Shift right 1 full screen */ centern += dv->numsamps - dv->numsamps / 8; case '.': /* Shift right 1/8 screen */ centern += dv->numsamps / 8; if (DEBUGOUT) printf(" Shifting right...\n"); { /* Should probably get the next chunk from the datfile... */ double highestr; highestr = lodp->nlo + lodp->nn - 0.5 * dv->numsamps; if (centern > highestr) centern = highestr; } free(dv); dv = get_dataview(centern, zoomlevel, lodp); cpgpage(); offsetn = plot_dataview(dv, minval, maxval, 1.0); break; case '+': /* Increase height of top edge */ { float dy; if (maxval > 0.5 * LARGENUM) { printf(" Auto-scaling of top edge is off.\n"); if (minval < 0.5 * SMALLNUM) dy = dv->maxval - dv->minval; else dy = dv->maxval - minval; maxval = dv->maxval + 0.1 * dy; } else { if (minval < 0.5 * SMALLNUM) dy = maxval - dv->minval; else dy = maxval - minval; maxval += 0.1 * dy; } cpgpage(); offsetn = plot_dataview(dv, minval, maxval, 1.0); break; } case '_': /* Decrease height of top edge */ { float dy; if (maxval > 0.5 * LARGENUM) { printf(" Auto-scaling of top edge is off.\n"); if (minval < 0.5 * SMALLNUM) dy = dv->maxval - dv->minval; else dy = dv->maxval - minval; maxval = dv->maxval - 0.1 * dy; } else { if (minval < 0.5 * SMALLNUM) dy = maxval - dv->minval; else dy = maxval - minval; maxval -= 0.1 * dy; } cpgpage(); offsetn = plot_dataview(dv, minval, maxval, 1.0); break; } case '=': /* Increase height of bottom edge */ { float dy; if (minval < 0.5 * SMALLNUM) { printf(" Auto-scaling of bottom edge is off.\n"); if (maxval > 0.5 * LARGENUM) dy = dv->maxval - dv->minval; else dy = maxval - dv->minval; minval = dv->minval + 0.1 * dy; } else { if (maxval > 0.5 * LARGENUM) dy = dv->maxval - minval; else dy = maxval - minval; minval += 0.1 * dy; } cpgpage(); offsetn = plot_dataview(dv, minval, maxval, 1.0); break; } case '-': /* Decrease height of bottom edge */ { float dy; if (minval < 0.5 * SMALLNUM) { printf(" Auto-scaling of bottom edge is off.\n"); if (maxval > 0.5 * LARGENUM) dy = dv->maxval - dv->minval; else dy = maxval - dv->minval; minval = dv->minval - 0.1 * dy; } else { if (maxval > 0.5 * LARGENUM) dy = dv->maxval - minval; else dy = maxval - minval; minval -= 0.1 * dy; } cpgpage(); offsetn = plot_dataview(dv, minval, maxval, 1.0); break; } case 'S': /* Auto-scale */ case 's': printf(" Auto-scaling is on.\n"); minval = SMALLNUM; maxval = LARGENUM; cpgpage(); offsetn = plot_dataview(dv, minval, maxval, 1.0); break; case 'G': /* Goto a time */ case 'g': { char timestr[50]; double time = -1.0; while (time < 0.0) { printf (" Enter the time (s) from the beginning of the file to go to:\n"); fgets(timestr, 50, stdin); timestr[strlen(timestr) - 1] = '\0'; time = atof(timestr); } offsetn = 0.0; centern = (int) (time / idata.dt + 0.5); printf(" Moving to time %.15g (data point %d).\n", time, centern); free(dv); dv = get_dataview(centern, zoomlevel, lodp); cpgpage(); offsetn = plot_dataview(dv, minval, maxval, 1.0); } break; case '?': /* Print help screen */ print_help(); break; case 'P': /* Print the current plot */ case 'p': { int len; char filename[200]; printf(" Enter the filename to save the plot as:\n"); fgets(filename, 195, stdin); len = strlen(filename) - 1; filename[len + 0] = '/'; filename[len + 1] = 'C'; filename[len + 2] = 'P'; filename[len + 3] = 'S'; filename[len + 4] = '\0'; psid = cpgopen(filename); cpgslct(psid); cpgpap(10.25, 8.5 / 11.0); cpgiden(); offsetn = plot_dataview(dv, minval, maxval, 1.0); cpgclos(); cpgslct(xid); filename[len] = '\0'; printf(" Wrote the plot to the file '%s'.\n", filename); } break; case 'V': /* Show the basic statistics for the current dataview */ case 'v': statvals = calc_stats(dv, lodp); printf("\n Statistics:\n" " Low sample %d\n" " Number of samples %d\n" " Low time (s) %.7g\n" " Duration of samples (s) %.7g\n" " Maximum value %.7g\n" " Minimum value %.7g\n" " Average value %.7g\n" " Median value %.7g\n" " Standard Deviation %.7g\n" " Skewness %.7g\n" " Kurtosis %.7g\n\n", dv->lon, dv->numsamps, dv->lon * idata.dt, dv->numsamps * idata.dt, statvals->max, statvals->min, statvals->average, statvals->median, statvals->stdev, statvals->skewness, statvals->kurtosis); free(statvals); break; case 'Q': /* Quit */ case 'q': printf(" Quitting...\n"); free(dv); cpgclos(); break; default: printf(" Unrecognized option '%c'.\n", inchar); break; } } while (inchar != 'Q' && inchar != 'q'); free_datapart(lodp); #ifdef USEMMAP close(mmap_file); #else fclose(datfile); #endif printf("Done\n\n"); return 0; }
void create_accelobs(accelobs * obs, infodata * idata, Cmdline * cmd, int usemmap) { int ii, rootlen, input_shorts = 0; { int hassuffix = 0; char *suffix; hassuffix = split_root_suffix(cmd->argv[0], &(obs->rootfilenm), &suffix); if (hassuffix) { if (strcmp(suffix, "fft") != 0 && strcmp(suffix, "dat") != 0 && strcmp(suffix, "sdat") != 0) { printf("\nInput file ('%s') must be an '.fft' or '.[s]dat' file!\n\n", cmd->argv[0]); free(suffix); exit(0); } /* If the input file is a time series */ if (strcmp(suffix, "dat") == 0 || strcmp(suffix, "sdat") == 0) { obs->dat_input = 1; obs->mmap_file = 0; if (strcmp(suffix, "sdat") == 0) input_shorts = 1; } else { obs->dat_input = 0; } free(suffix); } else { printf("\nInput file ('%s') must be an '.fft' or '.[s]dat' file!\n\n", cmd->argv[0]); exit(0); } } if (cmd->noharmpolishP) obs->use_harmonic_polishing = 0; else obs->use_harmonic_polishing = 1; // now default /* Read the info file */ readinf(idata, obs->rootfilenm); if (idata->object) { printf("Analyzing %s data from '%s'.\n\n", remove_whitespace(idata->object), cmd->argv[0]); } else { printf("Analyzing data from '%s'.\n\n", cmd->argv[0]); } /* Prepare the input time series if required */ if (obs->dat_input) { FILE *datfile; long long filelen; float *ftmp; printf("Reading and FFTing the time series..."); fflush(NULL); datfile = chkfopen(cmd->argv[0], "rb"); /* Check the length of the file to see if we can handle it */ filelen = chkfilelen(datfile, sizeof(float)); if (input_shorts) filelen *= 2; if (filelen > 67108864) { /* Small since we need memory for the templates */ printf("\nThe input time series is too large. Use 'realfft' first.\n\n"); exit(0); } /* Read the time series into a temporary buffer */ /* Note: The padding allows us to search very short time series */ /* using correlations without having to worry about */ /* accessing data before or after the valid FFT freqs. */ if (input_shorts) { short *stmp = gen_svect(filelen); ftmp = gen_fvect(filelen+2*ACCEL_PADDING); for (ii = 0; ii < ACCEL_PADDING; ii++) { ftmp[ii] = 0.0; ftmp[ii+filelen+ACCEL_PADDING] = 0.0; } chkfread(stmp, sizeof(short), filelen, datfile); for (ii = 0; ii < filelen; ii++) ftmp[ii+ACCEL_PADDING] = (float) stmp[ii]; free(stmp); } else { ftmp = read_float_file(datfile, -ACCEL_PADDING, filelen+2*ACCEL_PADDING); } /* Now, offset the pointer so that we are pointing at the first */ /* bits of valid data. */ ftmp += ACCEL_PADDING; fclose(datfile); /* FFT it */ realfft(ftmp, filelen, -1); obs->fftfile = NULL; obs->fft = (fcomplex *) ftmp; obs->numbins = filelen / 2; printf("done.\n"); /* De-redden it */ printf("Removing red-noise..."); deredden(obs->fft, obs->numbins); printf("done.\n\n"); } /* Determine the output filenames */ rootlen = strlen(obs->rootfilenm) + 25; obs->candnm = (char *) calloc(rootlen, 1); obs->accelnm = (char *) calloc(rootlen, 1); obs->workfilenm = (char *) calloc(rootlen, 1); sprintf(obs->candnm, "%s_ACCEL_%d.cand", obs->rootfilenm, cmd->zmax); sprintf(obs->accelnm, "%s_ACCEL_%d", obs->rootfilenm, cmd->zmax); sprintf(obs->workfilenm, "%s_ACCEL_%d.txtcand", obs->rootfilenm, cmd->zmax); /* Open the FFT file if it exists appropriately */ if (!obs->dat_input) { obs->fftfile = chkfopen(cmd->argv[0], "rb"); obs->numbins = chkfilelen(obs->fftfile, sizeof(fcomplex)); if (usemmap) { fclose(obs->fftfile); obs->fftfile = NULL; printf("Memory mapping the input FFT. This may take a while...\n"); obs->mmap_file = open(cmd->argv[0], O_RDONLY); if (obs->mmap_file == -1) { perror("\nError in open() in accel_utils.c"); printf("\n"); exit(-1); } obs->fft = (fcomplex *) mmap(0, sizeof(fcomplex) * obs->numbins, PROT_READ, MAP_SHARED, obs->mmap_file, 0); if (obs->fft == MAP_FAILED) { perror("\nError in mmap() in accel_utils.c"); printf("Falling back to a non-mmaped approach\n"); obs->fftfile = chkfopen(cmd->argv[0], "rb"); obs->mmap_file = 0; } } else { obs->mmap_file = 0; } } /* Determine the other parameters */ if (cmd->zmax % ACCEL_DZ) cmd->zmax = (cmd->zmax / ACCEL_DZ + 1) * ACCEL_DZ; if (!obs->dat_input) obs->workfile = chkfopen(obs->workfilenm, "w"); obs->N = (long long) idata->N; if (cmd->photonP) { if (obs->mmap_file || obs->dat_input) { obs->nph = obs->fft[0].r; } else { obs->nph = get_numphotons(obs->fftfile); } printf("Normalizing powers using %.0f photons.\n\n", obs->nph); } else { obs->nph = 0.0; /* For short FFTs insure that we don't pick up the DC */ /* or Nyquist component as part of the interpolation */ /* for higher frequencies. */ if (cmd->locpowP) { obs->norm_type = 1; printf("Normalizing powers using local-power determination.\n\n"); } else if (cmd->medianP) { obs->norm_type = 0; printf("Normalizing powers using median-blocks.\n\n"); } else { obs->norm_type = 0; printf("Normalizing powers using median-blocks (default).\n\n"); } if (obs->dat_input) { obs->fft[0].r = 1.0; obs->fft[0].i = 1.0; } } obs->lobin = cmd->lobin; if (obs->lobin > 0) { obs->nph = 0.0; if (cmd->lobin > obs->numbins - 1) { printf("\n'lobin' is greater than the total number of\n"); printf(" frequencies in the data set. Exiting.\n\n"); exit(1); } } if (cmd->numharm != 1 && cmd->numharm != 2 && cmd->numharm != 4 && cmd->numharm != 8 && cmd->numharm != 16) { printf("\n'numharm' = %d must be a power-of-two! Exiting\n\n", cmd->numharm); exit(1); } obs->numharmstages = twon_to_index(cmd->numharm) + 1; obs->dz = ACCEL_DZ; obs->numz = cmd->zmax * 2 + 1; obs->numbetween = ACCEL_NUMBETWEEN; obs->dt = idata->dt; obs->T = idata->dt * idata->N; if (cmd->floP) { obs->rlo = floor(cmd->flo * obs->T); if (obs->rlo < obs->lobin) obs->rlo = obs->lobin; if (obs->rlo > obs->numbins - 1) { printf("\nLow frequency to search 'flo' is greater than\n"); printf(" the highest available frequency. Exiting.\n\n"); exit(1); } } else { if (cmd->rloP) obs->rlo = cmd->rlo; else obs->rlo = 1.0; if (obs->rlo < obs->lobin) obs->rlo = obs->lobin; if (obs->rlo > obs->numbins - 1) { printf("\nLow frequency to search 'rlo' is greater than\n"); printf(" the available number of points. Exiting.\n\n"); exit(1); } } obs->highestbin = obs->numbins - 1; if (cmd->fhiP) { obs->highestbin = ceil(cmd->fhi * obs->T); if (obs->highestbin > obs->numbins - 1) obs->highestbin = obs->numbins - 1; obs->rhi = obs->highestbin; if (obs->highestbin < obs->rlo) { printf("\nHigh frequency to search 'fhi' is less than\n"); printf(" the lowest frequency to search 'flo'. Exiting.\n\n"); exit(1); } } else if (cmd->rhiP) { obs->highestbin = cmd->rhi; if (obs->highestbin > obs->numbins - 1) obs->highestbin = obs->numbins - 1; obs->rhi = obs->highestbin; if (obs->highestbin < obs->rlo) { printf("\nHigh frequency to search 'rhi' is less than\n"); printf(" the lowest frequency to search 'rlo'. Exiting.\n\n"); exit(1); } } obs->dr = ACCEL_DR; obs->zhi = cmd->zmax; obs->zlo = -cmd->zmax; obs->sigma = cmd->sigma; obs->powcut = (float *) malloc(obs->numharmstages * sizeof(float)); obs->numindep = (long long *) malloc(obs->numharmstages * sizeof(long long)); for (ii = 0; ii < obs->numharmstages; ii++) { if (obs->numz == 1) obs->numindep[ii] = (obs->rhi - obs->rlo) / index_to_twon(ii); else /* The numz+1 takes care of the small amount of */ /* search we get above zmax and below zmin. */ obs->numindep[ii] = (obs->rhi - obs->rlo) * (obs->numz + 1) * (obs->dz / 6.95) / index_to_twon(ii); obs->powcut[ii] = power_for_sigma(obs->sigma, index_to_twon(ii), obs->numindep[ii]); } obs->numzap = 0; /* if (zapfile!=NULL) obs->numzap = get_birdies(cmd->zapfile, obs->T, obs->baryv, &(obs->lobins), &(obs->hibins)); else obs->numzap = 0; */ }
command_stream_t make_command_stream(int (*get_next_byte) (void *), void *get_next_byte_argument) { /* FIXME: Replace this with your implementation. You may need to add auxiliary functions and otherwise modify the source code. You can also use external functions defined in the GNU C Library. */ token_t t = checked_malloc(sizeof(struct token)); token_t head = t; t->prev = NULL; t->str = checked_malloc(sizeof(char)); t->str[0] = '\0'; t->type = EMPTY; char* inputStream = makeInputStream(get_next_byte, get_next_byte_argument); while(1) { token_t temp = get_next_token(inputStream, t); //printf("%s %d\n", temp->prev->str, temp->prev->type); //printf("%s %d\n", temp->str, temp->type); if(temp->str[0] == EOF) { t = temp; break; } t = temp; } t->next = NULL; t = remove_whitespace(head); // while (t != NULL) // { // //printf("%s %d\n", t->str, t->type); // //if (t -> next != NULL) { // //printf("%s %d\n", t->next->str, t->next->type); // //} // t = t->next; // } convert_to_simple(head); remove_newline(head); // t = head; // while (t != NULL) // { // printf("%s %d\n", t->str, t->type); // //if (t -> next != NULL) { // //printf("%s %d\n", t->next->str, t->next->type); // //} // t = t->next; // } //remove_newline(head); // t = head; // while (t != NULL) // { // //printf("%s %d\n", t->str, t->type); // //if (t -> next != NULL) { // //printf("%s %d\n", t->next->str, t->next->type); // //} // t = t->next; // } command_stream_t stream = make_command(head); command_stream_t c = checked_malloc(sizeof(struct command_stream)); c->head = NULL; c->tail = NULL; while(stream->head != NULL) { struct command_node *n = stream->head->next; stream->head->next = c->head; c->head = stream->head; stream->head = n; } // while(c->head != NULL) // { // printf("new command\n"); // print_command(c->head->command); // c->head = c->head->next; // } // t = head; // while(t != NULL) // { // token_command_t c = get_next_command(t); // //printf("%s\n", t->str); // if(c != NULL) // { // if(c->type == SIMPLE) // { // int i = 0; // while(c->command->u.word[i] != '\0') // { // //printf("%d:%s\n", i, c->command->u.word[i]); // i=i+1; // } // } // else // { // //printf("%s %d\n", t->str, c->type); // } // //printf("\n"); // } // t = t->next; // } return c; }
int main(int argc, char *argv[]) { FILE *infile, *outfile; int ii, jj, bufflen = 10000, numread; long long N = 0; float *inbuffer = NULL, *outbuffer = NULL; short useshorts = 0, *sinbuffer = NULL, *soutbuffer = NULL; char *rootfilenm, *outname; infodata idata; Cmdline *cmd; /* Call usage() if we have no command line arguments */ if (argc == 1) { Program = argv[0]; printf("\n"); usage(); exit(1); } /* Parse the command line using the excellent program Clig */ cmd = parseCmdline(argc, argv); #ifdef DEBUG showOptionValues(); #endif printf("\n\n"); printf(" Time Series Downsampling Routine\n"); printf(" Sept, 2002\n\n"); { int hassuffix = 0; char *suffix; hassuffix = split_root_suffix(cmd->argv[0], &rootfilenm, &suffix); if (hassuffix) { if (strcmp(suffix, "sdat") == 0) useshorts = 1; if (strcmp(suffix, "dat") != 0 && strcmp(suffix, "sdat") != 0) { printf ("\nInput file ('%s') must be a time series ('.dat' or '.sdat')!\n\n", cmd->argv[0]); free(suffix); exit(0); } free(suffix); } else { printf("\nInput file ('%s') must be a time series ('.dat' or '.sdat')!\n\n", cmd->argv[0]); exit(0); } if (cmd->outfileP) { outname = cmd->outfile; } else { outname = (char *) calloc(strlen(rootfilenm) + 11, sizeof(char)); if (useshorts) sprintf(outname, "%s_D%d.sdat", rootfilenm, cmd->factor); else sprintf(outname, "%s_D%d.dat", rootfilenm, cmd->factor); } } /* Read the info file */ readinf(&idata, rootfilenm); if (idata.object) { printf("Downsampling %s data from '%s'.\n\n", remove_whitespace(idata.object), cmd->argv[0]); } else { printf("Downsampling data from '%s'.\n\n", cmd->argv[0]); } /* Open files and create arrays */ infile = chkfopen(argv[1], "rb"); outfile = chkfopen(outname, "wb"); /* Read and downsample */ if (useshorts) { sinbuffer = gen_svect(bufflen * cmd->factor); soutbuffer = gen_svect(bufflen); while ((numread = chkfread(sinbuffer, sizeof(short), bufflen * cmd->factor, infile))) { for (ii = 0; ii < numread / cmd->factor; ii++) { soutbuffer[ii] = 0; for (jj = 0; jj < cmd->factor; jj++) soutbuffer[ii] += sinbuffer[cmd->factor * ii + jj]; } chkfwrite(soutbuffer, sizeof(short), numread / cmd->factor, outfile); N += numread / cmd->factor; } vect_free(sinbuffer); vect_free(soutbuffer); } else { inbuffer = gen_fvect(bufflen * cmd->factor); outbuffer = gen_fvect(bufflen); while ((numread = chkfread(inbuffer, sizeof(float), bufflen * cmd->factor, infile))) { for (ii = 0; ii < numread / cmd->factor; ii++) { outbuffer[ii] = 0; for (jj = 0; jj < cmd->factor; jj++) outbuffer[ii] += inbuffer[cmd->factor * ii + jj]; } chkfwrite(outbuffer, sizeof(float), numread / cmd->factor, outfile); N += numread / cmd->factor; } vect_free(inbuffer); vect_free(outbuffer); } printf("Done. Wrote %lld points.\n\n", N); /* Write the new info file */ idata.dt = idata.dt * cmd->factor; idata.numonoff = 0; idata.N = (double) N; strncpy(idata.name, outname, strlen(outname) - 4); if (useshorts) idata.name[strlen(outname) - 5] = '\0'; else idata.name[strlen(outname) - 4] = '\0'; writeinf(&idata); fclose(infile); fclose(outfile); free(rootfilenm); if (!cmd->outfileP) free(outname); exit(0); }
int main(int argc, char *argv[]) { Display *dpy; Bool ret; int screen, major, minor, len, i, j; char *str, *start, *str0, *str1; int *enabledDpyIds; /* * Open a display connection, and make sure the NV-CONTROL X * extension is present on the screen we want to use. */ dpy = XOpenDisplay(NULL); if (!dpy) { fprintf(stderr, "Cannot open display '%s'.\n\n", XDisplayName(NULL)); return 1; } screen = GetNvXScreen(dpy); ret = XNVCTRLQueryVersion(dpy, &major, &minor); if (ret != True) { fprintf(stderr, "The NV-CONTROL X extension does not exist " "on '%s'.\n\n", XDisplayName(NULL)); return 1; } printf("\nUsing NV-CONTROL extension %d.%d on %s\n\n", major, minor, XDisplayName(NULL)); /* * query the enabled display devices on this X screen and print basic * information about each X screen. */ ret = XNVCTRLQueryTargetBinaryData(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, screen, 0, NV_CTRL_BINARY_DATA_DISPLAYS_ENABLED_ON_XSCREEN, (unsigned char **) &enabledDpyIds, &len); if (!ret || (len < sizeof(enabledDpyIds[0]))) { fprintf(stderr, "Failed to query the enabled Display Devices.\n\n"); return 1; } printf("Enabled Display Devices:\n"); for (i = 0; i < enabledDpyIds[0]; i++) { int dpyId = enabledDpyIds[i+1]; print_display_id_and_name(dpy, dpyId, " "); } printf("\n"); /* * perform the requested action, based on the specified * commandline option */ if (argc <= 1) goto printHelp; /* * for each enabled display device on this X screen, query the list of * modelines in the mode pool using NV_CTRL_BINARY_DATA_MODELINES, then * print the results. */ if (strcmp(argv[1], "--print-modelines") == 0) { for (i = 0; i < enabledDpyIds[0]; i++) { int dpyId = enabledDpyIds[i+1]; ret = XNVCTRLQueryTargetBinaryData(dpy, NV_CTRL_TARGET_TYPE_DISPLAY, dpyId, 0, NV_CTRL_BINARY_DATA_MODELINES, (void *) &str, &len); if (!ret) { fprintf(stderr, "Failed to query ModeLines.\n\n"); return 1; } /* * the returned data is in the form: * * "ModeLine 1\0ModeLine 2\0ModeLine 3\0Last ModeLine\0\0" * * so walk from one "\0" to the next to print each ModeLine. */ printf("Modelines for DPY-%d:\n", dpyId); start = str; for (j = 0; j < len; j++) { if (str[j] == '\0') { printf(" %s\n", start); start = &str[j+1]; } } XFree(str); } } /* * for each enabled display device on this X screen, query the current * modeline using NV_CTRL_STRING_CURRENT_MODELINE. */ else if (strcmp(argv[1], "--print-current-modeline") == 0) { for (i = 0; i < enabledDpyIds[0]; i++) { int dpyId = enabledDpyIds[i+1]; ret = XNVCTRLQueryTargetStringAttribute(dpy, NV_CTRL_TARGET_TYPE_DISPLAY, dpyId, 0, NV_CTRL_STRING_CURRENT_MODELINE, &str); if (!ret) { fprintf(stderr, "Failed to query current ModeLine.\n\n"); return 1; } printf("Current Modeline for DPY-%d:\n", dpyId); printf(" %s\n\n", str); XFree(str); } } /* * add the specified modeline to the mode pool for the specified * display device, using NV_CTRL_STRING_ADD_MODELINE */ else if ((strcmp(argv[1], "--add-modeline") == 0) && argv[2] && argv[3]) { int dpyId = strtol(argv[2], NULL, 0); ret = XNVCTRLSetTargetStringAttribute(dpy, NV_CTRL_TARGET_TYPE_DISPLAY, dpyId, 0, NV_CTRL_STRING_ADD_MODELINE, argv[3]); if (!ret) { fprintf(stderr, "Failed to add the modeline \"%s\" to DPY-%d's " "mode pool.\n\n", argv[3], dpyId); return 1; } printf("Added modeline \"%s\" to DPY-%d's mode pool.\n\n", argv[3], dpyId); } /* * delete the specified modeline from the mode pool for the * specified display device, using NV_CTRL_STRING_DELETE_MODELINE */ else if ((strcmp(argv[1], "--delete-modeline") == 0) && argv[2] && argv[3]) { int dpyId = strtol(argv[2], NULL, 0); ret = XNVCTRLSetTargetStringAttribute(dpy, NV_CTRL_TARGET_TYPE_DISPLAY, dpyId, 0, NV_CTRL_STRING_DELETE_MODELINE, argv[3]); if (!ret) { fprintf(stderr, "Failed to delete the mode \"%s\" from DPY-%d's " "mode pool.\n\n", argv[3], dpyId); return 1; } printf("Deleted modeline \"%s\" from DPY-%d's mode pool.\n\n", argv[3], dpyId); } /* * generate a GTF modeline using NV_CTRL_STRING_OPERATION_GTF_MODELINE */ else if ((strcmp(argv[1], "--generate-gtf-modeline") == 0) && argv[2] && argv[3] && argv[4]) { char pGtfString[128]; char *pOut; snprintf(pGtfString, 128, "width=%s, height=%s, refreshrate=%s", argv[2], argv[3], argv[4]); ret = XNVCTRLStringOperation(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, screen, 0, NV_CTRL_STRING_OPERATION_GTF_MODELINE, pGtfString, &pOut); if (!ret) { fprintf(stderr, "Failed to generate GTF ModeLine from " "\"%s\".\n\n", pGtfString); return 1; } printf("GTF ModeLine from \"%s\": %s\n\n", pGtfString, pOut); } /* * generate a CVT modeline using NV_CTRL_STRING_OPERATION_CVT_MODELINE */ else if ((strcmp(argv[1], "--generate-cvt-modeline") == 0) && argv[2] && argv[3] && argv[4] && argv[5]) { char pCvtString[128]; char *pOut; snprintf(pCvtString, 128, "width=%s, height=%s, refreshrate=%s, " "reduced-blanking=%s", argv[2], argv[3], argv[4], argv[5]); ret = XNVCTRLStringOperation(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, screen, 0, NV_CTRL_STRING_OPERATION_CVT_MODELINE, pCvtString, &pOut); if (!ret) { fprintf(stderr, "Failed to generate CVT ModeLine from " "\"%s\".\n\n", pCvtString); return 1; } printf("CVT ModeLine from \"%s\": %s\n\n", pCvtString, pOut); } /* * query the MetaModes for the X screen, using * NV_CTRL_BINARY_DATA_METAMODES. */ else if (strcmp(argv[1], "--print-metamodes") == 0) { /* get list of metamodes */ ret = XNVCTRLQueryBinaryData(dpy, screen, 0, // n/a NV_CTRL_BINARY_DATA_METAMODES, (void *) &str, &len); if (!ret) { fprintf(stderr, "Failed to query MetaModes.\n\n"); return 1; } /* * the returned data is in the form: * * "MetaMode 1\0MetaMode 2\0MetaMode 3\0Last MetaMode\0\0" * * so walk from one "\0" to the next to print each MetaMode. */ printf("MetaModes:\n"); start = str; for (j = 0; j < len; j++) { if (str[j] == '\0') { printf(" %s\n", start); start = &str[j+1]; } } XFree(str); } /* * query the MetaModes for the X screen, using * NV_CTRL_BINARY_DATA_METAMODES_VERSION_2. */ else if (strcmp(argv[1], "--print-metamodes-version2") == 0) { /* get list of metamodes */ ret = XNVCTRLQueryBinaryData(dpy, screen, 0, // n/a NV_CTRL_BINARY_DATA_METAMODES_VERSION_2, (void *) &str, &len); if (!ret) { fprintf(stderr, "Failed to query MetaModes.\n\n"); return 1; } /* * the returned data is in the form: * * "MetaMode 1\0MetaMode 2\0MetaMode 3\0Last MetaMode\0\0" * * so walk from one "\0" to the next to print each MetaMode. */ printf("MetaModes:\n"); start = str; for (j = 0; j < len; j++) { if (str[j] == '\0') { printf(" %s\n", start); start = &str[j+1]; } } XFree(str); } /* * query the currently in use MetaMode. Note that an alternative * way to accomplish this is to use XRandR to query the current * mode's refresh rate, and then match the refresh rate to the id * reported in the returned NV_CTRL_BINARY_DATA_METAMODES data. */ else if (strcmp(argv[1], "--print-current-metamode") == 0) { ret = XNVCTRLQueryStringAttribute(dpy, screen, 0, NV_CTRL_STRING_CURRENT_METAMODE, &str); if (!ret) { fprintf(stderr, "Failed to query the current MetaMode.\n\n"); return 1; } printf("current metamode: \"%s\"\n\n", str); XFree(str); } /* * query the currently in use MetaMode. Note that an alternative * way to accomplish this is to use XRandR to query the current * mode's refresh rate, and then match the refresh rate to the id * reported in the returned NV_CTRL_BINARY_DATA_METAMODES_VERSION_2 data. */ else if (strcmp(argv[1], "--print-current-metamode-version2") == 0) { ret = XNVCTRLQueryStringAttribute(dpy, screen, 0, NV_CTRL_STRING_CURRENT_METAMODE_VERSION_2, &str); if (!ret) { fprintf(stderr, "Failed to query the current MetaMode.\n\n"); return 1; } printf("current metamode: \"%s\"\n\n", str); XFree(str); } /* * add the given MetaMode to X screen's list of MetaModes, using * NV_CTRL_STRING_OPERATION_ADD_METAMODE; example MetaMode string: * * "nvidia-auto-select, nvidia-auto-select" * * The output string will contain "id=#" which indicates the * unique identifier for this MetaMode. You can then use XRandR * to switch to this mode by matching the identifier with the * refresh rate reported via XRandR. * * For example: * * $ ./nv-control-dpy --add-metamode \ * "nvidia-auto-select, nvidia-auto-select" * * Using NV-CONTROL extension 1.12 on :0 * Enabled Display Devices: * DPY-0 : EIZO F931 * DPY-1 : ViewSonic P815-4 * * Added MetaMode "nvidia-auto-select, nvidia-auto-select"; * pOut: "id=52" * * $ xrandr -q * SZ: Pixels Physical Refresh * 0 3200 x 1200 ( 821mm x 302mm ) 51 52 * *1 1600 x 600 ( 821mm x 302mm ) *50 * Current rotation - normal * Current reflection - none * Rotations possible - normal * Reflections possible - none * * $ xrandr -s 0 -r 52 */ else if ((strcmp(argv[1], "--add-metamode") == 0) && (argv[2])) { char *pOut; ret = XNVCTRLStringOperation(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, screen, 0, NV_CTRL_STRING_OPERATION_ADD_METAMODE, argv[2], &pOut); if (!ret) { fprintf(stderr, "Failed to add the MetaMode \"%s\".\n\n", argv[2]); return 1; } printf("Added MetaMode \"%s\"; pOut: \"%s\"\n\n", argv[2], pOut); XFree(pOut); } /* * delete the given MetaMode from the X screen's list of * MetaModes, using NV_CTRL_STRING_DELETE_METAMODE */ else if ((strcmp(argv[1], "--delete-metamode") == 0) && (argv[1])) { ret = XNVCTRLSetStringAttribute(dpy, screen, 0, NV_CTRL_STRING_DELETE_METAMODE, argv[2]); if (!ret) { fprintf(stderr, "Failed to delete the MetaMode.\n\n"); return 1; } printf("Deleted MetaMode \"%s\".\n\n", argv[2]); } /* * query the valid frequency ranges for each display device, using * NV_CTRL_STRING_VALID_HORIZ_SYNC_RANGES and * NV_CTRL_STRING_VALID_VERT_REFRESH_RANGES */ else if (strcmp(argv[1], "--get-valid-freq-ranges") == 0) { for (i = 0; i < enabledDpyIds[0]; i++) { int dpyId = enabledDpyIds[i+1]; ret = XNVCTRLQueryTargetStringAttribute (dpy, NV_CTRL_TARGET_TYPE_DISPLAY, dpyId, 0, NV_CTRL_STRING_VALID_HORIZ_SYNC_RANGES, &str0); if (!ret) { fprintf(stderr, "Failed to query HorizSync for DPY-%d.\n\n", dpyId); return 1; } ret = XNVCTRLQueryTargetStringAttribute (dpy, NV_CTRL_TARGET_TYPE_DISPLAY, dpyId, 0, NV_CTRL_STRING_VALID_VERT_REFRESH_RANGES, &str1); if (!ret) { fprintf(stderr, "Failed to query VertRefresh for DPY-%d.\n\n", dpyId); XFree(str0); return 1; } printf("frequency information for DPY-%d:\n", dpyId); printf(" HorizSync : \"%s\"\n", str0); printf(" VertRefresh : \"%s\"\n\n", str1); XFree(str0); XFree(str1); } } /* * attempt to build the modepool for each display device; this * will fail for any display device that already has a modepool */ else if (strcmp(argv[1], "--build-modepool") == 0) { for (i = 0; i < enabledDpyIds[0]; i++) { int dpyId = enabledDpyIds[i+1]; ret = XNVCTRLStringOperation (dpy, NV_CTRL_TARGET_TYPE_DISPLAY, dpyId, 0, NV_CTRL_STRING_OPERATION_BUILD_MODEPOOL, argv[2], &str0); if (!ret) { fprintf(stderr, "Failed to build modepool for DPY-%d (it most " "likely already has a modepool).\n\n", dpyId); } else { printf("Built modepool for DPY-%d.\n\n", dpyId); } } } /* * query the assigned display devices on this X screen; these are the * display devices that are available to the X screen for use by MetaModes. */ else if (strcmp(argv[1], "--get-assigned-dpys") == 0) { int *pData = NULL; int len; ret = XNVCTRLQueryTargetBinaryData(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, screen, 0, NV_CTRL_BINARY_DATA_DISPLAYS_ASSIGNED_TO_XSCREEN, (unsigned char **) &pData, &len); if (!ret || (len < sizeof(pData[0]))) { fprintf(stderr, "failed to query the assigned display " "devices.\n\n"); return 1; } printf("Assigned display devices:\n"); for (i = 0; i < pData[0]; i++) { int dpyId = pData[i+1]; printf(" DPY-%d\n", dpyId); } printf("\n"); XFree(pData); } /* * query information about the GPUs in the system */ else if (strcmp(argv[1], "--query-gpus") == 0) { int num_gpus, num_screens, i; int *pData; printf("GPU Information:\n"); /* Get the number of gpus in the system */ ret = XNVCTRLQueryTargetCount(dpy, NV_CTRL_TARGET_TYPE_GPU, &num_gpus); if (!ret) { fprintf(stderr, "Failed to query number of gpus.\n\n"); return 1; } printf(" number of GPUs: %d\n", num_gpus); /* List the X screen number of all X screens driven by each gpu */ for (i = 0; i < num_gpus; i++) { ret = XNVCTRLQueryTargetBinaryData (dpy, NV_CTRL_TARGET_TYPE_GPU, i, // target_id 0, NV_CTRL_BINARY_DATA_XSCREENS_USING_GPU, (unsigned char **) &pData, &len); if (!ret || (len < sizeof(pData[0]))) { fprintf(stderr, "Failed to query list of X Screens\n"); return 1; } printf(" number of X screens using GPU %d: %d\n", i, pData[0]); /* List X Screen number of all X Screens driven by this GPU. */ printf(" Indices of X screens using GPU %d: ", i); for (j = 1; j <= pData[0]; j++) { printf(" %d", pData[j]); } printf("\n"); XFree(pData); } /* Get the number of X Screens in the system * * NOTE: If Xinerama is enabled, ScreenCount(dpy) will return 1, * where as querying the screen count information from * NV-CONTROL will return the number of underlying X Screens. */ ret = XNVCTRLQueryTargetCount(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, &num_screens); if (!ret) { fprintf(stderr, "Failed to query number of X Screens\n\n"); return 1; } printf("\n"); printf(" number of X screens (ScreenCount): %d\n", ScreenCount(dpy)); printf(" number of X screens (NV-CONTROL): %d\n\n", num_screens); for (i = 0; i < num_screens; i++) { ret = XNVCTRLQueryTargetBinaryData (dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, i, // target_id 0, NV_CTRL_BINARY_DATA_GPUS_USED_BY_XSCREEN, (unsigned char **) &pData, &len); if (!ret || (len < sizeof(pData[0]))) { fprintf(stderr, "Failed to query list of gpus\n\n"); return 1; } printf(" number of GPUs used by X screen %d: %d\n", i, pData[0]); /* List gpu number of all gpus driven by this X screen */ printf(" Indices of GPUs used by X screen %d: ", i); for (j = 1; j <= pData[0]; j++) { printf(" %d", pData[j]); } printf("\n"); XFree(pData); } printf("\n"); } /* * probe for any newly connected display devices */ else if (strcmp(argv[1], "--probe-dpys") == 0) { int num_gpus, i; printf("Display Device Probed Information:\n\n"); /* Get the number of gpus in the system */ ret = XNVCTRLQueryTargetCount(dpy, NV_CTRL_TARGET_TYPE_GPU, &num_gpus); if (!ret) { fprintf(stderr, "Failed to query number of gpus\n\n"); return 1; } printf(" number of GPUs: %d\n", num_gpus); /* Probe and list the Display devices */ for (i = 0; i < num_gpus; i++) { int deprecated; int *pData; /* Get the gpu name */ ret = XNVCTRLQueryTargetStringAttribute (dpy, NV_CTRL_TARGET_TYPE_GPU, i, 0, NV_CTRL_STRING_PRODUCT_NAME, &str); if (!ret) { fprintf(stderr, "Failed to query gpu name\n\n"); return 1; } /* Probe the GPU for new/old display devices */ ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, i, 0, NV_CTRL_PROBE_DISPLAYS, &deprecated); if (!ret) { fprintf(stderr, "Failed to probe the enabled Display " "Devices on GPU-%d (%s).\n\n", i, str); return 1; } printf(" display devices on GPU-%d (%s):\n", i, str); XFree(str); /* Report results */ ret = XNVCTRLQueryTargetBinaryData(dpy, NV_CTRL_TARGET_TYPE_GPU, i, 0, NV_CTRL_BINARY_DATA_DISPLAYS_CONNECTED_TO_GPU, (unsigned char **) &pData, &len); if (!ret || (len < sizeof(pData[0]))) { fprintf(stderr, "Failed to query the connected Display Devices.\n\n"); return 1; } for (j = 0; j < pData[0]; j++) { int dpyId = pData[j+1]; print_display_id_and_name(dpy, dpyId, " "); } printf("\n"); } printf("\n"); } /* * query the nvidiaXineramaInfoOrder */ else if (strcmp(argv[1], "--query-nvidia-xinerama-info-order") == 0) { ret = XNVCTRLQueryTargetStringAttribute (dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, screen, 0, NV_CTRL_STRING_NVIDIA_XINERAMA_INFO_ORDER, &str); if (!ret) { fprintf(stderr, "Failed to query nvidiaXineramaInfoOrder.\n\n"); return 1; } printf("nvidiaXineramaInfoOrder: %s\n\n", str); } /* * assign the nvidiaXineramaInfoOrder */ else if ((strcmp(argv[1], "--assign-nvidia-xinerama-info-order")== 0) && argv[2]) { ret = XNVCTRLSetStringAttribute (dpy, screen, 0, NV_CTRL_STRING_NVIDIA_XINERAMA_INFO_ORDER, argv[2]); if (!ret) { fprintf(stderr, "Failed to assign " "nvidiaXineramaInfoOrder = \"%s\".\n\n", argv[2]); return 1; } printf("assigned nvidiaXineramaInfoOrder: \"%s\"\n\n", argv[2]); } /* * use NV_CTRL_MAX_SCREEN_WIDTH and NV_CTRL_MAX_SCREEN_HEIGHT to * query the maximum screen dimensions on each GPU in the system */ else if (strcmp(argv[1], "--max-screen-size") == 0) { int num_gpus, i, width, height; /* Get the number of gpus in the system */ ret = XNVCTRLQueryTargetCount(dpy, NV_CTRL_TARGET_TYPE_GPU, &num_gpus); if (!ret) { fprintf(stderr, "Failed to query number of gpus.\n\n"); return 1; } for (i = 0; i < num_gpus; i++) { ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, i, 0, NV_CTRL_MAX_SCREEN_WIDTH, &width); if (!ret) { fprintf(stderr, "Failed to query the maximum screen " "width on GPU-%d\n\n", i); return 1; } ret = XNVCTRLQueryTargetAttribute(dpy, NV_CTRL_TARGET_TYPE_GPU, i, 0, NV_CTRL_MAX_SCREEN_HEIGHT, &height); if (!ret) { fprintf(stderr, "Failed to query the maximum screen " "height on GPU-%d.\n\n", i); return 1; } printf("GPU-%d: maximum X screen size: %d x %d.\n\n", i, width, height); } } /* * demonstrate how to use NV-CONTROL to query what modelines are * used by the MetaModes of the X screen: we first query all the * MetaModes, parse out the display device names and mode names, * and then lookup the modelines associated with those mode names * on those display devices * * this could be implemented much more efficiently, but * demonstrates the general idea */ else if (strcmp(argv[1], "--print-used-modelines") == 0) { char *pMetaModes, *pModeLines[8], *tmp, *modeString; char *modeLine, *modeName, *noWhiteSpace; int MetaModeLen, ModeLineLen[8], ModeLineDpyId[8]; int dpyId; /* first, we query the MetaModes on this X screen */ XNVCTRLQueryBinaryData(dpy, screen, 0, NV_CTRL_BINARY_DATA_METAMODES_VERSION_2, (void *) &pMetaModes, &MetaModeLen); /* * then, we query the ModeLines for each display device on * this X screen; we'll need these later */ for (i = 0; i < enabledDpyIds[0]; i++) { dpyId = enabledDpyIds[i+1]; XNVCTRLQueryTargetBinaryData(dpy, NV_CTRL_TARGET_TYPE_DISPLAY, dpyId, 0, NV_CTRL_BINARY_DATA_MODELINES, (void *) &str, &len); pModeLines[i] = str; ModeLineLen[i] = len; ModeLineDpyId[i] = dpyId; } /* now, parse each MetaMode */ str = start = pMetaModes; for (j = 0; j < MetaModeLen - 1; j++) { /* * if we found the end of a line, treat the string from * start to str[j] as a MetaMode */ if ((str[j] == '\0') && (str[j+1] != '\0')) { printf("MetaMode: %s\n", start); /* * remove any white space from the string to make * parsing easier */ noWhiteSpace = remove_whitespace(start); /* * the MetaMode may be preceded with "token=value" * pairs, separated by the main MetaMode with "::"; if * "::" exists in the string, skip past it */ tmp = strstr(noWhiteSpace, "::"); if (tmp) { tmp += 2; } else { tmp = noWhiteSpace; } /* Parse each mode from the metamode */ for (modeString = mode_strtok(tmp); modeString; modeString = mode_strtok(NULL)) { /* * retrieve the modeName and display device id * for this segment of the Metamode */ if (!parse_mode_string(modeString, &modeName, &dpyId)) { fprintf(stderr, " Failed to parse mode string '%s'." "\n\n", modeString); continue; } /* lookup the modeline that matches */ for (i = 0; i < enabledDpyIds[0]; i++) { if (ModeLineDpyId[i] == dpyId) { break; } } if ( i >= enabledDpyIds[0] ) { fprintf(stderr, " Failed to find modelines for " "DPY-%d.\n\n", dpyId); continue; } modeLine = find_modeline(modeName, pModeLines[i], ModeLineLen[i]); printf(" DPY-%d: %s\n", dpyId, modeLine); } printf("\n"); free(noWhiteSpace); /* move to the next MetaMode */ start = &str[j+1]; } } } /* Display all names each display device goes by */ else if (strcmp(argv[1], "--print-display-names") == 0) { int *pData; int len, i; printf("Display Device Information:\n"); ret = XNVCTRLQueryTargetBinaryData(dpy, NV_CTRL_TARGET_TYPE_GPU, 0, 0, NV_CTRL_BINARY_DATA_DISPLAY_TARGETS, (unsigned char **) &pData, &len); if (!ret || (len < sizeof(pData[0]))) { fprintf(stderr, "Failed to query number of display devices.\n\n"); return 1; } printf(" number of display devices: %d\n", pData[0]); for (i = 1; i <= pData[0]; i++) { printf("\n Display Device: %d\n", pData[i]); print_display_name(dpy, pData[i], NV_CTRL_STRING_DISPLAY_NAME_TYPE_BASENAME, "Type Basename"); print_display_name(dpy, pData[i], NV_CTRL_STRING_DISPLAY_NAME_TYPE_ID, "Type ID"); print_display_name(dpy, pData[i], NV_CTRL_STRING_DISPLAY_NAME_DP_GUID, "DP GUID"); print_display_name(dpy, pData[i], NV_CTRL_STRING_DISPLAY_NAME_EDID_HASH, "EDID HASH"); print_display_name(dpy, pData[i], NV_CTRL_STRING_DISPLAY_NAME_TARGET_INDEX, "Target Index"); print_display_name(dpy, pData[i], NV_CTRL_STRING_DISPLAY_NAME_RANDR, "RANDR"); } } /* * print help information */ else { printHelp: printf("\nnv-control-dpy [options]:\n\n"); printf(" ModeLine options:\n\n"); printf(" --print-modelines: print the modelines in the mode pool " "for each Display Device.\n\n"); printf(" --print-current-modeline: print the current modeline " "for each Display Device.\n\n"); printf(" --add-modeline [dpy id] [modeline]: " "add new modeline.\n\n"); printf(" --delete-modeline [dpy id] [modename]: " "delete modeline with modename.\n\n"); printf(" --generate-gtf-modeline [width] [height] [refreshrate]:" " use the GTF formula" " to generate a modeline for the specified parameters.\n\n"); printf(" --generate-cvt-modeline [width] [height] [refreshrate]" " [reduced-blanking]: use the CVT formula" " to generate a modeline for the specified parameters.\n\n"); printf(" MetaMode options:\n\n"); printf(" --print-metamodes: print the current MetaModes for the " "X screen\n\n"); printf(" --print-metamodes-version2: print the current MetaModes for " "the X screen with extended information\n\n"); printf(" --add-metamode [metamode]: add the specified " "MetaMode to the X screen's list of MetaModes.\n\n"); printf(" --delete-metamode [metamode]: delete the specified MetaMode " "from the X screen's list of MetaModes.\n\n"); printf(" --print-current-metamode: print the current MetaMode.\n\n"); printf(" --print-current-metamode-version2: print the current " "MetaMode with extended information.\n\n"); printf(" Misc options:\n\n"); printf(" --get-valid-freq-ranges: query the valid frequency " "information for each display device.\n\n"); printf(" --build-modepool: build a modepool for any display device " "that does not already have one.\n\n"); printf(" --get-assigned-dpys: query the assigned display device for " "this X screen\n\n"); printf(" --query-gpus: print GPU information and relationship to " "X screens.\n\n"); printf(" --probe-dpys: probe GPUs for new display devices\n\n"); printf(" --query-nvidia-xinerama-info-order: query the " "nvidiaXineramaInfoOrder.\n\n"); printf(" --assign-nvidia-xinerama-info-order [order]: assign the " "nvidiaXineramaInfoOrder.\n\n"); printf(" --max-screen-size: query the maximum screen size " "on all GPUs in the system\n\n"); printf(" --print-used-modelines: print the modeline for each display " "device for each MetaMode on the X screen.\n\n"); printf(" --print-display-names: print all the names associated with " "each display device on the server\n\n"); } return 0; }
int main(int argc, char *argv[]) { FILE *fftfile, *candfile; float powargr, powargi, *powers = NULL, *minifft; float norm, numchunks, *powers_pos; int nbins, newncand, nfftsizes, fftlen, halffftlen, binsleft; int numtoread, filepos = 0, loopct = 0, powers_offset, ncand2; int ii, ct, newper = 0, oldper = 0, numsumpow = 1; double T, totnumsearched = 0.0, minsig = 0.0, min_orb_p, max_orb_p; char *rootfilenm, *notes; fcomplex *data = NULL; rawbincand tmplist[MININCANDS], *list; infodata idata; struct tms runtimes; double ttim, utim, stim, tott; Cmdline *cmd; fftwf_plan fftplan; /* Prep the timer */ tott = times(&runtimes) / (double) CLK_TCK; /* Call usage() if we have no command line arguments */ if (argc == 1) { Program = argv[0]; printf("\n"); usage(); exit(1); } /* Parse the command line using the excellent program Clig */ cmd = parseCmdline(argc, argv); #ifdef DEBUG showOptionValues(); #endif printf("\n\n"); printf(" Phase Modulation Pulsar Search Routine\n"); printf(" by Scott M. Ransom\n\n"); { int hassuffix = 0; char *suffix; hassuffix = split_root_suffix(cmd->argv[0], &rootfilenm, &suffix); if (hassuffix) { if (strcmp(suffix, "fft") != 0) { printf("\nInput file ('%s') must be a FFT file ('.fft')!\n\n", cmd->argv[0]); free(suffix); exit(0); } free(suffix); } else { printf("\nInput file ('%s') must be a FFT file ('.fft')!\n\n", cmd->argv[0]); exit(0); } } /* Read the info file */ readinf(&idata, rootfilenm); T = idata.N * idata.dt; if (strlen(remove_whitespace(idata.object)) > 0) { printf("Analyzing '%s' data from '%s'.\n\n", remove_whitespace(idata.object), cmd->argv[0]); } else { printf("Analyzing data from '%s'.\n\n", cmd->argv[0]); } min_orb_p = MINORBP; if (cmd->noaliasP) max_orb_p = T / 2.0; else max_orb_p = T / 1.2; /* open the FFT file and get its length */ fftfile = chkfopen(cmd->argv[0], "rb"); nbins = chkfilelen(fftfile, sizeof(fcomplex)); /* Check that cmd->maxfft is an acceptable power of 2 */ ct = 4; ii = 1; while (ct < MAXREALFFT || ii) { if (ct == cmd->maxfft) ii = 0; ct <<= 1; } if (ii) { printf("\n'maxfft' is out of range or not a power-of-2.\n\n"); exit(1); } /* Check that cmd->minfft is an acceptable power of 2 */ ct = 4; ii = 1; while (ct < MAXREALFFT || ii) { if (ct == cmd->minfft) ii = 0; ct <<= 1; } if (ii) { printf("\n'minfft' is out of range or not a power-of-2.\n\n"); exit(1); } /* Low and high Fourier freqs to check */ if (cmd->floP) { cmd->rlo = floor(cmd->flo * T); if (cmd->rlo < cmd->lobin) cmd->rlo = cmd->lobin; if (cmd->rlo > cmd->lobin + nbins - 1) { printf("\nLow frequency to search 'flo' is greater than\n"); printf(" the highest available frequency. Exiting.\n\n"); exit(1); } } else { cmd->rlo = 1.0; if (cmd->rlo < cmd->lobin) cmd->rlo = cmd->lobin; if (cmd->rlo > cmd->lobin + nbins - 1) { printf("\nLow frequency to search 'rlo' is greater than\n"); printf(" the available number of points. Exiting.\n\n"); exit(1); } } if (cmd->fhiP) { cmd->rhi = ceil(cmd->fhi * T); if (cmd->rhi > cmd->lobin + nbins - 1) cmd->rhi = cmd->lobin + nbins - 1; if (cmd->rhi < cmd->rlo) { printf("\nHigh frequency to search 'fhi' is less than\n"); printf(" the lowest frequency to search 'flo'. Exiting.\n\n"); exit(1); } } else if (cmd->rhiP) { if (cmd->rhi > cmd->lobin + nbins - 1) cmd->rhi = cmd->lobin + nbins - 1; if (cmd->rhi < cmd->rlo) { printf("\nHigh frequency to search 'rhi' is less than\n"); printf(" the lowest frequency to search 'rlo'. Exiting.\n\n"); exit(1); } } /* Determine how many different mini-fft sizes we will use */ nfftsizes = 1; ii = cmd->maxfft; while (ii > cmd->minfft) { ii >>= 1; nfftsizes++; } /* Allocate some memory and prep some variables. */ /* For numtoread, the 6 just lets us read extra data at once */ numtoread = 6 * cmd->maxfft; if (cmd->stack == 0) powers = gen_fvect(numtoread); minifft = (float *) fftwf_malloc(sizeof(float) * (cmd->maxfft * cmd->numbetween + 2)); ncand2 = 2 * cmd->ncand; list = (rawbincand *) malloc(sizeof(rawbincand) * ncand2); for (ii = 0; ii < ncand2; ii++) list[ii].mini_sigma = 0.0; for (ii = 0; ii < MININCANDS; ii++) tmplist[ii].mini_sigma = 0.0; filepos = cmd->rlo - cmd->lobin; numchunks = (float) (cmd->rhi - cmd->rlo) / numtoread; printf("Searching...\n"); printf(" Amount complete = %3d%%", 0); fflush(stdout); /* Prep FFTW */ read_wisdom(); /* Loop through fftfile */ while ((filepos + cmd->lobin) < cmd->rhi) { /* Calculate percentage complete */ newper = (int) (loopct / numchunks * 100.0); if (newper > oldper) { newper = (newper > 99) ? 100 : newper; printf("\r Amount complete = %3d%%", newper); oldper = newper; fflush(stdout); } /* Adjust our search parameters if close to end of zone to search */ binsleft = cmd->rhi - (filepos + cmd->lobin); if (binsleft < cmd->minfft) break; if (binsleft < numtoread) { /* Change numtoread */ numtoread = cmd->maxfft; while (binsleft < numtoread) { cmd->maxfft /= 2; numtoread = cmd->maxfft; } } fftlen = cmd->maxfft; /* Read from fftfile */ if (cmd->stack == 0) { data = read_fcomplex_file(fftfile, filepos, numtoread); for (ii = 0; ii < numtoread; ii++) powers[ii] = POWER(data[ii].r, data[ii].i); numsumpow = 1; } else { powers = read_float_file(fftfile, filepos, numtoread); numsumpow = cmd->stack; } if (filepos == 0) powers[0] = 1.0; /* Chop the powers that are way above the median level */ prune_powers(powers, numtoread, numsumpow); /* Loop through the different small FFT sizes */ while (fftlen >= cmd->minfft) { halffftlen = fftlen / 2; powers_pos = powers; powers_offset = 0; /* Create the appropriate FFT plan */ fftplan = fftwf_plan_dft_r2c_1d(cmd->interbinP ? fftlen : 2 * fftlen, minifft, (fftwf_complex *) minifft, FFTW_PATIENT); /* Perform miniffts at each section of the powers array */ while ((numtoread - powers_offset) > (int) ((1.0 - cmd->overlap) * cmd->maxfft + DBLCORRECT)) { /* Copy the proper amount and portion of powers into minifft */ memcpy(minifft, powers_pos, fftlen * sizeof(float)); /* For Fourier interpolation use a zeropadded FFT */ if (cmd->numbetween > 1 && !cmd->interbinP) { for (ii = fftlen; ii < cmd->numbetween * fftlen; ii++) minifft[ii] = 0.0; } /* Perform the minifft */ fftwf_execute(fftplan); /* Normalize and search the miniFFT */ norm = sqrt(fftlen * numsumpow) / minifft[0]; for (ii = 0; ii < (cmd->interbinP ? fftlen + 1 : 2 * fftlen + 1); ii++) minifft[ii] *= norm; search_minifft((fcomplex *) minifft, halffftlen, min_orb_p, max_orb_p, tmplist, MININCANDS, cmd->harmsum, cmd->numbetween, idata.N, T, (double) (powers_offset + filepos + cmd->lobin), cmd->interbinP ? INTERBIN : INTERPOLATE, cmd->noaliasP ? NO_CHECK_ALIASED : CHECK_ALIASED); /* Check if the new cands should go into the master cand list */ for (ii = 0; ii < MININCANDS; ii++) { if (tmplist[ii].mini_sigma > minsig) { /* Check to see if another candidate with these properties */ /* is already in the list. */ if (not_already_there_rawbin(tmplist[ii], list, ncand2)) { list[ncand2 - 1] = tmplist[ii]; minsig = percolate_rawbincands(list, ncand2); } } else { break; } /* Mini-fft search for loop */ } totnumsearched += fftlen; powers_pos += (int) (cmd->overlap * fftlen); powers_offset = powers_pos - powers; /* Position of mini-fft in data set while loop */ } fftwf_destroy_plan(fftplan); fftlen >>= 1; /* Size of mini-fft while loop */ } if (cmd->stack == 0) vect_free(data); else vect_free(powers); filepos += (numtoread - (int) ((1.0 - cmd->overlap) * cmd->maxfft)); loopct++; /* File position while loop */ } /* Print the final percentage update */ printf("\r Amount complete = %3d%%\n\n", 100); /* Print the number of frequencies searched */ printf("Searched %.0f pts (including interbins).\n\n", totnumsearched); printf("Timing summary:\n"); tott = times(&runtimes) / (double) CLK_TCK - tott; utim = runtimes.tms_utime / (double) CLK_TCK; stim = runtimes.tms_stime / (double) CLK_TCK; ttim = utim + stim; printf(" CPU time: %.3f sec (User: %.3f sec, System: %.3f sec)\n", ttim, utim, stim); printf(" Total time: %.3f sec\n\n", tott); printf("Writing result files and cleaning up.\n"); /* Count how many candidates we actually have */ ii = 0; while (ii < ncand2 && list[ii].mini_sigma != 0) ii++; newncand = (ii > cmd->ncand) ? cmd->ncand : ii; /* Set our candidate notes to all spaces */ notes = malloc(sizeof(char) * newncand * 18 + 1); for (ii = 0; ii < newncand; ii++) strncpy(notes + ii * 18, " ", 18); /* Check the database for possible known PSR detections */ if (idata.ra_h && idata.dec_d) { for (ii = 0; ii < newncand; ii++) { comp_rawbin_to_cand(&list[ii], &idata, notes + ii * 18, 0); } } /* Compare the candidates with each other */ compare_rawbin_cands(list, newncand, notes); /* Send the candidates to the text file */ file_rawbin_candidates(list, notes, newncand, cmd->harmsum, rootfilenm); /* Write the binary candidate file */ { char *candnm; candnm = (char *) calloc(strlen(rootfilenm) + 15, sizeof(char)); sprintf(candnm, "%s_bin%d.cand", rootfilenm, cmd->harmsum); candfile = chkfopen(candnm, "wb"); chkfwrite(list, sizeof(rawbincand), (unsigned long) newncand, candfile); fclose(candfile); free(candnm); } /* Free our arrays and close our files */ if (cmd->stack == 0) vect_free(powers); free(list); fftwf_free(minifft); free(notes); free(rootfilenm); fclose(fftfile); printf("Done.\n\n"); return (0); }
void read_PSRFITS_files(struct spectra_info *s) // Read and convert PSRFITS information from a group of files // and place the resulting info into a spectra_info structure. { int IMJD, SMJD, itmp, ii, status = 0; double OFFS, dtmp; long double MJDf; char ctmp[80], comment[120]; s->datatype = PSRFITS; s->fitsfiles = (fitsfile **)malloc(sizeof(fitsfile *) * s->num_files); s->start_subint = gen_ivect(s->num_files); s->num_subint = gen_ivect(s->num_files); s->start_spec = (long long *)malloc(sizeof(long long) * s->num_files); s->num_spec = (long long *)malloc(sizeof(long long) * s->num_files); s->num_pad = (long long *)malloc(sizeof(long long) * s->num_files); s->start_MJD = (long double *)malloc(sizeof(long double) * s->num_files); s->N = 0; s->num_beams = 1; s->get_rawblock = &get_PSRFITS_rawblock; s->offset_to_spectra = &offset_to_PSRFITS_spectra; // By default, don't flip the band. But don't change // the input value if it is aleady set to flip the band always if (s->apply_flipband==-1) s->apply_flipband = 0; // Step through the other files for (ii = 0 ; ii < s->num_files ; ii++) { // Is the file a PSRFITS file? if (!is_PSRFITS(s->filenames[ii])) { fprintf(stderr, "\nError! File '%s' does not appear to be PSRFITS!\n", s->filenames[ii]); exit(1); } // Open the PSRFITS file fits_open_file(&(s->fitsfiles[ii]), s->filenames[ii], READONLY, &status); // Is the data in search mode? fits_read_key(s->fitsfiles[ii], TSTRING, "OBS_MODE", ctmp, comment, &status); // Quick fix for Parkes DFB data (SRCH? why????)... if (strcmp("SRCH", ctmp)==0) { strncpy(ctmp, "SEARCH", 40); } if (strcmp(ctmp, "SEARCH")) { fprintf(stderr, "\nError! File '%s' does not contain SEARCH-mode data!\n", s->filenames[ii]); exit(1); } // Now get the stuff we need from the primary HDU header fits_read_key(s->fitsfiles[ii], TSTRING, "TELESCOP", ctmp, comment, &status); \ // Quick fix for MockSpec data... if (strcmp("ARECIBO 305m", ctmp)==0) { strncpy(ctmp, "Arecibo", 40); } // Quick fix for Parkes DFB data... { char newctmp[80]; // Copy ctmp first since strlower() is in-place strcpy(newctmp, ctmp); if (strcmp("parkes", strlower(remove_whitespace(newctmp)))==0) { strncpy(ctmp, "Parkes", 40); } } if (status) { printf("Error %d reading key %s\n", status, "TELESCOP"); if (ii==0) s->telescope[0]='\0'; if (status==KEY_NO_EXIST) status=0; } else { if (ii==0) strncpy(s->telescope, ctmp, 40); else if (strcmp(s->telescope, ctmp)!=0) printf("Warning!: %s values don't match for files 0 and %d!\n", "TELESCOP", ii); } get_hdr_string("OBSERVER", s->observer); get_hdr_string("SRC_NAME", s->source); get_hdr_string("FRONTEND", s->frontend); get_hdr_string("BACKEND", s->backend); get_hdr_string("PROJID", s->project_id); get_hdr_string("DATE-OBS", s->date_obs); get_hdr_string("FD_POLN", s->poln_type); get_hdr_string("RA", s->ra_str); get_hdr_string("DEC", s->dec_str); get_hdr_double("OBSFREQ", s->fctr); get_hdr_int("OBSNCHAN", s->orig_num_chan); get_hdr_double("OBSBW", s->orig_df); //get_hdr_double("CHAN_DM", s->chan_dm); get_hdr_double("BMIN", s->beam_FWHM); /* This is likely not in earlier versions of PSRFITS so */ /* treat it a bit differently */ fits_read_key(s->fitsfiles[ii], TDOUBLE, "CHAN_DM", &(s->chan_dm), comment, &status); if (status==KEY_NO_EXIST) { status = 0; s->chan_dm = 0.0; } // Don't use the macros unless you are using the struct! fits_read_key(s->fitsfiles[ii], TINT, "STT_IMJD", &IMJD, comment, &status); s->start_MJD[ii] = (long double) IMJD; fits_read_key(s->fitsfiles[ii], TINT, "STT_SMJD", &SMJD, comment, &status); fits_read_key(s->fitsfiles[ii], TDOUBLE, "STT_OFFS", &OFFS, comment, &status); s->start_MJD[ii] += ((long double) SMJD + (long double) OFFS) / SECPERDAY; // Are we tracking? fits_read_key(s->fitsfiles[ii], TSTRING, "TRK_MODE", ctmp, comment, &status); itmp = (strcmp("TRACK", ctmp)==0) ? 1 : 0; if (ii==0) s->tracking = itmp; else if (s->tracking != itmp) printf("Warning!: TRK_MODE values don't match for files 0 and %d!\n", ii); // Now switch to the SUBINT HDU header fits_movnam_hdu(s->fitsfiles[ii], BINARY_TBL, "SUBINT", 0, &status); get_hdr_double("TBIN", s->dt); get_hdr_int("NCHAN", s->num_channels); get_hdr_int("NPOL", s->num_polns); get_hdr_string("POL_TYPE", s->poln_order); fits_read_key(s->fitsfiles[ii], TINT, "NCHNOFFS", &itmp, comment, &status); if (itmp > 0) printf("Warning!: First freq channel is not 0 in file %d!\n", ii); get_hdr_int("NSBLK", s->spectra_per_subint); get_hdr_int("NBITS", s->bits_per_sample); fits_read_key(s->fitsfiles[ii], TINT, "NAXIS2", &(s->num_subint[ii]), comment, &status); fits_read_key(s->fitsfiles[ii], TINT, "NSUBOFFS", &(s->start_subint[ii]), comment, &status); s->time_per_subint = s->dt * s->spectra_per_subint; /* This is likely not in earlier versions of PSRFITS so */ /* treat it a bit differently */ fits_read_key(s->fitsfiles[ii], TFLOAT, "ZERO_OFF", &(s->zero_offset), comment, &status); if (status==KEY_NO_EXIST) { status = 0; s->zero_offset = 0.0; } s->zero_offset = fabs(s->zero_offset); // Get the time offset column info and the offset for the 1st row { double offs_sub; int colnum, anynull, numrows; // Identify the OFFS_SUB column number fits_get_colnum(s->fitsfiles[ii], 0, "OFFS_SUB", &colnum, &status); if (status==COL_NOT_FOUND) { printf("Warning!: Can't find the OFFS_SUB column!\n"); status = 0; // Reset status } else { if (ii==0) { s->offs_sub_col = colnum; } else if (colnum != s->offs_sub_col) { printf("Warning!: OFFS_SUB column changes between files!\n"); } } // Read the OFFS_SUB column value for the 1st row fits_read_col(s->fitsfiles[ii], TDOUBLE, s->offs_sub_col, 1L, 1L, 1L, 0, &offs_sub, &anynull, &status); numrows = (int)((offs_sub - 0.5 * s->time_per_subint) / s->time_per_subint + 1e-7); // Check to see if any rows have been deleted or are missing if (numrows > s->start_subint[ii]) { printf("Warning: NSUBOFFS reports %d previous rows\n" " but OFFS_SUB implies %d. Using OFFS_SUB.\n" " Will likely be able to correct for this.\n", s->start_subint[ii], numrows); } s->start_subint[ii] = numrows; } // This is the MJD offset based on the starting subint number MJDf = (s->time_per_subint * s->start_subint[ii]) / SECPERDAY; // The start_MJD values should always be correct s->start_MJD[ii] += MJDf; // Compute the starting spectra from the times MJDf = s->start_MJD[ii] - s->start_MJD[0]; if (MJDf < 0.0) { fprintf(stderr, "Error!: File %d seems to be from before file 0!\n", ii); exit(1); } s->start_spec[ii] = (long long)(MJDf * SECPERDAY / s->dt + 0.5); // Now pull stuff from the other columns { float ftmp; long repeat, width; int colnum, anynull; // Identify the data column and the data type fits_get_colnum(s->fitsfiles[ii], 0, "DATA", &colnum, &status); if (status==COL_NOT_FOUND) { printf("Warning!: Can't find the DATA column!\n"); status = 0; // Reset status } else { if (ii==0) { s->data_col = colnum; fits_get_coltype(s->fitsfiles[ii], colnum, &(s->FITS_typecode), &repeat, &width, &status); } else if (colnum != s->data_col) { printf("Warning!: DATA column changes between files!\n"); } } // Telescope azimuth fits_get_colnum(s->fitsfiles[ii], 0, "TEL_AZ", &colnum, &status); if (status==COL_NOT_FOUND) { s->azimuth = 0.0; status = 0; // Reset status } else { fits_read_col(s->fitsfiles[ii], TFLOAT, colnum, 1L, 1L, 1L, 0, &ftmp, &anynull, &status); if (ii==0) s->azimuth = (double) ftmp; } // Telescope zenith angle fits_get_colnum(s->fitsfiles[ii], 0, "TEL_ZEN", &colnum, &status); if (status==COL_NOT_FOUND) { s->zenith_ang = 0.0; status = 0; // Reset status } else { fits_read_col(s->fitsfiles[ii], TFLOAT, colnum, 1L, 1L, 1L, 0, &ftmp, &anynull, &status); if (ii==0) s->zenith_ang = (double) ftmp; } // Observing frequencies fits_get_colnum(s->fitsfiles[ii], 0, "DAT_FREQ", &colnum, &status); if (status==COL_NOT_FOUND) { printf("Warning!: Can't find the channel freq column!\n"); status = 0; // Reset status } else { int jj; float *freqs = (float *)malloc(sizeof(float) * s->num_channels); fits_read_col(s->fitsfiles[ii], TFLOAT, colnum, 1L, 1L, s->num_channels, 0, freqs, &anynull, &status); if (ii==0) { s->df = freqs[1]-freqs[0]; s->lo_freq = freqs[0]; s->hi_freq = freqs[s->num_channels-1]; // Now check that the channel spacing is the same throughout for (jj = 0 ; jj < s->num_channels - 1 ; jj++) { ftmp = freqs[jj+1] - freqs[jj]; if (fabs(ftmp - s->df) > 1e-7) printf("Warning!: Channel spacing changes in file %d!\n", ii); } } else { ftmp = fabs(s->df-(freqs[1]-freqs[0])); if (ftmp > 1e-7) printf("Warning!: Channel spacing changes between files!\n"); ftmp = fabs(s->lo_freq-freqs[0]); if (ftmp > 1e-7) printf("Warning!: Low channel changes between files!\n"); ftmp = fabs(s->hi_freq-freqs[s->num_channels-1]); if (ftmp > 1e-7) printf("Warning!: High channel changes between files!\n"); } free(freqs); } // Data weights fits_get_colnum(s->fitsfiles[ii], 0, "DAT_WTS", &colnum, &status); if (status==COL_NOT_FOUND) { printf("Warning!: Can't find the channel weights!\n"); status = 0; // Reset status } else { if (s->apply_weight < 0) { // Use the data to decide int jj; if (ii==0) { s->dat_wts_col = colnum; } else if (colnum != s->dat_wts_col) { printf("Warning!: DAT_WTS column changes between files!\n"); } float *fvec = (float *)malloc(sizeof(float) * s->num_channels); fits_read_col(s->fitsfiles[ii], TFLOAT, s->dat_wts_col, 1L, 1L, s->num_channels, 0, fvec, &anynull, &status); for (jj = 0 ; jj < s->num_channels ; jj++) { // If the weights are not 1, apply them if (fvec[jj] != 1.0) { s->apply_weight = 1; break; } } free(fvec); } if (s->apply_weight < 0) s->apply_weight = 0; // not needed } // Data offsets fits_get_colnum(s->fitsfiles[ii], 0, "DAT_OFFS", &colnum, &status); if (status==COL_NOT_FOUND) { printf("Warning!: Can't find the channel offsets!\n"); status = 0; // Reset status } else { if (s->apply_offset < 0) { // Use the data to decide int jj; if (ii==0) { s->dat_offs_col = colnum; } else if (colnum != s->dat_offs_col) { printf("Warning!: DAT_OFFS column changes between files!\n"); } float *fvec = (float *)malloc(sizeof(float) * s->num_channels * s->num_polns); fits_read_col(s->fitsfiles[ii], TFLOAT, s->dat_offs_col, 1L, 1L, s->num_channels * s->num_polns, 0, fvec, &anynull, &status); for (jj = 0 ; jj < s->num_channels * s->num_polns ; jj++) { // If the offsets are not 0, apply them if (fvec[jj] != 0.0) { s->apply_offset = 1; break; } } free(fvec); } if (s->apply_offset < 0) s->apply_offset = 0; // not needed } // Data scalings fits_get_colnum(s->fitsfiles[ii], 0, "DAT_SCL", &colnum, &status); if (status==COL_NOT_FOUND) { printf("Warning!: Can't find the channel scalings!\n"); status = 0; // Reset status } else { if (s->apply_scale < 0) { // Use the data to decide int jj; if (ii==0) { s->dat_scl_col = colnum; } else if (colnum != s->dat_scl_col) { printf("Warning!: DAT_SCL column changes between files!\n"); } float *fvec = (float *)malloc(sizeof(float) * s->num_channels * s->num_polns); fits_read_col(s->fitsfiles[ii], TFLOAT, colnum, 1L, 1L, s->num_channels * s->num_polns, 0, fvec, &anynull, &status); for (jj = 0 ; jj < s->num_channels * s->num_polns ; jj++) { // If the scales are not 1, apply them if (fvec[jj] != 1.0) { s->apply_scale = 1; break; } } free(fvec); } if (s->apply_scale < 0) s->apply_scale = 0; // not needed } } // Compute the samples per file and the amount of padding // that the _previous_ file has s->num_pad[ii] = 0; s->num_spec[ii] = s->spectra_per_subint * s->num_subint[ii]; if (ii > 0) { if (s->start_spec[ii] > s->N) { // Need padding s->num_pad[ii-1] = s->start_spec[ii] - s->N; s->N += s->num_pad[ii-1]; } } s->N += s->num_spec[ii]; } // Convert the position strings into degrees { int d, h, m; double sec; ra_dec_from_string(s->ra_str, &h, &m, &sec); s->ra2000 = hms2rad(h, m, sec) * RADTODEG; ra_dec_from_string(s->dec_str, &d, &m, &sec); s->dec2000 = dms2rad(d, m, sec) * RADTODEG; } // Are the polarizations summed? if ((strncmp("AA+BB", s->poln_order, 5)==0) || (strncmp("INTEN", s->poln_order, 5)==0)) s->summed_polns = 1; else s->summed_polns = 0; // Calculate some others s->T = s->N * s->dt; s->orig_df /= (double) s->orig_num_chan; s->samples_per_spectra = s->num_polns * s->num_channels; // Note: the following is the number of bytes that will be in // the returned array from CFITSIO. // CFITSIO turns bits into bytes when FITS_typecode=1 // and we turn 2-bits or 4-bits into bytes if bits_per_sample < 8 if (s->bits_per_sample < 8) s->bytes_per_spectra = s->samples_per_spectra; else s->bytes_per_spectra = (s->bits_per_sample * s->samples_per_spectra) / 8; s->samples_per_subint = s->samples_per_spectra * s->spectra_per_subint; s->bytes_per_subint = s->bytes_per_spectra * s->spectra_per_subint; // Flip the band? if (s->hi_freq < s->lo_freq) { float ftmp = s->hi_freq; s->hi_freq = s->lo_freq; s->lo_freq = ftmp; s->df *= -1.0; s->apply_flipband = 1; } // Compute the bandwidth s->BW = s->num_channels * s->df; // Flip the bytes for Parkes FB_1BIT data if (s->bits_per_sample==1 && strcmp(s->telescope, "Parkes")==0 && strcmp(s->backend, "FB_1BIT")==0) { printf("Flipping bit ordering since Parkes FB_1BIT data.\n"); s->flip_bytes = 1; } else { s->flip_bytes = 0; } // Allocate the buffers cdatabuffer = gen_bvect(s->bytes_per_subint); // Following is twice as big because we use it as a ringbuffer too fdatabuffer = gen_fvect(2 * s->spectra_per_subint * s->num_channels); s->padvals = gen_fvect(s->num_channels); for (ii = 0 ; ii < s->num_channels ; ii++) s->padvals[ii] = 0.0; offsets = gen_fvect(s->num_channels * s->num_polns); scales = gen_fvect(s->num_channels * s->num_polns); weights = gen_fvect(s->num_channels); // Initialize these if we won't be reading them from the file if (s->apply_offset==0) for (ii = 0 ; ii < s->num_channels * s->num_polns ; ii++) offsets[ii] = 0.0; if (s->apply_scale==0) for (ii = 0 ; ii < s->num_channels * s->num_polns ; ii++) scales[ii] = 1.0; if (s->apply_weight==0) for (ii = 0 ; ii < s->num_channels ; ii++) weights[ii] = 1.0; }
int main(int argc, char *argv[]) { int ii, jj, numbirds; double lofreq, hifreq; char *rootfilenm; birdie *newbird; GSList *zapped = NULL; infodata idata; Cmdline *cmd; /* Call usage() if we have no command line arguments */ if (argc == 1) { Program = argv[0]; printf("\n"); usage(); exit(1); } /* Parse the command line using the excellent program Clig */ cmd = parseCmdline(argc, argv); #ifdef DEBUG showOptionValues(); #endif printf("\n\n"); printf(" Interactive/Automatic Birdie Zapping Program\n"); printf(" by Scott M. Ransom\n"); printf(" January, 2001\n\n"); if (!cmd->zapP && !cmd->inzapfileP && !cmd->outzapfileP) { printf("You must specify '-in' and '-out' if you are not\n"); printf("automatically zapping a file (with '-zap').\n\n"); exit(0); } { int hassuffix = 0; char *suffix; hassuffix = split_root_suffix(cmd->argv[0], &rootfilenm, &suffix); if (hassuffix) { if (strcmp(suffix, "fft") != 0) { printf("\nInput file ('%s') must be a FFT file ('.fft')!\n\n", cmd->argv[0]); free(suffix); exit(0); } free(suffix); } else { printf("\nInput file ('%s') must be a FFT file ('.fft')!\n\n", cmd->argv[0]); exit(0); } } /* Read the info file */ readinf(&idata, rootfilenm); if (idata.object) { printf("Examining %s data from '%s'.\n\n", remove_whitespace(idata.object), cmd->argv[0]); } else { printf("Examining data from '%s'.\n\n", cmd->argv[0]); } T = idata.dt * idata.N; dr = 1.0 / NUMBETWEEN; if (cmd->zapP) { /* Automatic */ double *bird_lobins, *bird_hibins, hibin; if (!cmd->zapfileP) { printf("You must specify a 'zapfile' containing freqs\n"); printf("and widths if you want to write to the FFT file.\n\n"); free(rootfilenm); exit(0); } hibin = idata.N / 2; /* Read the Standard bird list */ numbirds = get_birdies(cmd->zapfile, T, cmd->baryv, &bird_lobins, &bird_hibins); /* Zap the birdies */ fftfile = chkfopen(cmd->argv[0], "rb+"); for (ii = 0; ii < numbirds; ii++) { if (bird_lobins[ii] >= hibin) break; if (bird_hibins[ii] >= hibin) bird_hibins[ii] = hibin - 1; zapbirds(bird_lobins[ii], bird_hibins[ii], fftfile, NULL); } vect_free(bird_lobins); vect_free(bird_hibins); } else { /* Interactive */ int *bird_numharms; double *bird_basebins; /* Read the Standard bird list */ numbirds = get_std_birds(cmd->inzapfile, T, cmd->baryv, &bird_basebins, &bird_numharms); /* Create our correlation kernel */ { int numkern; fcomplex *resp; khw = r_resp_halfwidth(LOWACC); numkern = 2 * NUMBETWEEN * khw; resp = gen_r_response(0.0, NUMBETWEEN, numkern); kernel = gen_cvect(FFTLEN); place_complex_kernel(resp, numkern, kernel, FFTLEN); COMPLEXFFT(kernel, FFTLEN, -1); vect_free(resp); } /* Loop over the birdies */ fftfile = chkfopen(cmd->argv[0], "rb"); cpgstart_x("landscape"); cpgask(0); for (ii = 0; ii < numbirds; ii++) { for (jj = 0; jj < bird_numharms[ii]; jj++) { process_bird(bird_basebins[ii], jj + 1, &lofreq, &hifreq); if (lofreq && hifreq) { newbird = birdie_create(lofreq, hifreq, cmd->baryv); zapped = g_slist_insert_sorted(zapped, newbird, birdie_compare); } } } cpgclos(); /* Output the birdies */ { FILE *outfile; outfile = chkfopen(cmd->outzapfile, "w"); fprintf(outfile, "#\n"); fprintf(outfile, "# Topocentric birdies found using 'zapbirds' for '%s'\n", cmd->argv[0]); fprintf(outfile, "#\n"); fprintf(outfile, "# Frequency (Hz) Width (Hz)\n"); fprintf(outfile, "#\n"); g_slist_foreach(zapped, birdie_print, outfile); fclose(outfile); } printf("\nOutput birdie file is '%s'.\n\n", cmd->outzapfile); /* Free the memory */ g_slist_foreach(zapped, birdie_free, NULL); g_slist_free(zapped); vect_free(kernel); vect_free(bird_numharms); vect_free(bird_basebins); } fclose(fftfile); free(rootfilenm); printf("Done\n\n"); return 0; }
int main(int argc, char *argv[]) { float maxpow = 0.0, inx = 0.0, iny = 0.0; double centerr, offsetf; int zoomlevel, maxzoom, minzoom, xid, psid; char *rootfilenm, inchar; fftpart *lofp; fftview *fv; if (argc == 1) { printf("\nusage: explorefft fftfilename\n\n"); exit(0); } printf("\n\n"); printf(" Interactive FFT Explorer\n"); printf(" by Scott M. Ransom\n"); printf(" October, 2001\n"); print_help(); { int hassuffix = 0; char *suffix; hassuffix = split_root_suffix(argv[1], &rootfilenm, &suffix); if (hassuffix) { if (strcmp(suffix, "fft") != 0) { printf("\nInput file ('%s') must be a FFT file ('.fft')!\n\n", argv[1]); free(suffix); exit(0); } free(suffix); } else { printf("\nInput file ('%s') must be a FFT file ('.fft')!\n\n", argv[1]); exit(0); } } /* Read the info file */ readinf(&idata, rootfilenm); if (strlen(remove_whitespace(idata.object)) > 0) { printf("Examining %s data from '%s'.\n\n", remove_whitespace(idata.object), argv[1]); } else { printf("Examining data from '%s'.\n\n", argv[1]); } N = idata.N; T = idata.dt * idata.N; #ifdef USEMMAP printf("Memory mapping the input FFT. This may take a while...\n"); mmap_file = open(argv[1], O_RDONLY); { int rt; struct stat buf; rt = fstat(mmap_file, &buf); if (rt == -1) { perror("\nError in fstat() in explorefft.c"); printf("\n"); exit(-1); } Nfft = buf.st_size / sizeof(fcomplex); } lofp = get_fftpart(0, Nfft); #else { int numamps; fftfile = chkfopen(argv[1], "rb"); Nfft = chkfilelen(fftfile, sizeof(fcomplex)); numamps = (Nfft > MAXBINS) ? (int) MAXBINS : (int) Nfft; lofp = get_fftpart(0, numamps); } #endif /* Plot the initial data */ { int initnumbins = INITIALNUMBINS; if (initnumbins > Nfft) { initnumbins = next2_to_n(Nfft) / 2; zoomlevel = LOGDISPLAYNUM - (int) (log(initnumbins) / log(2.0)); minzoom = zoomlevel; } else { zoomlevel = LOGDISPLAYNUM - LOGINITIALNUMBINS; minzoom = LOGDISPLAYNUM - LOGMAXBINS; } maxzoom = LOGDISPLAYNUM - LOGMINBINS; centerr = initnumbins / 2; } fv = get_fftview(centerr, zoomlevel, lofp); /* Prep the XWIN device for PGPLOT */ xid = cpgopen("/XWIN"); if (xid <= 0) { free(fv); #ifdef USEMMAP close(mmap_file); #else fclose(fftfile); #endif free_fftpart(lofp); exit(EXIT_FAILURE); } cpgscr(15, 0.4, 0.4, 0.4); cpgask(0); cpgpage(); offsetf = plot_fftview(fv, maxpow, 1.0, 0.0, 0); do { cpgcurs(&inx, &iny, &inchar); if (DEBUGOUT) printf("You pressed '%c'\n", inchar); switch (inchar) { case 'A': /* Zoom in */ case 'a': centerr = (inx + offsetf) * T; case 'I': case 'i': if (DEBUGOUT) printf(" Zooming in (zoomlevel = %d)...\n", zoomlevel); if (zoomlevel < maxzoom) { zoomlevel++; free(fv); fv = get_fftview(centerr, zoomlevel, lofp); cpgpage(); offsetf = plot_fftview(fv, maxpow, 1.0, 0.0, 0); } else printf(" Already at maximum zoom level (%d).\n", zoomlevel); break; case 'X': /* Zoom out */ case 'x': case 'O': case 'o': if (DEBUGOUT) printf(" Zooming out (zoomlevel = %d)...\n", zoomlevel); if (zoomlevel > minzoom) { zoomlevel--; free(fv); fv = get_fftview(centerr, zoomlevel, lofp); cpgpage(); offsetf = plot_fftview(fv, maxpow, 1.0, 0.0, 0); } else printf(" Already at minimum zoom level (%d).\n", zoomlevel); break; case '<': /* Shift left 1 full screen */ centerr -= fv->numbins + fv->numbins / 8; case ',': /* Shift left 1/8 screen */ if (DEBUGOUT) printf(" Shifting left...\n"); centerr -= fv->numbins / 8; { /* Should probably get the previous chunk from the fftfile... */ double lowestr; lowestr = 0.5 * fv->numbins; if (centerr < lowestr) centerr = lowestr; } free(fv); fv = get_fftview(centerr, zoomlevel, lofp); cpgpage(); offsetf = plot_fftview(fv, maxpow, 1.0, 0.0, 0); break; case '>': /* Shift right 1 full screen */ centerr += fv->numbins - fv->numbins / 8; case '.': /* Shift right 1/8 screen */ if (DEBUGOUT) printf(" Shifting right...\n"); centerr += fv->numbins / 8; { /* Should probably get the next chunk from the fftfile... */ double highestr; highestr = lofp->rlo + lofp->numamps - 0.5 * fv->numbins; if (centerr > highestr) centerr = highestr; } free(fv); fv = get_fftview(centerr, zoomlevel, lofp); cpgpage(); offsetf = plot_fftview(fv, maxpow, 1.0, 0.0, 0); break; case '+': /* Increase height of powers */ case '=': if (maxpow == 0.0) { printf(" Auto-scaling is off.\n"); maxpow = 1.1 * fv->maxpow; } maxpow = 3.0 / 4.0 * maxpow; cpgpage(); offsetf = plot_fftview(fv, maxpow, 1.0, 0.0, 0); break; case '-': /* Decrease height of powers */ case '_': if (maxpow == 0.0) { printf(" Auto-scaling is off.\n"); maxpow = 1.1 * fv->maxpow; } maxpow = 4.0 / 3.0 * maxpow; cpgpage(); offsetf = plot_fftview(fv, maxpow, 1.0, 0.0, 0); break; case 'S': /* Auto-scale */ case 's': if (maxpow == 0.0) break; else { printf(" Auto-scaling is on.\n"); maxpow = 0.0; cpgpage(); offsetf = plot_fftview(fv, maxpow, 1.0, 0.0, 0); break; } case 'G': /* Goto a frequency */ case 'g': { char freqstr[50]; double freq = -1.0; while (freq < 0.0) { printf(" Enter the frequency (Hz) to go to:\n"); fgets(freqstr, 50, stdin); freqstr[strlen(freqstr) - 1] = '\0'; freq = atof(freqstr); } offsetf = 0.0; centerr = freq * T; printf(" Moving to frequency %.15g.\n", freq); free(fv); fv = get_fftview(centerr, zoomlevel, lofp); cpgpage(); offsetf = plot_fftview(fv, maxpow, 1.0, centerr, 2); } break; case 'H': /* Show harmonics */ case 'h': { double retval; retval = harmonic_loop(xid, centerr, zoomlevel, lofp); if (retval > 0.0) { offsetf = 0.0; centerr = retval; free(fv); fv = get_fftview(centerr, zoomlevel, lofp); cpgpage(); offsetf = plot_fftview(fv, maxpow, 1.0, centerr, 2); } } break; case '?': /* Print help screen */ print_help(); break; case 'D': /* Show details about a selected point */ case 'd': { double newr; printf(" Searching for peak near freq = %.7g Hz...\n", (inx + offsetf)); newr = find_peak(inx + offsetf, fv, lofp); centerr = newr; free(fv); fv = get_fftview(centerr, zoomlevel, lofp); cpgpage(); offsetf = plot_fftview(fv, maxpow, 1.0, centerr, 2); } break; case 'L': /* Load a zaplist */ case 'l': { int ii, len; char filename[200]; double *lobins, *hibins; printf(" Enter the filename containing the zaplist to load:\n"); fgets(filename, 199, stdin); len = strlen(filename) - 1; filename[len] = '\0'; numzaplist = get_birdies(filename, T, 0.0, &lobins, &hibins); lenzaplist = numzaplist + 20; /* Allow some room to add more */ if (lenzaplist) free(zaplist); zaplist = (bird *) malloc(sizeof(bird) * lenzaplist); for (ii = 0; ii < numzaplist; ii++) { zaplist[ii].lobin = lobins[ii]; zaplist[ii].hibin = hibins[ii]; } vect_free(lobins); vect_free(hibins); printf("\n"); cpgpage(); offsetf = plot_fftview(fv, maxpow, 1.0, 0.0, 0); } break; case 'Z': /* Add a birdie to a zaplist */ case 'z': { int badchoice = 2; float lox, hix, loy, hiy; double rs[2]; char choice; if (numzaplist + 1 > lenzaplist) { lenzaplist += 10; zaplist = (bird *) realloc(zaplist, sizeof(bird) * lenzaplist); } cpgqwin(&lox, &hix, &loy, &hiy); printf(" Click the left mouse button on the first frequency limit.\n"); while (badchoice) { cpgcurs(&inx, &iny, &choice); if (choice == 'A' || choice == 'a') { rs[2 - badchoice] = ((double) inx + offsetf) * T; cpgsave(); cpgsci(7); cpgmove(inx, 0.0); cpgdraw(inx, hiy); cpgunsa(); badchoice--; if (badchoice == 1) printf (" Click the left mouse button on the second frequency limit.\n"); } else { printf(" Option not recognized.\n"); } }; if (rs[1] > rs[0]) { zaplist[numzaplist].lobin = rs[0]; zaplist[numzaplist].hibin = rs[1]; } else { zaplist[numzaplist].lobin = rs[1]; zaplist[numzaplist].hibin = rs[0]; } printf(" The new birdie has: f_avg = %.15g f_width = %.15g\n\n", 0.5 * (zaplist[numzaplist].hibin + zaplist[numzaplist].lobin) / T, (zaplist[numzaplist].hibin - zaplist[numzaplist].lobin) / T); numzaplist++; qsort(zaplist, numzaplist, sizeof(bird), compare_birds); cpgpage(); offsetf = plot_fftview(fv, maxpow, 1.0, 0.0, 0); } break; case 'P': /* Print the current plot */ case 'p': { int len; char filename[200]; printf(" Enter the filename to save the plot as:\n"); fgets(filename, 196, stdin); len = strlen(filename) - 1; filename[len + 0] = '/'; filename[len + 1] = 'P'; filename[len + 2] = 'S'; filename[len + 3] = '\0'; psid = cpgopen(filename); cpgslct(psid); cpgpap(10.25, 8.5 / 11.0); cpgiden(); cpgscr(15, 0.8, 0.8, 0.8); offsetf = plot_fftview(fv, maxpow, 1.0, 0.0, 0); cpgclos(); cpgslct(xid); cpgscr(15, 0.4, 0.4, 0.4); filename[len] = '\0'; printf(" Wrote the plot to the file '%s'.\n", filename); } break; case 'N': /* Changing power normalization */ case 'n': { float inx2 = 0.0, iny2 = 0.0; char choice; unsigned char badchoice = 1; printf(" Specify the type of power normalization:\n" " m,M : Median values determined locally\n" " d,D : DC frequency amplitude\n" " r,R : Raw powers (i.e. no normalization)\n" " u,U : User specified interval (the average powers)\n"); while (badchoice) { cpgcurs(&inx2, &iny2, &choice); switch (choice) { case 'M': case 'm': norm_const = 0.0; maxpow = 0.0; badchoice = 0; printf (" Using local median normalization. Autoscaling is on.\n"); break; case 'D': case 'd': norm_const = 1.0 / r0; maxpow = 0.0; badchoice = 0; printf (" Using DC frequency (%f) normalization. Autoscaling is on.\n", r0); break; case 'R': case 'r': norm_const = 1.0; maxpow = 0.0; badchoice = 0; printf (" Using raw powers (i.e. no normalization). Autoscaling is on.\n"); break; case 'U': case 'u': { char choice2; float xx = inx, yy = iny; int lor, hir, numr; double avg, var; printf (" Use the left mouse button to select a left and right boundary\n" " of a region to calculate the average power.\n"); do { cpgcurs(&xx, &yy, &choice2); } while (choice2 != 'A' && choice2 != 'a'); lor = (int) ((xx + offsetf) * T); cpgsci(7); cpgmove(xx, 0.0); cpgdraw(xx, 10.0 * fv->maxpow); do { cpgcurs(&xx, &yy, &choice2); } while (choice2 != 'A' && choice2 != 'a'); hir = (int) ((xx + offsetf) * T); cpgmove(xx, 0.0); cpgdraw(xx, 10.0 * fv->maxpow); cpgsci(1); if (lor > hir) { int tempr; tempr = hir; hir = lor; lor = tempr; } numr = hir - lor + 1; avg_var(lofp->rawpowers + lor - lofp->rlo, numr, &avg, &var); printf(" Selection has: average = %.5g\n" " std dev = %.5g\n", avg, sqrt(var)); norm_const = 1.0 / avg; maxpow = 0.0; badchoice = 0; printf (" Using %.5g as the normalization constant. Autoscaling is on.\n", avg); break; } default: printf(" Unrecognized choice '%c'.\n", choice); break; } } free(fv); fv = get_fftview(centerr, zoomlevel, lofp); cpgpage(); offsetf = plot_fftview(fv, maxpow, 1.0, 0.0, 0); } break; case 'Q': /* Quit */ case 'q': printf(" Quitting...\n"); free(fv); cpgclos(); break; default: printf(" Unrecognized option '%c'.\n", inchar); break; } } while (inchar != 'Q' && inchar != 'q'); free_fftpart(lofp); #ifdef USEMMAP close(mmap_file); #else fclose(fftfile); #endif if (lenzaplist) free(zaplist); printf("Done\n\n"); return 0; }
static int parse_section(FILE *fp, char *path, const char **error_string, int depth, parser_cb_f parser_cb, icmap_map_t config_map, void *user_data) { char line[512]; int i; char *loc; int ignore_line; char new_keyname[ICMAP_KEYNAME_MAXLEN]; if (strcmp(path, "") == 0) { parser_cb("", NULL, NULL, PARSER_CB_START, error_string, config_map, user_data); } while (fgets (line, sizeof (line), fp)) { if (strlen(line) > 0) { if (line[strlen(line) - 1] == '\n') line[strlen(line) - 1] = '\0'; if (strlen (line) > 0 && line[strlen(line) - 1] == '\r') line[strlen(line) - 1] = '\0'; } /* * Clear out white space and tabs */ for (i = strlen (line) - 1; i > -1; i--) { if (line[i] == '\t' || line[i] == ' ') { line[i] = '\0'; } else { break; } } ignore_line = 1; for (i = 0; i < strlen (line); i++) { if (line[i] != '\t' && line[i] != ' ') { if (line[i] != '#') ignore_line = 0; break; } } /* * Clear out comments and empty lines */ if (ignore_line) { continue; } /* New section ? */ if ((loc = strchr_rs (line, '{'))) { char *section = remove_whitespace(line, 1); loc--; *loc = '\0'; if (strlen(path) + strlen(section) + 1 >= ICMAP_KEYNAME_MAXLEN) { *error_string = "parser error: Start of section makes total cmap path too long"; return -1; } strcpy(new_keyname, path); if (strcmp(path, "") != 0) { strcat(new_keyname, "."); } strcat(new_keyname, section); if (!parser_cb(new_keyname, NULL, NULL, PARSER_CB_SECTION_START, error_string, config_map, user_data)) { return -1; } if (parse_section(fp, new_keyname, error_string, depth + 1, parser_cb, config_map, user_data)) return -1; continue ; } /* New key/value */ if ((loc = strchr_rs (line, ':'))) { char *key; char *value; *(loc-1) = '\0'; key = remove_whitespace(line, 1); value = remove_whitespace(loc, 0); if (strlen(path) + strlen(key) + 1 >= ICMAP_KEYNAME_MAXLEN) { *error_string = "parser error: New key makes total cmap path too long"; return -1; } strcpy(new_keyname, path); if (strcmp(path, "") != 0) { strcat(new_keyname, "."); } strcat(new_keyname, key); if (!parser_cb(new_keyname, key, value, PARSER_CB_ITEM, error_string, config_map, user_data)) { return -1; } continue ; } if (strchr_rs (line, '}')) { if (depth == 0) { *error_string = "parser error: Unexpected closing brace"; return -1; } if (!parser_cb(path, NULL, NULL, PARSER_CB_SECTION_END, error_string, config_map, user_data)) { return -1; } return 0; } } if (strcmp(path, "") != 0) { *error_string = "parser error: Missing closing brace"; return -1; } if (strcmp(path, "") == 0) { parser_cb("", NULL, NULL, PARSER_CB_END, error_string, config_map, user_data); } return 0; }
int main(int argc, char const *argv[]) { if (argc != 3) { fprintf(stderr, "%s\n", "usage: ./preprocessor <fdl file> <fdlp file>"); exit(1); } char *fileName = (char *) argv[1]; char *outputFileName = (char *) argv[2]; // check input file extension if (strcmp("fdl", getFileExtension(fileName)) != 0) { die("file extension must be fdl"); } // check output file extension if (strcmp("fdlp", getFileExtension(outputFileName)) != 0) { die("output file extension must be fdlp"); } FILE *input; if ((input = fopen(fileName, "r")) == NULL) { die("fpen() failed"); } // char *outputFileName = "output.fdlp"; FILE *output; if ((output = fopen(outputFileName, "w")) == NULL) { die("fpen() failed"); } char buffer[MAX_BUFFER]; while (fgets(buffer, sizeof(buffer), input) != NULL) { size_t len = strlen(buffer) - 1; if (buffer[len] == '\n') { buffer[len] = '\0'; } if (strstr(buffer, "*/") != NULL) { fprintf(output, "%s\n", buffer); } else if (strstr(buffer, "/*") != NULL) { fprintf(output, "%s\n", buffer); } else if (strstr(buffer, "def ") != NULL) { fprintf(output, "%s {\n", buffer); } else if (strstr(buffer, "int ") != NULL) { fprintf(output, "%s;\n", buffer); } else if (strstr(buffer, "path ") != NULL) { fprintf(output, "%s;\n", buffer); } else if (strstr(buffer, "dict ") != NULL) { fprintf(output, "%s;\n", buffer); } else if (strstr(buffer, "list ") != NULL) { fprintf(output, "%s;\n", buffer); } else if (strstr(buffer, "string ") != NULL) { fprintf(output, "%s;\n", buffer); } else if (strstr(buffer, "bool ") != NULL) { fprintf(output, "%s;\n", buffer); } else if (strstr(buffer, "for ") != NULL) { fprintf(output, "%s {\n", buffer); } else if ((strstr(buffer, "if (") != NULL || strstr(buffer, "if(") != NULL) && (strstr(buffer, "then") != NULL)) { fprintf(output, "%s {\n", buffer); } else if ((strstr(buffer, "if (") != NULL || strstr(buffer, "if(") != NULL) && (strstr(buffer, "then") == NULL)) { fprintf(output, "%s\n", buffer); } else if (strstr(buffer, "then") != NULL) { fprintf(output, "%s {\n", buffer); } else if (strstr(buffer, "else") != NULL) { int i; int counter = 0; for (i = 0; i < strlen(buffer); ++i) { if (buffer[i] == ' ') { fprintf(output, "%c", buffer[i]); counter++; } } fprintf(output, "} %s {\n", buffer + counter); } else if (strstr(buffer, "while (") != NULL || strstr(buffer, "while(") != NULL) { fprintf(output, "%s {\n", buffer); } else if (strstr(buffer, "end") != NULL) { int i; for (i = 0; i < strlen(buffer); i++){ if (buffer[i] == 'e') { buffer[i] = '}'; } else if (buffer[i] == 'n') { buffer[i] = '\n'; } else if (buffer[i] == 'd') { buffer[i] = '\0'; } else { } } fprintf(output, "%s", buffer); } else { if (is_empty(buffer)) { remove_whitespace(buffer); fprintf(output, "\n"); } else { fprintf(output, "%s;\n", buffer); } } } fclose(input); fclose(output); return 0; }