do { \
size_t cri_off = 0; \
size_t cri_sz = 0; \
cri_fmt_bprintf(&(Str), &cri_off, &cri_sz, "(" \
\
for (size_t cri_i = 0; cri_i < cri_size; ++cri_i) { \
char *cri_saveptr =
NULL; \
char *cri_line =
cri_strtok_r(cri_repr,
"\n", &cri_saveptr); \
\
if (cri_line) { \
cri_fmt_bprintf(&(Str), &cri_off, &cri_sz, \
\
cri_fmt_bprintf(&(Str), &cri_off, &cri_sz, "\n\t%s", cri_line); \
} \
cri_fmt_bprintf(&(Str), &cri_off, &cri_sz, ",\n"); \
} \
cr_asprintf_free(cri_repr); \
} \
cri_fmt_bprintf(&(Str), &cri_off, &cri_sz, "}"); \
} while (0)
CR_API char * cri_strtok_r(char *str, const char *delim, char **saveptr)
#define CRI_ASSERT_TYPE_TAG(Tag)
#define CRI_ASSERT_TYPE_TAG_ARRLEN(Tag)
#define CRI_USER_TAG_ID(Id, Tag)
291# define CRI_USER_TOSTR_ARR(Str, Arr, Tag) \
292 do { \
293 size_t cri_off = 0; \
294 size_t cri_sz = 0; \
295 cri_fmt_bprintf(&(Str), &cri_off, &cri_sz, "(" \
296 CR_STR(CRI_ASSERT_TYPE_TAG(Tag)) "[%" CRI_PRIuSIZE "]) {\n", \
297 CRI_ASSERT_TYPE_TAG_ARRLEN(Tag)); \
298 \
299 for (size_t cri_i = 0; cri_i < cri_size; ++cri_i) { \
300 char *cri_repr = CRI_USER_TAG_ID(tostr, Tag)(&(Arr)[cri_i]); \
301 char *cri_saveptr = NULL; \
302 char *cri_line = cri_strtok_r(cri_repr, "\n", &cri_saveptr); \
303 \
304 if (cri_line) { \
305 cri_fmt_bprintf(&(Str), &cri_off, &cri_sz, \
306 "\t[%" CRI_PRIuSIZE "] = %s", cri_i, cri_line); \
307 \
308 while ((cri_line = cri_strtok_r(NULL, "\n", &cri_saveptr))) { \
309 cri_fmt_bprintf(&(Str), &cri_off, &cri_sz, "\n\t%s", cri_line); \
310 } \
311 cri_fmt_bprintf(&(Str), &cri_off, &cri_sz, ",\n"); \
312 } \
313 cr_asprintf_free(cri_repr); \
314 } \
315 cri_fmt_bprintf(&(Str), &cri_off, &cri_sz, "}"); \
316 } while (0)