void *DataMapStoreScalar(struct DataMap *ptr, char *name,int type,void *data) { struct DataMapScalar *s; void *tmp=NULL; if (ptr==NULL) return NULL; if (data==NULL) return NULL; switch (type) { case DATACHAR: tmp=malloc(sizeof(char)); if (tmp==NULL) break; *((char *) tmp)=*((char *) data); break; case DATASHORT: tmp=malloc(sizeof(int16)); if (tmp==NULL) break; *((int16 *) tmp)=*((int16 *) data); break; case DATAINT: tmp=malloc(sizeof(int32)); if (tmp==NULL) break; *((int32 *) tmp)=*((int32 *) data); break; case DATAFLOAT: tmp=malloc(sizeof(float)); if (tmp==NULL) break; *((float *) tmp)=*((float *) data); break; case DATADOUBLE: tmp=malloc(+sizeof(double)); if (tmp==NULL) break; *((double *) tmp)=*((double *) data); break; default: tmp=malloc(sizeof(char *)); if (tmp==NULL) break; *((char **) tmp)=*((char **) data); break; } if (tmp==NULL) return NULL; s=DataMapMakeScalar(name,1,type,tmp); if (s==NULL) return NULL; if (ptr->scl==NULL) tmp=malloc(sizeof(struct DataMapScalar *)); else tmp=realloc(ptr->scl,(ptr->snum+1)*sizeof(struct DataMapScalar *)); if (tmp==NULL) { DataMapFreeScalar(s); return NULL; } ptr->scl=tmp; ptr->scl[ptr->snum]=s; ptr->snum++; return tmp; }
int DataMapAddScalar(struct DataMap *ptr, char *name,int type,void *data) { struct DataMapScalar *s; if (ptr==NULL) return -1; s=DataMapMakeScalar(name,0,type,data); if (s==NULL) return -1; if (ptr->scl==NULL) ptr->scl=malloc(sizeof(struct DataMapScalar *)); else { struct DataMapScalar **tmp; tmp=realloc(ptr->scl,(ptr->snum+1)*sizeof(struct DataMapScalar *)); if (tmp==NULL) { DataMapFreeScalar(s); return -1; } ptr->scl=tmp; } ptr->scl[ptr->snum]=s; ptr->snum++; return 0; }
int loadmap(FILE *fp) { char buf[256]; int off=0; int c,x,y,t,dim; do { off=0; do { c=fgetc(fp); if (c==-1) break; if (c==';') break; buf[off]=c; off++; if (off>255) c=-1; } while (c !=-1); if (c==-1) break; buf[off]=0; x=0; while((!isalnum(buf[x])) && (x<off)) x++; y=x; while((isalnum(buf[y])) && (y<off)) y++; t=0; if (strncmp(buf+x,"char",4)==0) t=DATACHAR; if (strncmp(buf+x,"short",5)==0) t=DATASHORT; if (strncmp(buf+x,"int",4)==0) t=DATAINT; if (strncmp(buf+x,"float",5)==0) t=DATAFLOAT; if (strncmp(buf+x,"double",6)==0) t=DATADOUBLE; if (strncmp(buf+x,"string",6)==0) t=DATASTRING; x=y; while ((!isalnum(buf[x])) && (x<off)) x++; y=x; while ((isalnum(buf[y])) && (y<off)) y++; buf[y]=0; dim=atoi(buf+x); x=y; while ((buf[x] !='"') && (x<off)) x++; y=x+1; while ((buf[y] !='"') && (y<off)) y++; buf[y]=0; if (dim==0) { if (sptr==NULL) sptr=malloc(sizeof(struct DataMapScalar *)); else { struct DataMapScalar **tmp; tmp=realloc(sptr,(snum+1)*sizeof(struct DataMapScalar *)); if (tmp==NULL) break; sptr=tmp; } sptr[snum]=DataMapMakeScalar(buf+x+1,0,t,NULL); if (cdfsname==NULL) cdfsname=malloc(sizeof(char *)); else { char **tmp; tmp=realloc(cdfsname,(snum+1)*sizeof(char *)); if (tmp==NULL) break; cdfsname=tmp; } snum++; } else { if (aptr==NULL) aptr=malloc(sizeof(struct DataMapArray *)); else { struct DataMapArray **tmp; tmp=realloc(aptr,(anum+1)*sizeof(struct DataMapArray *)); if (tmp==NULL) break; aptr=tmp; } if (cdfaname==NULL) cdfaname=malloc(sizeof(char *)); else { char **tmp; tmp=realloc(cdfaname,(snum+1)*sizeof(char *)); if (tmp==NULL) break; cdfaname=tmp; } aptr[anum]=DataMapMakeArray(buf+x+1,0,t,dim,NULL,NULL); anum++; } x=y+1; while ((buf[x] !='=') && (x<off)) x++; while ((!isalnum(buf[x])) && (x<off)) x++; y=x; while ((buf[y] !=';') && (y<off)) y++; buf[y]=0; if (dim==0) { cdfsname[snum-1]=malloc(y-x+1); strcpy(cdfsname[snum-1],buf+x); } else { cdfaname[anum-1]=malloc(y-x+1); strcpy(cdfaname[anum-1],buf+x); } } while (c !=-1); return 0; }
int main(int argc,char *argv[]) { int status=0; struct DataMap *ptr=NULL; struct DataMapScalar *sx=NULL,*sy=NULL; struct DataMapArray *ax=NULL,*ay=NULL; struct DimMap *dx=NULL; unsigned char vbflg=0; unsigned char help=0; unsigned char option=0; unsigned char zflg=0; FILE *fp=NULL; int c,i; gzFile zfp=0; int x=0,n=0; OptionAdd(&opt,"-help",'x',&help); OptionAdd(&opt,"-option",'x',&option); OptionAdd(&opt,"vb",'x',&vbflg); OptionAdd(&opt,"z",'x',&zflg); if (argc>1) { arg=OptionProcess(1,argc,argv,&opt,NULL); if (help==1) { OptionPrintInfo(stdout,hlpstr); exit(0); } if (option==1) { OptionDump(stdout,&opt); exit(0); } if (zflg) { zfp=gzopen(argv[arg],"r"); if (zfp==0) { fprintf(stderr,"File not found.\n"); exit(-1); } } else { fp=fopen(argv[arg],"r"); if (fp==NULL) { fprintf(stderr,"File not found.\n"); exit(-1); } } } else { OptionPrintInfo(stdout,errstr); exit(-1); } while (1) { if (zflg) ptr=DataMapReadZ(zfp); else ptr=DataMapFread(fp); if (ptr==NULL) break; for (c=0;c<ptr->snum;c++) { sx=ptr->scl[c]; for (n=0;n<snum;n++) { sy=sptr[n]; if (strcmp(sx->name,sy->name) !=0) continue; if (sx->type !=sy->type) continue; break; } if (n==snum) { /* copy the scalar */ if (sptr==NULL) sptr=malloc(sizeof(struct DataMapScalar *)); else { struct DataMapScalar **tmp; tmp=realloc(sptr,(snum+1)*sizeof(struct DataMapScalar *)); if (tmp==NULL) break; sptr=tmp; } sptr[snum]=DataMapMakeScalar(sx->name,0,sx->type,NULL); snum++; } } if (c !=ptr->snum) { status=-1; break; } for (c=0;c<ptr->anum;c++) { ax=ptr->arr[c]; for (n=0;n<anum;n++) { ay=aptr[n]; if (strcmp(ax->name,ay->name) !=0) continue; if (ax->type != ay->type) continue; if (ax->dim != ay->dim) continue; break; } if (n !=anum) { /* check the ranges */ for (i=0;i<ax->dim;i++) if (ax->rng[i]>rptr[roff[n]+i]) rptr[roff[n]+i]=ax->rng[i]; } if (n==anum) { /* copy the array */ if (roff==NULL) roff=malloc(sizeof(int32)); else { int32 *tmp; tmp=realloc(roff,(anum+1)*sizeof(int32)); if (tmp==NULL) break; roff=tmp; } roff[anum]=rnum; if (rptr==NULL) rptr=malloc(sizeof(int32)*ax->dim); else { int32 *tmp; tmp=realloc(rptr,(rnum+ax->dim)*sizeof(int32)); if (tmp==NULL) break; rptr=tmp; } for (i=0;i<ax->dim;i++) rptr[rnum+i]=ax->rng[i]; rnum+=ax->dim; if (aptr==NULL) aptr=malloc(sizeof(struct DataMapArray *)); else { struct DataMapArray **tmp; tmp=realloc(aptr,(anum+1)*sizeof(struct DataMapArray *)); if (tmp==NULL) break; aptr=tmp; } aptr[anum]=DataMapMakeArray(ax->name,0,ax->type,ax->dim,NULL, NULL); anum++; } } if (c !=ptr->anum) { status=-1; break; } DataMapFree(ptr); } if (zflg) gzclose(zfp); else fclose(fp); if (status==-1) { fprintf(stderr,"Error processing file.\n"); exit(-1); } for (n=0;n<anum;n++) { ax=aptr[n]; ax->rng=rptr+roff[n]; for (c=0;c<ax->dim;c++) if (ax->rng[c]==0) break; /* bad data */ if (c !=ax->dim) ax->dim=0; } cdfsname=malloc(sizeof(char *)*snum); if (cdfsname==NULL) { fprintf(stderr,"Could not allocate scalar name table.\n"); exit(-1); } cdfaname=malloc(sizeof(char *)*anum); if (cdfaname==NULL) { fprintf(stderr,"Could not allocate array name table.\n"); exit(-1); } for (n=0;n<snum;n++) { sx=sptr[n]; cdfsname[n]=malloc(strlen(sx->name)+1); for (c=0;sx->name[c] !=0;c++) if (isalnum(sx->name[c])) cdfsname[n][c]=sx->name[c]; else cdfsname[n][c]='_'; cdfsname[n][c]=0; x=0; for (c=0;c<n;c++) if (strncmp(cdfsname[c],cdfsname[n], strlen(cdfsname[n]))==0) x++;; if (x !=0) { char *tmp; char txt[4]; x++; sprintf(txt,"%.3d",x); tmp=realloc(cdfsname[n],strlen(cdfsname[n])+4); if (tmp==NULL) break; cdfsname[n]=tmp; strcat(cdfsname[n],txt); } } if (n !=snum) { fprintf(stderr,"Error generating names.\n"); exit(-1); } for (n=0;n<anum;n++) { ax=aptr[n]; cdfaname[n]=NULL; if (ax->dim==0) continue; cdfaname[n]=malloc(strlen(ax->name)+1); for (c=0;ax->name[c] !=0;c++) if (isalnum(ax->name[c])) cdfaname[n][c]=ax->name[c]; else cdfaname[n][c]='_'; cdfaname[n][c]=0; for (c=0;c<n;c++) if (strncmp(cdfaname[c],cdfaname[n], strlen(cdfaname[n]))==0) x++; if (x !=0) { char *tmp; char txt[4]; x++; sprintf(txt,"%.3d",x); tmp=realloc(cdfaname[n],strlen(cdfaname[n])+4); if (tmp==NULL) break; cdfaname[n]=tmp; strcat(cdfaname[n],txt); } } if (n !=anum) { fprintf(stderr,"Error generating names.\n"); exit(-1); } /* build the dimension table */ for (n=0;n<snum;n++) { sx=sptr[n]; if (sx->type != DATASTRING) continue; if (dnum==0) dptr=malloc(sizeof(struct DimMap *)); else { struct DimMap **tmp; tmp=realloc(dptr,(dnum+1)*sizeof(struct DimMap *)); if (tmp==NULL) break; dptr=tmp; } dx=malloc(sizeof(struct DimMap)); dptr[dnum]=dx; dx->flg=0; dx->num=n; dx->dim=0; dx->value=STRINGSIZE; dx->name=malloc(strlen(cdfsname[n])+1); strcpy(dx->name,cdfsname[n]); x=0; for (c=0;c<dnum;c++) if (strncmp(dptr[c]->name,dx->name, strlen(dx->name))==0) x++; if (x !=0) { char *tmp; char txt[4]; x++; sprintf(txt,"%.3d",x); tmp=realloc(dx->name,strlen(dx->name)+4); if (tmp==NULL) break; dx->name=tmp; strcat(dx->name,txt); } dnum++; } if (n !=snum) { fprintf(stderr,"Error building dimension table.\n"); exit(-1); } for (n=0;n<anum;n++) { ax=aptr[n]; if (ax->dim==0) continue; for (i=0;i<ax->dim;i++) { if (dnum==0) dptr=malloc(sizeof(struct DimMap *)); else { struct DimMap **tmp; tmp=realloc(dptr,(dnum+1)*sizeof(struct DimMap *)); if (tmp==NULL) break; dptr=tmp; } dx=malloc(sizeof(struct DimMap)); dptr[dnum]=dx; dx->flg=1; dx->num=n; dx->dim=i; dx->value=ax->rng[i]; dx->name=malloc(strlen(cdfaname[n])+1); strcpy(dx->name,cdfaname[n]); x=0; for (c=0;c<dnum;c++) if (strncmp(dptr[c]->name,dx->name, strlen(dx->name))==0) x++; if (x !=0) { char *tmp; char txt[4]; x++; sprintf(txt,"%.3d",x); tmp=realloc(dx->name,strlen(dx->name)+4); if (tmp==NULL) break; dx->name=tmp; strcat(dx->name,txt); } dnum++; } if (ax->type==DATASTRING) { if (dnum==0) dptr=malloc(sizeof(struct DimMap *)); else { struct DimMap **tmp; tmp=realloc(dptr,(dnum+1)*sizeof(struct DimMap *)); if (tmp==NULL) break; dptr=tmp; } dx=malloc(sizeof(struct DimMap)); dptr[dnum]=dx; dx->flg=1; dx->num=n; dx->dim=i; dx->value=STRINGSIZE; dx->name=malloc(strlen(cdfaname[n])+1); strcpy(dx->name,cdfaname[n]); x=0; for (c=0;c<dnum;c++) if (strncmp(dptr[c]->name,dx->name, strlen(dx->name))==0) x++; if (x !=0) { char *tmp; char txt[4]; x++; sprintf(txt,"%.3d",x); tmp=realloc(dx->name,strlen(dx->name)+4); if (tmp==NULL) break; dx->name=tmp; strcat(dx->name,txt); } dnum++; } } if (n !=anum) { fprintf(stderr,"Error building dimension table.\n"); exit(-1); } fp=fopen(argv[2],"w"); fprintf(fp,"netcdf dmap {\n\n"); fprintf(fp,"dimensions:\n"); fprintf(fp,"\tblock=unlimited;\n"); for (n=0;n<dnum;n++) { dx=dptr[n]; fprintf(fp,"\t%s=%d;\n",dx->name,dx->value); } fprintf(fp,"variables:\n"); for (n=0;n<snum;n++) { fprintf(fp,"\t"); sx=sptr[n]; switch(sx->type) { case DATACHAR: fprintf(fp,"char"); break; case DATASHORT: fprintf(fp,"short"); break; case DATAINT: fprintf(fp,"int"); break; case DATAFLOAT: fprintf(fp,"float"); break; case DATADOUBLE: fprintf(fp,"double"); break; case DATASTRING: fprintf(fp,"char"); } fprintf(fp," %s",cdfsname[n]); if (sx->type==DATASTRING) { for (x=0;x<dnum;x++) { dx=dptr[x]; if (dx->flg !=0) continue; if (dx->num==n) break; } fprintf(fp,"(block,%s);\n",dx->name); } else fprintf(fp,"(block);\n"); } for (n=0;n<anum;n++) { fprintf(fp,"\t"); ax=aptr[n]; if (ax->dim==0) continue; switch(ax->type) { case DATACHAR: fprintf(fp,"char"); break; case DATASHORT: fprintf(fp,"short"); break; case DATAINT: fprintf(fp,"int"); break; case DATAFLOAT: fprintf(fp,"float"); break; case DATADOUBLE: fprintf(fp,"double"); break; case DATASTRING: fprintf(fp,"char"); } fprintf(fp," %s",cdfaname[n]); fprintf(fp,"(block"); for (x=0;x<dnum;x++) { dx=dptr[x]; if (dx->flg !=1) continue; if (dx->num!=n) continue; fprintf(fp,",%s",dx->name); } fprintf(fp,");\n"); } fprintf(fp,"}"); fclose(fp); fp=fopen(argv[3],"w"); for (n=0;n<snum;n++) { fprintf(fp,"\t"); sx=sptr[n]; switch(sx->type) { case DATACHAR: fprintf(fp,"char 0"); break; case DATASHORT: fprintf(fp,"short 0"); break; case DATAINT: fprintf(fp,"int 0"); break; case DATAFLOAT: fprintf(fp,"float 0"); break; case DATADOUBLE: fprintf(fp,"double 0"); break; case DATASTRING: fprintf(fp,"string 0"); } fprintf(fp," %c%s%c=%s;\n",'"',sx->name,'"',cdfsname[n]); } for (n=0;n<anum;n++) { fprintf(fp,"\t"); ax=aptr[n]; if (ax->dim==0) continue; switch(ax->type) { case DATACHAR: fprintf(fp,"char"); break; case DATASHORT: fprintf(fp,"short"); break; case DATAINT: fprintf(fp,"int"); break; case DATAFLOAT: fprintf(fp,"float"); break; case DATADOUBLE: fprintf(fp,"double"); break; case DATASTRING: fprintf(fp,"string"); } fprintf(fp," %d",ax->dim); fprintf(fp," %c%s%c=%s;\n",'"',ax->name,'"',cdfaname[n]); } fclose(fp); return 0; }
int main(int argc,char *argv[]) { int status=0; struct DataMap *ptr; struct DataMapScalar *sx=NULL,*sy=NULL; struct DataMapArray *ax=NULL,*ay=NULL; char buf[1024]; unsigned char vbflg=0; FILE *fp; int c,i; int x=0,n; int tab; char *cdfname=NULL; char *cdfdef={"dmapcdf"}; int block=0; int rnum=0,znum=0; int nelm=0; unsigned char help=0; unsigned char option=0; OptionAdd(&opt,"-help",'x',&help); OptionAdd(&opt,"-option",'x',&option); OptionAdd(&opt,"vb",'x',&vbflg); if (argc>1) { arg=OptionProcess(1,argc,argv,&opt,NULL); if (help==1) { OptionPrintInfo(stdout,hlpstr); exit(0); } if (option==1) { OptionDump(stdout,&opt); exit(0); } fp=fopen(argv[arg],"r"); if (fp==NULL) { fprintf(stderr,"File not found.\n"); exit(-1); } } else { OptionPrintInfo(stdout,errstr); exit(-1); } if (cdfname==NULL) cdfname=cdfdef; while ((ptr=DataMapFread(fp)) !=NULL) { for (c=0;c<ptr->snum;c++) { sx=ptr->scl[c]; for (n=0;n<snum;n++) { sy=sptr[n]; if (strcmp(sx->name,sy->name) !=0) continue; if (sx->type !=sy->type) continue; break; } if (n==snum) { /* copy the scalar */ if (sptr==NULL) sptr=malloc(sizeof(struct DataMapScalar *)); else { struct DataMapScalar **tmp; tmp=realloc(sptr,(snum+1)*sizeof(struct DataMapScalar *)); if (tmp==NULL) break; sptr=tmp; } sptr[snum]=DataMapMakeScalar(sx->name,sx->type,NULL); snum++; } } if (c !=ptr->snum) { status=-1; break; } for (c=0;c<ptr->anum;c++) { ax=ptr->arr[c]; for (n=0;n<anum;n++) { ay=aptr[n]; if (strcmp(ax->name,ay->name) !=0) continue; if (ax->type != ay->type) continue; if (ax->dim != ay->dim) continue; break; } if (n !=anum) { /* check the ranges */ for (i=0;i<ax->dim;i++) if (ax->rng[i]>rptr[roff[n]+i]) rptr[roff[n]+i]=ax->rng[i]; } if (n==anum) { /* copy the array */ if (roff==NULL) roff=malloc(sizeof(int32)); else { int32 *tmp; tmp=realloc(roff,(anum+1)*sizeof(int32)); if (tmp==NULL) break; roff=tmp; } roff[anum]=rnum; if (rptr==NULL) rptr=malloc(sizeof(int32)*ax->dim); else { int32 *tmp; tmp=realloc(rptr,(rnum+ax->dim)*sizeof(int32)); if (tmp==NULL) break; rptr=tmp; } for (i=0;i<ax->dim;i++) rptr[rnum+i]=ax->rng[i]; rnum+=ax->dim; if (aptr==NULL) aptr=malloc(sizeof(struct DataMapArray *)); else { struct DataMapArray **tmp; tmp=realloc(aptr,(anum+1)*sizeof(struct DataMapArray *)); if (tmp==NULL) break; aptr=tmp; } aptr[anum]=DataMapMakeArray(ax->name,ax->type,ax->dim,NULL, NULL); anum++; } } if (c !=ptr->anum) { status=-1; break; } DataMapFree(ptr); block++; } fclose(fp); if (status==-1) { fprintf(stderr,"Error processing file.\n"); exit(-1); } for (n=0;n<anum;n++) { ax=aptr[n]; ax->rng=rptr+roff[n]; for (c=0;c<ax->dim;c++) if (ax->rng[c]==0) break; /* bad data */ if (c !=ax->dim) ax->dim=0; } cdfsname=malloc(sizeof(char *)*snum); if (cdfsname==NULL) { fprintf(stderr,"Could not allocate scalar name table.\n"); exit(-1); } cdfaname=malloc(sizeof(char *)*anum); if (cdfaname==NULL) { fprintf(stderr,"Could not allocate array name table.\n"); exit(-1); } for (n=0;n<snum;n++) { sx=sptr[n]; cdfsname[n]=malloc(strlen(sx->name)+1); for (c=0;sx->name[c] !=0;c++) if (isalnum(sx->name[c])) cdfsname[n][c]=sx->name[c]; else cdfsname[n][c]='_'; cdfsname[n][c]=0; x=0; for (c=0;c<n;c++) if (strncmp(cdfsname[c],cdfsname[n], strlen(cdfsname[n]))==0) x++;; if (x !=0) { char *tmp; char txt[4]; x++; sprintf(txt,"%.3d",x); tmp=realloc(cdfsname[n],strlen(cdfsname[n])+4); if (tmp==NULL) break; cdfsname[n]=tmp; strcat(cdfsname[n],txt); } } if (n !=snum) { fprintf(stderr,"Error generating names.\n"); exit(-1); } for (n=0;n<anum;n++) { ax=aptr[n]; cdfaname[n]=NULL; if (ax->dim==0) continue; cdfaname[n]=malloc(strlen(ax->name)+1); for (c=0;ax->name[c] !=0;c++) if (isalnum(ax->name[c])) cdfaname[n][c]=ax->name[c]; else cdfaname[n][c]='_'; cdfaname[n][c]=0; for (c=0;c<n;c++) if (strncmp(cdfaname[c],cdfaname[n], strlen(cdfaname[n]))==0) x++; if (x !=0) { char *tmp; char txt[4]; x++; sprintf(txt,"%.3d",x); tmp=realloc(cdfaname[n],strlen(cdfaname[n])+4); if (tmp==NULL) break; cdfaname[n]=tmp; strcat(cdfaname[n],txt); } } if (n !=anum) { fprintf(stderr,"Error generating names.\n"); exit(-1); } rnum=snum; znum=anum; fp=fopen(argv[2],"w"); fprintf(fp,"#header\n"); fprintf(fp," CDF NAME: %s\n",cdfname); fprintf(fp," DATA ENCODING: NETWORK\n"); fprintf(fp," MAJORITY: ROW\n"); fprintf(fp," FORMAT: SINGLE\n\n"); fprintf(fp, "! Variables G.Attributes V.Attributes Records Dims Sizes\n"); fprintf(fp, "! --------- ------------ ------------ ------- ---- -----\n"); fprintf(fp, " %d/%d 0 0 %d/z 0\n", rnum,znum,block); fprintf(fp,"\n#GLOBALattributes\n"); fprintf(fp,"\n#VARIABLEattributes\n"); fprintf(fp,"\n#variables\n\n"); for (n=0;n<snum;n++) { sx=sptr[n]; fprintf(fp,"! Variable Data Number Record Dimension\n"); fprintf(fp,"! Name Type Elements Variance Variances\n"); fprintf(fp,"! -------- ---- -------- -------- ---------\n"); fprintf(fp,"\n"); sprintf(buf," %c%s%c",'"',cdfsname[n],'"'); fprintf(fp,buf); tab=18-strlen(buf); if (tab>0) for (c=0;c<tab;c++) fprintf(fp," "); else fprintf(fp," "); switch (sx->type) { case DATACHAR: fprintf(fp,"CDF_CHAR "); break; case DATASHORT: fprintf(fp,"CDF_INT2 "); break; case DATAINT: fprintf(fp,"CDF_INT4 "); break; case DATAFLOAT: fprintf(fp,"CDF_FLOAT "); break; case DATADOUBLE: fprintf(fp,"CDF_DOUBLE"); break; case DATASTRING: fprintf(fp,"CDF_CHAR "); break; } nelm=1; if (sx->type==DATASTRING) nelm=STRINGSIZE; fprintf(fp," %d T ",nelm); fprintf(fp,"\n\n"); fprintf(fp,"! Attribute Data Value\n"); fprintf(fp,"! Name Type\n"); fprintf(fp,"! -------- ---- --------\n"); fprintf(fp,"\n.\n\n"); } fprintf(fp,"\n#zVariables\n\n"); for (n=0;n<anum;n++) { ax=aptr[n]; fprintf(fp,"! Variable Data Number"); fprintf(fp," Record Dimension\n"); fprintf(fp,"! Name Type Elements Dims"); fprintf(fp," Sizes Variance Variances\n"); fprintf(fp, "! -------- ---- -------- ----"); fprintf(fp," ----- -------- ---------\n"); fprintf(fp,"\n"); sprintf(buf," %c%s%c",'"',cdfaname[n],'"'); fprintf(fp,buf); tab=18-strlen(buf); if (tab>0) for (c=0;c<tab;c++) fprintf(fp," "); else fprintf(fp," "); switch (ax->type) { case DATACHAR: fprintf(fp,"CDF_CHAR "); break; case DATASHORT: fprintf(fp,"CDF_INT2 "); break; case DATAINT: fprintf(fp,"CDF_INT4 "); break; case DATAFLOAT: fprintf(fp,"CDF_FLOAT "); break; case DATADOUBLE: fprintf(fp,"CDF_DOUBLE"); break; case DATASTRING: fprintf(fp,"CDF_CHAR "); break; } nelm=1; if (ax->type==DATASTRING) nelm=STRINGSIZE; fprintf(fp," %d %d ",nelm,ax->dim); for (c=0;c<ax->dim;c++) fprintf(fp,"%d ",ax->rng[c]); fprintf(fp," T "); for (c=0;c<ax->dim;c++) fprintf(fp,"T "); fprintf(fp,"\n\n"); fprintf(fp,"! Attribute Data Value\n"); fprintf(fp,"! Name Type\n"); fprintf(fp,"! -------- ---- --------\n"); fprintf(fp,"\n.\n\n"); } fprintf(fp,"#end\n\n"); fp=fopen(argv[3],"w"); for (n=0;n<snum;n++) { fprintf(fp,"\t"); sx=sptr[n]; switch(sx->type) { case DATACHAR: fprintf(fp,"char 0"); break; case DATASHORT: fprintf(fp,"short 0"); break; case DATAINT: fprintf(fp,"int 0"); break; case DATAFLOAT: fprintf(fp,"float 0"); break; case DATADOUBLE: fprintf(fp,"double 0"); break; case DATASTRING: fprintf(fp,"string 0"); } fprintf(fp," %c%s%c=%s;\n",'"',sx->name,'"',cdfsname[n]); } for (n=0;n<anum;n++) { fprintf(fp,"\t"); ax=aptr[n]; if (ax->dim==0) continue; switch(ax->type) { case DATACHAR: fprintf(fp,"char"); break; case DATASHORT: fprintf(fp,"short"); break; case DATAINT: fprintf(fp,"int"); break; case DATAFLOAT: fprintf(fp,"float"); break; case DATADOUBLE: fprintf(fp,"double"); break; case DATASTRING: fprintf(fp,"string"); } fprintf(fp," %d",ax->dim); fprintf(fp," %c%s%c=%s;\n",'"',ax->name,'"',cdfaname[n]); } fclose(fp); return 0; }