static void fillarray(Symbol* basetype, Dimset* dimset, int index, Datalist* arraylist) { int i; Symbol* dim = dimset->dimsyms[index]; unsigned int size = dim->dim.declsize; int isunlimited = (size == 0); int lastdim = (index == (dimset->ndims - 1)); int firstdim = (index == 0); Datalist* sublist; sublist = (firstdim?builddatalist(0):arraylist); if(isunlimited) { /* do a single entry to satisfy*/ if(lastdim) { filllist(basetype,sublist); } else { fillarray(basetype->typ.basetype,dimset,index+1,sublist); } } else { /* bounded*/ if(lastdim) { for(i=0;i<size;i++) filllist(basetype,sublist); } else { for(i=0;i<size;i++) { fillarray(basetype->typ.basetype,dimset,index+1,sublist); } } } }
static void filllist(Symbol* tsym, Datalist* dl) { int i; Datalist* sublist; NCConstant con; con.filled = 0; ASSERT(tsym->objectclass == NC_TYPE); switch (tsym->subclass) { case NC_ENUM: case NC_OPAQUE: case NC_PRIM: con.nctype = tsym->typ.typecode; nc_getfill(&con); dlappend(dl,&con); break; case NC_COMPOUND: sublist = builddatalist(listlength(tsym->subnodes)); for(i=0;i<listlength(tsym->subnodes);i++) { Symbol* field = (Symbol*)listget(tsym->subnodes,i); filllist(field->typ.basetype,sublist); } con = builddatasublist(sublist); dlappend(dl,&con); break; case NC_VLEN: sublist = builddatalist(0); filllist(tsym->typ.basetype,sublist); /* generate a single instance*/ con = builddatasublist(sublist); dlappend(dl,&con); break; default: PANIC1("fill: unexpected subclass %d",tsym->subclass); } }
static void fill(Symbol* tvsym, Datalist* filler) { int i; Constant con; Datalist* sublist; /* NC_TYPE case*/ switch (tvsym->subclass) { case NC_ENUM: case NC_OPAQUE: case NC_PRIM: con.nctype = tvsym->typ.typecode; nc_getfill(&con); break; case NC_COMPOUND: sublist = builddatalist(listlength(tvsym->subnodes)); for(i=0;i<listlength(tvsym->subnodes);i++) { Symbol* field = (Symbol*)listget(tvsym->subnodes,i); if(field->typ.dimset.ndims > 0) { fillarray(field->typ.basetype,&field->typ.dimset,0,filler); } else filllist(field->typ.basetype,sublist); } con = builddatasublist(sublist); break; case NC_VLEN: sublist = builddatalist(0); filllist(tvsym->typ.basetype,sublist); /* generate a single instance*/ con = builddatasublist(sublist); break; default: PANIC1("fill: unexpected subclass %d",tvsym->subclass); } dlappend(filler,&con); }