From 0ecb20e49ca68af134a5c65eea6e2cf8327e2ca9 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Thu, 14 Aug 2008 16:09:11 +0200 Subject: [PATCH] add isl_basic_set_read_from_file --- Makefile.am | 1 + include/isl_int.h | 1 + include/isl_set.h | 3 +++ isl_input.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ isl_map.c | 12 +++++++++ isl_map_private.h | 4 +++ 6 files changed, 97 insertions(+) create mode 100644 isl_input.c diff --git a/Makefile.am b/Makefile.am index d074a3f..7008290 100644 --- a/Makefile.am +++ b/Makefile.am @@ -38,6 +38,7 @@ libisl_la_SOURCES = \ isl_equalities.c \ isl_equalities.h \ isl_gmp.c \ + isl_input.c \ isl_int.h \ isl_lp.h \ isl_lp.c \ diff --git a/include/isl_int.h b/include/isl_int.h index 770e0d1..27ddc65 100644 --- a/include/isl_int.h +++ b/include/isl_int.h @@ -39,6 +39,7 @@ typedef mpz_t isl_int; #define isl_int_cdiv_q(r,i,j) mpz_cdiv_q(r,i,j) #define isl_int_fdiv_q(r,i,j) mpz_fdiv_q(r,i,j) +#define isl_int_read(r,s) mpz_set_str(r,s,10) #define isl_int_print(out,i) \ do { \ char *s; \ diff --git a/include/isl_set.h b/include/isl_set.h index 7ab4f2e..501ca30 100644 --- a/include/isl_set.h +++ b/include/isl_set.h @@ -82,6 +82,9 @@ struct isl_basic_set *isl_basic_set_affine_hull(struct isl_ctx *ctx, struct isl_basic_set *bset); struct isl_basic_set *isl_basic_set_simplify( struct isl_ctx *ctx, struct isl_basic_set *bset); +#define ISL_FORMAT_POLYLIB 1 +struct isl_basic_set *isl_basic_set_read_from_file(struct isl_ctx *ctx, + FILE *input, unsigned input_format); struct isl_set *isl_basic_set_lexmin(struct isl_ctx *ctx, struct isl_basic_set *bset); diff --git a/isl_input.c b/isl_input.c new file mode 100644 index 0000000..94d6252 --- /dev/null +++ b/isl_input.c @@ -0,0 +1,76 @@ +#include +#include +#include +#include "isl_map_private.h" + +static char *next_line(FILE *input, char *line, unsigned len) +{ + char *p; + + do { + if (!(p = fgets(line, len, input))) + return NULL; + while (isspace(*p) && *p != '\n') + ++p; + } while (*p == '#' || *p == '\n'); + + return p; +} + +struct isl_basic_set *isl_basic_set_read_from_file(struct isl_ctx *ctx, + FILE *input, unsigned input_format) +{ + struct isl_basic_set *bset = NULL; + int i, j; + unsigned n_row, n_col; + unsigned dim; + char line[1024]; + char val[1024]; + char *p; + + isl_assert(ctx, input_format == ISL_FORMAT_POLYLIB, return NULL); + isl_assert(ctx, next_line(input, line, sizeof(line)), return NULL); + isl_assert(ctx, sscanf(line, "%u %u", &n_row, &n_col) == 2, return NULL); + isl_assert(ctx, n_col >= 2, return NULL); + dim = n_col - 2; + bset = isl_basic_set_alloc(ctx, 0, dim, 0, n_row, n_row); + if (!bset) + return NULL; + for (i = 0; i < n_row; ++i) { + int type; + int offset; + int n; + int k; + isl_int *c; + + p = next_line(input, line, sizeof(line)); + isl_assert(ctx, p, goto error); + n = sscanf(p, "%u%n", &type, &offset); + isl_assert(ctx, n != 0, goto error); + p += offset; + isl_assert(ctx, type == 0 || type == 1, goto error); + if (type == 0) { + k = isl_basic_set_alloc_equality(ctx, bset); + c = bset->eq[k]; + } else { + k = isl_basic_set_alloc_inequality(ctx, bset); + c = bset->ineq[k]; + } + isl_assert(ctx, k >= 0, goto error); + for (j = 0; j < dim; ++j) { + n = sscanf(p, "%s%n", val, &offset); + isl_assert(ctx, n != 0, goto error); + isl_int_read(c[1+j], val); + p += offset; + } + n = sscanf(p, "%s%n", val, &offset); + isl_assert(ctx, n != 0, goto error); + isl_int_read(c[0], val); + } + bset = isl_basic_set_simplify(ctx, bset); + bset = isl_basic_set_finalize(ctx, bset); + return bset; +error: + isl_basic_set_free(ctx, bset); + return NULL; +} diff --git a/isl_map.c b/isl_map.c index 8e5781c..21a2fce 100644 --- a/isl_map.c +++ b/isl_map.c @@ -231,6 +231,12 @@ int isl_basic_map_alloc_equality(struct isl_ctx *ctx, return bmap->n_eq++; } +int isl_basic_set_alloc_equality(struct isl_ctx *ctx, + struct isl_basic_set *bset) +{ + return isl_basic_map_alloc_equality(ctx, (struct isl_basic_map *)bset); +} + int isl_basic_map_free_equality(struct isl_ctx *ctx, struct isl_basic_map *bmap, unsigned n) { @@ -276,6 +282,12 @@ int isl_basic_map_alloc_inequality(struct isl_ctx *ctx, return bmap->n_ineq++; } +int isl_basic_set_alloc_inequality(struct isl_ctx *ctx, + struct isl_basic_set *bset) +{ + return isl_basic_map_alloc_inequality(ctx, (struct isl_basic_map *)bset); +} + int isl_basic_map_free_inequality(struct isl_ctx *ctx, struct isl_basic_map *bmap, unsigned n) { diff --git a/isl_map_private.h b/isl_map_private.h index e6394e1..f57763f 100644 --- a/isl_map_private.h +++ b/isl_map_private.h @@ -3,8 +3,12 @@ int isl_basic_map_alloc_equality(struct isl_ctx *ctx, struct isl_basic_map *bmap); +int isl_basic_set_alloc_equality(struct isl_ctx *ctx, + struct isl_basic_set *bset); int isl_basic_map_free_equality(struct isl_ctx *ctx, struct isl_basic_map *bmap, unsigned n); +int isl_basic_set_alloc_inequality(struct isl_ctx *ctx, + struct isl_basic_set *bset); int isl_basic_map_alloc_inequality(struct isl_ctx *ctx, struct isl_basic_map *bmap); int isl_basic_map_free_inequality(struct isl_ctx *ctx, -- 2.7.4