summaryrefslogtreecommitdiff
path: root/libmp/port/betomp.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmp/port/betomp.c')
-rw-r--r--libmp/port/betomp.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/libmp/port/betomp.c b/libmp/port/betomp.c
new file mode 100644
index 00000000..95935fcd
--- /dev/null
+++ b/libmp/port/betomp.c
@@ -0,0 +1,40 @@
+#include "os.h"
+#include <mp.h>
+#include "dat.h"
+
+// convert a big-endian byte array (most significant byte first) to an mpint
+mpint*
+betomp(uchar *p, uint n, mpint *b)
+{
+ int m, s;
+ mpdigit x;
+
+ if(b == nil)
+ b = mpnew(0);
+
+ // dump leading zeros
+ while(*p == 0 && n > 1){
+ p++;
+ n--;
+ }
+
+ // get the space
+ mpbits(b, n*8);
+ b->top = DIGITS(n*8);
+ m = b->top-1;
+
+ // first digit might not be Dbytes long
+ s = ((n-1)*8)%Dbits;
+ x = 0;
+ for(; n > 0; n--){
+ x |= ((mpdigit)(*p++)) << s;
+ s -= 8;
+ if(s < 0){
+ b->p[m--] = x;
+ s = Dbits-8;
+ x = 0;
+ }
+ }
+
+ return b;
+}