X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/70b904c575877c683e6c79cac4fbf7c6d89d0bde..45c0fd363937c6e9b05da04a9167e9912c05ca0c:/mpint.h diff --git a/mpint.h b/mpint.h index 733292b..dbf9065 100644 --- a/mpint.h +++ b/mpint.h @@ -1,13 +1,13 @@ /* -*-c-*- * - * $Id: mpint.h,v 1.1 1999/11/25 11:38:31 mdw Exp $ + * $Id$ * * Conversion between MPs and standard C integers * * (c) 1999 Straylight/Edgeware */ -/*----- Licensing notice --------------------------------------------------* +/*----- Licensing notice --------------------------------------------------* * * This file is part of Catacomb. * @@ -15,28 +15,20 @@ * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. - * + * * Catacomb is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. - * + * * You should have received a copy of the GNU Library General Public * License along with Catacomb; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. */ -/*----- Revision history --------------------------------------------------* - * - * $Log: mpint.h,v $ - * Revision 1.1 1999/11/25 11:38:31 mdw - * Support for conversions between MPs and C integers. - * - */ - -#ifndef MPINT_H -#define MPINT_H +#ifndef CATACOMB_MPINT_H +#define CATACOMB_MPINT_H #ifdef __cplusplus extern "C" { @@ -46,7 +38,7 @@ #include -#ifndef MP_H +#ifndef CATACOMB_MP_H # include "mp.h" #endif @@ -68,45 +60,36 @@ mp *_d = (d); \ size_t _sz = 4; \ \ - MP_MODIFY(_d, _sz); \ + MP_DEST(_d, _sz, 0); \ _d->f &= ~(MP_NEG | MP_UNDEF); \ \ - /* --- Set the sign on the MP --- * \ - * \ - * If the input integer is *not* negative, then negate it. This \ - * fixes a problem with two's complement machines where the most \ - * negative value actually has larger magnitude than the most \ - * positive, and hence -TYPE_MIN == TYPE_MIN but TYPE_MIN != 0. If \ - * all the work is carried out on negative numbers there isn't a \ - * problem. \ - */ \ - \ - if (_i >= 0) \ - _i = -_i; \ - else \ + if (_i >= 0) { \ + while (_i) { \ + if (_o == _sz) { \ + _sz <<= 1; \ + MP_ENSURE(_d, _sz); \ + } \ + _d->v[_o++] = MPW(_i); \ + if (_i <= MPW_MAX) \ + break; \ + else \ + _i /= (type)MPW_MAX + 1; \ + } \ + } else { \ _d->f |= MP_NEG; \ - \ - while (_i) { \ - if (_o == _sz) { \ - _sz <<= 1; \ - MP_ENSURE(_d, _sz); \ + while (_i) { \ + if (_o == _sz) { \ + _sz <<= 1; \ + MP_ENSURE(_d, _sz); \ + } \ + _d->v[_o++] = MPW(-_i); \ + if (_i >= -MPW_MAX) \ + break; \ + else \ + _i /= (type)MPW_MAX + 1; \ } \ - _d->v[_o++] = MPW(-_i); \ - \ - /* --- More subtlety --- * \ - * \ - * Ideally, I'd like to just shift @i@ right by @MPW_BITS@. But I \ - * can't, because that might be more than I'm allowed. I can't \ - * divide by @MPW_MAX + 1@ because that might turn out to be zero \ - * in my current type, and besides which it's unsigned which messes \ - * up all of my negative arithmetic. So do an explicit test here. \ - */ \ - \ - if (_i > -MPW_MAX) \ - break; \ - else \ - _i /= (type)MPW_MAX + 1; \ } \ + \ _d->vl = _d->v + _o; \ (d) = _d; \ } while (0) @@ -144,7 +127,7 @@ _v++; \ _max /= (mpd)MPW_MAX + 1; \ } \ - if (!(_m->f & MP_NEG)) \ + if (!MP_NEGP(_m)) \ _i = -_i; \ (i) = _i; \ } while (0) @@ -168,6 +151,7 @@ mp_fromINT(short, short); mp_fromINT(ushort, unsigned short); mp_fromINT(int, int); mp_fromINT(uint, unsigned); +mp_fromINT(uint32, uint32); mp_fromINT(long, long); mp_fromINT(ulong, unsigned long); @@ -187,12 +171,13 @@ mp_fromINT(ulong, unsigned long); */ #define mp_toINT(name, type) \ - extern type mp_to##name(const mp */*m*/); + extern type mp_to##name(const mp */*m*/) mp_toINT(short, short); mp_toINT(ushort, unsigned short); mp_toINT(int, int); mp_toINT(uint, unsigned); +mp_toINT(uint32, uint32); mp_toINT(long, long); mp_toINT(ulong, unsigned long);