50 lines
		
	
	
		
			727 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			727 B
		
	
	
	
		
			C
		
	
	
	
	
	
#include "os.h"
 | 
						|
#include <mp.h>
 | 
						|
#include "dat.h"
 | 
						|
 | 
						|
#define VLDIGITS (sizeof(vlong)/sizeof(mpdigit))
 | 
						|
 | 
						|
/*
 | 
						|
 *  this code assumes that a vlong is an integral number of
 | 
						|
 *  mpdigits long.
 | 
						|
 */
 | 
						|
mpint*
 | 
						|
uvtomp(uvlong v, mpint *b)
 | 
						|
{
 | 
						|
	int s;
 | 
						|
 | 
						|
	if(b == nil)
 | 
						|
		b = mpnew(VLDIGITS*sizeof(mpdigit));
 | 
						|
	else
 | 
						|
		mpbits(b, VLDIGITS*sizeof(mpdigit));
 | 
						|
	mpassign(mpzero, b);
 | 
						|
	if(v == 0)
 | 
						|
		return b;
 | 
						|
	for(s = 0; s < VLDIGITS && v != 0; s++){
 | 
						|
		b->p[s] = v;
 | 
						|
		v >>= sizeof(mpdigit)*8;
 | 
						|
	}
 | 
						|
	b->top = s;
 | 
						|
	return b;
 | 
						|
}
 | 
						|
 | 
						|
uvlong
 | 
						|
mptouv(mpint *b)
 | 
						|
{
 | 
						|
	uvlong v;
 | 
						|
	int s;
 | 
						|
 | 
						|
	if(b->top == 0)
 | 
						|
		return (vlong) 0;
 | 
						|
 | 
						|
	mpnorm(b);
 | 
						|
	if(b->top > VLDIGITS)
 | 
						|
		return MAXVLONG;
 | 
						|
 | 
						|
	v = (uvlong) 0;
 | 
						|
	for(s = 0; s < b->top; s++)
 | 
						|
		v |= b->p[s]<<(s*sizeof(mpdigit)*8);
 | 
						|
 | 
						|
	return v;
 | 
						|
}
 |