12#ifndef ELLIPSIS_INIT_H
13#define ELLIPSIS_INIT_H
25#define STRINGIFY(...) STRINGIFY_(__VA_ARGS__)
26#define STRINGIFY_(...) #__VA_ARGS__
28#define ELLIPSIS_CONTRACT_VIOLATION(COUNT, VERB, CTYPE, CSTR, ...) \
30 static char const contract_format_ ## COUNT[] = \
31 __FILE__ ":" STRINGIFY(__LINE__) ": violation of " CTYPE " `" CSTR "`" __VA_OPT__(", ") __VA_ARGS__ "\n";\
33 ? fputs(contract_format_ ## COUNT, stderr) \
37#define ELLIPSIS_CONTRACT_IMPL(COUNT, COND, ACTION, VERB, CSTR, CTYPE, ...) \
40 : (ELLIPSIS_CONTRACT_VIOLATION(COUNT, VERB, CTYPE, CSTR __VA_OPT__(,) __VA_ARGS__) \
45#define ELLIPSIS_TO_VOIDS(...) ((void*)((uintptr_t)((__VA_ARGS__)-(__VA_ARGS__))))
47#define ELLIPSIS_TEST_ICE(...) (false ? ELLIPSIS_TO_VOIDS(__VA_ARGS__) : (ellipsis‿contracts‿is_ice*)nullptr)
49#define ELLIPSIS_CONTRACT_ICE_OR_TRUE(...) \
51 ELLIPSIS_TEST_ICE(__VA_ARGS__), \
52 ellipsis‿contracts‿is_ice*: (__VA_ARGS__), \
55#define ELLIPSIS_CONTRACT_CHECK_STATIC(CTYPE, COND, CSTR, ...) \
57 static_assert(ELLIPSIS_CONTRACT_ICE_OR_TRUE(COND), \
58 "compile time violation of " CTYPE " " CSTR \
59 __VA_OPT__(", ") __VA_ARGS__ );\
62#define ELLIPSIS_CONTRACT(COUNT, COND, ACTION, VERB, CSTR, CTYPE, ...) \
66 ELLIPSIS_TEST_ICE(COND), \
67 ellipsis‿contracts‿is_ice*: ELLIPSIS_CONTRACT_CHECK_STATIC(CTYPE, COND, CSTR __VA_OPT__(,) __VA_ARGS__), \
68 default: ELLIPSIS_CONTRACT_IMPL(COUNT, COND, ACTION, VERB, CSTR, CTYPE __VA_OPT__(,) __VA_ARGS__));\
78# if __has_include(<stdckdint.h>)
79# include <stdckdint.h>
87# define ckd_add(R, A, B) __builtin_add_overflow ((A), (B), (R))
88# define ckd_sub(R, A, B) __builtin_sub_overflow ((A), (B), (R))
89# define ckd_mul(R, A, B) __builtin_mul_overflow ((A), (B), (R))
91# error "we need a compiler extension for this"
123#define ALLOC_CHECK_RETURN(T, M) \
124 case ellipsis‿init‿flex_ ## T: return (len <= M ## _MAX)
141 default:
return false;
148 return !ckd_mul(&size, len, size_dat) && !ckd_add(&size, size, off_dat);
156 size_t m,
unsigned char buffer[restrict
static m]) {
157 do {
ELLIPSIS_CONTRACT(1, sample, abort,
true,
"sample",
"assertion",
"missing sample");}
while (
false);
158 do {
ELLIPSIS_CONTRACT(2, buffer, abort,
true,
"buffer",
"assertion",
"missing buffer");}
while (
false);
171 size_t size_dat,
size_t off_dat,
172 unsigned char ret[restrict static (off_dat + len*size_dat)],
173 unsigned char const base_init[restrict static 1],
174 unsigned char const dat_init[restrict static 1]) {
175 typeof(
void*) DEFER_LOC_ID_0_1;
176 if (__func__[0] ==
'm' && __func__[1] ==
'a' && __func__[2] ==
'i' && __func__[3] ==
'n' && !__func__[4]) {
177 DEFER_LOC_ID_0_1 = (typeof(
void*)) {};
179 [[__maybe_unused__]]
register unsigned DEFER_LOC_ID_0_2 = 1U;
180 [[__maybe_unused__]]
register bool defer_return_flag =
false;
183 goto DEFER_END_ID_1_2;
186 do {
ELLIPSIS_CONTRACT(3, ret, abort,
true,
"ret",
"assertion",
"missing return buffer");}
while (
false);
187 do {
ELLIPSIS_CONTRACT(4, base_init, abort,
true,
"base_init",
"assertion",
"missing base_init");}
while (
false);
188 do {
ELLIPSIS_CONTRACT(5, dat_init, abort,
true,
"dat_init",
"assertion",
"missing dat_init");}
while (
false);
190 do {
ELLIPSIS_CONTRACT(7,
ellipsis‿init‿check_range(len, size_dat, off_dat), abort,
true,
"ellipsis∷init∷check_range(len, size_dat, off_dat)",
"assertion",
"data range is not presentable in type size_t");}
while (
false);
194 defer_return_flag =
true;
201[[__maybe_unused__]] DEFER_END_ID_1_2:;
202 return DEFER_LOC_ID_0_1;
213 size_t size_dat,
size_t off_dat,
214 unsigned char ret[restrict static (off_dat + len*size_dat)],
215 unsigned char const base_init[restrict static 1],
216 unsigned char const dat_init[restrict static 1]) {
217 typeof(
void*) DEFER_LOC_ID_0_1;
218 if (__func__[0] ==
'm' && __func__[1] ==
'a' && __func__[2] ==
'i' && __func__[3] ==
'n' && !__func__[4]) {
219 DEFER_LOC_ID_0_1 = (typeof(
void*)) {};
221 [[__maybe_unused__]]
register unsigned DEFER_LOC_ID_0_2 = 1U;
222 [[__maybe_unused__]]
register bool defer_return_flag =
false;
225 goto DEFER_END_ID_1_4;
228 do {
ELLIPSIS_CONTRACT(8, ret, abort,
true,
"ret",
"assertion",
"missing return buffer");}
while (
false);
229 do {
ELLIPSIS_CONTRACT(9, base_init, abort,
true,
"base_init",
"assertion",
"missing base_init");}
while (
false);
230 do {
ELLIPSIS_CONTRACT(10, dat_init, abort,
true,
"dat_init",
"assertion",
"missing dat_init");}
while (
false);
232 do {
ELLIPSIS_CONTRACT(12,
ellipsis‿init‿check_range(len, size_dat, off_dat), abort,
true,
"ellipsis∷init∷check_range(len, size_dat, off_dat)",
"assertion",
"data range is not presentable in type size_t");}
while (
false);
236 defer_return_flag =
true;
243[[__maybe_unused__]] DEFER_END_ID_1_4:;
244 return DEFER_LOC_ID_0_1;
255 size_t size_dat,
size_t off_dat,
256 unsigned char const base_init[restrict static 1],
257 unsigned char const dat_init[restrict static 1]) {
258 typeof(
void*) DEFER_LOC_ID_0_1;
259 if (__func__[0] ==
'm' && __func__[1] ==
'a' && __func__[2] ==
'i' && __func__[3] ==
'n' && !__func__[4]) {
260 DEFER_LOC_ID_0_1 = (typeof(
void*)) {};
262 [[__maybe_unused__]]
register unsigned DEFER_LOC_ID_0_2 = 1U;
263 [[__maybe_unused__]]
register bool defer_return_flag =
false;
266 goto DEFER_END_ID_1_6;
270 [[__maybe_unused__, __deprecated__(
"dummy variable for better diagnostics")]]
271 unsigned (*DEFER_LOC_ID_1_1)[DEFER_LOC_ID_0_2] = {};
274 [[__maybe_unused__, __deprecated__(
"invalid termination of a deferred block")]]
275 register bool const defer_return_flag =
false, defer_break_flag =
false, defer_continue_flag =
false;
276 {
ELLIPSIS_CONTRACT(13, !len || ((typeof(DEFER_LOC_ID_0_1))DEFER_LOC_ID_0_1), unreachable,
false,
"¬len ∨ ((typeof(DEFER_LOC_ID_0_1))DEFER_LOC_ID_0_1)",
"assumption",
"allocation failed");}
281 do {
ELLIPSIS_CONTRACT(14, base_init, abort,
true,
"base_init",
"assertion",
"missing base_init");}
while (
false);
282 do {
ELLIPSIS_CONTRACT(15, dat_init, abort,
true,
"dat_init",
"assertion",
"missing dat_init");}
while (
false);
284 do {
ELLIPSIS_CONTRACT(17,
ellipsis‿init‿check_range(len, size_dat, off_dat), abort,
true,
"ellipsis∷init∷check_range(len, size_dat, off_dat)",
"assertion",
"data range is not presentable in type size_t");}
while (
false);
288 defer_return_flag =
true;
295[[__maybe_unused__]] DEFER_END_ID_1_6:;
296 return DEFER_LOC_ID_0_1;
307 size_t size_dat,
size_t off_dat,
308 unsigned char const base_init[restrict static 1],
309 unsigned char const dat_init[restrict static 1]) {
310 typeof(
void*) DEFER_LOC_ID_0_1;
311 if (__func__[0] ==
'm' && __func__[1] ==
'a' && __func__[2] ==
'i' && __func__[3] ==
'n' && !__func__[4]) {
312 DEFER_LOC_ID_0_1 = (typeof(
void*)) {};
314 [[__maybe_unused__]]
register unsigned DEFER_LOC_ID_0_2 = 1U;
315 [[__maybe_unused__]]
register bool defer_return_flag =
false;
318 goto DEFER_END_ID_1_8;
322 [[__maybe_unused__, __deprecated__(
"dummy variable for better diagnostics")]]
323 unsigned (*DEFER_LOC_ID_1_2)[DEFER_LOC_ID_0_2] = {};
326 [[__maybe_unused__, __deprecated__(
"invalid termination of a deferred block")]]
327 register bool const defer_return_flag =
false, defer_break_flag =
false, defer_continue_flag =
false;
328 {
ELLIPSIS_CONTRACT(18, len <= 0 || ((typeof(DEFER_LOC_ID_0_1))DEFER_LOC_ID_0_1), unreachable,
false,
"len ≤ 0 ∨ ((typeof(DEFER_LOC_ID_0_1))DEFER_LOC_ID_0_1)",
"assumption",
"allocation failed");}
333 do {
ELLIPSIS_CONTRACT(19, base_init, abort,
true,
"base_init",
"assertion",
"missing base_init");}
while (
false);
334 do {
ELLIPSIS_CONTRACT(20, dat_init, abort,
true,
"dat_init",
"assertion",
"missing dat_init");}
while (
false);
336 do {
ELLIPSIS_CONTRACT(22,
ellipsis‿init‿check_range(len, size_dat, off_dat), abort,
true,
"ellipsis∷init∷check_range(len, size_dat, off_dat)",
"assertion",
"data range is not presentable in type size_t");}
while (
false);
340 defer_return_flag =
true;
347[[__maybe_unused__]] DEFER_END_ID_1_8:;
348 return DEFER_LOC_ID_0_1;
359 size_t size_dat,
size_t off_dat,
360 unsigned char const ini[restrict static 1]) {
361 typeof(
void*) DEFER_LOC_ID_0_1;
362 if (__func__[0] ==
'm' && __func__[1] ==
'a' && __func__[2] ==
'i' && __func__[3] ==
'n' && !__func__[4]) {
363 DEFER_LOC_ID_0_1 = (typeof(
void*)) {};
365 [[__maybe_unused__]]
register unsigned DEFER_LOC_ID_0_2 = 1U;
366 [[__maybe_unused__]]
register bool defer_return_flag =
false;
369 goto DEFER_END_ID_1_10;
373 [[__maybe_unused__, __deprecated__(
"dummy variable for better diagnostics")]]
374 unsigned (*DEFER_LOC_ID_1_3)[DEFER_LOC_ID_0_2] = {};
377 [[__maybe_unused__, __deprecated__(
"invalid termination of a deferred block")]]
378 register bool const defer_return_flag =
false, defer_break_flag =
false, defer_continue_flag =
false;
379 {
ELLIPSIS_CONTRACT(23, !len || ((typeof(DEFER_LOC_ID_0_1))DEFER_LOC_ID_0_1), unreachable,
false,
"¬len ∨ ((typeof(DEFER_LOC_ID_0_1))DEFER_LOC_ID_0_1)",
"assumption",
"allocation failed");}
384 do {
ELLIPSIS_CONTRACT(24, ostart_, abort,
true,
"ostart_",
"assertion",
"missing ostart_");}
while (
false);
385 do {
ELLIPSIS_CONTRACT(25, ini, abort,
true,
"ini",
"assertion",
"missing ini");}
while (
false);
387 do {
ELLIPSIS_CONTRACT(27,
ellipsis‿init‿check_range(len, size_dat, off_dat), abort,
true,
"ellipsis∷init∷check_range(len, size_dat, off_dat)",
"assertion",
"data range is not presentable in type size_t");}
while (
false);
391 defer_return_flag =
true;
398[[__maybe_unused__]] DEFER_END_ID_1_10:;
399 return DEFER_LOC_ID_0_1;
410 size_t size_dat,
size_t off_dat,
411 unsigned char const ini[restrict static 1]) {
412 typeof(
void*) DEFER_LOC_ID_0_1;
413 if (__func__[0] ==
'm' && __func__[1] ==
'a' && __func__[2] ==
'i' && __func__[3] ==
'n' && !__func__[4]) {
414 DEFER_LOC_ID_0_1 = (typeof(
void*)) {};
416 [[__maybe_unused__]]
register unsigned DEFER_LOC_ID_0_2 = 1U;
417 [[__maybe_unused__]]
register bool defer_return_flag =
false;
420 goto DEFER_END_ID_1_12;
424 [[__maybe_unused__, __deprecated__(
"dummy variable for better diagnostics")]]
425 unsigned (*DEFER_LOC_ID_1_4)[DEFER_LOC_ID_0_2] = {};
428 [[__maybe_unused__, __deprecated__(
"invalid termination of a deferred block")]]
429 register bool const defer_return_flag =
false, defer_break_flag =
false, defer_continue_flag =
false;
430 {
ELLIPSIS_CONTRACT(28, len <= 0 || ((typeof(DEFER_LOC_ID_0_1))DEFER_LOC_ID_0_1), unreachable,
false,
"len ≤ 0 ∨ ((typeof(DEFER_LOC_ID_0_1))DEFER_LOC_ID_0_1)",
"assumption",
"allocation failed");}
435 do {
ELLIPSIS_CONTRACT(29, ostart_, abort,
true,
"ostart_",
"assertion",
"missing ostart_");}
while (
false);
436 do {
ELLIPSIS_CONTRACT(30, ini, abort,
true,
"ini",
"assertion",
"missing ini");}
while (
false);
438 do {
ELLIPSIS_CONTRACT(32,
ellipsis‿init‿check_range(len, size_dat, off_dat), abort,
true,
"ellipsis∷init∷check_range(len, size_dat, off_dat)",
"assertion",
"data range is not presentable in type size_t");}
while (
false);
442 defer_return_flag =
true;
449[[__maybe_unused__]] DEFER_END_ID_1_12:;
450 return DEFER_LOC_ID_0_1;
458 size_t m,
unsigned char buffer[restrict
static m]) {
459 do {
ELLIPSIS_CONTRACT(33, sample, unreachable,
false,
"sample",
"assumption",
"missing sample");}
while (
false);
460 do {
ELLIPSIS_CONTRACT(34, buffer, unreachable,
false,
"buffer",
"assumption",
"missing buffer");}
while (
false);
473 size_t size_dat,
size_t off_dat,
474 unsigned char ret[restrict static (off_dat + len*size_dat)],
475 unsigned char const base_init[restrict static 1],
476 unsigned char const dat_init[restrict static 1]) {
477 typeof(
void*) DEFER_LOC_ID_0_1;
478 if (__func__[0] ==
'm' && __func__[1] ==
'a' && __func__[2] ==
'i' && __func__[3] ==
'n' && !__func__[4]) {
479 DEFER_LOC_ID_0_1 = (typeof(
void*)) {};
481 [[__maybe_unused__]]
register unsigned DEFER_LOC_ID_0_2 = 1U;
482 [[__maybe_unused__]]
register bool defer_return_flag =
false;
485 goto DEFER_END_ID_1_14;
488 do {
ELLIPSIS_CONTRACT(35, ret, unreachable,
false,
"ret",
"assumption",
"missing return buffer");}
while (
false);
489 do {
ELLIPSIS_CONTRACT(36, base_init, unreachable,
false,
"base_init",
"assumption",
"missing base_init");}
while (
false);
490 do {
ELLIPSIS_CONTRACT(37, dat_init, unreachable,
false,
"dat_init",
"assumption",
"missing dat_init");}
while (
false);
492 do {
ELLIPSIS_CONTRACT(39,
ellipsis‿init‿check_range(len, size_dat, off_dat), unreachable,
false,
"ellipsis∷init∷check_range(len, size_dat, off_dat)",
"assumption",
"data range is not presentable in type size_t");}
while (
false);
496 defer_return_flag =
true;
503[[__maybe_unused__]] DEFER_END_ID_1_14:;
504 return DEFER_LOC_ID_0_1;
515 size_t size_dat,
size_t off_dat,
516 unsigned char ret[restrict static (off_dat + len*size_dat)],
517 unsigned char const base_init[restrict static 1],
518 unsigned char const dat_init[restrict static 1]) {
519 typeof(
void*) DEFER_LOC_ID_0_1;
520 if (__func__[0] ==
'm' && __func__[1] ==
'a' && __func__[2] ==
'i' && __func__[3] ==
'n' && !__func__[4]) {
521 DEFER_LOC_ID_0_1 = (typeof(
void*)) {};
523 [[__maybe_unused__]]
register unsigned DEFER_LOC_ID_0_2 = 1U;
524 [[__maybe_unused__]]
register bool defer_return_flag =
false;
527 goto DEFER_END_ID_1_16;
530 do {
ELLIPSIS_CONTRACT(40, ret, unreachable,
false,
"ret",
"assumption",
"missing return buffer");}
while (
false);
531 do {
ELLIPSIS_CONTRACT(41, base_init, unreachable,
false,
"base_init",
"assumption",
"missing base_init");}
while (
false);
532 do {
ELLIPSIS_CONTRACT(42, dat_init, unreachable,
false,
"dat_init",
"assumption",
"missing dat_init");}
while (
false);
533 do {
ELLIPSIS_CONTRACT(43,
ellipsis‿init‿check_type(type, len), unreachable,
false,
"ellipsis∷init∷check_type(type, len)",
"assumption",
"requested array length is too large for the type");}
while (
false);
534 do {
ELLIPSIS_CONTRACT(44,
ellipsis‿init‿check_range(len, size_dat, off_dat), unreachable,
false,
"ellipsis∷init∷check_range(len, size_dat, off_dat)",
"assumption",
"data range is not presentable in type size_t");}
while (
false);
538 defer_return_flag =
true;
545[[__maybe_unused__]] DEFER_END_ID_1_16:;
546 return DEFER_LOC_ID_0_1;
557 size_t size_dat,
size_t off_dat,
558 unsigned char const base_init[restrict static 1],
559 unsigned char const dat_init[restrict static 1]) {
560 typeof(
void*) DEFER_LOC_ID_0_1;
561 if (__func__[0] ==
'm' && __func__[1] ==
'a' && __func__[2] ==
'i' && __func__[3] ==
'n' && !__func__[4]) {
562 DEFER_LOC_ID_0_1 = (typeof(
void*)) {};
564 [[__maybe_unused__]]
register unsigned DEFER_LOC_ID_0_2 = 1U;
565 [[__maybe_unused__]]
register bool defer_return_flag =
false;
568 goto DEFER_END_ID_1_18;
572 [[__maybe_unused__, __deprecated__(
"dummy variable for better diagnostics")]]
573 unsigned (*DEFER_LOC_ID_1_5)[DEFER_LOC_ID_0_2] = {};
576 [[__maybe_unused__, __deprecated__(
"invalid termination of a deferred block")]]
577 register bool const defer_return_flag =
false, defer_break_flag =
false, defer_continue_flag =
false;
578 {
ELLIPSIS_CONTRACT(45, !len || ((typeof(DEFER_LOC_ID_0_1))DEFER_LOC_ID_0_1), abort,
true,
"¬len ∨ ((typeof(DEFER_LOC_ID_0_1))DEFER_LOC_ID_0_1)",
"assertion",
"allocation failed");}
583 do {
ELLIPSIS_CONTRACT(46, base_init, unreachable,
false,
"base_init",
"assumption",
"missing base_init");}
while (
false);
584 do {
ELLIPSIS_CONTRACT(47, dat_init, unreachable,
false,
"dat_init",
"assumption",
"missing dat_init");}
while (
false);
585 do {
ELLIPSIS_CONTRACT(48,
ellipsis‿init‿check_type(type, len), unreachable,
false,
"ellipsis∷init∷check_type(type, len)",
"assumption",
"requested array length is too large for the type");}
while (
false);
586 do {
ELLIPSIS_CONTRACT(49,
ellipsis‿init‿check_range(len, size_dat, off_dat), unreachable,
false,
"ellipsis∷init∷check_range(len, size_dat, off_dat)",
"assumption",
"data range is not presentable in type size_t");}
while (
false);
590 defer_return_flag =
true;
597[[__maybe_unused__]] DEFER_END_ID_1_18:;
598 return DEFER_LOC_ID_0_1;
609 size_t size_dat,
size_t off_dat,
610 unsigned char const base_init[restrict static 1],
611 unsigned char const dat_init[restrict static 1]) {
612 typeof(
void*) DEFER_LOC_ID_0_1;
613 if (__func__[0] ==
'm' && __func__[1] ==
'a' && __func__[2] ==
'i' && __func__[3] ==
'n' && !__func__[4]) {
614 DEFER_LOC_ID_0_1 = (typeof(
void*)) {};
616 [[__maybe_unused__]]
register unsigned DEFER_LOC_ID_0_2 = 1U;
617 [[__maybe_unused__]]
register bool defer_return_flag =
false;
620 goto DEFER_END_ID_1_20;
624 [[__maybe_unused__, __deprecated__(
"dummy variable for better diagnostics")]]
625 unsigned (*DEFER_LOC_ID_1_6)[DEFER_LOC_ID_0_2] = {};
628 [[__maybe_unused__, __deprecated__(
"invalid termination of a deferred block")]]
629 register bool const defer_return_flag =
false, defer_break_flag =
false, defer_continue_flag =
false;
630 {
ELLIPSIS_CONTRACT(50, len <= 0 || ((typeof(DEFER_LOC_ID_0_1))DEFER_LOC_ID_0_1), abort,
true,
"len ≤ 0 ∨ ((typeof(DEFER_LOC_ID_0_1))DEFER_LOC_ID_0_1)",
"assertion",
"allocation failed");}
635 do {
ELLIPSIS_CONTRACT(51, base_init, unreachable,
false,
"base_init",
"assumption",
"missing base_init");}
while (
false);
636 do {
ELLIPSIS_CONTRACT(52, dat_init, unreachable,
false,
"dat_init",
"assumption",
"missing dat_init");}
while (
false);
637 do {
ELLIPSIS_CONTRACT(53,
ellipsis‿init‿check_type(type, len), unreachable,
false,
"ellipsis∷init∷check_type(type, len)",
"assumption",
"requested array length is too large for the type");}
while (
false);
638 do {
ELLIPSIS_CONTRACT(54,
ellipsis‿init‿check_range(len, size_dat, off_dat), unreachable,
false,
"ellipsis∷init∷check_range(len, size_dat, off_dat)",
"assumption",
"data range is not presentable in type size_t");}
while (
false);
642 defer_return_flag =
true;
649[[__maybe_unused__]] DEFER_END_ID_1_20:;
650 return DEFER_LOC_ID_0_1;
661 size_t size_dat,
size_t off_dat,
662 unsigned char const ini[restrict static 1]) {
663 typeof(
void*) DEFER_LOC_ID_0_1;
664 if (__func__[0] ==
'm' && __func__[1] ==
'a' && __func__[2] ==
'i' && __func__[3] ==
'n' && !__func__[4]) {
665 DEFER_LOC_ID_0_1 = (typeof(
void*)) {};
667 [[__maybe_unused__]]
register unsigned DEFER_LOC_ID_0_2 = 1U;
668 [[__maybe_unused__]]
register bool defer_return_flag =
false;
671 goto DEFER_END_ID_1_22;
675 [[__maybe_unused__, __deprecated__(
"dummy variable for better diagnostics")]]
676 unsigned (*DEFER_LOC_ID_1_7)[DEFER_LOC_ID_0_2] = {};
679 [[__maybe_unused__, __deprecated__(
"invalid termination of a deferred block")]]
680 register bool const defer_return_flag =
false, defer_break_flag =
false, defer_continue_flag =
false;
681 {
ELLIPSIS_CONTRACT(55, !len || ((typeof(DEFER_LOC_ID_0_1))DEFER_LOC_ID_0_1), abort,
true,
"¬len ∨ ((typeof(DEFER_LOC_ID_0_1))DEFER_LOC_ID_0_1)",
"assertion",
"allocation failed");}
686 do {
ELLIPSIS_CONTRACT(56, ostart_, unreachable,
false,
"ostart_",
"assumption",
"missing ostart_");}
while (
false);
687 do {
ELLIPSIS_CONTRACT(57, ini, unreachable,
false,
"ini",
"assumption",
"missing ini");}
while (
false);
688 do {
ELLIPSIS_CONTRACT(58,
ellipsis‿init‿check_type(type, len), unreachable,
false,
"ellipsis∷init∷check_type(type, len)",
"assumption",
"requested array length is too large for the type");}
while (
false);
689 do {
ELLIPSIS_CONTRACT(59,
ellipsis‿init‿check_range(len, size_dat, off_dat), unreachable,
false,
"ellipsis∷init∷check_range(len, size_dat, off_dat)",
"assumption",
"data range is not presentable in type size_t");}
while (
false);
693 defer_return_flag =
true;
700[[__maybe_unused__]] DEFER_END_ID_1_22:;
701 return DEFER_LOC_ID_0_1;
712 size_t size_dat,
size_t off_dat,
713 unsigned char const ini[restrict static 1]) {
714 typeof(
void*) DEFER_LOC_ID_0_1;
715 if (__func__[0] ==
'm' && __func__[1] ==
'a' && __func__[2] ==
'i' && __func__[3] ==
'n' && !__func__[4]) {
716 DEFER_LOC_ID_0_1 = (typeof(
void*)) {};
718 [[__maybe_unused__]]
register unsigned DEFER_LOC_ID_0_2 = 1U;
719 [[__maybe_unused__]]
register bool defer_return_flag =
false;
722 goto DEFER_END_ID_1_24;
726 [[__maybe_unused__, __deprecated__(
"dummy variable for better diagnostics")]]
727 unsigned (*DEFER_LOC_ID_1_8)[DEFER_LOC_ID_0_2] = {};
730 [[__maybe_unused__, __deprecated__(
"invalid termination of a deferred block")]]
731 register bool const defer_return_flag =
false, defer_break_flag =
false, defer_continue_flag =
false;
732 {
ELLIPSIS_CONTRACT(60, len <= 0 || ((typeof(DEFER_LOC_ID_0_1))DEFER_LOC_ID_0_1), abort,
true,
"len ≤ 0 ∨ ((typeof(DEFER_LOC_ID_0_1))DEFER_LOC_ID_0_1)",
"assertion",
"allocation failed");}
737 do {
ELLIPSIS_CONTRACT(61, ostart_, unreachable,
false,
"ostart_",
"assumption",
"missing ostart_");}
while (
false);
738 do {
ELLIPSIS_CONTRACT(62, ini, unreachable,
false,
"ini",
"assumption",
"missing ini");}
while (
false);
739 do {
ELLIPSIS_CONTRACT(63,
ellipsis‿init‿check_type(type, len), unreachable,
false,
"ellipsis∷init∷check_type(type, len)",
"assumption",
"requested array length is too large for the type");}
while (
false);
740 do {
ELLIPSIS_CONTRACT(64,
ellipsis‿init‿check_range(len, size_dat, off_dat), unreachable,
false,
"ellipsis∷init∷check_range(len, size_dat, off_dat)",
"assumption",
"data range is not presentable in type size_t");}
while (
false);
744 defer_return_flag =
true;
751[[__maybe_unused__]] DEFER_END_ID_1_24:;
752 return DEFER_LOC_ID_0_1;
761#define ELLIPSIS_INIT_OBFUSCATE(X) ((typeof(X)restrict const){ellipsis‿init‿obfuscate(X), })
772#define TARGET_SIZE(T) (sizeof(*(T)))
774#define TARGET_SIZE(T) \
776 auto __LOC_ID_1_1 = (typeof(T))nullptr;\
777 ((size_t)_Generic((typeof(*__LOC_ID_1_1)const volatile*)nullptr, \
778 void const volatile*: 1, \
779 default: sizeof(*__LOC_ID_1_1)));\
791#define TARGET_TYPE(T) \
792 _Generic((typeof(*((typeof(T))nullptr))const volatile*)nullptr, \
793 void const volatile*: (unsigned char*)nullptr, \
794 default: ((typeof(T))nullptr))
798# define ELLIPSIS_INIT_DEFAULT 0
800# define ELLIPSIS_INIT_DEFAULT
816#define ellipsis_alloc(L, ...) ELLIPSIS_ALLOC_Iplus ((L) __VA_OPT__(,) __VA_ARGS__)
821#define ELLIPSIS_ALLOC_Iplus(L, ...) ELLIPSIS_ALLOC_I ## __VA_OPT__(Iplus) (L __VA_OPT__(,) __VA_ARGS__)
825#define ELLIPSIS_ALLOC_I(L) ELLIPSIS_ALLOC_IIplus (L, void)
832#define ELLIPSIS_ALLOC_IIplus(L, T, ...) \
835 auto const __LOC_ID_1_2 = L;\
836 typeof(T)*restrict __LOC_ID_1_3 = nullptr;\
838 auto const __LOC_ID_1_4 = TARGET_TYPE(__LOC_ID_1_3);\
839 typedef typeof(*__LOC_ID_1_4) __LOC_ID_1_5;\
840 ELLIPSIS_CONTRACT(65, 0 < __LOC_ID_1_2 && __LOC_ID_1_2 <= SIZE_MAX, abort, true, "0 < __LOC(3) ∧ __LOC(3) ≤ SIZE_MAX" , "assertion","the requested length overflows" );\
841 ELLIPSIS_CONTRACT(66, !ckd_mul(&(size_t){}, (size_t)__LOC_ID_1_2, sizeof(__LOC_ID_1_5)), abort, true, "¬ckd_mul(&(size_t){}, (size_t)__LOC(3), sizeof(__LOC(0)))" , "assertion","the requested size overflows");\
842 __LOC_ID_1_3 = ellipsis‿malloc(sizeof(__LOC_ID_1_5[__LOC_ID_1_2]));\
844 ellipsis_init(__LOC_ID_1_2, __LOC_ID_1_3, __LOC_ID_1_5, __VA_ARGS__);\
845 __LOC_ID_1_3 = ellipsis‿init‿obfuscate(__LOC_ID_1_3);\
846 ELLIPSIS_CONTRACT(67, __LOC_ID_1_3, unreachable, false, "__LOC(2)" , "assumption","failed allocation");\
871#define ellipsis_init(L, P, ...) ELLIPSIS_INIT_IIplus((L), (P) __VA_OPT__(,) __VA_ARGS__)
876#define ELLIPSIS_INIT_IIplus(L, P, ...) ELLIPSIS_INIT_II ## __VA_OPT__(Iplus)(L, P __VA_OPT__(,) __VA_ARGS__)
880#define ELLIPSIS_INIT_IIIplus(L, P, T, ...) ELLIPSIS_INIT_III ## __VA_OPT__(Iplus)(L, P, T __VA_OPT__(,) __VA_ARGS__)
884#define ELLIPSIS_INIT_II(L, P) ELLIPSIS_INIT_IIIIplus (L, P, void, ELLIPSIS_INIT_DEFAULT)
888#define ELLIPSIS_INIT_III(L, P, T) ELLIPSIS_INIT_IIIIplus (L, P, T, ELLIPSIS_INIT_DEFAULT)
895#define ELLIPSIS_INIT_IIIIplus(L, P, T, ...) \
898 auto const __LOC_ID_1_6 = (L);\
899 auto const __LOC_ID_1_7 = (typeof(T)*)(P);\
901 auto const __LOC_ID_1_8 = TARGET_TYPE(__LOC_ID_1_7);\
902 typedef typeof(*__LOC_ID_1_8) __LOC_ID_1_9;\
907 __LOC_ID_1_9 const __LOC_ID_1_10 = {__VA_ARGS__ };\
909 ellipsis‿init‿repeat(sizeof(__LOC_ID_1_9), (void const*)&__LOC_ID_1_10, \
910 sizeof(__LOC_ID_1_9[__LOC_ID_1_6]), (void*)__LOC_ID_1_7);\
912 ELLIPSIS_INIT_OBFUSCATE(__LOC_ID_1_7);\
918#define ELLIPSIS_INIT_FLEX_TYPE(...) \
919 _Generic((__VA_ARGS__), \
920 char: ellipsis‿init‿flex_char, \
921 signed char: ellipsis‿init‿flex_schar, \
922 unsigned char: ellipsis‿init‿flex_uchar, \
923 short: ellipsis‿init‿flex_short, \
924 unsigned short: ellipsis‿init‿flex_ushort, \
925 signed: ellipsis‿init‿flex_signed, \
926 unsigned: ellipsis‿init‿flex_unsigned, \
927 long: ellipsis‿init‿flex_long, \
928 unsigned long: ellipsis‿init‿flex_ulong, \
929 long long: ellipsis‿init‿flex_llong, \
930 unsigned long long: ellipsis‿init‿flex_ullong)
935#define ELLIPSIS_INIT_WHEN_SIGNED(X, A, B) \
936 _Generic((char(*)[(((typeof(X))-1) < 0)+1]){}, \
940#define ellipsis_init_flex(L, P, T, FL, LEN, ...) \
941 ((typeof(T)*restrict const){\
942 ELLIPSIS_INIT_WHEN_SIGNED(L, ellipsis‿init‿flex_core_s, ellipsis‿init‿flex_core_u) \
944 ELLIPSIS_INIT_FLEX_TYPE(((typeof(T)*)nullptr)->LEN), offsetof(typeof(T), LEN), \
945 sizeof(((typeof(T)*)nullptr)->FL[0]), offsetof(typeof(T), FL), \
947 (void const*)&((typeof(T) const){__VA_ARGS__ }), \
948 (void const*)&((typeof(((typeof(T)*)nullptr)->FL[0]) const){})), })
950#define ellipsis_alloc_flex(L, T, FL, LEN, ...) \
951 ((typeof(T)*restrict const){\
952 ELLIPSIS_INIT_WHEN_SIGNED(L, ellipsis‿alloc‿flex_core_s, ellipsis‿alloc‿flex_core_u) \
954 ELLIPSIS_INIT_FLEX_TYPE(((typeof(T)*)nullptr)->LEN), offsetof(typeof(T), LEN), \
955 sizeof(((typeof(T)*)nullptr)->FL[0]), offsetof(typeof(T), FL), \
956 (void const*)&((typeof(T)){__VA_ARGS__ }), \
957 (void const*)&((typeof(((typeof(T)*)nullptr)->FL[0])){})), })
959#define ellipsis_realloc_flex(L, P, FL, LEN) \
960 ((typeof(P)restrict const){\
961 ELLIPSIS_INIT_WHEN_SIGNED(L, ellipsis‿realloc‿flex_core_s, ellipsis‿realloc‿flex_core_u) \
963 ELLIPSIS_INIT_FLEX_TYPE(((typeof(P))nullptr)->LEN), offsetof(typeof(*(P)), LEN), \
964 sizeof((P)->FL[0]), offsetof(typeof(*(P)), FL), \
965 (void const*)&(typeof((P)->FL[0])){}), })
#define STDC_ATTR_NODISCARD(...)
Definition ellipsis-error.h:68
struct ellipsis‿contracts‿is_ice ellipsis‿contracts‿is_ice
Definition ellipsis-expression.c:24
void * ellipsis‿init‿flex_core_s‿_Insta(signed long long len, size_t size_base, ellipsis‿init‿flex type, size_t off_len, size_t size_dat, size_t off_dat, unsigned char ret[restrict static(off_dat+len *size_dat)], unsigned char const base_init[restrict static 1], unsigned char const dat_init[restrict static 1])
Definition ellipsis-init.c:328
ellipsis‿realloc‿flex_core_u ellipsis‿realloc‿flex_core_u
Definition ellipsis-init.c:83
void * ellipsis‿init‿flex_core_u‿_Inner(unsigned long long len, size_t size_base, ellipsis‿init‿flex type, size_t off_len, size_t size_dat, size_t off_dat, unsigned char ret[restrict static(off_dat+len *size_dat)], unsigned char const base_init[restrict static 1], unsigned char const dat_init[restrict static 1])
Definition ellipsis-init.c:109
void * ellipsis‿alloc‿flex_core_u‿_Insta(unsigned long long len, size_t size_base, ellipsis‿init‿flex type, size_t off_len, size_t size_dat, size_t off_dat, unsigned char const base_init[restrict static 1], unsigned char const dat_init[restrict static 1])
Definition ellipsis-init.c:370
void * ellipsis‿realloc‿flex_core_s‿_Inner(signed long long len, void *ostart_, size_t size_base, ellipsis‿init‿flex type, size_t off_len, size_t size_dat, size_t off_dat, unsigned char const ini[restrict static 1])
Definition ellipsis-init.c:258
void * ellipsis‿alloc‿flex_core_s‿_Insta(signed long long len, size_t size_base, ellipsis‿init‿flex type, size_t off_len, size_t size_dat, size_t off_dat, unsigned char const base_init[restrict static 1], unsigned char const dat_init[restrict static 1])
Definition ellipsis-init.c:411
void * ellipsis‿realloc‿flex_core_u‿_Insta(unsigned long long len, void *ostart_, size_t size_base, ellipsis‿init‿flex type, size_t off_len, size_t size_dat, size_t off_dat, unsigned char const ini[restrict static 1])
Definition ellipsis-init.c:452
ellipsis‿realloc‿flex_core_s ellipsis‿realloc‿flex_core_s
Definition ellipsis-init.c:84
void * ellipsis‿init‿flex_core_u‿_Insta(unsigned long long len, size_t size_base, ellipsis‿init‿flex type, size_t off_len, size_t size_dat, size_t off_dat, unsigned char ret[restrict static(off_dat+len *size_dat)], unsigned char const base_init[restrict static 1], unsigned char const dat_init[restrict static 1])
Definition ellipsis-init.c:286
ellipsis‿alloc‿flex_core_s ellipsis‿alloc‿flex_core_s
Definition ellipsis-init.c:82
void * ellipsis‿init‿flex_core_s‿_Inner(signed long long len, size_t size_base, ellipsis‿init‿flex type, size_t off_len, size_t size_dat, size_t off_dat, unsigned char ret[restrict static(off_dat+len *size_dat)], unsigned char const base_init[restrict static 1], unsigned char const dat_init[restrict static 1])
Definition ellipsis-init.c:142
void * ellipsis‿realloc‿flex_core_s‿_Insta(signed long long len, void *ostart_, size_t size_base, ellipsis‿init‿flex type, size_t off_len, size_t size_dat, size_t off_dat, unsigned char const ini[restrict static 1])
Definition ellipsis-init.c:492
void * ellipsis‿alloc‿flex_core_u‿_Inner(unsigned long long len, size_t size_base, ellipsis‿init‿flex type, size_t off_len, size_t size_dat, size_t off_dat, unsigned char const base_init[restrict static 1], unsigned char const dat_init[restrict static 1])
Definition ellipsis-init.c:156
void * ellipsis‿realloc‿flex_core_u‿_Inner(unsigned long long len, void *ostart_, size_t size_base, ellipsis‿init‿flex type, size_t off_len, size_t size_dat, size_t off_dat, unsigned char const ini[restrict static 1])
Definition ellipsis-init.c:203
void ellipsis‿init‿repeat‿_Inner(size_t n, unsigned char const sample[restrict static n], size_t m, unsigned char buffer[restrict static m])
Definition ellipsis-init.c:96
ellipsis‿alloc‿flex_core_u ellipsis‿alloc‿flex_core_u
Definition ellipsis-init.c:81
void ellipsis‿init‿repeat‿_Insta(size_t n, unsigned char const sample[restrict static n], size_t m, unsigned char buffer[restrict static m])
Definition ellipsis-init.c:273
void * ellipsis‿alloc‿flex_core_s‿_Inner(signed long long len, size_t size_base, ellipsis‿init‿flex type, size_t off_len, size_t size_dat, size_t off_dat, unsigned char const base_init[restrict static 1], unsigned char const dat_init[restrict static 1])
Definition ellipsis-init.c:190
bool ellipsis‿init‿check_range(size_t len, size_t size_dat, size_t off_dat)
Definition ellipsis-init.h:146
void * ellipsis‿init‿flex_core_s‿_Ctra(signed long long len, size_t size_base, ellipsis‿init‿flex type, size_t off_len, size_t size_dat, size_t off_dat, unsigned char ret[restrict static(off_dat+len *size_dat)], unsigned char const base_init[restrict static 1], unsigned char const dat_init[restrict static 1])
Definition ellipsis-init.h:512
thread_local bool volatile ellipsis‿contracts‿verbose‿dynamic
void ellipsis‿init‿repeat(size_t n, unsigned char const sample[restrict static n], size_t m, unsigned char buffer[restrict static m])
Definition ellipsis-init.h:155
#define ELLIPSIS_CONTRACT(COUNT, COND, ACTION, VERB, CSTR, CTYPE,...)
Definition ellipsis-init.h:62
void * ellipsis‿init‿flex_core_s(signed long long len, size_t size_base, ellipsis‿init‿flex type, size_t off_len, size_t size_dat, size_t off_dat, unsigned char ret[restrict static(off_dat+len *size_dat)], unsigned char const base_init[restrict static 1], unsigned char const dat_init[restrict static 1])
Definition ellipsis-init.h:210
void * ellipsis‿alloc‿flex_core_u‿_Ctra(unsigned long long len, size_t size_base, ellipsis‿init‿flex type, size_t off_len, size_t size_dat, size_t off_dat, unsigned char const base_init[restrict static 1], unsigned char const dat_init[restrict static 1])
Definition ellipsis-init.h:554
#define ALLOC_CHECK_RETURN(T, M)
Definition ellipsis-init.h:123
void * ellipsis‿alloc‿flex_core_s‿_Ctra(signed long long len, size_t size_base, ellipsis‿init‿flex type, size_t off_len, size_t size_dat, size_t off_dat, unsigned char const base_init[restrict static 1], unsigned char const dat_init[restrict static 1])
Definition ellipsis-init.h:606
thread_local bool volatile ellipsis‿contracts‿proceed‿dynamic
void * ellipsis‿init‿flex_core_u(unsigned long long len, size_t size_base, ellipsis‿init‿flex type, size_t off_len, size_t size_dat, size_t off_dat, unsigned char ret[restrict static(off_dat+len *size_dat)], unsigned char const base_init[restrict static 1], unsigned char const dat_init[restrict static 1])
Definition ellipsis-init.h:168
void ellipsis‿init‿repeat‿_Ctra(size_t n, unsigned char const sample[restrict static n], size_t m, unsigned char buffer[restrict static m])
Definition ellipsis-init.h:457
ellipsis‿init‿flex
Definition ellipsis-init.h:98
@ ellipsis‿init‿flex_unsigned
Definition ellipsis-init.h:105
@ ellipsis‿init‿flex_short
Definition ellipsis-init.h:102
@ ellipsis‿init‿flex_signed
Definition ellipsis-init.h:104
@ ellipsis‿init‿flex_schar
Definition ellipsis-init.h:100
@ ellipsis‿init‿flex_ushort
Definition ellipsis-init.h:103
@ ellipsis‿init‿flex_long
Definition ellipsis-init.h:106
@ ellipsis‿init‿flex_char
Definition ellipsis-init.h:99
@ ellipsis‿init‿flex_uchar
Definition ellipsis-init.h:101
@ ellipsis‿init‿flex_llong
Definition ellipsis-init.h:108
@ ellipsis‿init‿flex_ullong
Definition ellipsis-init.h:109
@ ellipsis‿init‿flex_ulong
Definition ellipsis-init.h:107
void * ellipsis‿init‿obfuscate(void *p)
Definition ellipsis-init.c:528
void * ellipsis‿realloc‿flex_core_u‿_Ctra(unsigned long long len, void *ostart_, size_t size_base, ellipsis‿init‿flex type, size_t off_len, size_t size_dat, size_t off_dat, unsigned char const ini[restrict static 1])
Definition ellipsis-init.h:658
thread_local bool volatile ellipsis‿contracts‿ignore‿dynamic
bool ellipsis‿init‿check_type(ellipsis‿init‿flex type, size_t len)
Definition ellipsis-init.h:127
void * ellipsis‿realloc‿flex_core_s‿_Ctra(signed long long len, void *ostart_, size_t size_base, ellipsis‿init‿flex type, size_t off_len, size_t size_dat, size_t off_dat, unsigned char const ini[restrict static 1])
Definition ellipsis-init.h:709
void * ellipsis‿init‿flex_core_u‿_Ctra(unsigned long long len, size_t size_base, ellipsis‿init‿flex type, size_t off_len, size_t size_dat, size_t off_dat, unsigned char ret[restrict static(off_dat+len *size_dat)], unsigned char const base_init[restrict static 1], unsigned char const dat_init[restrict static 1])
Definition ellipsis-init.h:470