示例#1
0
expression_db_t*
merge_expression_dbs (expression_db_t *edb1, expression_db_t *edb2)
{
    while (edb2 != 0)
    {
	expression_db_t *e = lookup(edb1, edb2->name, edb2->kind);

	if (e != 0)
	{
	    switch (edb2->kind)
	    {
		case EXPRESSION_DB_EXPRESSION :
		case EXPRESSION_DB_DESIGN :
		    edb1 = remove_expression_db(edb1, e);
		    edb1 = insert_expression_db(edb1, copy_expression(edb2));
		    break;

		case EXPRESSION_DB_GROUP :
		    e->v.group.subs = merge_expression_dbs(e->v.group.subs, edb2->v.group.subs);
		    break;

		default :
		    g_assert_not_reached();
		    break;
	    }
	}
	else
	{
	    switch (edb2->kind)
	    {
		case EXPRESSION_DB_EXPRESSION :
		case EXPRESSION_DB_DESIGN :
		    edb1 = insert_expression_db(edb1, copy_expression(edb2));
		    break;

		case EXPRESSION_DB_GROUP :
		    e = new_expression_db(EXPRESSION_DB_GROUP);

		    e->name = strdup(edb2->name);
		    assert(e->name != 0);

		    edb1 = insert_expression_db(edb1, e);
		    e->v.group.subs = merge_expression_dbs(0, edb2->v.group.subs);
		    break;

		default :
		    g_assert_not_reached();
		    break;
	    }
	}

	edb2 = edb2->next;
    }

    return edb1;
}
示例#2
0
expression_db_t*
copy_expression_db (expression_db_t *edb)
{
    expression_db_t *head = NULL;
    expression_db_t *last = NULL;

    while (edb != NULL)
    {
	expression_db_t *copy;

	if (edb->kind == EXPRESSION_DB_GROUP)
	    copy = make_expression_db_group(edb->name, copy_expression_db(edb->v.group.subs));
	else
	    copy = copy_expression(edb);

	if (last == NULL)
	{
	    g_assert(head == NULL);
	    head = last = copy;
	}
	else
	    last = last->next = copy;

	edb = edb->next;
    }

    return head;
}
struct lambda_expression *
abbreviation_lookup(const char *id)
{
	struct lambda_expression *r = NULL;
	void *p = lookup_key(abbr_table, id);
	if (p) r = copy_expression(p);
	return r;
}