This is readData.c in view mode; [Download] [Up]
#include <stdio.h>
#define equal(s,w) (strcmp(s,w) == 0)
#undef min
#define min(a,b) ((a) < (b) ? (a) : (b))
#undef max
#define max(a,b) ((a) > (b) ? (a) : (b))
#define ctrl(c) ((c) - 'A' + 1) /* control character mapping */
#define plural(n) ((n) == 1 ? "" : "s")
#define thest(n) ((n) == 1 ? "-st" : ((n) == 2 ? "-nd" : ((n) == 3 ? "-rd" \
: "-th")))
#define lastch(s) s[strlen(s)-1]
#define no_ret(s) { register int xyz; /* varname is for lint */ \
for (xyz=strlen(s)-1; xyz >= 0 && \
(s[xyz] == '\r' || s[xyz] == '\n'); ) \
s[xyz--] = '\0'; \
}
#define first_word(s,w) (strncmp(s,w, strlen(w)) == 0)
#define whitespace(c) ((c) == ' ' || (c) == '\t')
#define ok_char(c) (isalnum(c) || (c) == '-' || (c) == '_' || (c) == '.')
#define quote(c) ((c) == '"' || (c) == '\'')
#define onoff(n) (n == 0 ? "OFF" : "ON")
/* find tab stops preceding or following a given column position 'a', where
* the column position starts counting from 1, NOT 0!
* The external integer "tabspacing" must be declared to use this. */
#define prev_tab(a,tb) (((((a-1)/(tb)))*(tb))+1)
#define next_tab(a,tb) (((((a-1)/(tb))+1)*(tb))+1)
#define MAXALLOC 100
#define MAXNUM 10000
#define MAXLINE 10000
#define NO -1;
#define YES !NO;
typedef enum {
NEITHER = 0,
LINES,
POINTS,
BOTH
} pts_or_lines;
typedef struct {
float **all;
float **displayed;
int npts;
pts_or_lines type;
float radius;
float shade;
} datapoints;
main()
{
FILE *infile;
char line[128], thisline[128], *aPtr, *word();
char cmd, fileName[128];
int nwords,i, j, count, tlines, ncols, nlines, max_path, expected_cols = 3;
float x[3], y, *scratch, *fpt, *path, radius, shade, argv[4];
float *xx[3];
datapoints **toshow;
datapoints *thesedata;
datapoints **all_data = toshow = (datapoints **)calloc(MAXALLOC, sizeof(datapoints *));
void float_copy();
long pts_read = 0;
long num_allocs = 0;
tlines = 0;
max_path = 100;
path = (float *) calloc(2*max_path, sizeof(float));
scratch = (float *) calloc(MAXNUM, sizeof(float));
/* release existing data */
while ((thesedata = *all_data) != (datapoints *) NULL) {
free(thesedata->displayed);
count = 0;
while(thesedata->all[count] != (float *) NULL) {
free(thesedata->all[count]);
count++;
}
free(thesedata->all);
free(thesedata);
*all_data++ = (datapoints *) NULL;
}
all_data = toshow; /* read new data */
printf("Enter File Name: ");
gets(fileName);
infile = fopen(fileName,"r");
pts_read = 0;
while(fgets(line,128,infile) != NULL) {
if(lastch(line) == '\n') lastch(line) = '\0';
if(isalpha(line[0])) {
if (pts_read != 0) {
/* create the datapoints structure and store the values */
thesedata = *all_data++ = (datapoints *) malloc(sizeof(datapoints));
if (++num_allocs > MAXALLOC) {
sprintf(thisline, "Number Distinct Groups > MAXALLOC");
/* [self showError:thisline]; */
return NO;
}
switch(cmd) {
case 'n':
thesedata->type = NEITHER;
break;
case 'l':
thesedata->type = LINES;
break;
case 'p':
thesedata->type = POINTS;
thesedata->radius = radius;
thesedata->shade = shade;
/*
* Store radius, shade, label here in thesedata->radius, etc.
*/
break;
case 'b':
thesedata->type = BOTH;
break;
}
thesedata->all = (float **)calloc((size_t) expected_cols + 1,
(size_t) sizeof(float *));
for(ncols = 0; ncols < expected_cols; ncols++) {
thesedata->all[ncols] = (float *)calloc((size_t) nlines, sizeof(float));
float_copy(nlines, thesedata->all[ncols], 1, scratch + ncols,
expected_cols);
}
thesedata->all[expected_cols] = (float *)NULL;
/* make sure path is large enough */
if (2*nlines >= max_path)
realloc(path, (2*nlines)*sizeof(float));
thesedata->npts = nlines;
memmove(thesedata->displayed = (float **) calloc(3, sizeof(float *)),
thesedata->all, 3 * sizeof(float *));
}
cmd = tolower(line[0]);
nwords = max(words(line),3);
for(i=1;i<3;i++) argv[i] = 0;
/* printf("Type is %c",cmd,nwords); */
for(i=1;i<=nwords;i++) {
if((aPtr = word(i,line)) != NULL) {
sscanf(aPtr,"%f",&argv[i]);
/* printf(" ,arg[%d] = %f",i,argv[i]); */
}
}
printf("\n");
switch (cmd) {
case 'n':
break;
case 'l':
break;
case 'p':
radius = argv[1];
shade = argv[2];
break;
case 'b':
default:
break;
}
fpt = scratch;
pts_read = 0;
nlines = 0;
continue;
}
sscanf(line,"%f %f %f",&x[0], &x[1], &x[2]);
printf(" %f %f %f\n",x[0],x[1],x[2]);
nlines++;
for(i=0;i<3;i++) {
*fpt++ = x[i];
if( ++pts_read == MAXNUM) {
sprintf(thisline, "Storage space for points exceeded.");
return NO;
}
}
}
if (pts_read != 0) {
/* create the datapoints structure and store the values */
thesedata = *all_data++ = (datapoints *) malloc(sizeof(datapoints));
if (++num_allocs > MAXALLOC) {
sprintf(thisline, "Number Distinct Groups > MAXALLOC");
/* [self showError:thisline]; */
return NO;
}
switch(cmd) {
case 'n':
thesedata->type = NEITHER;
break;
case 'l':
thesedata->type = LINES;
break;
case 'p':
thesedata->type = POINTS;
thesedata->radius = radius;
thesedata->shade = shade;
/*
* Store radius, shade, label here in thesedata->radius, etc.
*/
break;
case 'b':
thesedata->type = BOTH;
break;
}
thesedata->all = (float **)calloc((size_t) expected_cols + 1,
(size_t) sizeof(float *));
for(ncols = 0; ncols < expected_cols; ncols++) {
thesedata->all[ncols] = (float *)calloc((size_t) nlines, sizeof(float));
float_copy(nlines, thesedata->all[ncols], 1, scratch + ncols,
expected_cols);
}
thesedata->all[expected_cols] = (float *)NULL;
/* make sure path is large enough */
if (2*nlines >= max_path)
realloc(path, (2*nlines)*sizeof(float));
thesedata->npts = nlines;
memmove(thesedata->displayed = (float **) calloc(3, sizeof(float *)),
thesedata->all, 3 * sizeof(float *));
}
free(scratch);
/* [self display]; */
/* Debuggin output
*/
{ FILE *debug;
int j;
float *xx[3];
printf("Opening debug file");
if((debug = fopen("debug","w+")) == NULL) {
printf("Can't open debug file");
return NO;
}
all_data = toshow;
while ((thesedata = *all_data++) != (datapoints *) NULL) {
fprintf(debug,"Type is : %d ",thesedata->type);
if (thesedata->type == POINTS)
fprintf(debug," with radius = %f, and shade = %f",
thesedata->radius, thesedata->shade);
fprintf(debug,"\n");
for(j=0;j<expected_cols;j++)
xx[j] = thesedata->displayed[j];
for(i=0;i<thesedata->npts;i++) {
fprintf(debug,"%d ) : ",i);
for(j=0;j<expected_cols;j++)
fprintf(debug," %10.6f",*xx[j]++);
fprintf(debug,"\n");
}
}
fclose(debug);
}
/**/
return YES;
}
int words(str)
char *str;
{
int count=0;
while(*str != '\0') {
while(ok_char(*str)) str++; /* skip characters */
while(whitespace(*str)) str++; /* skip whitespace */
if(ok_char(*str)) count++;
}
return count;
}
char *word(i,str)
int i;
char *str;
{
int count=0;
if(i > words(str)) return NULL;
while(*str != '\0') {
while(ok_char(*str)) str++; /* skip characters */
while(whitespace(*str)) str++; /* skip whitespace */
if(ok_char(*str))
if(++count == i) return str;
}
return NULL;
}
void float_copy (register int n, register float * to, register int
to_inc, register float * from, register int from_inc)
{
if (n > 0)
while (n--) {
*to = *from;
to += to_inc;
from += from_inc;
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.