Subversion Repositories planix.SVN

Rev

Rev 2 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include "os.h"
2
#include <mp.h>
3
#include "dat.h"
4
 
5
#define VLDIGITS (sizeof(vlong)/sizeof(mpdigit))
6
 
7
/*
8
 *  this code assumes that a vlong is an integral number of
9
 *  mpdigits long.
10
 */
11
mpint*
12
vtomp(vlong v, mpint *b)
13
{
14
	int s;
15
	uvlong uv;
16
 
17
	if(b == nil)
18
		b = mpnew(VLDIGITS*sizeof(mpdigit));
19
	else
20
		mpbits(b, VLDIGITS*sizeof(mpdigit));
21
	mpassign(mpzero, b);
22
	if(v == 0)
23
		return b;
24
	if(v < 0){
25
		b->sign = -1;
26
		uv = -v;
27
	} else
28
		uv = v;
29
	for(s = 0; s < VLDIGITS && uv != 0; s++){
30
		b->p[s] = uv;
31
		uv >>= sizeof(mpdigit)*8;
32
	}
33
	b->top = s;
34
	return b;
35
}
36
 
37
vlong
38
mptov(mpint *b)
39
{
40
	uvlong v;
41
	int s;
42
 
43
	if(b->top == 0)
44
		return 0LL;
45
 
46
	mpnorm(b);
47
	if(b->top > VLDIGITS){
48
		if(b->sign > 0)
49
			return (vlong)MAXVLONG;
50
		else
51
			return (vlong)MINVLONG;
52
	}
53
 
54
	v = 0ULL;
55
	for(s = 0; s < b->top; s++)
56
		v |= b->p[s]<<(s*sizeof(mpdigit)*8);
57
 
58
	if(b->sign > 0){
59
		if(v > MAXVLONG)
60
			v = MAXVLONG;
61
	} else {
62
		if(v > MINVLONG)
63
			v = MINVLONG;
64
		else
65
			v = -(vlong)v;
66
	}
67
 
68
	return (vlong)v;
69
}