MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

reduce nesting

+27 -28
+27 -28
src/modules/bigint.c
··· 47 47 return copy; 48 48 } 49 49 50 + static bool grow_u32_buffer(uint32_t **buf, size_t *cap) { 51 + if (!buf || !*buf || !cap || *cap == 0 || *cap > SIZE_MAX / 2) return false; 52 + size_t new_cap = *cap * 2; 53 + uint32_t *grown = (uint32_t *)realloc(*buf, new_cap * sizeof(uint32_t)); 54 + if (!grown) return false; 55 + memset(grown + *cap, 0, (new_cap - *cap) * sizeof(uint32_t)); 56 + *buf = grown; 57 + *cap = new_cap; 58 + return true; 59 + } 60 + 61 + static bool append_carry_limbs(uint32_t **limbs, size_t *count, size_t *cap, uint64_t carry) { 62 + while (carry != 0) { 63 + if (*count == *cap && !grow_u32_buffer(limbs, cap)) return false; 64 + (*limbs)[(*count)++] = (uint32_t)carry; 65 + carry >>= 32; 66 + } 67 + return true; 68 + } 69 + 50 70 static void bigint_normalize_limbs(uint32_t *limbs, size_t *count) { 51 71 while (*count > 1 && limbs[*count - 1] == 0) (*count)--; 52 72 } ··· 802 822 carry = cur >> 32; 803 823 } 804 824 805 - if (carry != 0) { 806 - while (carry != 0) { 807 - if (count == cap) { 808 - size_t new_cap = cap * 2; 809 - uint32_t *new_limbs = (uint32_t *)realloc(limbs, new_cap * sizeof(uint32_t)); 810 - if (!new_limbs) { 811 - free(limbs); 812 - return js_mkerr(js, "oom"); 813 - } 814 - 815 - memset(new_limbs + cap, 0, (new_cap - cap) * sizeof(uint32_t)); 816 - limbs = new_limbs; 817 - cap = new_cap; 818 - } 819 - 820 - limbs[count++] = (uint32_t)carry; 821 - carry >>= 32; 822 - } 825 + if (carry != 0 && !append_carry_limbs(&limbs, &count, &cap, carry)) { 826 + free(limbs); 827 + return js_mkerr(js, "oom"); 823 828 } 824 829 } 825 830 ··· 870 875 size_t groups_len = 0; 871 876 872 877 while (!(tmp_count == 1 && tmp[0] == 0)) { 873 - if (groups_len == groups_cap) { 874 - size_t new_cap = groups_cap * 2; 875 - uint32_t *new_groups = (uint32_t *)realloc(groups, new_cap * sizeof(uint32_t)); 876 - if (!new_groups) { 877 - free(tmp); 878 - free(groups); 879 - return NULL; 880 - } 881 - groups = new_groups; 882 - groups_cap = new_cap; 878 + if (groups_len == groups_cap && !grow_u32_buffer(&groups, &groups_cap)) { 879 + free(tmp); 880 + free(groups); 881 + return NULL; 883 882 } 884 883 885 884 uint32_t rem = bigint_div_small_inplace(tmp, tmp_count, BIGINT_DEC_GROUP_BASE);