2 * Copyright 2008-2009 Katholieke Universiteit Leuven
4 * Use of this software is governed by the GNU LGPLv2.1 license
6 * Written by Sven Verdoolaege, K.U.Leuven, Departement
7 * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
13 static struct isl_options
*find_nested_options(struct isl_arg
*arg
,
14 void *opt
, struct isl_arg
*wanted
)
17 struct isl_options
*options
;
22 for (i
= 0; arg
[i
].type
!= isl_arg_end
; ++i
) {
23 if (arg
[i
].type
!= isl_arg_child
)
25 options
= find_nested_options(arg
[i
].u
.child
.child
,
26 *(void **)(((char *)opt
) + arg
->offset
), wanted
);
34 static struct isl_options
*find_nested_isl_options(struct isl_arg
*arg
,
37 return find_nested_options(arg
, opt
, isl_options_arg
);
40 void *isl_ctx_peek_options(isl_ctx
*ctx
, struct isl_arg
*arg
)
44 return find_nested_options(ctx
->user_arg
, ctx
->user_opt
, arg
);
47 isl_ctx
*isl_ctx_alloc_with_options(struct isl_arg
*arg
, void *user_opt
)
49 struct isl_ctx
*ctx
= NULL
;
50 struct isl_options
*opt
= NULL
;
51 int opt_allocated
= 0;
56 opt
= find_nested_isl_options(arg
, user_opt
);
58 opt
= isl_options_new_with_defaults();
64 ctx
= isl_calloc_type(NULL
, struct isl_ctx
);
68 if (isl_hash_table_init(ctx
, &ctx
->name_hash
, 0))
71 ctx
->stats
= isl_calloc_type(ctx
, struct isl_stats
);
76 ctx
->user_opt
= user_opt
;
77 ctx
->opt_allocated
= opt_allocated
;
81 isl_int_init(ctx
->zero
);
82 isl_int_set_si(ctx
->zero
, 0);
84 isl_int_init(ctx
->one
);
85 isl_int_set_si(ctx
->one
, 1);
87 isl_int_init(ctx
->two
);
88 isl_int_set_si(ctx
->two
, 2);
90 isl_int_init(ctx
->negone
);
91 isl_int_set_si(ctx
->negone
, -1);
93 isl_int_init(ctx
->normalize_gcd
);
97 ctx
->error
= isl_error_none
;
101 isl_arg_free(arg
, user_opt
);
103 isl_options_free(opt
);
108 struct isl_ctx
*isl_ctx_alloc()
110 struct isl_options
*opt
;
112 opt
= isl_options_new_with_defaults();
114 return isl_ctx_alloc_with_options(isl_options_arg
, opt
);
117 void isl_ctx_ref(struct isl_ctx
*ctx
)
122 void isl_ctx_deref(struct isl_ctx
*ctx
)
124 isl_assert(ctx
, ctx
->ref
> 0, return);
128 void isl_ctx_free(struct isl_ctx
*ctx
)
132 isl_assert(ctx
, ctx
->ref
== 0, return);
133 isl_hash_table_clear(&ctx
->name_hash
);
134 isl_blk_clear_cache(ctx
);
135 isl_int_clear(ctx
->zero
);
136 isl_int_clear(ctx
->one
);
137 isl_int_clear(ctx
->two
);
138 isl_int_clear(ctx
->negone
);
139 isl_int_clear(ctx
->normalize_gcd
);
140 isl_arg_free(ctx
->user_arg
, ctx
->user_opt
);
141 if (ctx
->opt_allocated
)
147 struct isl_options
*isl_ctx_options(isl_ctx
*ctx
)
154 enum isl_error
isl_ctx_last_error(isl_ctx
*ctx
)
159 void isl_ctx_reset_error(isl_ctx
*ctx
)
161 ctx
->error
= isl_error_none
;