/* -*-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.
*
* 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" {
#include <limits.h>
-#ifndef MP_H
+#ifndef CATACOMB_MP_H
# include "mp.h"
#endif
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)
_v++; \
_max /= (mpd)MPW_MAX + 1; \
} \
- if (!(_m->f & MP_NEG)) \
+ if (!MP_NEGP(_m)) \
_i = -_i; \
(i) = _i; \
} while (0)
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);
*/
#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);