/* Because loadf() and storef() are static, they are invisible outside this file. If you try calling loadf() from main(), the program won't compile. You can use the name loadf for other purposes in other files with no risk of conflict. */ #include #include #include "da.h" void da_free(da *d) { if (d->x) { free(d->x); d->x = 0; d->xspace = 0; d->xlen = 0; } } int da_append(da *d,double extra) { double *y; int yspace; if (d->xlen == d->xspace) { yspace = d->xspace + (d->xspace >> 2) + 1; y = realloc(d->x,yspace * sizeof(double)); if (!y) return 0; d->x = y; d->xspace = yspace; } d->x[d->xlen++] = extra; return 1; } int da_copy(da *d,da *e) { d->xlen = 0; while (d->xlen < e->xlen) if (!da_append(d,e->x[d->xlen])) return 0; return 1; } static int loadf(da *d,FILE *f) { double extra; d->xlen = 0; for (;;) switch(fscanf(f,"%lf",&extra)) { default: if (!ferror(f)) return 1; case 0: return 0; case 1: if (!da_append(d,extra)) return 0; } } int da_load(da *d,const char *fn) { FILE *f; int result; f = fopen(fn,"r"); if (!f) return 0; result = loadf(d,f); fclose(f); return result; } static int storef(da *d,FILE *f) { int i; for (i = 0;i < d->xlen;++i) if (fprintf(f,"%f\n",d->x[i]) == -1) return 0; if (fflush(f) == -1) return 0; return 1; } int da_store(da *d,const char *fn) { FILE *f; int result; f = fopen(fn,"w"); if (!f) return 0; result = storef(d,f); fclose(f); return result; }