| 1019 | #define P5A_MAX (sizeof(p5_a)/sizeof(*p5_a) - 1) |
| 1020 | |
| 1021 | static Bigint *pow5mult(Bigint *b, int k, Stack_alloc *alloc) |
| 1022 | { |
| 1023 | Bigint *b1, *p5, *p51=NULL; |
| 1024 | int i; |
| 1025 | static int p05[3]= { 5, 25, 125 }; |
| 1026 | my_bool overflow= FALSE; |
| 1027 | |
| 1028 | if ((i= k & 3)) |
| 1029 | b= multadd(b, p05[i-1], 0, alloc); |
| 1030 | |
| 1031 | if (!(k>>= 2)) |
| 1032 | return b; |
| 1033 | p5= p5_a; |
| 1034 | for (;;) |
| 1035 | { |
| 1036 | if (k & 1) |
| 1037 | { |
| 1038 | b1= mult(b, p5, alloc); |
| 1039 | Bfree(b, alloc); |
| 1040 | b= b1; |
| 1041 | } |
| 1042 | if (!(k>>= 1)) |
| 1043 | break; |
| 1044 | /* Calculate next power of 5 */ |
| 1045 | if (overflow) |
| 1046 | { |
| 1047 | p51= mult(p5, p5, alloc); |
| 1048 | Bfree(p5, alloc); |
| 1049 | p5= p51; |
| 1050 | } |
| 1051 | else if (p5 < p5_a + P5A_MAX) |
| 1052 | ++p5; |
| 1053 | else if (p5 == p5_a + P5A_MAX) |
| 1054 | { |
| 1055 | p5= mult(p5, p5, alloc); |
| 1056 | overflow= TRUE; |
| 1057 | } |
| 1058 | } |
| 1059 | if (p51) |
| 1060 | Bfree(p51, alloc); |
| 1061 | return b; |
| 1062 | } |
| 1063 | |
| 1064 | |
| 1065 | static Bigint *lshift(Bigint *b, int k, Stack_alloc *alloc) |
no test coverage detected