Browse Source

fourier.c: remove even more memory leaks

rlar 14 years ago
parent
commit
374b716fdd
  1. 58
      src/frontend/fourier.c

58
src/frontend/fourier.c

@ -40,14 +40,15 @@ fourier(wordlist *wl, struct plot *current_plot)
{
struct dvec *time, *vec;
struct pnode *pn, *names;
double *ff, fundfreq, *dp, *stuff;
double *ff, fundfreq, *data = NULL;
int nfreqs, fourgridsize, polydegree;
double *freq, *mag, *phase, *nmag, *nphase; /* Outputs from CKTfour */
double thd, *timescale, *grid, d;
double thd, *timescale = NULL;
char *s;
int i, err, fw;
char xbuf[20];
int shift;
int rv = 1;
if (!current_plot)
return 1;
@ -103,45 +104,44 @@ fourier(wordlist *wl, struct plot *current_plot)
}
if (polydegree) {
double *dp, d;
/* Build the grid... */
grid = TMALLOC(double, fourgridsize);
stuff = TMALLOC(double, fourgridsize);
timescale = TMALLOC(double, fourgridsize);
data = TMALLOC(double, fourgridsize);
dp = ft_minmax(time, TRUE);
/* Now get the last fund freq... */
d = 1 / fundfreq; /* The wavelength... */
if (dp[1] - dp[0] < d) {
fprintf(cp_err, "Error: wavelength longer than time span\n");
return 1;
goto done;
} else if (dp[1] - dp[0] > d) {
dp[0] = dp[1] - d;
}
d = (dp[1] - dp[0]) / fourgridsize;
for (i = 0; i < fourgridsize; i++)
grid[i] = dp[0] + i * d;
timescale[i] = dp[0] + i * d;
/* Now interpolate the stuff... */
if (!ft_interpolate(vec->v_realdata, stuff,
/* Now interpolate the data... */
if (!ft_interpolate(vec->v_realdata, data,
time->v_realdata, vec->v_length,
grid, fourgridsize,
timescale, fourgridsize,
polydegree)) {
fprintf(cp_err, "Error: can't interpolate\n");
goto ret_on_err;
goto done;
}
timescale = grid;
} else {
fourgridsize = vec->v_length;
stuff = vec->v_realdata;
data = vec->v_realdata;
timescale = time->v_realdata;
}
err = CKTfour(fourgridsize, nfreqs, &thd, timescale,
stuff, fundfreq, freq, mag, phase, nmag,
data, fundfreq, freq, mag, phase, nmag,
nphase);
if (err != OK) {
ft_sperror(err, "fourier");
goto ret_on_err;
goto done;
}
fprintf(cp_out, "Fourier analysis for %s:\n", vec->v_name);
@ -186,22 +186,19 @@ fourier(wordlist *wl, struct plot *current_plot)
/* generate name for new vector, using vec->name */
/* generate vector of size 3 * nfreqs in current plot */
/* store data in vector freq, mag, phase */
if (polydegree) {
tfree(timescale);
tfree(data);
}
timescale = NULL;
data = NULL;
}
}
free_pnode(names);
tfree(freq);
tfree(mag);
tfree(phase);
tfree(nmag);
tfree(nphase);
if (polydegree) {
tfree(grid);
tfree(stuff);
}
return 0;
rv = 0;
ret_on_err:
done:
free_pnode(names);
tfree(freq);
tfree(mag);
@ -209,10 +206,11 @@ ret_on_err:
tfree(nmag);
tfree(nphase);
if (polydegree) {
tfree(grid);
tfree(stuff);
tfree(timescale);
tfree(data);
}
return 1;
return rv;
}

Loading…
Cancel
Save