This is rd_func_fid.c in view mode; [Download] [Up]
#include <stdio.h> #include <carl/carl.h> #include <carl/defaults.h> /* * read_func_fid - read floatsam function file open on FILE *fd * takes: * fd - pointer to a FILE * set_seq_type - modify default file sequence type * side effects: * reads header if any for data sequence and name * returns: * pointer to function * notes: * If no header, it assumes data to be monotonic in x, unless * set_seq_type != NULL, in which case, its value * determines default type. * If the sequence type is monotonic in x, it returns * p->fxval = NULL. */ FUNCTION *read_func_fid(fp, set_seq_type) FILE *fp; char *set_seq_type; { int i = 0, len; float sample, *f, *x, *y; FUNCTION *p; char *type = NULL, *name = NULL, *def_type = H_MONO_IN_X; PROP *q, *u; /* set default data sequence type */ if (set_seq_type != NULL) def_type = set_seq_type; /* find out what sequence really is */ if ((q = getheader(fp)) != NULL) { type = getprop(fp, H_SEQUENCE); name = getprop(fp, H_FILENAME); } /* none stipulated, use default */ if (type == NULL) type = def_type; /* soak up data on file */ while (fgetfloat(&sample, fp) > 0) { if (i == 0) { f = (float *) malloc(sizeof(float)*BUFSIZ); if (f == NULL) { perror("malloc"); return(NULL); } len = BUFSIZ; } if (i < len-1) f[i++] = sample; else { len += BUFSIZ; f = (float *) realloc(f, len*sizeof(float)); if (f == NULL) { perror("malloc"); return(NULL); } f[i++] = sample; } } /* trim excess */ f = (float *) realloc(f, i*sizeof(float)); if (f == NULL) { perror("realloc"); return(NULL); } /* build FUNCTION structure and fields */ p = (FUNCTION *) calloc(sizeof(FUNCTION), 1); if (p == NULL) { perror("calloc"); return(NULL); } if (!strcmp(type, H_MONO_IN_X)) { /* funciton is monotonic in x */ p->fyval = f; p->flen = i; } else if (!strcmp(type, H_XY_PAIRS)) { /* function is [x,y] pairs */ register int j, k, l, toggle = 1; if ((i % 2) != 0) { fprintf(stderr, "read_func_fid: data not modulo 2\n"); return(NULL); } x = (float *) malloc(sizeof(float) * i/2); y = (float *) malloc(sizeof(float) * i/2); for (j = k = l = 0; j < i; j++, toggle = toggle ? 0 : 1) { if (toggle) { x[k++] = f[j]; } else { y[l++] = f[j]; } } p->fxval = x; p->fyval = y; p->flen = i/2; free(f); } p->ftype = (char *) malloc(strlen(type)+1); if (p->ftype == NULL) { perror("malloc"); return(NULL); } strcpy(p->ftype, type); if (name != NULL) { p->fname = (char *) malloc(strlen(name)+1); if (p->fname == NULL) { perror("malloc"); return(NULL); } strcpy(p->fname, name); } return(p); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.