add isl_set_read_from_file for reading unions of polyhedra (in polylib format)
[platform/upstream/isl.git] / isl_input.c
1 #include <ctype.h>
2 #include <stdio.h>
3 #include <isl_set.h>
4 #include "isl_map_private.h"
5 #include "isl_input_omega.h"
6
7 static char *next_line(FILE *input, char *line, unsigned len)
8 {
9         char *p;
10
11         do {
12                 if (!(p = fgets(line, len, input)))
13                         return NULL;
14                 while (isspace(*p) && *p != '\n')
15                         ++p;
16         } while (*p == '#' || *p == '\n');
17
18         return p;
19 }
20
21 static struct isl_basic_set *isl_basic_set_read_from_file_polylib(
22                 struct isl_ctx *ctx, FILE *input)
23 {
24         struct isl_basic_set *bset = NULL;
25         int i, j;
26         unsigned n_row, n_col;
27         unsigned dim;
28         char line[1024];
29         char val[1024];
30         char *p;
31
32         isl_assert(ctx, next_line(input, line, sizeof(line)), return NULL);
33         isl_assert(ctx, sscanf(line, "%u %u", &n_row, &n_col) == 2, return NULL);
34         isl_assert(ctx, n_col >= 2, return NULL);
35         dim = n_col - 2;
36         bset = isl_basic_set_alloc(ctx, 0, dim, 0, n_row, n_row);
37         if (!bset)
38                 return NULL;
39         for (i = 0; i < n_row; ++i) {
40                 int type;
41                 int offset;
42                 int n;
43                 int k;
44                 isl_int *c;
45
46                 p = next_line(input, line, sizeof(line));
47                 isl_assert(ctx, p, goto error);
48                 n = sscanf(p, "%u%n", &type, &offset);
49                 isl_assert(ctx, n != 0, goto error);
50                 p += offset;
51                 isl_assert(ctx, type == 0 || type == 1, goto error);
52                 if (type == 0) {
53                         k = isl_basic_set_alloc_equality(ctx, bset);
54                         c = bset->eq[k];
55                 } else {
56                         k = isl_basic_set_alloc_inequality(ctx, bset);
57                         c = bset->ineq[k];
58                 }
59                 isl_assert(ctx, k >= 0, goto error);
60                 for (j = 0; j < dim; ++j) {
61                         n = sscanf(p, "%s%n", val, &offset);
62                         isl_assert(ctx, n != 0, goto error);
63                         isl_int_read(c[1+j], val);
64                         p += offset;
65                 }
66                 n = sscanf(p, "%s%n", val, &offset);
67                 isl_assert(ctx, n != 0, goto error);
68                 isl_int_read(c[0], val);
69         }
70         bset = isl_basic_set_simplify(ctx, bset);
71         bset = isl_basic_set_finalize(ctx, bset);
72         return bset;
73 error:
74         isl_basic_set_free(ctx, bset);
75         return NULL;
76 }
77
78 static struct isl_set *isl_set_read_from_file_polylib(
79                 struct isl_ctx *ctx, FILE *input)
80 {
81         struct isl_set *set = NULL;
82         char line[1024];
83         int i;
84         unsigned n;
85
86         isl_assert(ctx, next_line(input, line, sizeof(line)), return NULL);
87         isl_assert(ctx, sscanf(line, "%u", &n) == 1, return NULL);
88
89         set = isl_set_alloc(ctx, 0, 0, n, 0);
90         if (!set)
91                 return NULL;
92         if (n == 0)
93                 return set;
94         for (i = 0; i < n; ++i) {
95                 set->p[i] = isl_basic_set_read_from_file_polylib(ctx, input);
96                 if (!set->p[i])
97                         goto error;
98         }
99         set->n = n;
100         set->dim = set->p[0]->dim;
101         for (i = 1; i < n; ++i)
102                 isl_assert(ctx, set->dim == set->p[i]->dim, goto error);
103         return set;
104 error:
105         isl_set_free(ctx, set);
106         return NULL;
107 }
108
109 struct isl_basic_set *isl_basic_set_read_from_file(struct isl_ctx *ctx,
110                 FILE *input, unsigned input_format)
111 {
112         if (input_format == ISL_FORMAT_POLYLIB)
113                 return isl_basic_set_read_from_file_polylib(ctx, input);
114         else if (input_format == ISL_FORMAT_OMEGA)
115                 return isl_basic_set_read_from_file_omega(ctx, input);
116         else
117                 isl_assert(ctx, 0, return NULL);
118 }
119
120 struct isl_basic_map *isl_basic_map_read_from_file(struct isl_ctx *ctx,
121                 FILE *input, unsigned input_format)
122 {
123         if (input_format == ISL_FORMAT_OMEGA)
124                 return isl_basic_map_read_from_file_omega(ctx, input);
125         else
126                 isl_assert(ctx, 0, return NULL);
127 }
128
129 struct isl_set *isl_set_read_from_file(struct isl_ctx *ctx,
130                 FILE *input, unsigned input_format)
131 {
132         if (input_format == ISL_FORMAT_POLYLIB)
133                 return isl_set_read_from_file_polylib(ctx, input);
134         else
135                 isl_assert(ctx, 0, return NULL);
136 }