isl_printer_print_qpolynomial: support proper isl output
authorSven Verdoolaege <skimo@kotnet.org>
Fri, 6 May 2011 13:33:38 +0000 (15:33 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Mon, 16 May 2011 16:01:22 +0000 (18:01 +0200)
That is, print description of the space associated to the isl_qpolynomial
in the isl format.

Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
isl_output.c

index 5912e16..95adf2b 100644 (file)
@@ -79,6 +79,16 @@ is now expressed as the domain of the resulting relation.
 
 =back
 
+=head3 Changes since isl-0.06
+
+=over
+
+=item * The format of C<isl_printer_print_qpolynomial>'s
+C<ISL_FORMAT_ISL> output has changed.
+Use C<ISL_FORMAT_C> to obtain the old output.
+
+=back
+
 =head1 Installation
 
 The source of C<isl> can be obtained either as a tarball
index 03f9e1b..274582e 100644 (file)
@@ -1479,7 +1479,7 @@ error:
        return NULL;
 }
 
-__isl_give isl_printer *isl_printer_print_qpolynomial(__isl_take isl_printer *p,
+static __isl_give isl_printer *print_qpolynomial(__isl_take isl_printer *p,
        __isl_keep isl_qpolynomial *qp)
 {
        if (!p || !qp)
@@ -1491,6 +1491,75 @@ error:
        return NULL;
 }
 
+static __isl_give isl_printer *print_qpolynomial_isl(__isl_take isl_printer *p,
+       __isl_keep isl_qpolynomial *qp)
+{
+       if (!p || !qp)
+               goto error;
+
+       if (isl_dim_size(qp->dim, isl_dim_param) > 0) {
+               p = print_tuple(qp->dim, p, isl_dim_param, 0, 0, NULL);
+               p = isl_printer_print_str(p, " -> ");
+       }
+       p = isl_printer_print_str(p, "{ ");
+       if (isl_dim_size(qp->dim, isl_dim_set) > 0 ||
+           isl_dim_is_named_or_nested(qp->dim, isl_dim_set)) {
+               p = print_dim(qp->dim, p, 1, 0, 0, NULL);
+               p = isl_printer_print_str(p, " -> ");
+       }
+       p = print_qpolynomial(p, qp);
+       p = isl_printer_print_str(p, " }");
+       return p;
+error:
+       isl_printer_free(p);
+       return NULL;
+}
+
+static __isl_give isl_printer *print_qpolynomial_c(__isl_take isl_printer *p,
+       __isl_keep isl_dim *dim, __isl_keep isl_qpolynomial *qp)
+{
+       isl_int den;
+
+       isl_int_init(den);
+       isl_qpolynomial_get_den(qp, &den);
+       if (!isl_int_is_one(den)) {
+               isl_qpolynomial *f;
+               p = isl_printer_print_str(p, "(");
+               qp = isl_qpolynomial_copy(qp);
+               f = isl_qpolynomial_rat_cst(isl_dim_copy(qp->dim),
+                                               den, qp->dim->ctx->one);
+               qp = isl_qpolynomial_mul(qp, f);
+       }
+       if (qp)
+               p = upoly_print(qp->upoly, dim, qp->div, p, 0);
+       if (!isl_int_is_one(den)) {
+               p = isl_printer_print_str(p, ")/");
+               p = isl_printer_print_isl_int(p, den);
+               isl_qpolynomial_free(qp);
+       }
+       isl_int_clear(den);
+       return p;
+}
+
+__isl_give isl_printer *isl_printer_print_qpolynomial(
+       __isl_take isl_printer *p, __isl_keep isl_qpolynomial *qp)
+{
+       if (!p || !qp)
+               goto error;
+
+       if (p->output_format == ISL_FORMAT_ISL)
+               return print_qpolynomial_isl(p, qp);
+       else if (p->output_format == ISL_FORMAT_C)
+               return print_qpolynomial_c(p, qp->dim, qp);
+       else
+               isl_die(qp->dim->ctx, isl_error_unsupported,
+                       "output format not supported for isl_qpolynomials",
+                       goto error);
+error:
+       isl_printer_free(p);
+       return NULL;
+}
+
 void isl_qpolynomial_print(__isl_keep isl_qpolynomial *qp, FILE *out,
        unsigned output_format)
 {
@@ -1518,7 +1587,7 @@ static __isl_give isl_printer *qpolynomial_fold_print(
        for (i = 0; i < fold->n; ++i) {
                if (i)
                        p = isl_printer_print_str(p, ", ");
-               p = isl_printer_print_qpolynomial(p, fold->qp[i]);
+               p = print_qpolynomial(p, fold->qp[i]);
        }
        p = isl_printer_print_str(p, ")");
        return p;
@@ -1553,7 +1622,7 @@ static __isl_give isl_printer *isl_pwqp_print_isl_body(
                        p = print_dim(pwqp->p[i].set->dim, p, 1, 0, 0, NULL);
                        p = isl_printer_print_str(p, " -> ");
                }
-               p = isl_printer_print_qpolynomial(p, pwqp->p[i].qp);
+               p = print_qpolynomial(p, pwqp->p[i].qp);
                p = print_disjuncts((isl_map *)pwqp->p[i].set, p, 1, 0);
        }
 
@@ -1790,32 +1859,6 @@ static __isl_give isl_printer *print_set_c(__isl_take isl_printer *p,
        return p;
 }
 
-static __isl_give isl_printer *print_qpolynomial_c(__isl_take isl_printer *p,
-       __isl_keep isl_dim *dim, __isl_keep isl_qpolynomial *qp)
-{
-       isl_int den;
-
-       isl_int_init(den);
-       isl_qpolynomial_get_den(qp, &den);
-       if (!isl_int_is_one(den)) {
-               isl_qpolynomial *f;
-               p = isl_printer_print_str(p, "(");
-               qp = isl_qpolynomial_copy(qp);
-               f = isl_qpolynomial_rat_cst(isl_dim_copy(qp->dim),
-                                               den, qp->dim->ctx->one);
-               qp = isl_qpolynomial_mul(qp, f);
-       }
-       if (qp)
-               p = upoly_print(qp->upoly, dim, qp->div, p, 0);
-       if (!isl_int_is_one(den)) {
-               p = isl_printer_print_str(p, ")/");
-               p = isl_printer_print_isl_int(p, den);
-               isl_qpolynomial_free(qp);
-       }
-       isl_int_clear(den);
-       return p;
-}
-
 static __isl_give isl_printer *print_pw_qpolynomial_c(
        __isl_take isl_printer *p, __isl_keep isl_pw_qpolynomial *pwqp)
 {