5 #include <isl_stream.h>
6 #include <isl_obj_list.h>
7 #include <barvinok/barvinok.h>
11 #include <barvinok/bernstein.h>
14 static int isl_bool_false
= 0;
15 static int isl_bool_true
= 1;
16 static int isl_bool_error
= -1;
18 static void *isl_obj_bool_copy(void *v
)
23 static void isl_obj_bool_free(void *v
)
27 static __isl_give isl_printer
*isl_obj_bool_print(__isl_take isl_printer
*p
,
30 if (v
== &isl_bool_true
)
31 return isl_printer_print_str(p
, "True");
32 else if (v
== &isl_bool_false
)
33 return isl_printer_print_str(p
, "False");
35 return isl_printer_print_str(p
, "Error");
38 static void *isl_obj_bool_add(void *v1
, void *v2
)
43 struct isl_obj_vtable isl_obj_bool_vtable
= {
49 #define isl_obj_bool (&isl_obj_bool_vtable)
51 int *isl_bool_from_int(int res
)
53 return res
< 0 ? &isl_bool_error
: res
? &isl_bool_true
: &isl_bool_false
;
56 int *map_is_equal(__isl_take isl_map
*map1
, __isl_take isl_map
*map2
)
58 int res
= isl_map_is_equal(map1
, map2
);
61 return isl_bool_from_int(res
);
63 int *set_is_equal(__isl_take isl_set
*set1
, __isl_take isl_set
*set2
)
65 return map_is_equal((isl_map
*)set1
, (isl_map
*)set2
);
68 int *map_is_subset(__isl_take isl_map
*map1
, __isl_take isl_map
*map2
)
70 int res
= isl_map_is_subset(map1
, map2
);
73 return isl_bool_from_int(res
);
75 int *set_is_subset(__isl_take isl_set
*set1
, __isl_take isl_set
*set2
)
77 return map_is_subset((isl_map
*)set1
, (isl_map
*)set2
);
80 int *map_is_strict_subset(__isl_take isl_map
*map1
, __isl_take isl_map
*map2
)
82 int res
= isl_map_is_strict_subset(map1
, map2
);
85 return isl_bool_from_int(res
);
87 int *set_is_strict_subset(__isl_take isl_set
*set1
, __isl_take isl_set
*set2
)
89 return map_is_strict_subset((isl_map
*)set1
, (isl_map
*)set2
);
92 int *map_is_superset(__isl_take isl_map
*map1
, __isl_take isl_map
*map2
)
94 return map_is_subset(map2
, map1
);
96 int *set_is_superset(__isl_take isl_set
*set1
, __isl_take isl_set
*set2
)
98 return set_is_subset(set2
, set1
);
101 int *map_is_strict_superset(__isl_take isl_map
*map1
, __isl_take isl_map
*map2
)
103 return map_is_strict_subset(map2
, map1
);
105 int *set_is_strict_superset(__isl_take isl_set
*set1
, __isl_take isl_set
*set2
)
107 return set_is_strict_subset(set2
, set1
);
110 extern struct isl_obj_vtable isl_obj_list_vtable
;
111 #define isl_obj_list (&isl_obj_list_vtable)
113 typedef void *(*isc_bin_op_fn
)(void *lhs
, void *rhs
);
115 enum isl_token_type op
;
121 struct isc_named_bin_op
{
123 struct isc_bin_op op
;
127 isl_pw_qpolynomial
*pwqp
;
128 isl_pw_qpolynomial
*res
;
131 static int eval_at(__isl_take isl_point
*pnt
, void *user
)
133 struct iscc_at
*at
= (struct iscc_at
*) user
;
137 set
= isl_set_from_point(isl_point_copy(pnt
));
138 qp
= isl_pw_qpolynomial_eval(isl_pw_qpolynomial_copy(at
->pwqp
), pnt
);
140 at
->res
= isl_pw_qpolynomial_add_disjoint(at
->res
,
141 isl_pw_qpolynomial_alloc(set
, qp
));
146 __isl_give isl_pw_qpolynomial
*isl_pw_qpolynomial_at(
147 __isl_take isl_pw_qpolynomial
*pwqp
, __isl_take isl_set
*set
)
152 at
.res
= isl_pw_qpolynomial_zero(isl_set_get_dim(set
));
154 isl_set_foreach_point(set
, eval_at
, &at
);
156 isl_pw_qpolynomial_free(pwqp
);
162 struct iscc_fold_at
{
163 isl_pw_qpolynomial_fold
*pwf
;
164 isl_pw_qpolynomial
*res
;
167 static int eval_fold_at(__isl_take isl_point
*pnt
, void *user
)
169 struct iscc_fold_at
*at
= (struct iscc_fold_at
*) user
;
173 set
= isl_set_from_point(isl_point_copy(pnt
));
174 qp
= isl_pw_qpolynomial_fold_eval(isl_pw_qpolynomial_fold_copy(at
->pwf
),
177 at
->res
= isl_pw_qpolynomial_add_disjoint(at
->res
,
178 isl_pw_qpolynomial_alloc(set
, qp
));
183 __isl_give isl_pw_qpolynomial
*isl_pw_qpolynomial_fold_at(
184 __isl_take isl_pw_qpolynomial_fold
*pwf
, __isl_take isl_set
*set
)
186 struct iscc_fold_at at
;
189 at
.res
= isl_pw_qpolynomial_zero(isl_set_get_dim(set
));
191 isl_set_foreach_point(set
, eval_fold_at
, &at
);
193 isl_pw_qpolynomial_fold_free(pwf
);
199 static __isl_give isl_set
*set_gist(__isl_take isl_set
*set
,
200 __isl_take isl_set
*context
)
202 return isl_set_gist(set
, isl_set_convex_hull(context
));
205 static __isl_give isl_map
*map_gist(__isl_take isl_map
*map
,
206 __isl_take isl_map
*context
)
208 return isl_map_gist(map
, isl_map_convex_hull(context
));
211 struct isc_bin_op bin_ops
[] = {
212 { '+', isl_obj_set
, isl_obj_set
,
214 (isc_bin_op_fn
) &isl_set_union
},
215 { '+', isl_obj_map
, isl_obj_map
,
217 (isc_bin_op_fn
) &isl_map_union
},
218 { '-', isl_obj_set
, isl_obj_set
,
220 (isc_bin_op_fn
) &isl_set_subtract
},
221 { '-', isl_obj_map
, isl_obj_map
,
223 (isc_bin_op_fn
) &isl_map_subtract
},
224 { '*', isl_obj_set
, isl_obj_set
,
226 (isc_bin_op_fn
) &isl_set_intersect
},
227 { '*', isl_obj_map
, isl_obj_map
,
229 (isc_bin_op_fn
) &isl_map_intersect
},
230 { '*', isl_obj_map
, isl_obj_set
,
232 (isc_bin_op_fn
) &isl_map_intersect_domain
},
233 { '.', isl_obj_map
, isl_obj_map
,
235 (isc_bin_op_fn
) &isl_map_apply_range
},
236 { ISL_TOKEN_TO
, isl_obj_set
, isl_obj_set
, isl_obj_map
,
237 (isc_bin_op_fn
) &isl_map_from_domain_and_range
},
238 { '=', isl_obj_set
, isl_obj_set
, isl_obj_bool
,
239 (isc_bin_op_fn
) &set_is_equal
},
240 { '=', isl_obj_map
, isl_obj_map
, isl_obj_bool
,
241 (isc_bin_op_fn
) &map_is_equal
},
242 { ISL_TOKEN_LE
, isl_obj_set
, isl_obj_set
, isl_obj_bool
,
243 (isc_bin_op_fn
) &set_is_subset
},
244 { ISL_TOKEN_LE
, isl_obj_map
, isl_obj_map
, isl_obj_bool
,
245 (isc_bin_op_fn
) &map_is_subset
},
246 { ISL_TOKEN_LT
, isl_obj_set
, isl_obj_set
, isl_obj_bool
,
247 (isc_bin_op_fn
) &set_is_strict_subset
},
248 { ISL_TOKEN_LT
, isl_obj_map
, isl_obj_map
, isl_obj_bool
,
249 (isc_bin_op_fn
) &map_is_strict_subset
},
250 { ISL_TOKEN_GE
, isl_obj_set
, isl_obj_set
, isl_obj_bool
,
251 (isc_bin_op_fn
) &set_is_superset
},
252 { ISL_TOKEN_GE
, isl_obj_map
, isl_obj_map
, isl_obj_bool
,
253 (isc_bin_op_fn
) &map_is_superset
},
254 { ISL_TOKEN_GT
, isl_obj_set
, isl_obj_set
, isl_obj_bool
,
255 (isc_bin_op_fn
) &set_is_strict_superset
},
256 { ISL_TOKEN_GT
, isl_obj_map
, isl_obj_map
, isl_obj_bool
,
257 (isc_bin_op_fn
) &map_is_strict_superset
},
258 { '+', isl_obj_pw_qpolynomial
, isl_obj_pw_qpolynomial
,
259 isl_obj_pw_qpolynomial
,
260 (isc_bin_op_fn
) &isl_pw_qpolynomial_add
},
261 { '-', isl_obj_pw_qpolynomial
, isl_obj_pw_qpolynomial
,
262 isl_obj_pw_qpolynomial
,
263 (isc_bin_op_fn
) &isl_pw_qpolynomial_sub
},
264 { '*', isl_obj_pw_qpolynomial
, isl_obj_pw_qpolynomial
,
265 isl_obj_pw_qpolynomial
,
266 (isc_bin_op_fn
) &isl_pw_qpolynomial_mul
},
267 { '*', isl_obj_pw_qpolynomial
, isl_obj_set
,
268 isl_obj_pw_qpolynomial
,
269 (isc_bin_op_fn
) &isl_pw_qpolynomial_intersect_domain
},
270 { '*', isl_obj_pw_qpolynomial_fold
, isl_obj_set
,
271 isl_obj_pw_qpolynomial_fold
,
272 (isc_bin_op_fn
) &isl_pw_qpolynomial_fold_intersect_domain
},
273 { '@', isl_obj_pw_qpolynomial
, isl_obj_set
,
274 isl_obj_pw_qpolynomial
,
275 (isc_bin_op_fn
) &isl_pw_qpolynomial_at
},
276 { '@', isl_obj_pw_qpolynomial_fold
, isl_obj_set
,
277 isl_obj_pw_qpolynomial
,
278 (isc_bin_op_fn
) &isl_pw_qpolynomial_fold_at
},
279 { '%', isl_obj_set
, isl_obj_set
,
281 (isc_bin_op_fn
) &set_gist
},
282 { '%', isl_obj_map
, isl_obj_map
,
284 (isc_bin_op_fn
) &map_gist
},
285 { '%', isl_obj_pw_qpolynomial
, isl_obj_set
,
286 isl_obj_pw_qpolynomial
,
287 (isc_bin_op_fn
) &isl_pw_qpolynomial_gist
},
288 { '%', isl_obj_pw_qpolynomial_fold
, isl_obj_set
,
289 isl_obj_pw_qpolynomial_fold
,
290 (isc_bin_op_fn
) &isl_pw_qpolynomial_fold_gist
},
293 struct isc_named_bin_op named_bin_ops
[] = {
294 { "cross", { -1, isl_obj_set
, isl_obj_set
, isl_obj_set
,
295 (isc_bin_op_fn
) &isl_set_product
} },
296 { "cross", { -1, isl_obj_map
, isl_obj_map
, isl_obj_map
,
297 (isc_bin_op_fn
) &isl_map_product
} },
301 __isl_give isl_set
*set_sample(__isl_take isl_set
*set
)
303 return isl_set_from_basic_set(isl_set_sample(set
));
306 __isl_give isl_map
*map_sample(__isl_take isl_map
*map
)
308 return isl_map_from_basic_map(isl_map_sample(map
));
311 static __isl_give isl_set
*set_affine_hull(__isl_take isl_set
*set
)
313 return isl_set_from_basic_set(isl_set_affine_hull(set
));
316 static __isl_give isl_map
*map_affine_hull(__isl_take isl_map
*map
)
318 return isl_map_from_basic_map(isl_map_affine_hull(map
));
321 typedef void *(*isc_un_op_fn
)(void *arg
);
323 enum isl_token_type op
;
328 struct isc_named_un_op
{
332 struct isc_named_un_op named_un_ops
[] = {
333 {"aff", { -1, isl_obj_map
, isl_obj_map
,
334 (isc_un_op_fn
) &map_affine_hull
} },
335 {"aff", { -1, isl_obj_set
, isl_obj_set
,
336 (isc_un_op_fn
) &set_affine_hull
} },
337 {"card", { -1, isl_obj_set
, isl_obj_pw_qpolynomial
,
338 (isc_un_op_fn
) &isl_set_card
} },
339 {"card", { -1, isl_obj_map
, isl_obj_pw_qpolynomial
,
340 (isc_un_op_fn
) &isl_map_card
} },
341 {"coalesce", { -1, isl_obj_set
, isl_obj_set
,
342 (isc_un_op_fn
) &isl_set_coalesce
} },
343 {"coalesce", { -1, isl_obj_map
, isl_obj_map
,
344 (isc_un_op_fn
) &isl_map_coalesce
} },
345 {"coalesce", { -1, isl_obj_pw_qpolynomial
, isl_obj_pw_qpolynomial
,
346 (isc_un_op_fn
) &isl_pw_qpolynomial_coalesce
} },
347 {"coalesce", { -1, isl_obj_pw_qpolynomial_fold
,
348 isl_obj_pw_qpolynomial_fold
,
349 (isc_un_op_fn
) &isl_pw_qpolynomial_fold_coalesce
} },
350 {"deltas", { -1, isl_obj_map
, isl_obj_set
,
351 (isc_un_op_fn
) &isl_map_deltas
} },
352 {"dom", { -1, isl_obj_map
, isl_obj_set
,
353 (isc_un_op_fn
) &isl_map_domain
} },
354 {"dom", { -1, isl_obj_pw_qpolynomial
, isl_obj_set
,
355 (isc_un_op_fn
) &isl_pw_qpolynomial_domain
} },
356 {"dom", { -1, isl_obj_pw_qpolynomial_fold
, isl_obj_set
,
357 (isc_un_op_fn
) &isl_pw_qpolynomial_fold_domain
} },
358 {"ran", { -1, isl_obj_map
, isl_obj_set
,
359 (isc_un_op_fn
) &isl_map_range
} },
360 {"lexmin", { -1, isl_obj_map
, isl_obj_map
,
361 (isc_un_op_fn
) &isl_map_lexmin
} },
362 {"lexmax", { -1, isl_obj_map
, isl_obj_map
,
363 (isc_un_op_fn
) &isl_map_lexmax
} },
364 {"lexmin", { -1, isl_obj_set
, isl_obj_set
,
365 (isc_un_op_fn
) &isl_set_lexmin
} },
366 {"lexmax", { -1, isl_obj_set
, isl_obj_set
,
367 (isc_un_op_fn
) &isl_set_lexmax
} },
368 {"sample", { -1, isl_obj_set
, isl_obj_set
,
369 (isc_un_op_fn
) &set_sample
} },
370 {"sample", { -1, isl_obj_map
, isl_obj_map
,
371 (isc_un_op_fn
) &map_sample
} },
372 {"sum", { -1, isl_obj_pw_qpolynomial
, isl_obj_pw_qpolynomial
,
373 (isc_un_op_fn
) &isl_pw_qpolynomial_sum
} },
375 {"ub", { -1, isl_obj_pw_qpolynomial
, isl_obj_pw_qpolynomial_fold
,
376 (isc_un_op_fn
) &isl_pw_qpolynomial_upper_bound
} },
381 struct isl_named_obj
{
386 static void free_obj(struct isl_obj obj
)
388 obj
.type
->free(obj
.v
);
391 static int same_name(const void *entry
, const void *val
)
393 const struct isl_named_obj
*named
= (const struct isl_named_obj
*)entry
;
395 return !strcmp(named
->name
, val
);
398 static int do_assign(struct isl_ctx
*ctx
, struct isl_hash_table
*table
,
399 char *name
, struct isl_obj obj
)
401 struct isl_hash_table_entry
*entry
;
403 struct isl_named_obj
*named
;
405 name_hash
= isl_hash_string(isl_hash_init(), name
);
406 entry
= isl_hash_table_find(ctx
, table
, name_hash
, same_name
, name
, 1);
411 free_obj(named
->obj
);
414 named
= isl_alloc_type(ctx
, struct isl_named_obj
);
429 static struct isl_obj
stored_obj(struct isl_ctx
*ctx
,
430 struct isl_hash_table
*table
, char *name
)
432 struct isl_obj obj
= { isl_obj_none
, NULL
};
433 struct isl_hash_table_entry
*entry
;
436 name_hash
= isl_hash_string(isl_hash_init(), name
);
437 entry
= isl_hash_table_find(ctx
, table
, name_hash
, same_name
, name
, 0);
439 struct isl_named_obj
*named
;
445 obj
.v
= obj
.type
->copy(obj
.v
);
449 static struct isc_bin_op
*read_bin_op_if_available(struct isl_stream
*s
,
453 struct isl_token
*tok
;
455 tok
= isl_stream_next_token(s
);
462 if (bin_ops
[i
].op
!= tok
->type
)
464 if (bin_ops
[i
].lhs
!= lhs
)
472 if (!named_bin_ops
[i
].name
)
474 if (named_bin_ops
[i
].op
.op
!= tok
->type
)
476 if (named_bin_ops
[i
].op
.lhs
!= lhs
)
480 return &named_bin_ops
[i
].op
;
483 isl_stream_push_token(s
, tok
);
488 static struct isc_un_op
*read_prefix_un_op_if_available(struct isl_stream
*s
)
491 struct isl_token
*tok
;
493 tok
= isl_stream_next_token(s
);
498 if (!named_un_ops
[i
].name
)
500 if (named_un_ops
[i
].op
.op
!= tok
->type
)
504 return &named_un_ops
[i
].op
;
507 isl_stream_push_token(s
, tok
);
512 static struct isc_un_op
*find_matching_un_op(struct isc_un_op
*like
,
518 if (!named_un_ops
[i
].name
)
520 if (named_un_ops
[i
].op
.op
!= like
->op
)
522 if (named_un_ops
[i
].op
.arg
!= arg
)
525 return &named_un_ops
[i
].op
;
531 static int is_assign(struct isl_stream
*s
)
533 struct isl_token
*tok
;
534 struct isl_token
*tok2
;
537 tok
= isl_stream_next_token(s
);
540 if (tok
->type
!= ISL_TOKEN_IDENT
) {
541 isl_stream_push_token(s
, tok
);
545 tok2
= isl_stream_next_token(s
);
547 isl_stream_push_token(s
, tok
);
550 assign
= tok2
->type
== ISL_TOKEN_DEF
;
551 isl_stream_push_token(s
, tok2
);
552 isl_stream_push_token(s
, tok
);
557 static struct isl_obj
read_obj(struct isl_stream
*s
,
558 struct isl_hash_table
*table
);
559 static struct isl_obj
read_expr(struct isl_stream
*s
,
560 struct isl_hash_table
*table
);
562 static struct isl_obj
read_un_op_expr(struct isl_stream
*s
,
563 struct isl_hash_table
*table
, struct isc_un_op
*op
)
565 struct isl_obj obj
= { isl_obj_none
, NULL
};
567 obj
= read_obj(s
, table
);
569 op
= find_matching_un_op(op
, obj
.type
);
571 isl_assert(s
->ctx
, op
, goto error
);
572 obj
.v
= op
->fn(obj
.v
);
578 obj
.type
= isl_obj_none
;
583 static struct isl_obj
transitive_closure(struct isl_ctx
*ctx
, struct isl_obj obj
)
585 struct isl_list
*list
;
588 isl_assert(ctx
, obj
.type
== isl_obj_map
, goto error
);
589 list
= isl_list_alloc(ctx
, 2);
593 list
->obj
[0].type
= isl_obj_map
;
594 list
->obj
[0].v
= isl_map_transitive_closure(obj
.v
, &exact
);
595 list
->obj
[1].type
= isl_obj_bool
;
596 list
->obj
[1].v
= exact
? &isl_bool_true
: &isl_bool_false
;
598 obj
.type
= isl_obj_list
;
599 if (exact
< 0 || !list
->obj
[0].v
)
605 obj
.type
= isl_obj_none
;
610 static struct isl_obj
obj_at_index(struct isl_stream
*s
, struct isl_obj obj
)
612 struct isl_list
*list
= obj
.v
;
613 struct isl_token
*tok
;
616 tok
= isl_stream_next_token(s
);
617 if (!tok
|| tok
->type
!= ISL_TOKEN_VALUE
) {
618 isl_stream_error(s
, tok
, "expecting index");
620 isl_stream_push_token(s
, tok
);
623 i
= isl_int_get_si(tok
->u
.v
);
625 isl_assert(s
, i
< list
->n
, goto error
);
626 if (isl_stream_eat(s
, ']'))
630 obj
.v
= obj
.type
->copy(obj
.v
);
637 obj
.type
= isl_obj_none
;
642 static struct isl_obj
power(struct isl_stream
*s
, struct isl_obj obj
)
644 struct isl_token
*tok
;
646 if (isl_stream_eat_if_available(s
, '+'))
647 return transitive_closure(s
->ctx
, obj
);
649 tok
= isl_stream_next_token(s
);
650 if (!tok
|| tok
->type
!= ISL_TOKEN_VALUE
|| isl_int_cmp_si(tok
->u
.v
, -1)) {
651 isl_stream_error(s
, tok
, "expecting -1");
653 isl_stream_push_token(s
, tok
);
657 isl_assert(s
->ctx
, obj
.type
== isl_obj_map
, goto error
);
659 obj
.v
= isl_map_reverse(obj
.v
);
666 obj
.type
= isl_obj_none
;
671 static struct isl_obj
read_obj(struct isl_stream
*s
,
672 struct isl_hash_table
*table
)
674 struct isl_obj obj
= { isl_obj_none
, NULL
};
676 struct isc_un_op
*op
= NULL
;
678 if (isl_stream_eat_if_available(s
, '(')) {
679 obj
= read_expr(s
, table
);
680 if (isl_stream_eat(s
, ')'))
683 op
= read_prefix_un_op_if_available(s
);
685 return read_un_op_expr(s
, table
, op
);
687 name
= isl_stream_read_ident_if_available(s
);
689 obj
= stored_obj(s
->ctx
, table
, name
);
691 obj
= isl_stream_read_obj(s
);
696 if (isl_stream_eat_if_available(s
, '^'))
698 else if (obj
.type
== isl_obj_list
&& isl_stream_eat_if_available(s
, '['))
699 obj
= obj_at_index(s
, obj
);
704 obj
.type
= isl_obj_none
;
709 static struct isc_bin_op
*find_matching_bin_op(struct isc_bin_op
*like
,
710 isl_obj_type lhs
, isl_obj_type rhs
)
717 if (bin_ops
[i
].op
!= like
->op
)
719 if (bin_ops
[i
].lhs
!= lhs
)
721 if (bin_ops
[i
].rhs
!= rhs
)
728 if (!named_bin_ops
[i
].name
)
730 if (named_bin_ops
[i
].op
.op
!= like
->op
)
732 if (named_bin_ops
[i
].op
.lhs
!= lhs
)
734 if (named_bin_ops
[i
].op
.rhs
!= rhs
)
737 return &named_bin_ops
[i
].op
;
743 static struct isl_obj
read_expr(struct isl_stream
*s
,
744 struct isl_hash_table
*table
)
746 struct isl_obj obj
= { isl_obj_none
, NULL
};
747 struct isl_obj right_obj
= { isl_obj_none
, NULL
};
749 obj
= read_obj(s
, table
);
751 struct isc_bin_op
*op
= NULL
;
753 op
= read_bin_op_if_available(s
, obj
.type
);
757 right_obj
= read_obj(s
, table
);
759 op
= find_matching_bin_op(op
, obj
.type
, right_obj
.type
);
761 isl_assert(s
->ctx
, op
, goto error
);
762 obj
.v
= op
->fn(obj
.v
, right_obj
.v
);
770 obj
.type
= isl_obj_none
;
775 static __isl_give isl_printer
*read_line(struct isl_stream
*s
,
776 struct isl_hash_table
*table
, __isl_take isl_printer
*p
)
778 struct isl_obj obj
= { isl_obj_none
, NULL
};
781 struct isc_bin_op
*op
= NULL
;
785 if (isl_stream_is_empty(s
))
788 assign
= is_assign(s
);
790 lhs
= isl_stream_read_ident_if_available(s
);
791 if (isl_stream_eat(s
, ISL_TOKEN_DEF
))
795 obj
= read_expr(s
, table
);
796 if (obj
.type
== isl_obj_none
|| obj
.v
== NULL
)
798 if (isl_stream_eat(s
, ';'))
802 if (do_assign(s
->ctx
, table
, lhs
, obj
))
805 p
= obj
.type
->print(p
, obj
.v
);
806 p
= isl_printer_end_line(p
);
817 int free_cb(void *entry
)
819 struct isl_named_obj
*named
= entry
;
821 free_obj(named
->obj
);
828 static void register_named_ops(struct isl_stream
*s
)
833 if (!named_un_ops
[i
].name
)
835 named_un_ops
[i
].op
.op
= isl_stream_register_keyword(s
,
836 named_un_ops
[i
].name
);
837 assert(named_un_ops
[i
].op
.op
!= ISL_TOKEN_ERROR
);
841 if (!named_bin_ops
[i
].name
)
843 named_bin_ops
[i
].op
.op
= isl_stream_register_keyword(s
,
844 named_bin_ops
[i
].name
);
845 assert(named_bin_ops
[i
].op
.op
!= ISL_TOKEN_ERROR
);
849 int main(int argc
, char **argv
)
852 struct isl_stream
*s
;
853 struct isl_hash_table
*table
;
856 ctx
= isl_ctx_alloc();
857 s
= isl_stream_new_file(ctx
, stdin
);
859 table
= isl_hash_table_alloc(ctx
, 10);
861 p
= isl_printer_to_file(ctx
, stdout
);
864 register_named_ops(s
);
867 p
= read_line(s
, table
, p
);
871 isl_hash_table_foreach(ctx
, table
, free_cb
);
872 isl_hash_table_free(ctx
, table
);