Beispiel #1
0
static void
genbin_defineattr(Symbol* asym)
{
    Bytebuffer* databuf = bbNew();
    generator_reset(bin_generator,NULL);
    generate_attrdata(asym,bin_generator,(Writer)genbin_write,databuf);
}
Beispiel #2
0
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);
}
Beispiel #3
0
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);
        }
}
Beispiel #4
0
/* 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);
}
Beispiel #5
0
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);
}
Beispiel #6
0
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);
}
Beispiel #7
0
/*
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");
    }
}