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; }
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; }