* This function initializes the internal state array, * with an array of 32-bit integers used as the seeds * @param init_key the array of 32-bit integers, used as a seed. * @param key_length the length of init_key. */
| 636 | * @param key_length the length of init_key. |
| 637 | */ |
| 638 | sfmt_t *init_by_array(uint32_t *init_key, int key_length) { |
| 639 | void *p; |
| 640 | sfmt_t *ctx; |
| 641 | int i, j, count; |
| 642 | uint32_t r; |
| 643 | int lag; |
| 644 | int mid; |
| 645 | int size = N * 4; |
| 646 | uint32_t *psfmt32; |
| 647 | |
| 648 | if (posix_memalign(&p, sizeof(w128_t), sizeof(sfmt_t)) != 0) { |
| 649 | return NULL; |
| 650 | } |
| 651 | ctx = (sfmt_t *)p; |
| 652 | psfmt32 = &ctx->sfmt[0].u[0]; |
| 653 | |
| 654 | if (size >= 623) { |
| 655 | lag = 11; |
| 656 | } else if (size >= 68) { |
| 657 | lag = 7; |
| 658 | } else if (size >= 39) { |
| 659 | lag = 5; |
| 660 | } else { |
| 661 | lag = 3; |
| 662 | } |
| 663 | mid = (size - lag) / 2; |
| 664 | |
| 665 | memset(ctx->sfmt, 0x8b, sizeof(ctx->sfmt)); |
| 666 | if (key_length + 1 > N32) { |
| 667 | count = key_length + 1; |
| 668 | } else { |
| 669 | count = N32; |
| 670 | } |
| 671 | r = func1(psfmt32[idxof(0)] ^ psfmt32[idxof(mid)] |
| 672 | ^ psfmt32[idxof(N32 - 1)]); |
| 673 | psfmt32[idxof(mid)] += r; |
| 674 | r += key_length; |
| 675 | psfmt32[idxof(mid + lag)] += r; |
| 676 | psfmt32[idxof(0)] = r; |
| 677 | |
| 678 | count--; |
| 679 | for (i = 1, j = 0; (j < count) && (j < key_length); j++) { |
| 680 | r = func1(psfmt32[idxof(i)] ^ psfmt32[idxof((i + mid) % N32)] |
| 681 | ^ psfmt32[idxof((i + N32 - 1) % N32)]); |
| 682 | psfmt32[idxof((i + mid) % N32)] += r; |
| 683 | r += init_key[j] + i; |
| 684 | psfmt32[idxof((i + mid + lag) % N32)] += r; |
| 685 | psfmt32[idxof(i)] = r; |
| 686 | i = (i + 1) % N32; |
| 687 | } |
| 688 | for (; j < count; j++) { |
| 689 | r = func1(psfmt32[idxof(i)] ^ psfmt32[idxof((i + mid) % N32)] |
| 690 | ^ psfmt32[idxof((i + N32 - 1) % N32)]); |
| 691 | psfmt32[idxof((i + mid) % N32)] += r; |
| 692 | r += i; |
| 693 | psfmt32[idxof((i + mid + lag) % N32)] += r; |
| 694 | psfmt32[idxof(i)] = r; |
| 695 | i = (i + 1) % N32; |
no test coverage detected