1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
/*
* rd_cazm - analog waveform file reader for the transient-simulation
* format written by the CAzM simulator.
*
* Steve Tell, August 11, 1998.
*
* $Log: rd_cazm.c,v $
* Revision 1.2 1998/09/17 18:24:14 tell
* add backpointer from DataSet to DataFile
*
* Revision 1.1 1998/08/31 20:58:41 tell
* Initial revision
*
*/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <glib.h>
#include "reader.h"
/*
* Read a whole file into memory.
* Returns pointer to DataFile on success,
* NULL on failure
* TODO: figure out a way to return more information on failure.
*/
DataFile *
cz_read_file(char *name, FILE *fp)
{
DataFile *df;
char *line;
char *signam;
int lineno = 0;
int linesize = 1024;
int dvsize = 128;
int nrows;
double val;
int i;
line = g_new(char, linesize);
while(1) {
if((fread_line(fp, &line, &linesize) == EOF) || lineno > 10) {
g_free(line);
return NULL;
}
lineno++;
/* "section header" TODO: handle the rest of them */
if(strncmp(line, "TRANSIENT", 8) == 0)
break;
}
/* line after header contains signal names
* first one is assumed to be the independent variable.
*/
if(fread_line(fp, &line, &linesize) == EOF) {
g_free(line);
return NULL;
}
df = g_new0(DataFile, 1);
df->filename = g_strdup(name);
signam = strtok(line, " \t\n");
if(!signam)
goto bailout;
df->iv = g_new0(IVar, 1);
an_init_dataset((DataSet *)df->iv, df, signam, TIME);
df->dv = g_new0(DVar*, dvsize);
df->ndv = 0;
while((signam = strtok(NULL, " \t\n")) != NULL) {
DVar *dv;
if(df->ndv >= dvsize) {
dvsize *= 2;
df->dv = g_realloc(df->dv, dvsize * sizeof(DVar*));
}
dv = g_new0(DVar, 1);
dv->iv = df->iv;
df->dv[df->ndv++] = dv;
an_init_dataset((DataSet *)&dv->d, df, signam, VOLTAGE);
}
nrows = 0;
while(fscanf(fp, "%lg", &val) != EOF) {
if(ds_blockno(nrows) >= df->iv->d.bpused) {
an_expand_dset((DataSet *)df->iv);
for(i = 0; i < df->ndv; i++)
an_expand_dset((DataSet *)df->dv[i]);
}
an_set_point((DataSet *)&df->iv->d, nrows, val);
df->iv->d.nvalues++;
for(i = 0; i < df->ndv; i++) {
val = 0;
fscanf(fp, "%lg", &val);
an_set_point((DataSet *)&df->dv[i]->d, nrows, val);
df->dv[i]->d.nvalues++;
}
nrows++;
}
g_free(line);
return df;
bailout: /* TODO: free everything else that might have been allocated */
if(line)
g_free(line);
if(df) {
g_free(df->filename);
g_free(df);
}
return NULL;
}
|