Beispiel #1
0
static void
pgf_print_cncfun(PgfCncFun *cncfun, PgfSequences *sequences, 
					GuWriter *wtr, GuExn *err)
{
	gu_printf(wtr,err,"    F%d := (", cncfun->funid);
	
	size_t n_seqs = gu_list_length(sequences);
	
	for (size_t i = 0; i < cncfun->n_lins; i++) {
		if (i > 0) gu_putc(',', wtr, err);
		PgfSequence seq = cncfun->lins[i];

		for (size_t seqid = 0; seqid < n_seqs; seqid++) {
			if (gu_seq_data(gu_list_index(sequences, seqid)) == gu_seq_data(seq)) {
				gu_printf(wtr,err,"S%d", seqid);
				break;
			}
		}
	}
	
	gu_puts(") [", wtr, err);
	gu_string_write(cncfun->name, wtr, err);
	gu_puts("]\n", wtr, err);
}
Beispiel #2
0
Datei: reader.c Projekt: k0001/GF
static PgfAbsFun*
pgf_read_absfun(PgfReader* rdr, PgfAbstr* abstr, PgfAbsFun* absfun)
{
	size_t len = pgf_read_len(rdr);

	PgfExprFun *efun =
		gu_new_flex_variant(PGF_EXPR_FUN,
							PgfExprFun,
							fun, len+1,
							&absfun->ep.expr, rdr->opool);
	gu_in_bytes(rdr->in, (uint8_t*)efun->fun, len, rdr->err);
	efun->fun[len] = 0;
	absfun->name = efun->fun;

	gu_return_on_exn(rdr->err, NULL);

	absfun->type = pgf_read_type_(rdr);
	gu_return_on_exn(rdr->err, NULL);

	absfun->arity = pgf_read_int(rdr);

	uint8_t tag = pgf_read_tag(rdr);
	gu_return_on_exn(rdr->err, NULL);
	switch (tag) {
	case 0:
		absfun->defns = NULL;
		if (absfun->arity == 0) {
			absfun->closure.code = abstr->eval_gates->evaluate_value;
			absfun->closure.con  = &absfun->closure.code;
		} else {
			absfun->closure.code = NULL;
		}
		break;
	case 1: {
        size_t length = pgf_read_len(rdr);
        gu_return_on_exn(rdr->err, NULL);

        absfun->defns = gu_new_seq(PgfEquation*, length, rdr->opool);
        PgfEquation** data = gu_seq_data(absfun->defns);
        for (size_t i = 0; i < length; i++) {
            size_t n_patts = pgf_read_len(rdr);
            gu_return_on_exn(rdr->err, NULL);

            PgfEquation *equ =
                gu_malloc(rdr->opool, 
                          sizeof(PgfEquation)+sizeof(PgfPatt)*n_patts);
            equ->n_patts = n_patts;
            for (size_t j = 0; j < n_patts; j++) {
                equ->patts[j] = pgf_read_patt(rdr);
                gu_return_on_exn(rdr->err, NULL);
            }
            equ->body = pgf_read_expr_(rdr);
            gu_return_on_exn(rdr->err, NULL);

            data[i] = equ;
        }
        
       	// pgf_jit_function(rdr, abstr, absfun);
		break;
    }
	default:
		pgf_read_tag_error(rdr);
		break;
	}

	absfun->ep.prob = - log(pgf_read_double(rdr));

	return absfun;
}