+static void mangle_namespace(entity_t *entity)
+{
+ for (entity_t *e = entity->base.parent_entity; e != NULL;
+ e = e->base.parent_entity) {
+ /* TODO: we need something similar (or the same?) for classes */
+ if (e->kind == ENTITY_NAMESPACE) {
+ mangle_namespace(e);
+ print_name(e->base.symbol->string);
+ return;
+ }
+ }
+}
+
+static void mangle_entity(entity_t *entity)
+{
+ obstack_1grow(&obst, '_');
+ obstack_1grow(&obst, 'Z');
+
+ if (entity->base.parent_entity != NULL) {
+ obstack_1grow(&obst, 'N');
+ mangle_namespace(entity);
+ }
+
+ print_name(entity->base.symbol->string);
+
+ if (entity->kind == ENTITY_FUNCTION) {
+ mangle_parameters(&entity->declaration.type->function);
+ }
+}
+
+static ident *make_id_from_obst(void)
+{
+ size_t size = obstack_object_size(&obst);
+ char *str = obstack_finish(&obst);
+ ident *id = new_id_from_chars(str, size);
+ obstack_free(&obst, str);
+ return id;
+}