mptouv.c 723 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #include "os.h"
  2. #include <mp.h>
  3. #include "dat.h"
  4. #define VLDIGITS (sizeof(vlong)/sizeof(mpdigit))
  5. /*
  6. * this code assumes that a vlong is an integral number of
  7. * mpdigits long.
  8. */
  9. mpint*
  10. uvtomp(uvlong v, mpint *b)
  11. {
  12. int s;
  13. if(b == nil)
  14. b = mpnew(VLDIGITS*sizeof(mpdigit));
  15. else
  16. mpbits(b, VLDIGITS*sizeof(mpdigit));
  17. mpassign(mpzero, b);
  18. if(v == 0)
  19. return b;
  20. for(s = 0; s < VLDIGITS && v != 0; s++){
  21. b->p[s] = v;
  22. v >>= sizeof(mpdigit)*8;
  23. }
  24. b->top = s;
  25. return b;
  26. }
  27. uvlong
  28. mptouv(mpint *b)
  29. {
  30. uvlong v;
  31. int s;
  32. if(b->top == 0)
  33. return 0LL;
  34. mpnorm(b);
  35. if(b->top > VLDIGITS)
  36. return MAXVLONG;
  37. v = 0ULL;
  38. for(s = 0; s < b->top; s++)
  39. v |= (uvlong)b->p[s]<<(s*sizeof(mpdigit)*8);
  40. return v;
  41. }