//----------------------------------------------------------------------------- int MGL_EXPORT mgl_datac_read_dim(HADT d, const char *fname,long mx,long my,long mz) { if(mx<=0 || my<=0 || mz<=0) return false; gzFile fp = gzopen(fname,"r"); if(!fp) return false; char *buf = mgl_read_gz(fp); gzclose(fp); mglFromStr(d,buf,mx,my,mz); free(buf); return true; }
//----------------------------------------------------------------------------- int MGL_EXPORT mgl_datac_read_mat(HADT d, const char *fname, long dim) { if(dim<=0 || dim>3) return false; gzFile fp = gzopen(fname,"r"); if(!fp) return false; long nx=1, ny=1, nz=1; char *buf = mgl_read_gz(fp); long nb = strlen(buf); gzclose(fp); register long j=0,i,l; while(j<nb) { if(buf[j]=='#') while(!isn(buf[j])) j++; // skip comment while(buf[j]<=' ' && j<nb) j++; break; } if(dim==1) { sscanf(buf+j,"%ld",&nx); while(buf[j]!='\n' && j<nb) j++; j++; // while(buf[j]>' ') j++; } else if(dim==2) { sscanf(buf+j,"%ld%ld",&nx,&ny); while(buf[j]!='\n' && j<nb) j++; j++; char *b=buf+j, ch; for(i=l=0;b[i];i++) { while(b[i]=='#') { while(!isn(b[i]) && b[i]) i++; } if(b[i]=='\n') l++; } if(l==nx*ny || l==nx*ny+1) // try to read 3d data (i.e. columns of matrix nx*ny) { nz=ny; ny=nx; nx=1; bool first = false; for(i=l=0;b[i] && !isn(b[i]);i++) // determine nx { while(b[i]=='#') { while(!isn(b[i]) && b[i]) i++; } ch = b[i]; if(ch>' ' && !first) first=true; if(first && (ch=='\t' || ch==';') && b[i+1]!='\t') nx++; } } } else if(dim==3) { sscanf(buf+j,"%ld%ld%ld",&nx,&ny,&nz); while(buf[j]!='\n' && j<nb) j++; j++; } mglFromStr(d,buf+j,nx,ny,nz); free(buf); return true; }
//----------------------------------------------------------------------------- int MGL_EXPORT mgl_datac_read(HADT d, const char *fname) { long l=1,m=1,k=1; long nb,i; gzFile fp = gzopen(fname,"r"); if(!fp) { if(!d->a) mgl_datac_create(d, 1,1,1); return false; } char *buf = mgl_read_gz(fp); nb = strlen(buf); gzclose(fp); bool first=false; // space is not allowed delimiter for file with complex numbers register char ch; for(i=nb-1;i>=0;i--) if(buf[i]>' ') break; buf[i+1]=0; nb = i; // remove tailing spaces for(i=0;i<nb-1 && !isn(buf[i]);i++) // determine nx { while(buf[i]=='#') { while(!isn(buf[i]) && i<nb) i++; } ch = buf[i]; if(ch>' ' && !first) first=true; if(first && (ch=='\t' || ch==';') && buf[i+1]!='\t') k++; // ',' is not valid delimiter for complex arrays } first = false; for(i=0;i<nb-1;i++) // determine ny { ch = buf[i]; if(ch=='#') while(!isn(buf[i]) && i<nb) i++; if(isn(ch)) { while(buf[i+1]=='\t') i++; if(isn(buf[i+1])) {first=true; break; } m++; } if(ch=='\f') break; } if(first) for(i=0;i<nb-1;i++) // determine nz { ch = buf[i]; if(ch=='#') while(!isn(buf[i]) && i<nb) i++; // if(ch=='#') com = true; // comment if(isn(ch)) { // if(com) { com=false; continue; } while(buf[i+1]=='\t') i++; if(isn(buf[i+1])) l++; } } else for(i=0;i<nb-1;i++) if(buf[i]=='\f') l++; mglFromStr(d,buf,k,m,l); free(buf); return true; }
//----------------------------------------------------------------------------- HMDT MGL_EXPORT mgl_data_ifs_file(const char *fname, const char *name, long n, long skip) { gzFile fp = gzopen(fname,"r"); if(!fp) return 0; // Couldn't open file file char *buf = mgl_read_gz(fp); gzclose(fp); char *s = strstr(buf,name); if(!s) return 0; // No data for fractal 'name' in the file char *p = strchr(s,'{'), *e; if(!p) return 0; // Wrong data format for fractal 'name' in the file bool ext3d = false; e = strstr(s,"(3D)"); if(e && e<p) ext3d = true; e = strstr(s,"(3d)"); if(e && e<p) ext3d = true; e = strchr(p,'}'); std::vector<mreal> nums; for(size_t i=0;p[i] && p+i<e;i++) { while(p[i]<=' ') i++; if(p[i]==';' || p[i]=='#') while(p[i] && p[i]!='\n') i++; if(strchr("0123456789.+-",p[i])) // this is number { nums.push_back(atof(p+i)); while(p[i]>' ') i++; } } HMDT dat = new mglData, res; if(ext3d) { dat->Set(&(nums[0]), 13, nums.size()/13, 1); res = mgl_data_ifs_3d(dat, n, skip); } else { dat->Set(&(nums[0]), 7, nums.size()/7, 1); res = mgl_data_ifs_2d(dat, n, skip); } delete dat; free(buf); return res; }