2 * Copyright 2008-2009 Katholieke Universiteit Leuven
4 * Use of this software is governed by the MIT license
6 * Written by Sven Verdoolaege, K.U.Leuven, Departement
7 * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
10 #include <isl_ctx_private.h>
12 #include <isl_options_private.h>
14 #define __isl_calloc(type,size) ((type *)calloc(1, size))
15 #define __isl_calloc_type(type) __isl_calloc(type,sizeof(type))
17 void isl_handle_error(isl_ctx
*ctx
, enum isl_error error
, const char *msg
,
18 const char *file
, int line
)
23 isl_ctx_set_error(ctx
, error
);
25 switch (ctx
->opt
->on_error
) {
26 case ISL_ON_ERROR_WARN
:
27 fprintf(stderr
, "%s:%d: %s\n", file
, line
, msg
);
29 case ISL_ON_ERROR_CONTINUE
:
31 case ISL_ON_ERROR_ABORT
:
32 fprintf(stderr
, "%s:%d: %s\n", file
, line
, msg
);
38 static struct isl_options
*find_nested_options(struct isl_args
*args
,
39 void *opt
, struct isl_args
*wanted
)
42 struct isl_options
*options
;
47 for (i
= 0; args
->args
[i
].type
!= isl_arg_end
; ++i
) {
48 struct isl_arg
*arg
= &args
->args
[i
];
51 if (arg
->type
!= isl_arg_child
)
54 if (arg
->offset
== (size_t) -1)
57 child
= *(void **)(((char *)opt
) + arg
->offset
);
59 options
= find_nested_options(arg
->u
.child
.child
,
68 static struct isl_options
*find_nested_isl_options(struct isl_args
*args
,
71 return find_nested_options(args
, opt
, &isl_options_args
);
74 void *isl_ctx_peek_options(isl_ctx
*ctx
, struct isl_args
*args
)
78 if (args
== &isl_options_args
)
80 return find_nested_options(ctx
->user_args
, ctx
->user_opt
, args
);
83 isl_ctx
*isl_ctx_alloc_with_options(struct isl_args
*args
, void *user_opt
)
85 struct isl_ctx
*ctx
= NULL
;
86 struct isl_options
*opt
= NULL
;
87 int opt_allocated
= 0;
92 opt
= find_nested_isl_options(args
, user_opt
);
94 opt
= isl_options_new_with_defaults();
100 ctx
= __isl_calloc_type(struct isl_ctx
);
104 if (isl_hash_table_init(ctx
, &ctx
->id_table
, 0))
107 ctx
->stats
= isl_calloc_type(ctx
, struct isl_stats
);
111 ctx
->user_args
= args
;
112 ctx
->user_opt
= user_opt
;
113 ctx
->opt_allocated
= opt_allocated
;
117 isl_int_init(ctx
->zero
);
118 isl_int_set_si(ctx
->zero
, 0);
120 isl_int_init(ctx
->one
);
121 isl_int_set_si(ctx
->one
, 1);
123 isl_int_init(ctx
->two
);
124 isl_int_set_si(ctx
->two
, 2);
126 isl_int_init(ctx
->negone
);
127 isl_int_set_si(ctx
->negone
, -1);
129 isl_int_init(ctx
->normalize_gcd
);
134 ctx
->error
= isl_error_none
;
138 isl_args_free(args
, user_opt
);
140 isl_options_free(opt
);
145 struct isl_ctx
*isl_ctx_alloc()
147 struct isl_options
*opt
;
149 opt
= isl_options_new_with_defaults();
151 return isl_ctx_alloc_with_options(&isl_options_args
, opt
);
154 void isl_ctx_ref(struct isl_ctx
*ctx
)
159 void isl_ctx_deref(struct isl_ctx
*ctx
)
161 isl_assert(ctx
, ctx
->ref
> 0, return);
165 void isl_ctx_free(struct isl_ctx
*ctx
)
170 isl_die(ctx
, isl_error_invalid
,
171 "isl_ctx freed, but some objects still reference it",
174 isl_hash_table_clear(&ctx
->id_table
);
175 isl_blk_clear_cache(ctx
);
176 isl_int_clear(ctx
->zero
);
177 isl_int_clear(ctx
->one
);
178 isl_int_clear(ctx
->two
);
179 isl_int_clear(ctx
->negone
);
180 isl_int_clear(ctx
->normalize_gcd
);
181 isl_args_free(ctx
->user_args
, ctx
->user_opt
);
182 if (ctx
->opt_allocated
)
183 isl_options_free(ctx
->opt
);
188 struct isl_options
*isl_ctx_options(isl_ctx
*ctx
)
195 enum isl_error
isl_ctx_last_error(isl_ctx
*ctx
)
200 void isl_ctx_reset_error(isl_ctx
*ctx
)
202 ctx
->error
= isl_error_none
;
205 void isl_ctx_set_error(isl_ctx
*ctx
, enum isl_error error
)
211 void isl_ctx_abort(isl_ctx
*ctx
)
217 void isl_ctx_resume(isl_ctx
*ctx
)
223 int isl_ctx_aborted(isl_ctx
*ctx
)
225 return ctx
? ctx
->abort
: -1;
228 int isl_ctx_parse_options(isl_ctx
*ctx
, int argc
, char **argv
, unsigned flags
)
232 return isl_args_parse(ctx
->user_args
, argc
, argv
, ctx
->user_opt
, flags
);