+ if (self->dump_finish_children)
+ self->dump_finish_children(self, id);
+} /* pattern_finish_children */
+
+/*
+ * Finish the the dumper.
+ */
+void pattern_end(pattern_dumper_t *self)
+{
+ if (self->dump_end)
+ self->dump_end(self);
+
+ free(self);
+} /* pattern_end */
+
+/**
+ * pattern dumper factory for text dumper
+ */
+pattern_dumper_t *new_text_dumper(void)
+{
+ pattern_dumper_t *res = malloc(sizeof(*res));
+
+ if (res) {
+ memcpy(res, &stdout_dump, sizeof(*res));
+ res->data = stdout;
+
+ if (res->dump_start)
+ res->dump_start(res);
+ } /* if */
+ return res;
+} /* new_text_dumper */
+
+/**
+ * pattern dumper factory for vcg dumper
+ */
+pattern_dumper_t *new_vcg_dumper(const char *vcg_name, unsigned max_pattern)
+{
+ pattern_dumper_t *res = malloc(sizeof(*res) + sizeof(vcg_private_t));
+ vcg_private_t *priv;
+
+ if (res) {
+ FILE *f;
+
+ memcpy(res, &vcg_dump, sizeof(*res));
+
+ priv = (vcg_private_t *)(res + 1);
+ memset(priv, 0, sizeof(*priv));
+
+ f = fopen(vcg_name, "w");
+ priv->f = f;
+ priv->pattern_id = 0;
+ priv->max_pattern = max_pattern ? max_pattern : (unsigned)-1;
+ res->data = priv;
+
+ if (res->dump_start)
+ res->dump_start(res);
+ } /* if */
+
+ return res;
+} /* new_vcg_dumper */
+
+#endif /* FIRM_STATISTICS */