void generate_vardata(Symbol* vsym, Generator* generator, Writer writer, Bytebuffer* code) { Dimset* dimset = &vsym->typ.dimset; int rank = dimset->ndims; Symbol* basetype = vsym->typ.basetype; Datalist* filler = getfiller(vsym); const size_t* start; const size_t* count; Odometer* odom; if(vsym->data == NULL) return; /* give the buffer a running start to be large enough*/ if(!bbSetalloc(code, nciterbuffersize)) return; if(rank == 0) {/*scalar case*/ NCConstant* c0 = datalistith(vsym->data,0); generate_basetype(basetype,c0,code,filler,generator); writer(generator,vsym,code,0,NULL,NULL); } else {/*rank > 0*/ /* First, create an odometer using all of the dimensions */ odom = newodometer(dimset,NULL,NULL); start = odometerstartvector(odom); count = odometercountvector(odom); generate_array(vsym,code,filler,generator,writer); } }
int bbSetlength(Bytebuffer* bb, const unsigned int sz) { if(bb == NULL) return bbFail(); if(bb->length < sz) { if(!bbSetalloc(bb,sz)) return bbFail(); } bb->length = sz; return TRUE; }
int bbAppend(Bytebuffer* bb, char elem) { if(bb == NULL) return bbFail(); /* We need space for the char + null */ while(bb->length+1 >= bb->alloc) if(!bbSetalloc(bb,0)) return bbFail(); bb->content[bb->length] = elem; bb->length++; bb->content[bb->length] = '\0'; return TRUE; }
int bbAppendn(Bytebuffer* bb, const void* elem, const unsigned int n0) { unsigned int n = n0; if(bb == NULL || elem == NULL) return bbFail(); if(n == 0) {n = strlen((char*)elem);} while(!bbNeed(bb,(n+1))) {if(!bbSetalloc(bb,0)) return bbFail();} memcpy((void*)&bb->content[bb->length],(void*)elem,n); bb->length += n; bb->content[bb->length] = '\0'; return TRUE; }
void generate_vardata(Symbol* vsym, Generator* generator, Writer writer, Bytebuffer* code) { Dimset* dimset = &vsym->typ.dimset; int rank = dimset->ndims; Symbol* basetype = vsym->typ.basetype; Datalist* filler = getfiller(vsym); if(vsym->data == NULL) return; /* give the buffer a running start to be large enough*/ bbSetalloc(code, nciterbuffersize); if(rank == 0) {/*scalar case*/ Constant* c0 = datalistith(vsym->data,0); generate_basetype(basetype,c0,code,filler,generator); writer(generator,vsym,code,0,NULL,NULL); } else {/*rank > 0*/ generate_array(vsym,code,filler,generator,writer); } }
/* * Generate code for creating netCDF from in-memory structure. */ void gen_ncjava_std(const char *filename) { int idim, ivar, iatt, maxdims; int ndims, nvars, natts, ngatts, ngrps, ntyps; char* cmode_string; jcode = bbNew(); bbSetalloc(jcode,C_MAX_STMT); ndims = listlength(dimdefs); nvars = listlength(vardefs); natts = listlength(attdefs); ngatts = listlength(gattdefs); ngrps = listlength(grpdefs); ntyps = listlength(typdefs); /* Construct the main class */ jline("import java.util.*;"); jline("import ucar.ma2.*;"); jline("import ucar.nc2.*;"); jline("import ucar.nc2.NetcdfFile.*;"); jline(""); jpartial("public class "); jline(mainname); jline("{"); /* Now construct the main procedure*/ jline(""); jline("static public void main(String[] argv) throws Exception"); jline("{"); /* create necessary declarations */ if (ndims > 0) { jline(""); jlined(1,"/* dimension lengths */"); for(idim = 0; idim < ndims; idim++) { Symbol* dsym = (Symbol*)listget(dimdefs,idim); if (dsym->dim.size == NC_UNLIMITED) { nprintf(stmt,sizeof(stmt),"%sfinal int %s_len = 0;", indented(1),jname(dsym)); } else { nprintf(stmt,sizeof(stmt),"%sfinal int %s_len = %lu;", indented(1), jname(dsym), (unsigned long) dsym->dim.size); } jline(stmt); } } jflush(); maxdims = 0; /* most dimensions of any variable */ for(ivar = 0; ivar < nvars; ivar++) { Symbol* vsym = (Symbol*)listget(vardefs,ivar); if(vsym->typ.dimset.ndims > maxdims) maxdims = vsym->typ.dimset.ndims; } jline(""); #ifdef DOTHROW jlined(1,"try {"); #endif /* create netCDF file, uses NC_CLOBBER mode */ jline(""); jlined(1,"/* enter define mode */"); if (!cmode_modifier) { cmode_string = "NC_CLOBBER"; } else if (cmode_modifier & NC_64BIT_OFFSET) { cmode_string = "NC_CLOBBER|NC_64BIT_OFFSET"; } else { derror("unknown cmode modifier"); cmode_string = "NC_CLOBBER"; } nprintf(stmt,sizeof(stmt), "NetcdfFileWriteable ncfile = NetcdfFileWriteable.createNew(\"%s\", %s);", filename,(nofill_flag?"false":"true")); jlined(1,stmt); jflush(); /* define dimensions from info in dims array */ if (ndims > 0) { jline(""); jlined(1,"/* define dimensions */"); for(idim = 0; idim < ndims; idim++) { Symbol* dsym = (Symbol*)listget(dimdefs,idim); if(dsym->dim.size == NC_UNLIMITED) { nprintf(stmt,sizeof(stmt),"Dimension %s_dim = ncfile.addUnlimitedDimension(\"%s\");", jname(dsym),jescapifyname(dsym->name)); } else { nprintf(stmt,sizeof(stmt),"Dimension %s_dim = ncfile.addDimension(\"%s\", %s_len);", jname(dsym),jescapifyname(dsym->name), jname(dsym)); } jlined(1,stmt); } jflush(); } /* define variables from info in vars array */ if (nvars > 0) { jline(""); jlined(1,"/* define variables */"); for(ivar = 0; ivar < nvars; ivar++) { Symbol* vsym = (Symbol*)listget(vardefs,ivar); Symbol* basetype = vsym->typ.basetype; Dimset* dimset = &vsym->typ.dimset; jline(""); nprintf(stmt,sizeof(stmt),"ArrayList %s_dimlist = new ArrayList();", jname(vsym)); jlined(1,stmt); if(dimset->ndims > 0) { for(idim = 0; idim < dimset->ndims; idim++) { Symbol* dsym = dimset->dimsyms[idim]; nprintf(stmt,sizeof(stmt),"%s_dimlist.add(%s_dim);", jname(vsym),jname(dsym)); jlined(1,stmt); } } nprintf(stmt,sizeof(stmt), "ncfile.addVariable(\"%s\", DataType.%s, %s_dimlist);", jescapifyname(vsym->name), jtypeallcaps(basetype->typ.typecode), jname(vsym)); jlined(1,stmt); } jflush(); } /* Define the global attributes*/ if(ngatts > 0) { jline(""); jlined(1,"/* assign global attributes */"); for(iatt = 0; iatt < ngatts; iatt++) { Symbol* gasym = (Symbol*)listget(gattdefs,iatt); genjstd_defineattribute(gasym); } jline(""); jflush(); } /* Define the variable specific attributes*/ if(natts > 0) { jline(""); jlined(1,"/* assign per-variable attributes */"); for(iatt = 0; iatt < natts; iatt++) { Symbol* asym = (Symbol*)listget(attdefs,iatt); genjstd_defineattribute(asym); } jline(""); jflush(); } jlined(1,"ncfile.create();"); /* equiv to nc_enddef */ /* Load values into those variables with defined data */ if(nvars > 0) { jline(""); jlined(1,"/* assign variable data */"); for(ivar = 0; ivar < nvars; ivar++) { Symbol* vsym = (Symbol*)listget(vardefs,ivar); if(vsym->data != NULL) genjstd_definevardata(vsym); } jline(""); /* compute the max actual size of the unlimited dimension*/ if(usingclassic) computemaxunlimited(); } jflush(); }