static void genbin_defineattr(Symbol* asym) { Bytebuffer* databuf = bbNew(); generator_reset(bin_generator,NULL); generate_attrdata(asym,bin_generator,(Writer)genbin_write,databuf); }
static void test_specific_type(Generator *gen, const char *input) { uint32_t j, n; char c, *s; if (!input[strspn(input, "0123456789")]) { generator_seed_str(gen, input, 10); generator_reset(gen); j = 0; n = 0; s = NULL; do { c = generator_step(gen); if (j >= n) { n = n ? (n * 2) : 128; s = realloc(s, n); assert(s); } s[j++] = c; } while (c); } else { s = strdup(input); assert(s); } printf("Test '%s'..\n", s); test_type(s); free(s); }
static void test_basic_set(Generator *gen) { uint32_t i, j, n; char c, *s; printf("Test standard set of 8k variants..\n"); for (i = 0; i < 8192; ++i) { generator_seed_u32(gen, i); generator_reset(gen); j = 0; n = 0; s = NULL; do { c = generator_step(gen); if (j >= n) { n = n ? (n * 2) : 128; s = realloc(s, n); assert(s); } s[j++] = c; } while (c); printf(" %u: %s\n", i, s); test_type(s); free(s); } }
/* Following is patterned after the walk functions in semantics.c */ static void genbin_definevardata(Symbol* vsym) { Bytebuffer* databuf; if(vsym->data == NULL) return; databuf = bbNew(); generator_reset(bin_generator,NULL); generate_vardata(vsym,bin_generator,(Writer)genbin_write,databuf); }
static void genj_definevardata(Symbol* vsym) { Bytebuffer* code; /* capture so we can dump vlens first */ if(vsym->data == NULL) return; code = bbNew(); generator_reset(j_generator,NULL); generate_vardata(vsym,j_generator,(Writer)genj_write,code); bbFree(code); }
static void genj_defineattr(Symbol* asym) { Bytebuffer* code; /* capture so we can dump vlens first */ ASSERT(asym->data != NULL); code = bbNew(); generator_reset(j_generator,NULL); generate_attrdata(asym,j_generator,(Writer)genj_write,code); bbFree(code); }
/* Generate type definitions */ static void genbin_deftype(Symbol* tsym) { int i,stat; ASSERT(tsym->objectclass == NC_TYPE); switch (tsym->subclass) { case NC_PRIM: break; /* these are already taken care of*/ case NC_OPAQUE: stat = nc_def_opaque(tsym->container->ncid, tsym->typ.size, tsym->name, &tsym->ncid); check_err(stat,__LINE__,__FILE__); break; case NC_ENUM: { Bytebuffer* datum; Datalist* ecdl; stat = nc_def_enum(tsym->container->ncid, tsym->typ.basetype->typ.typecode, tsym->name, &tsym->ncid); check_err(stat,__LINE__,__FILE__); datum = bbNew(); ecdl = builddatalist(1); dlextend(ecdl); /* make room for one constant*/ ecdl->length = 1; for(i=0;i<listlength(tsym->subnodes);i++) { Symbol* econst = (Symbol*)listget(tsym->subnodes,i); ASSERT(econst->subclass == NC_ECONST); generator_reset(bin_generator,NULL); bbClear(datum); generate_basetype(econst->typ.basetype,&econst->typ.econst,datum,NULL,bin_generator); stat = nc_insert_enum(tsym->container->ncid, tsym->ncid, econst->name, bbContents(datum)); check_err(stat,__LINE__,__FILE__); } bbFree(datum); dlfree(&ecdl); } break; case NC_VLEN: stat = nc_def_vlen(tsym->container->ncid, tsym->name, tsym->typ.basetype->ncid, &tsym->ncid); check_err(stat,__LINE__,__FILE__); break; case NC_COMPOUND: stat = nc_def_compound(tsym->container->ncid, tsym->typ.size, tsym->name, &tsym->ncid); check_err(stat,__LINE__,__FILE__); for(i=0;i<listlength(tsym->subnodes);i++) { Symbol* efield = (Symbol*)listget(tsym->subnodes,i); ASSERT(efield->subclass == NC_FIELD); if(efield->typ.dimset.ndims == 0){ stat = nc_insert_compound( tsym->container->ncid, tsym->ncid, efield->name, efield->typ.offset, efield->typ.basetype->ncid); } else { int j; int dimsizes[NC_MAX_VAR_DIMS]; /* Generate the field dimension constants*/ for(j=0;j<efield->typ.dimset.ndims;j++) { unsigned int size = efield->typ.dimset.dimsyms[j]->dim.declsize; dimsizes[j] = size; } stat = nc_insert_array_compound( tsym->container->ncid, tsym->ncid, efield->name, efield->typ.offset, efield->typ.basetype->ncid, efield->typ.dimset.ndims, dimsizes); } check_err(stat,__LINE__,__FILE__); } break; default: panic("definectype: unexpected type subclass"); } }