add isl_basic_set_read_from_file
authorSven Verdoolaege <skimo@kotnet.org>
Thu, 14 Aug 2008 14:09:11 +0000 (16:09 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Mon, 25 Aug 2008 08:15:07 +0000 (10:15 +0200)
Makefile.am
include/isl_int.h
include/isl_set.h
isl_input.c [new file with mode: 0644]
isl_map.c
isl_map_private.h

index d074a3f..7008290 100644 (file)
@@ -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 \
index 770e0d1..27ddc65 100644 (file)
@@ -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;                                                \
index 7ab4f2e..501ca30 100644 (file)
@@ -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 (file)
index 0000000..94d6252
--- /dev/null
@@ -0,0 +1,76 @@
+#include <ctype.h>
+#include <stdio.h>
+#include <isl_set.h>
+#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;
+}
index 8e5781c..21a2fce 100644 (file)
--- 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)
 {
index e6394e1..f57763f 100644 (file)
@@ -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,