| 1 | /* |
| 2 | * Copyright 2011 Sven Verdoolaege |
| 3 | * |
| 4 | * Use of this software is governed by the MIT license |
| 5 | * |
| 6 | * Written by Sven Verdoolaege. |
| 7 | */ |
| 8 | |
| 9 | #define xCAT(A,B) A ## B |
| 10 | #define CAT(A,B) xCAT(A,B) |
| 11 | #undef TYPE |
| 12 | #define TYPE CAT(isl_,TYPE_BASE) |
| 13 | |
| 14 | /* Read an object of type "TYPE" from "s". |
| 15 | * |
| 16 | * In particular, first read the parameters and the opening brace. |
| 17 | * Then read the body that is specific to the object type. |
| 18 | * Finally, read the closing brace. |
| 19 | */ |
| 20 | __isl_give TYPE *FN(isl_stream_read,TYPE_BASE)(__isl_keep isl_stream *s) |
| 21 | { |
| 22 | struct vars *v; |
| 23 | isl_set *dom; |
| 24 | TYPE *obj = NULL; |
| 25 | |
| 26 | v = vars_new(ctx: s->ctx); |
| 27 | if (!v) |
| 28 | return NULL; |
| 29 | |
| 30 | dom = isl_set_universe(space: isl_space_params_alloc(ctx: s->ctx, nparam: 0)); |
| 31 | if (next_is_tuple(s)) { |
| 32 | dom = read_map_tuple(s, map: dom, type: isl_dim_param, v, rational: 1, comma: 0); |
| 33 | if (isl_stream_eat(s, type: ISL_TOKEN_TO)) |
| 34 | goto error; |
| 35 | } |
| 36 | if (isl_stream_eat(s, type: '{')) |
| 37 | goto error; |
| 38 | |
| 39 | obj = FN(isl_stream_read_with_params,TYPE_BASE)(s, dom, v); |
| 40 | |
| 41 | if (isl_stream_eat(s, type: '}')) |
| 42 | goto error; |
| 43 | |
| 44 | vars_free(v); |
| 45 | isl_set_free(set: dom); |
| 46 | return obj; |
| 47 | error: |
| 48 | vars_free(v); |
| 49 | isl_set_free(set: dom); |
| 50 | FN(TYPE,free)(pwaff: obj); |
| 51 | return NULL; |
| 52 | } |
| 53 | |