Ejemplo n.º 1
0
static void
gen_tf (const struct parse_tf *tf, FILE *out, FILE *f_strs, const array_t *arrs,
        int narrs)
{
    char *buf_deps, *buf_ports;
    size_t sz_deps, sz_ports;
    FILE *f_ports = open_memstream (&buf_ports, &sz_ports);
    FILE *f_deps = open_memstream (&buf_deps, &sz_deps);

    int start = ftell (out);
    struct tf hdr = {ftell (f_strs) + VALID_OFS, tf->nrules};

    if (tf->prefix) fwrite (tf->prefix, 1, strlen (tf->prefix) + 1, f_strs);
    else hdr.prefix = 0;
    fwrite (&hdr, sizeof hdr, 1, out);
    /* TODO: Alignment? */

    struct rule rules[hdr.nrules];
    memset (rules, 0, sizeof rules);

    int i = 0;
    for (struct parse_rule *r = tf->rules.head; r; r = r->next, i++) {
        struct rule *tmp = &rules[i];
        tmp->idx = r->idx;
        tmp->in = gen_ports (ARR (r->in), r->in.n, f_ports);
        tmp->out = gen_ports (ARR (r->out), r->out.n, f_ports);
        tmp->match = arr_find (r->match, arrs, narrs);
        tmp->mask = arr_find (r->mask, arrs, narrs);
        tmp->rewrite = arr_find (r->rewrite, arrs, narrs);
        if (r->deps.head) tmp->deps = gen_deps (&r->deps, f_deps, f_ports, arrs, narrs);
        //tmp->desc = barfoo;
    }
    fclose (f_ports);
    fclose (f_deps);

    qsort (rules, hdr.nrules, sizeof *rules, rule_cmp);
    fwrite (rules, hdr.nrules, sizeof *rules, out);

    hdr.map_ofs = ftell (out) - start;
    gen_map (out, &tf->in_map, rules, ARR_LEN (rules));

    hdr.ports_ofs = ftell (out) - start;
    fwrite (buf_ports, 1, sz_ports, out);
    free (buf_ports);

    hdr.deps_ofs = ftell (out) - start;
    fwrite (buf_deps, 1, sz_deps, out);
    free (buf_deps);

    int end = ftell (out);
    fseek (out, start, SEEK_SET);
    fwrite (&hdr, sizeof hdr, 1, out);
    fseek (out, end, SEEK_SET);
}
Ejemplo n.º 2
0
static uint32_t
gen_deps (struct list_parse_dep *deps, FILE *f_deps, FILE *f_ports,
          const array_t *arrs, int narrs)
{
    uint32_t n = deps->n;
    uint32_t ret = VALID_OFS + ftell (f_deps);
    fwrite (&n, sizeof n, 1, f_deps);
    for (struct parse_dep *dep = deps->head; dep; dep = dep->next) {
        struct dep tmp = {dep->rule};
        tmp.match = arr_find (dep->match, arrs, narrs);
        tmp.port = gen_ports (dep->ports, dep->nports, f_ports);
        fwrite (&tmp, sizeof tmp, 1, f_deps);
    }
    return ret;
}
Ejemplo n.º 3
0
void
GeneratorCCD::gen_ports(IR__::ComponentDef_ptr component) {

	// handle base component
	IR__::ComponentDef_var base = component->base_component();
	if(!CORBA::is_nil(base))
	{ 
		gen_ports(base);
	}

	// receptacles
	IR__::ContainedSeq_var contained_seq = component->contents(CORBA__::dk_Uses, false);
	CORBA::ULong len = contained_seq->length();
	CORBA::ULong i;
	for( i= 0; i < len; i++)
	{
		IR__::UsesDef_var a_uses = IR__::UsesDef::_narrow(((*contained_seq)[i]));
 
		out << "<uses usesname=\"";
		out << a_uses -> name();
		out << "\" repid=\"" ;
		out << IR__::InterfaceDef::_narrow(a_uses -> interface_type()) -> id();
		out << "\"/>\n";

	}

	// facets
	contained_seq = component->contents(CORBA__::dk_Provides, false);
	len = contained_seq->length();
	for( i= 0; i < len; i++)
	{
		IR__::ProvidesDef_var a_provides = IR__::ProvidesDef::_narrow(((*contained_seq)[i]));
 
		out << "<provides providesname=\"";
		out << a_provides -> name();
		out << "\" repid=\"" ;
		out << IR__::InterfaceDef::_narrow(a_provides -> interface_type()) -> id() << "\"" ;
		out << " facettag=\"" << facet_number_++ << "\"";
		out << "/>\n";
	}


	// emitters
	contained_seq = component->contents(CORBA__::dk_Emits, false);
	len = contained_seq->length();
	for( i= 0; i < len; i++)
	{
		IR__::EmitsDef_var a_emits = IR__::EmitsDef::_narrow(((*contained_seq)[i]));
 
		out << "<emits emitsname=\"";
		out << a_emits -> name();
		out << "\" eventtype=\"" ;
		out << a_emits -> event() -> id();
		out << "\">\n";
		out << "<eventpolicy policy=\"normal\"/>\n";
		out << "</emits>\n";
	}

	// publisher
	contained_seq = component->contents(CORBA__::dk_Publishes, false);
	len = contained_seq->length();
	for( i= 0; i < len; i++)
	{
		IR__::EventPortDef_var a_publishes = IR__::EventPortDef::_narrow(((*contained_seq)[i]));
 
		out << "<publishes publishesname=\"";
		out << a_publishes -> name();
		out << "\" eventtype=\"" ;
		out << a_publishes -> event() -> id();
		out << "\">\n";
		out << "<eventpolicy policy=\"normal\"/>\n";
		out << "</publishes>\n";
	}

	// consumer
	contained_seq = component->contents(CORBA__::dk_Consumes, false);
	len = contained_seq->length();
	for( i= 0; i < len; i++)
	{
		IR__::ConsumesDef_var a_consumes = IR__::ConsumesDef::_narrow(((*contained_seq)[i]));
 
		out << "<consumes consumesname=\"";
		out << a_consumes -> name();
		out << "\" eventtype=\"" ;
		out << a_consumes -> event () -> id();
		out << "\">\n";
		out << "<eventpolicy policy=\"normal\"/>\n";
		out << "</consumes>\n";
	}
}
Ejemplo n.º 4
0
//
// composition
//
void
GeneratorCCD::doComposition(CIDL::CompositionDef_ptr composition)
{
	filename_ = "";

	// check whether the descriptor has to be create elsewhere
	// for usage from project generator
	if (m_dir_prefix.length())
	{
		filename_ = m_dir_prefix;
	}

	std::string id = composition->id();
	IR__::Contained_ptr module_def = 0;
	std::string::size_type pos = id.find_last_of("/");
	if(pos != std::string::npos)
	{
		id.replace(pos, string::npos, ":1.0");
		module_def = repository_->lookup_id(id.c_str());
		filename_.append(getAbsoluteName(module_def, "_"));
		filename_.append("_");
	}
	
	// open output file
	filename_.append(composition->name());
	filename_.append(".ccd");
	out.open(filename_.c_str());

	out << "<?xml version = '1.0' ?>\n";
	out << "<!DOCTYPE corbacomponent PUBLIC \"-//OMG//DTD CORBA Component Descriptor\"";
	out << " \"http://www.qedo.org/corbacomponent.dtd\">\n\n";

	out << "<corbacomponent>\n";
	out.indent();
    out << "<corbaversion>3.0</corbaversion>\n";
	out << "<componentrepid repid=\"" << composition->ccm_component()->id() << "\"/>\n";
    out << "<homerepid repid=\"" << composition->ccm_home()->id() << "\"/>\n";
    
	out << "<componentkind>\n";
	out.indent();
	switch( composition->lifecycle() )
	{
	case CIDL::lc_Service: 
		out << "<service>\n";
		break;
	case CIDL::lc_Session: 
		out << "<session>\n";
		break;
	case CIDL::lc_Process: 
		out << "<process>\n";
		break;
	case CIDL::lc_Entity: 
		out << "<entity>\n";
		break;
	case CIDL::lc_Extension: 
		out << "<containerextension>\n";
		break;
	default : {}
	}
	out.indent();
    out << "<servant lifetime=\"container\"/>\n";
	out.unindent();
	switch( composition->lifecycle() )
	{
	case CIDL::lc_Service: 
		out << "</service>\n";
		break;
	case CIDL::lc_Session: 
		out << "</session>\n";
		break;
	case CIDL::lc_Process: 
		out << "</process>\n";
		break;
	case CIDL::lc_Entity: 
		out << "</entity>\n";
		break;
	case CIDL::lc_Extension: 
		out << "</containerextension>\n";
		break;
	default : {}
	}
	out.unindent();
    out << "</componentkind>\n";

    out << "<threading policy=\"multithread\"/>\n";
    out << "<configurationcomplete set=\"true\"/>\n\n";
	
	//<segment name="Seg" segmenttag="">
    //    <segmentmember facettag="the_fork"/>
    //</segment>

	out << "<homefeatures name=\"" << composition->ccm_home()->name();
	out << "\" repid=\"" << composition->ccm_home()->id() << "\">\n";
    out << "</homefeatures>\n\n";
    out << "<componentfeatures name=\"" << composition->ccm_component()->name();
	out << "\" repid=\"" << composition->ccm_component()->id() << "\">\n";
    out.indent();
	out << "<ports>\n";

	// manage ports
	out.indent();
	gen_ports(composition->ccm_component());

	//out << "        <provides providesname="the_fork" repid="IDL:dinner/Fork:1.0" facettag="the_fork"/>
    //        <provides providesname="the_name" repid="IDL:dinner/Named:1.0" facettag="the_name"/>
	out.unindent();
	out << "</ports>\n";
	out.unindent();
    out << "</componentfeatures>\n";
	out.unindent();
	out << "</corbacomponent>";

	// close file
	out.close();
}