int main (void) { size_t i; int ret = 0; mtrace (); for (i = 0; i < sizeof (tests) / sizeof (tests[0]); ++i) { if (setlocale (LC_ALL, "de_DE.ISO-8859-1") == NULL) { puts ("setlocale de_DE.ISO-8859-1 failed"); ret = 1; } ret |= do_one_test (&tests[i], ""); if (setlocale (LC_ALL, "de_DE.UTF-8") == NULL) { puts ("setlocale de_DE.UTF-8 failed"); ret = 1; } ret |= do_one_test (&tests[i], "UTF-8 "); ret |= do_mb_tests (&tests[i]); } return ret; }
static void do_test_limit (size_t align1, size_t align2, size_t len, size_t n, int max_char, int exp_result) { size_t i, align_n; char *s1, *s2; if (n == 0) { s1 = (char*)(buf1 + page_size); s2 = (char*)(buf2 + page_size); printf ("Length %d/%d:", len, n); FOR_EACH_IMPL (impl, 0) do_one_test (impl, s1, s2, n, 0); putchar ('\n'); return; } align1 &= 15; align2 &= 15; align_n = (page_size - n) & 15; s1 = (char*)(buf1 + page_size - n); s2 = (char*)(buf2 + page_size - n); if (align1 < align_n) s1 -= (align_n - align1); if (align2 < align_n) s2 -= (align_n - align2); for (i = 0; i < n; i++) s1[i] = s2[i] = 1 + 23 * i % max_char; if (len < n) { s1[len] = 0; s2[len] = 0; if (exp_result < 0) s2[len] = 32; else if (exp_result > 0) s1[len] = 64; } printf ("Length %d/%d, alignment %d/%d:", len, n, align1, align2); FOR_EACH_IMPL (impl, 0) do_one_test (impl, s1, s2, n, exp_result); putchar ('\n'); }
static void do_test (size_t align1, size_t align2, size_t len, int max_char) { size_t i; CHAR *s1, *s2; /* For wcscpy: align1 and align2 here mean alignment not in bytes, but in wchar_ts, in bytes it will equal to align * (sizeof (wchar_t)) len for wcschr here isn't in bytes but it's number of wchar_t symbols. */ align1 &= 7; if ((align1 + len) * sizeof(CHAR) >= page_size) return; align2 &= 7; if ((align2 + len) * sizeof(CHAR) >= page_size) return; s1 = (CHAR *) (buf1) + align1; s2 = (CHAR *) (buf2) + align2; for (i = 0; i < len; i++) s1[i] = 32 + 23 * i % (max_char - 32); s1[len] = 0; printf ("Length %4zd, alignments in bytes %2zd/%2zd:", len, align1 * sizeof(CHAR), align2 * sizeof(CHAR)); FOR_EACH_IMPL (impl, 0) do_one_test (impl, s2, s1, len); putchar ('\n'); }
static void do_test (size_t align1, size_t align2, size_t len) { size_t i, j; char *s1, *s2; align1 &= 63; if (align1 + len >= page_size) return; align2 &= 63; if (align2 + len >= page_size) return; s1 = (char *) (buf1 + align1); s2 = (char *) (buf2 + align2); for (i = 0, j = 1; i < len; i++, j += 23) s1[i] = j; printf ("Length %4zd, alignment %d/%d:", len, align1, align2); FOR_EACH_IMPL (impl, 0) do_one_test (impl, s2, (char *) (buf2 + align1), s1, len); putchar ('\n'); }
static void do_test (size_t align1, size_t align2, size_t len, int exp_result) { size_t i; CHAR *s1, *s2; if (len == 0) return; align1 &= 63; if (align1 + (len + 1) * CHARBYTES >= page_size) return; align2 &= 63; if (align2 + (len + 1) * CHARBYTES >= page_size) return; s1 = (CHAR *) (buf1 + align1); s2 = (CHAR *) (buf2 + align2); for (i = 0; i < len; i++) s1[i] = s2[i] = 1 + (23 << ((CHARBYTES - 1) * 8)) * i % CHAR__MAX; s1[len] = align1; s2[len] = align2; s2[len - 1] -= exp_result; printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2); FOR_EACH_IMPL (impl, 0) do_one_test (impl, s1, s2, len, exp_result); putchar ('\n'); }
static void do_random_tests (void) { for (size_t n = 0; n < ITERATIONS; ++n) { char tmpbuf[32]; size_t shift = random () % 11; size_t rel = random () % ((2 << (shift + 1)) * 64); size_t idx = MIN ((2 << shift) * 64 + rel, BUF1PAGES * page_size - 2); size_t len = random () % (sizeof (tmpbuf) - 1) + 1; len = MIN (len, BUF1PAGES * page_size - idx - 1); memcpy (tmpbuf, buf1 + idx, len); for (size_t i = random () % len / 2 + 1; i > 0; --i) { size_t off = random () % len; char ch = '0' + random () % 10; buf1[idx + off] = ch; } printf ("String %.*s, offset %zd:", (int) len, buf1 + idx, idx); FOR_EACH_IMPL (impl, 0) do_one_test (impl, buf1, BUF1PAGES * page_size, buf1 + idx, len, buf1 + idx); putchar ('\n'); memcpy (buf1 + idx, tmpbuf, len); } }
static void do_test (size_t align1, size_t align2, size_t len, size_t dlen, int max_char) { size_t i; char *s1, *s2; align1 &= 7; if (align1 + len >= page_size) return; align2 &= 7; if (align2 + len >= page_size) return; s1 = (char *) buf1 + align1; s2 = (char *) buf2 + align2; for (i = 0; i < len; i++) s1[i] = 32 + 23 * i % (max_char - 32); s1[len] = 0; if (dlen > len) printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2); FOR_EACH_IMPL (impl, 0) do_one_test (impl, s2, s1, len, dlen); if (dlen > len) putchar ('\n'); }
static void do_test (size_t align1, size_t align2, int c, size_t len, size_t n, int max_char) { size_t i; char *s1, *s2; align1 &= 7; if (align1 + len >= page_size) return; align2 &= 7; if (align2 + len >= page_size) return; s1 = (char *) (buf1 + align1); s2 = (char *) (buf2 + align2); for (i = 0; i < len - 1; ++i) { s1[i] = 32 + 23 * i % (max_char - 32); if (s1[i] == (char) c) --s1[i]; } s1[len - 1] = c; for (i = len; i + align1 < page_size && i < len + 64; ++i) s1[i] = 32 + 32 * i % (max_char - 32); printf ("Length %4zd, n %4zd, char %d, alignment %2zd/%2zd:", len, n, c, align1, align2); FOR_EACH_IMPL (impl, 0) do_one_test (impl, s2, s1, c, len, n); putchar ('\n'); }
static void do_test (size_t align1, size_t align2, size_t len, size_t n, int max_char) { size_t i; CHAR *s1, *s2; /* For wcsncpy: align1 and align2 here mean alignment not in bytes, but in wchar_ts, in bytes it will equal to align * (sizeof (wchar_t)). */ align1 &= 7; if ((align1 + len) * sizeof (CHAR) >= page_size) return; align2 &= 7; if ((align2 + len) * sizeof (CHAR) >= page_size) return; s1 = (CHAR *) (buf1) + align1; s2 = (CHAR *) (buf2) + align2; for (i = 0; i < len; ++i) s1[i] = 32 + 23 * i % (max_char - 32); s1[len] = 0; for (i = len + 1; (i + align1) * sizeof (CHAR) < page_size && i < len + 64; ++i) s1[i] = 32 + 32 * i % (max_char - 32); printf ("Length %4zd, n %4zd, alignment %2zd/%2zd:", len, n, align1, align2); FOR_EACH_IMPL (impl, 0) do_one_test (impl, s2, s1, len, n); putchar ('\n'); }
static void do_test (size_t align, size_t pos, size_t len, int seek_char) { size_t i; char *result; align &= 7; if (align + len >= page_size) return; for (i = 0; i < len; ++i) { buf1[align + i] = 1 + 23 * i % 127; if (buf1[align + i] == seek_char) buf1[align + i] = seek_char + 1; } buf1[align + len] = 0; assert (pos < len); buf1[align + pos] = seek_char; buf1[align + len] = -seek_char; result = (char *) (buf1 + align + pos); if (HP_TIMING_AVAIL) printf ("Length %4zd, alignment %2zd:", pos, align); FOR_EACH_IMPL (impl, 0) do_one_test (impl, (char *) (buf1 + align), seek_char, result); if (HP_TIMING_AVAIL) putchar ('\n'); }
static void do_test (json_ctx_t *json_ctx, size_t align1, size_t align2, size_t len) { size_t i, j; char *s1, *s2; align1 &= 63; if (align1 + len >= page_size) return; align2 &= 63; if (align2 + len >= page_size) return; s1 = (char *) (buf2 + align1); s2 = (char *) (buf2 + align2); for (i = 0, j = 1; i < len; i++, j += 23) s1[i] = j; json_element_object_begin (json_ctx); json_attr_uint (json_ctx, "length", (double) len); json_attr_uint (json_ctx, "align1", (double) align1); json_attr_uint (json_ctx, "align2", (double) align2); json_array_begin (json_ctx, "timings"); FOR_EACH_IMPL (impl, 0) do_one_test (json_ctx, impl, s2, s1, len); json_array_end (json_ctx); json_element_object_end (json_ctx); }
static void do_test (size_t align1, size_t align2, size_t len, size_t n, int max_char) { size_t i; char *s1, *s2; align1 &= 7; if (align1 + len >= page_size) return; align2 &= 7; if (align2 + len >= page_size) return; s1 = (char *) (buf1 + align1); s2 = (char *) (buf2 + align2); for (i = 0; i < len; ++i) s1[i] = 32 + 23 * i % (max_char - 32); s1[len] = 0; for (i = len + 1; i + align1 < page_size && i < len + 64; ++i) s1[i] = 32 + 32 * i % (max_char - 32); if (HP_TIMING_AVAIL) printf ("Length %4zd, n %4zd, alignment %2zd/%2zd:", len, n, align1, align2); FOR_EACH_IMPL (impl, 0) do_one_test (impl, s2, s1, len, n); if (HP_TIMING_AVAIL) putchar ('\n'); }
static int do_test (void) { int mode, ret = 0; for (mode = 0; mode <= 4; mode++) ret |= do_one_test (mode); return ret; }
static void do_test (size_t align, size_t pos, size_t len) { size_t i; int c; RES_TYPE result; char *rej, *s; align &= 7; if (align + pos + 10 >= page_size || len > 240) return; rej = (char *) (buf2 + (random () & 255)); s = (char *) (buf1 + align); for (i = 0; i < len; ++i) { rej[i] = random () & 255; if (!rej[i]) rej[i] = random () & 255; if (!rej[i]) rej[i] = 1 + (random () & 127); } rej[len] = '\0'; for (c = 1; c <= 255; ++c) if (strchr (rej, c) == NULL) break; for (i = 0; i < pos; ++i) { s[i] = random () & 255; if (strchr (rej, s[i])) { s[i] = random () & 255; if (strchr (rej, s[i])) s[i] = c; } } s[pos] = rej[random () % (len + 1)]; if (s[pos]) { for (i = pos + 1; i < pos + 10; ++i) s[i] = random () & 255; s[i] = '\0'; } result = STRPBRK_RESULT (s, pos); if (HP_TIMING_AVAIL) printf ("Length %4zd, alignment %2zd, rej len %2zd:", pos, align, len); FOR_EACH_IMPL (impl, 0) do_one_test (impl, s, rej, result); if (HP_TIMING_AVAIL) putchar ('\n'); }
static int do_test (void) { struct passwd *pwd = getpwnam ("nobody"); if (pwd == NULL) { puts ("User nobody doesn't exist"); return 0; } nobody_uid = pwd->pw_uid; nobody_gid = pwd->pw_gid; if (getresuid (&prev_ruid, &prev_euid, &prev_suid) < 0) { printf ("getresuid failed: %m\n"); exit (1); } if (getresgid (&prev_rgid, &prev_egid, &prev_sgid) < 0) { printf ("getresgid failed: %m\n"); exit (1); } if (prev_ruid == nobody_uid || prev_euid == nobody_uid || prev_suid == nobody_uid) { puts ("already running as user nobody, skipping tests"); exit (0); } if (prev_rgid == nobody_gid || prev_egid == nobody_gid || prev_sgid == nobody_gid) { puts ("already running as group nobody, skipping tests"); exit (0); } if (pthread_barrier_init (&b3, NULL, 3) != 0) { puts ("barrier_init failed"); exit (1); } if (pthread_barrier_init (&b4, NULL, 4) != 0) { puts ("barrier_init failed"); exit (1); } for (unsigned long int testno = 0; testno < sizeof (setuid_tests) / sizeof (setuid_tests[0]); ++testno) do_one_test (testno); return 0; }
static void do_test (size_t align, size_t pos, size_t len) { size_t i; int c; RES_TYPE result; CHAR *rej, *s; align &= 7; if ((align + pos + 10) * sizeof (CHAR) >= page_size || len > 240) return; rej = (CHAR *) (buf2) + (random () & 255); s = (CHAR *) (buf1) + align; for (i = 0; i < len; ++i) { rej[i] = random () & BIG_CHAR; if (!rej[i]) rej[i] = random () & BIG_CHAR; if (!rej[i]) rej[i] = 1 + (random () & SMALL_CHAR); } rej[len] = '\0'; for (c = 1; c <= BIG_CHAR; ++c) if (STRCHR (rej, c) == NULL) break; for (i = 0; i < pos; ++i) { s[i] = random () & BIG_CHAR; if (STRCHR (rej, s[i])) { s[i] = random () & BIG_CHAR; if (STRCHR (rej, s[i])) s[i] = c; } } s[pos] = rej[random () % (len + 1)]; if (s[pos]) { for (i = pos + 1; i < pos + 10; ++i) s[i] = random () & BIG_CHAR; s[i] = '\0'; } result = STRPBRK_RESULT (s, pos); printf ("Length %4zd, alignment %2zd, rej len %2zd:", pos, align, len); FOR_EACH_IMPL (impl, 0) do_one_test (impl, s, rej, result); putchar ('\n'); }
int test_main (void) { json_ctx_t json_ctx; size_t i; bench_start (); json_init (&json_ctx, 2, stdout); json_attr_object_begin (&json_ctx, TEST_NAME); /* Create 2 test arrays, one with 10% zeroes, 10% negative values, 79% positive values and 1% infinity/NaN. The other contains 50% inf, 50% NaN. This relies on rand behaving correctly. */ for (i = 0; i < SIZE; i++) { int x = rand () & 255; arr1[i] = (x < 25) ? 0.0 : ((x < 50) ? -1 : 100); if (x == 255) arr1[i] = __builtin_inf (); if (x == 254) arr1[i] = __builtin_nan ("0"); arr2[i] = (x < 128) ? __builtin_inf () : __builtin_nan ("0"); } for (i = 0; i < sizeof (test_list) / sizeof (test_list[0]); i++) { json_attr_object_begin (&json_ctx, test_list[i].name); do_one_test (&json_ctx, test_list[i].fn, arr2, SIZE, "inf/nan"); json_attr_object_end (&json_ctx); } for (i = 0; i < sizeof (test_list) / sizeof (test_list[0]); i++) { json_attr_object_begin (&json_ctx, test_list[i].name); do_one_test (&json_ctx, test_list[i].fn, arr1, SIZE, "normal"); json_attr_object_end (&json_ctx); } json_attr_object_end (&json_ctx); return 0; }
/* Run the tests for regular files and wide mode files. */ static int do_test (void) { int ret = 0; char *filename; int fd = create_temp_file ("tst-ftell-append-tmp.", &filename); if (fd == -1) { printf ("create_temp_file: %m\n"); return 1; } close (fd); /* Tests for regular files. */ puts ("Regular mode:"); fputs_func = (fputs_func_t) fputs; fgets_func = (fgets_func_t) fgets; data = char_data; buf = char_buf; data_len = strlen (char_data); ret |= do_one_test (filename); /* Tests for wide files. */ puts ("Wide mode:"); if (setlocale (LC_ALL, "en_US.UTF-8") == NULL) { printf ("Cannot set en_US.UTF-8 locale.\n"); return 1; } fputs_func = (fputs_func_t) fputws; fgets_func = (fgets_func_t) fgetws; data = wide_data; buf = wide_buf; data_len = wcslen (wide_data); ret |= do_one_test (filename); return ret; }
static void do_test (json_ctx_t *json_ctx, size_t len) { json_element_object_begin (json_ctx); json_attr_uint (json_ctx, "length", (double) len); json_array_begin (json_ctx, "timings"); FOR_EACH_IMPL (impl, 0) do_one_test (json_ctx, impl, (char *) buf2, (char *) buf1, len); json_array_end (json_ctx); json_element_object_end (json_ctx); }
static void do_test (size_t align, int c, size_t len) { align &= 63; if ((align + len) * sizeof (CHAR) > page_size) return; printf ("Length %4zd, alignment %2zd, c %2d:", len, align, c); FOR_EACH_IMPL (impl, 0) do_one_test (impl, (CHAR *) (buf1) + align, c, len); putchar ('\n'); }
static void do_test (size_t align, int c, size_t len) { align &= 7; if (align + len > page_size) return; printf ("Length %4zd, alignment %2zd, c %2d:", len, align, c); FOR_EACH_IMPL (impl, 0) do_one_test (impl, (char *) buf1 + align, c, len); putchar ('\n'); }
static void do_test (const char *str, size_t len, size_t idx) { char tmpbuf[len]; memcpy (tmpbuf, buf1 + idx, len); memcpy (buf1 + idx, str, len); printf ("String %s, offset %zd:", str, idx); FOR_EACH_IMPL (impl, 0) do_one_test (impl, buf1, BUF1PAGES * page_size, str, len, buf1 + idx); memcpy (buf1 + idx, tmpbuf, len); putchar ('\n'); }
static void do_test (size_t align1, size_t align2, size_t len1, size_t len2, int fail) { char *s1 = (char *) (buf1 + align1); char *s2 = (char *) (buf2 + align2); static const char d[] = "1234567890abcxyz"; #define dl (sizeof (d) - 1) char *ss2 = s2; for (size_t l = len2; l > 0; l = l > dl ? l - dl : 0) { size_t t = l > dl ? dl : l; ss2 = mempcpy (ss2, d, t); } s2[len2] = '\0'; if (fail) { char *ss1 = s1; for (size_t l = len1; l > 0; l = l > dl ? l - dl : 0) { size_t t = l > dl ? dl : l; memcpy (ss1, d, t); ++ss1[len2 > 7 ? 7 : len2 - 1]; ss1 += t; } } else { memset (s1, '0', len1); for (size_t i = 0; i < len2; ++i) s1[len1 - len2 + i] = toupper (s2[i]); } s1[len1] = '\0'; if (HP_TIMING_AVAIL) printf ("Length %4zd/%zd, alignment %2zd/%2zd, %s:", len1, len2, align1, align2, fail ? "fail" : "found"); FOR_EACH_IMPL (impl, 0) do_one_test (impl, s1, s2, fail ? NULL : s1 + len1 - len2); if (HP_TIMING_AVAIL) putchar ('\n'); }
static void do_test (json_ctx_t *json_ctx, size_t align1, size_t align2, size_t len, int max_char, int exp_result) { size_t i; CHAR *s1, *s2; if (len == 0) return; align1 &= 63; if (align1 + (len + 1) * CHARBYTES >= page_size) return; align2 &= 63; if (align2 + (len + 1) * CHARBYTES >= page_size) return; /* Put them close to the end of page. */ i = align1 + CHARBYTES * (len + 2); s1 = (CHAR *) (buf1 + ((page_size - i) / 16 * 16) + align1); i = align2 + CHARBYTES * (len + 2); s2 = (CHAR *) (buf2 + ((page_size - i) / 16 * 16) + align2); for (i = 0; i < len; i++) s1[i] = s2[i] = 1 + (23 << ((CHARBYTES - 1) * 8)) * i % max_char; s1[len] = s2[len] = 0; s1[len + 1] = 23; s2[len + 1] = 24 + exp_result; s2[len - 1] -= exp_result; json_element_object_begin (json_ctx); json_attr_uint (json_ctx, "length", (double) len); json_attr_uint (json_ctx, "align1", (double) align1); json_attr_uint (json_ctx, "align2", (double) align2); json_array_begin (json_ctx, "timings"); FOR_EACH_IMPL (impl, 0) do_one_test (json_ctx, impl, s1, s2, exp_result); json_array_end (json_ctx); json_element_object_end (json_ctx); }
static void do_test (size_t align, size_t len) { size_t i; align &= 63; if (align + sizeof(CHAR) * len >= page_size) return; CHAR *buf = (CHAR *) (buf1); for (i = 0; i < len; ++i) buf[align + i] = 1 + 11111 * i % MAX_CHAR; buf[align + len] = 0; FOR_EACH_IMPL (impl, 0) do_one_test (impl, (CHAR *) (buf + align), len); }
static void do_test (size_t align1, size_t align2, size_t n, size_t len, int max_char, int exp_result) { size_t i; char *s1, *s2; if (len == 0) return; align1 &= 7; if (align1 + len + 1 >= page_size) return; align2 &= 7; if (align2 + len + 1 >= page_size) return; s1 = (char *) (buf1 + align1); s2 = (char *) (buf2 + align2); for (i = 0; i < len; i++) { s1[i] = toupper (1 + 23 * i % max_char); s2[i] = tolower (s1[i]); } s1[len] = s2[len] = 0; s1[len + 1] = 23; s2[len + 1] = 24 + exp_result; if ((s2[len - 1] == 'z' && exp_result == -1) || (s2[len - 1] == 'a' && exp_result == 1)) s1[len - 1] += exp_result; else s2[len - 1] -= exp_result; printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2); FOR_EACH_IMPL (impl, 0) do_one_test (impl, s1, s2, n, exp_result); putchar ('\n'); }
static void do_test (size_t align, size_t pos, size_t len, int seek_char, int max_char) /* For wcsrchr: align here means align not in bytes, but in wchar_ts, in bytes it will equal to align * (sizeof (wchar_t)) len for wcschr here isn't in bytes but it's number of wchar_t symbols. */ { size_t i; CHAR *result; CHAR *buf = (CHAR *) buf1; align &= 7; if ((align + len) * sizeof (CHAR) >= page_size) return; for (i = 0; i < len; ++i) { buf[align + i] = (random () * random ()) & max_char; if (!buf[align + i]) buf[align + i] = (random () * random ()) & max_char; if (!buf[align + i]) buf[align + i] = 1; if ((i > pos || pos >= len) && buf[align + i] == seek_char) buf[align + i] = seek_char + 10 + (random () & 15); } buf[align + len] = 0; if (pos < len) { buf[align + pos] = seek_char; result = (CHAR *) (buf + align + pos); } else if (seek_char == 0) result = (CHAR *) (buf + align + len); else result = NULL; printf ("Length %4zd, alignment in bytes %2zd:", len, align * sizeof (CHAR)); FOR_EACH_IMPL (impl, 0) do_one_test (impl, (CHAR *) (buf + align), seek_char, result); putchar ('\n'); }
static void do_test (size_t align1, size_t align2, size_t len, size_t n, int max_char, int exp_result) { size_t i; char *s1, *s2; if (n == 0) return; align1 &= 7; if (align1 + n + 1 >= page_size) return; align2 &= 7; if (align2 + n + 1 >= page_size) return; s1 = (char*)(buf1 + align1); s2 = (char*)(buf2 + align2); for (i = 0; i < n; i++) s1[i] = s2[i] = 1 + 23 * i % max_char; s1[n] = 24 + exp_result; s2[n] = 23; s1[len] = 0; s2[len] = 0; if (exp_result < 0) s2[len] = 32; else if (exp_result > 0) s1[len] = 64; if (len >= n) s2[n - 1] -= exp_result; printf ("Length %d/%d, alignment %d/%d:", len, n, align1, align2); FOR_EACH_IMPL (impl, 0) do_one_test (impl, (char*)s1, (char*)s2, n, exp_result); putchar ('\n'); }
static void do_test (size_t align, size_t pos, size_t len) { size_t i; CHAR *acc, *s; align &= 7; if ((align + pos + 10) * sizeof (CHAR) >= page_size || len > 240 || ! len) return; acc = (CHAR *) (buf2) + (random () & 255); s = (CHAR *) (buf1) + align; for (i = 0; i < len; ++i) { acc[i] = random () & BIG_CHAR; if (!acc[i]) acc[i] = random () & BIG_CHAR; if (!acc[i]) acc[i] = 1 + (random () & SMALL_CHAR); } acc[len] = '\0'; for (i = 0; i < pos; ++i) s[i] = acc[random () % len]; s[pos] = random () & BIG_CHAR; if (STRCHR (acc, s[pos])) s[pos] = '\0'; else { for (i = pos + 1; i < pos + 10; ++i) s[i] = random () & BIG_CHAR; s[i] = '\0'; } printf ("Length %4zd, alignment %2zd, acc len %2zd:", pos, align, len); FOR_EACH_IMPL (impl, 0) do_one_test (impl, s, acc, pos); putchar ('\n'); }
static void do_test (size_t align, size_t pos, size_t len) { size_t i; char *acc, *s; align &= 7; if (align + pos + 10 >= page_size || len > 240 || ! len) return; acc = (char *) (buf2 + (random () & 255)); s = (char *) (buf1 + align); for (i = 0; i < len; ++i) { acc[i] = random () & 255; if (!acc[i]) acc[i] = random () & 255; if (!acc[i]) acc[i] = 1 + (random () & 127); } acc[len] = '\0'; for (i = 0; i < pos; ++i) s[i] = acc[random () % len]; s[pos] = random () & 255; if (strchr (acc, s[pos])) s[pos] = '\0'; else { for (i = pos + 1; i < pos + 10; ++i) s[i] = random () & 255; s[i] = '\0'; } printf ("Length %4zd, alignment %2zd, acc len %2zd:", pos, align, len); FOR_EACH_IMPL (impl, 0) do_one_test (impl, s, acc, pos); putchar ('\n'); }