int dumpmetadata(int ncid, NChdr** hdrp) { int stat,i,j,k; NChdr* hdr = (NChdr*)calloc(1,sizeof(NChdr)); MEMCHECK(hdr,NC_ENOMEM); hdr->ncid = ncid; hdr->content = ncbytesnew(); if(hdrp) *hdrp = hdr; stat = nc_inq(hdr->ncid, &hdr->ndims, &hdr->nvars, &hdr->ngatts, &hdr->unlimid); CHECK(stat); if(ncdap3debug > 0) { fprintf(stdout,"ncid=%d ngatts=%d ndims=%d nvars=%d unlimid=%d\n", hdr->ncid,hdr->ngatts,hdr->ndims,hdr->nvars,hdr->unlimid); } hdr->gatts = (NCattribute*)calloc(1,hdr->ngatts*sizeof(NCattribute)); MEMCHECK(hdr->gatts,NC_ENOMEM); if(hdr->ngatts > 0) fprintf(stdout,"global attributes:\n"); for(i=0;i<hdr->ngatts;i++) { NCattribute* att = &hdr->gatts[i]; char attname[NC_MAX_NAME]; nc_type nctype; size_t typesize; size_t nvalues; stat = nc_inq_attname(hdr->ncid,NC_GLOBAL,i,attname); CHECK(stat); att->name = nulldup(attname); stat = nc_inq_att(hdr->ncid,NC_GLOBAL,att->name,&nctype,&nvalues); CHECK(stat); att->etype = nctypetodap(nctype); typesize = nctypesizeof(att->etype); fprintf(stdout,"\t[%d]: name=%s type=%s values(%lu)=", i,att->name,nctypetostring(octypetonc(att->etype)), (unsigned long)nvalues); if(nctype == NC_CHAR) { size_t len = typesize*nvalues; char* values = (char*)malloc(len+1);/* for null terminate*/ MEMCHECK(values,NC_ENOMEM); stat = nc_get_att(hdr->ncid,NC_GLOBAL,att->name,values); CHECK(stat); values[len] = '\0'; fprintf(stdout," '%s'",values); } else { size_t len = typesize*nvalues; char* values = (char*)malloc(len); MEMCHECK(values,NC_ENOMEM); stat = nc_get_att(hdr->ncid,NC_GLOBAL,att->name,values); CHECK(stat); for(k=0;k<nvalues;k++) { fprintf(stdout," "); dumpdata1(octypetonc(att->etype),k,values); } } fprintf(stdout,"\n"); } hdr->dims = (Dim*)malloc(hdr->ndims*sizeof(Dim)); MEMCHECK(hdr->dims,NC_ENOMEM); for(i=0;i<hdr->ndims;i++) { hdr->dims[i].dimid = i; stat = nc_inq_dim(hdr->ncid, hdr->dims[i].dimid, hdr->dims[i].name, &hdr->dims[i].size); CHECK(stat); fprintf(stdout,"dim[%d]: name=%s size=%lu\n", i,hdr->dims[i].name,(unsigned long)hdr->dims[i].size); } hdr->vars = (Var*)malloc(hdr->nvars*sizeof(Var)); MEMCHECK(hdr->vars,NC_ENOMEM); for(i=0;i<hdr->nvars;i++) { Var* var = &hdr->vars[i]; nc_type nctype; var->varid = i; stat = nc_inq_var(hdr->ncid, var->varid, var->name, &nctype, &var->ndims, var->dimids, &var->natts); CHECK(stat); var->nctype = (nctype); fprintf(stdout,"var[%d]: name=%s type=%s |dims|=%d", i, var->name, nctypetostring(var->nctype), var->ndims); fprintf(stdout," dims={"); for(j=0;j<var->ndims;j++) { fprintf(stdout," %d",var->dimids[j]); } fprintf(stdout,"}\n"); var->atts = (NCattribute*)malloc(var->natts*sizeof(NCattribute)); MEMCHECK(var->atts,NC_ENOMEM); for(j=0;j<var->natts;j++) { NCattribute* att = &var->atts[j]; char attname[NC_MAX_NAME]; size_t typesize; char* values; nc_type nctype; size_t nvalues; stat = nc_inq_attname(hdr->ncid,var->varid,j,attname); CHECK(stat); att->name = nulldup(attname); stat = nc_inq_att(hdr->ncid,var->varid,att->name,&nctype,&nvalues); CHECK(stat); att->etype = nctypetodap(nctype); typesize = nctypesizeof(att->etype); values = (char*)malloc(typesize*nvalues); MEMCHECK(values,NC_ENOMEM); stat = nc_get_att(hdr->ncid,var->varid,att->name,values); CHECK(stat); fprintf(stdout,"\tattr[%d]: name=%s type=%s values(%lu)=", j,att->name,nctypetostring(octypetonc(att->etype)),(unsigned long)nvalues); for(k=0;k<nvalues;k++) { fprintf(stdout," "); dumpdata1(octypetonc(att->etype),k,values); } fprintf(stdout,"\n"); } } fflush(stdout); return NC_NOERR; }
int main(int argc, char **argv) { int c, stat; int ncid; NChdr* hdr; init(); opterr=1; while ((c = getopt(argc, argv, "dvau:D:l:p:c:t:R:")) != EOF) { switch(c) { case 'v': verbose=1; break; case 'd': debug=1; break; case 'D': debug=atoi(optarg); break; default: break; } } if(debug > 0) {ocdebug = debug;} argc -= optind; argv += optind; if(argc > 0 && fileurl == NULL) fileurl = nulldup(argv[0]); if(fileurl == NULL) fileurl = getenv("FILEURL"); if(fileurl == NULL) { fprintf(stderr,"no file url specified\n"); usage(); } if(verbose) dumpflags(); if(verbose) {fprintf(stdout,"initializing\n"); fflush(stdout);} stat = nc_open(fileurl,NC_NOWRITE,&ncid); check_err(stat); /* dump meta data */ stat = dumpmetadata(ncid,&hdr); check_err(stat); /* Get data */ if(1) { int i,j,limited; size_t start[NC_MAX_VAR_DIMS]; size_t count[NC_MAX_VAR_DIMS]; /* Walk each variable */ for(i=0;i<hdr->nvars;i++) { Var* var = &hdr->vars[i]; size_t nelems = 1; limited = 0; for(j=0;j<var->ndims;j++) { start[j] = 0; assert(var->dimids[j] == hdr->dims[var->dimids[j]].dimid); count[j] = hdr->dims[var->dimids[j]].size; /* put a limit on each count */ if(count[j] > LIMIT) {count[j] = LIMIT; limited = 1;} nelems *= count[j]; } if(nelems > 0) { size_t typesize = nctypesizeof(var->nctype); size_t memsize = typesize*nelems; void* memory = malloc(memsize); fprintf(stdout,"%s: size=%lu (%lu * %lu) ; ", var->name, (unsigned long)memsize, (unsigned long)typesize, (unsigned long)nelems); fflush(stdout); stat = nc_get_vara(ncid,var->varid,start,count,memory); check_err(stat); /* dump memory */ switch (var->nctype){ case NC_CHAR: fprintf(stdout,"\""); fflush(stdout); dumpchars(nelems,memory); fprintf(stdout,"\""); break; default: for(j=0;j<nelems;j++) { if(j > 0) fprintf(stdout," "); dumpdata1(var->nctype,j,memory); } } if(limited) fprintf(stdout,"..."); fprintf(stdout,"\n"); free(memory); } else fprintf(stdout,"%s: no data\n",var->name); } fprintf(stdout,"\n"); } nc_close(ncid); return 0; }