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)
{
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);
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;
{
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)
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;
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,
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)
{
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);
}
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);
+}