add isl_qpolynomial_fold_scale_val
[platform/upstream/isl.git] / isl_printer.c
index 51e1f39..e0821f2 100644 (file)
@@ -13,6 +13,12 @@ static __isl_give isl_printer *file_end_line(__isl_take isl_printer *p)
        return p;
 }
 
+static __isl_give isl_printer *file_flush(__isl_take isl_printer *p)
+{
+       fflush(p->file);
+       return p;
+}
+
 static __isl_give isl_printer *file_print_str(__isl_take isl_printer *p,
        const char *s)
 {
@@ -20,6 +26,13 @@ static __isl_give isl_printer *file_print_str(__isl_take isl_printer *p,
        return p;
 }
 
+static __isl_give isl_printer *file_print_double(__isl_take isl_printer *p,
+       double d)
+{
+       fprintf(p->file, "%g", d);
+       return p;
+}
+
 static __isl_give isl_printer *file_print_int(__isl_take isl_printer *p, int i)
 {
        fprintf(p->file, "%d", i);
@@ -85,23 +98,49 @@ error:
 static __isl_give isl_printer *str_start_line(__isl_take isl_printer *p)
 {
        p = str_print_indent(p, p->indent);
-       p = str_print(p, p->prefix, strlen(p->prefix));
+       if (p->prefix)
+               p = str_print(p, p->prefix, strlen(p->prefix));
        return p;
 }
 
 static __isl_give isl_printer *str_end_line(__isl_take isl_printer *p)
 {
-       p = str_print(p, p->suffix, strlen(p->suffix));
+       if (p->suffix)
+               p = str_print(p, p->suffix, strlen(p->suffix));
        p = str_print(p, "\n", strlen("\n"));
        return p;
 }
 
+static __isl_give isl_printer *str_flush(__isl_take isl_printer *p)
+{
+       p->buf_n = 0;
+       return p;
+}
+
 static __isl_give isl_printer *str_print_str(__isl_take isl_printer *p,
        const char *s)
 {
        return str_print(p, s, strlen(s));
 }
 
+static __isl_give isl_printer *str_print_double(__isl_take isl_printer *p,
+       double d)
+{
+       int left = p->buf_size - p->buf_n;
+       int need = snprintf(p->buf + p->buf_n, left, "%g", d);
+       if (need >= left) {
+               if (grow_buf(p, need))
+                       goto error;
+               left = p->buf_size - p->buf_n;
+               need = snprintf(p->buf + p->buf_n, left, "%g", d);
+       }
+       p->buf_n += need;
+       return p;
+error:
+       isl_printer_free(p);
+       return NULL;
+}
+
 static __isl_give isl_printer *str_print_int(__isl_take isl_printer *p, int i)
 {
        int left = p->buf_size - p->buf_n;
@@ -124,42 +163,47 @@ static __isl_give isl_printer *str_print_isl_int(__isl_take isl_printer *p,
 {
        char *s;
        int len;
-       isl_int_print_gmp_free_t gmp_free;
 
-       s = mpz_get_str(0, 10, i);
+       s = isl_int_get_str(i);
        len = strlen(s);
        if (len < p->width)
                p = str_print_indent(p, p->width - len);
        p = str_print(p, s, len);
-       mp_get_memory_functions(NULL, NULL, &gmp_free);
-       (*gmp_free)(s, len + 1);
+       isl_int_free_str(s);
        return p;
 }
 
 struct isl_printer_ops {
        __isl_give isl_printer *(*start_line)(__isl_take isl_printer *p);
        __isl_give isl_printer *(*end_line)(__isl_take isl_printer *p);
+       __isl_give isl_printer *(*print_double)(__isl_take isl_printer *p,
+               double d);
        __isl_give isl_printer *(*print_int)(__isl_take isl_printer *p, int i);
        __isl_give isl_printer *(*print_isl_int)(__isl_take isl_printer *p,
                                                isl_int i);
        __isl_give isl_printer *(*print_str)(__isl_take isl_printer *p,
                                                const char *s);
+       __isl_give isl_printer *(*flush)(__isl_take isl_printer *p);
 };
 
 static struct isl_printer_ops file_ops = {
        file_start_line,
        file_end_line,
+       file_print_double,
        file_print_int,
        file_print_isl_int,
-       file_print_str
+       file_print_str,
+       file_flush
 };
 
 static struct isl_printer_ops str_ops = {
        str_start_line,
        str_end_line,
+       str_print_double,
        str_print_int,
        str_print_isl_int,
-       str_print_str
+       str_print_str,
+       str_flush
 };
 
 __isl_give isl_printer *isl_printer_to_file(isl_ctx *ctx, FILE *file)
@@ -196,6 +240,7 @@ __isl_give isl_printer *isl_printer_to_str(isl_ctx *ctx)
        if (!p->buf)
                goto error;
        p->buf_n = 0;
+       p->buf[0] = '\0';
        p->buf_size = 256;
        p->indent = 0;
        p->output_format = ISL_FORMAT_ISL;
@@ -209,13 +254,30 @@ error:
        return NULL;
 }
 
-void isl_printer_free(__isl_take isl_printer *p)
+void *isl_printer_free(__isl_take isl_printer *p)
 {
        if (!p)
-               return;
+               return NULL;
        free(p->buf);
        isl_ctx_deref(p->ctx);
        free(p);
+
+       return NULL;
+}
+
+isl_ctx *isl_printer_get_ctx(__isl_keep isl_printer *printer)
+{
+       return printer ? printer->ctx : NULL;
+}
+
+FILE *isl_printer_get_file(__isl_keep isl_printer *printer)
+{
+       if (!printer)
+               return NULL;
+       if (!printer->file)
+               isl_die(isl_printer_get_ctx(printer), isl_error_invalid,
+                       "not a file printer", return NULL);
+       return printer->file;
 }
 
 __isl_give isl_printer *isl_printer_set_isl_int_width(__isl_take isl_printer *p,
@@ -240,6 +302,19 @@ __isl_give isl_printer *isl_printer_set_indent(__isl_take isl_printer *p,
        return p;
 }
 
+__isl_give isl_printer *isl_printer_indent(__isl_take isl_printer *p,
+       int indent)
+{
+       if (!p)
+               return NULL;
+
+       p->indent += indent;
+       if (p->indent < 0)
+               p->indent = 0;
+
+       return p;
+}
+
 __isl_give isl_printer *isl_printer_set_prefix(__isl_take isl_printer *p,
        const char *prefix)
 {
@@ -273,30 +348,63 @@ __isl_give isl_printer *isl_printer_set_output_format(__isl_take isl_printer *p,
        return p;
 }
 
+int isl_printer_get_output_format(__isl_keep isl_printer *p)
+{
+       if (!p)
+               return -1;
+       return p->output_format;
+}
+
 __isl_give isl_printer *isl_printer_print_str(__isl_take isl_printer *p,
        const char *s)
 {
+       if (!p)
+               return NULL;
+       if (!s)
+               return isl_printer_free(p);
+
        return p->ops->print_str(p, s);
 }
 
+__isl_give isl_printer *isl_printer_print_double(__isl_take isl_printer *p,
+       double d)
+{
+       if (!p)
+               return NULL;
+
+       return p->ops->print_double(p, d);
+}
+
 __isl_give isl_printer *isl_printer_print_int(__isl_take isl_printer *p, int i)
 {
+       if (!p)
+               return NULL;
+
        return p->ops->print_int(p, i);
 }
 
 __isl_give isl_printer *isl_printer_print_isl_int(__isl_take isl_printer *p,
        isl_int i)
 {
+       if (!p)
+               return NULL;
+
        return p->ops->print_isl_int(p, i);
 }
 
 __isl_give isl_printer *isl_printer_start_line(__isl_take isl_printer *p)
 {
+       if (!p)
+               return NULL;
+
        return p->ops->start_line(p);
 }
 
 __isl_give isl_printer *isl_printer_end_line(__isl_take isl_printer *p)
 {
+       if (!p)
+               return NULL;
+
        return p->ops->end_line(p);
 }
 
@@ -306,3 +414,11 @@ char *isl_printer_get_str(__isl_keep isl_printer *printer)
                return NULL;
        return strdup(printer->buf);
 }
+
+__isl_give isl_printer *isl_printer_flush(__isl_take isl_printer *p)
+{
+       if (!p)
+               return NULL;
+
+       return p->ops->flush(p);
+}