isl_basic_map_is_empty: don't compute sample for rational sets
[isl.git] / isl_input.c
blob1606dcdb1bad2b8bdba233804c36a7febfa94c78
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"
7 static char *next_line(FILE *input, char *line, unsigned len)
9 char *p;
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');
18 return p;
21 static struct isl_basic_set *isl_basic_set_read_from_file_polylib(
22 struct isl_ctx *ctx, FILE *input, unsigned nparam)
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;
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 - nparam;
36 bset = isl_basic_set_alloc(ctx, nparam, 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;
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(bset);
54 c = bset->eq[k];
55 } else {
56 k = isl_basic_set_alloc_inequality(bset);
57 c = bset->ineq[k];
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+nparam+j], val);
64 p += offset;
66 for (j = 0; j < nparam; ++j) {
67 n = sscanf(p, "%s%n", val, &offset);
68 isl_assert(ctx, n != 0, goto error);
69 isl_int_read(c[1+j], val);
70 p += offset;
72 n = sscanf(p, "%s%n", val, &offset);
73 isl_assert(ctx, n != 0, goto error);
74 isl_int_read(c[0], val);
76 bset = isl_basic_set_simplify(bset);
77 bset = isl_basic_set_finalize(bset);
78 return bset;
79 error:
80 isl_basic_set_free(bset);
81 return NULL;
84 static struct isl_set *isl_set_read_from_file_polylib(
85 struct isl_ctx *ctx, FILE *input, unsigned nparam)
87 struct isl_set *set = NULL;
88 char line[1024];
89 int i;
90 unsigned n;
92 isl_assert(ctx, next_line(input, line, sizeof(line)), return NULL);
93 isl_assert(ctx, sscanf(line, "%u", &n) == 1, return NULL);
95 set = isl_set_alloc(ctx, nparam, 0, n, 0);
96 if (!set)
97 return NULL;
98 if (n == 0)
99 return set;
100 for (i = 0; i < n; ++i) {
101 set->p[i] = isl_basic_set_read_from_file_polylib(ctx, input,
102 nparam);
103 if (!set->p[i])
104 goto error;
106 set->n = n;
107 set->dim = set->p[0]->dim;
108 for (i = 1; i < n; ++i)
109 isl_assert(ctx, set->dim == set->p[i]->dim, goto error);
110 return set;
111 error:
112 isl_set_free(set);
113 return NULL;
116 struct isl_basic_set *isl_basic_set_read_from_file(struct isl_ctx *ctx,
117 FILE *input, unsigned nparam, unsigned input_format)
119 if (input_format == ISL_FORMAT_POLYLIB)
120 return isl_basic_set_read_from_file_polylib(ctx, input, nparam);
121 else if (input_format == ISL_FORMAT_OMEGA) {
122 isl_assert(ctx, nparam == 0, return NULL);
123 return isl_basic_set_read_from_file_omega(ctx, input);
124 } else
125 isl_assert(ctx, 0, return NULL);
128 struct isl_basic_map *isl_basic_map_read_from_file(struct isl_ctx *ctx,
129 FILE *input, unsigned nparam, unsigned input_format)
131 if (input_format == ISL_FORMAT_OMEGA)
132 return isl_basic_map_read_from_file_omega(ctx, input);
133 else
134 isl_assert(ctx, 0, return NULL);
137 struct isl_set *isl_set_read_from_file(struct isl_ctx *ctx,
138 FILE *input, unsigned nparam, unsigned input_format)
140 if (input_format == ISL_FORMAT_POLYLIB)
141 return isl_set_read_from_file_polylib(ctx, input, nparam);
142 else
143 isl_assert(ctx, 0, return NULL);