Annotation of OpenXM/src/kan96xx/plugin/cmo-gmp.c, Revision 1.1
1.1 ! maekawa 1: #include <stdio.h>
! 2: #include <string.h>
! 3: #include <netinet/in.h>
! 4: #include "datatype.h"
! 5: #include "stackm.h"
! 6: #include "extern.h"
! 7: #include "extern2.h"
! 8: #include "mathcap.h"
! 9: #include "kclass.h"
! 10:
! 11: #include "gmp.h"
! 12: #include "gmp-impl.h"
! 13:
! 14: #include "file2.h"
! 15: #include "cmo.h"
! 16:
! 17: extern int OxVersion;
! 18: size_t cmoOutGMPCoeff_old(mpz_srcptr x);
! 19: size_t cmoOutGMPCoeff_new(mpz_srcptr x);
! 20: size_t
! 21: cmoOutGMPCoeff(mpz_srcptr x) {
! 22: if (OxVersion >= 199907170)
! 23: return(cmoOutGMPCoeff_new(x));
! 24: else
! 25: return(cmoOutGMPCoeff_old(x));
! 26: }
! 27:
! 28: cmoGetGMPCoeff(MP_INT *x, struct cmoBuffer *cb) {
! 29: if (OxVersion >= 199907170)
! 30: return(cmoGetGMPCoeff_new(x,cb));
! 31: else
! 32: return(cmoGetGMPCoeff_old(x,cb));
! 33: }
! 34:
! 35:
! 36: /* From gmp/mpz/out_raw.c and inp_raw.c */
! 37:
! 38: /* mpz_out_raw -- Output a mpz_t in binary. Use an endianess and word size
! 39: independent format.
! 40:
! 41: Copyright (C) 1995 Free Software Foundation, Inc.
! 42:
! 43: This file is part of the GNU MP Library.
! 44:
! 45: The GNU MP Library is free software; you can redistribute it and/or modify
! 46: it under the terms of the GNU Library General Public License as published by
! 47: the Free Software Foundation; either version 2 of the License, or (at your
! 48: option) any later version.
! 49:
! 50: The GNU MP Library is distributed in the hope that it will be useful, but
! 51: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 52: or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
! 53: License for more details.
! 54:
! 55: You should have received a copy of the GNU Library General Public License
! 56: along with the GNU MP Library; see the file COPYING.LIB. If not, write to
! 57: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
! 58: MA 02111-1307, USA. */
! 59:
! 60: static int myfputc(int i) {
! 61: char tmp[1];
! 62: tmp[0] = i;
! 63: cmoOutputToBuf(CMOPUT,tmp,1);
! 64: }
! 65: static outRawInt32(int k)
! 66: {
! 67: int tmp[1];
! 68: tmp[0] = htonl((int) k);
! 69: cmoOutputToBuf(CMOPUT,tmp,4);
! 70: }
! 71:
! 72: size_t
! 73: cmoOutGMPCoeff_old(mpz_srcptr x)
! 74: {
! 75: int i;
! 76: mp_size_t s;
! 77: mp_size_t xsize = ABS (x->_mp_size);
! 78: mp_srcptr xp = x->_mp_d;
! 79: mp_size_t out_bytesize;
! 80: mp_limb_t hi_limb;
! 81: int n_bytes_in_hi_limb;
! 82: cmoint tmp[1];
! 83: tmp[0] = htonl(CMO_ZZ_OLD);
! 84: cmoOutputToBuf(CMOPUT,tmp,sizeof(cmoint));
! 85:
! 86: if (xsize == 0)
! 87: {
! 88: for (i = 4 - 1; i >= 0; i--)
! 89: myfputc (0);
! 90: return 4;
! 91: }
! 92:
! 93: hi_limb = xp[xsize - 1];
! 94: for (i = BYTES_PER_MP_LIMB - 1; i > 0; i--)
! 95: {
! 96: if ((hi_limb >> i * BITS_PER_CHAR) != 0)
! 97: break;
! 98: }
! 99: n_bytes_in_hi_limb = i + 1;
! 100: out_bytesize = BYTES_PER_MP_LIMB * (xsize - 1) + n_bytes_in_hi_limb;
! 101: if (x->_mp_size < 0)
! 102: out_bytesize = -out_bytesize;
! 103:
! 104: /* Make the size 4 bytes on all machines, to make the format portable. */
! 105: for (i = 4 - 1; i >= 0; i--)
! 106: myfputc ((out_bytesize >> (i * BITS_PER_CHAR)) % (1 << BITS_PER_CHAR));
! 107:
! 108: /* Output from the most significant limb to the least significant limb,
! 109: with each limb also output in decreasing significance order. */
! 110:
! 111: /* Output the most significant limb separately, since we will only
! 112: output some of its bytes. */
! 113: for (i = n_bytes_in_hi_limb - 1; i >= 0; i--)
! 114: myfputc ((hi_limb >> (i * BITS_PER_CHAR)) % (1 << BITS_PER_CHAR));
! 115:
! 116: /* Output the remaining limbs. */
! 117: for (s = xsize - 2; s >= 0; s--)
! 118: {
! 119: mp_limb_t x_limb;
! 120:
! 121: x_limb = xp[s];
! 122: for (i = BYTES_PER_MP_LIMB - 1; i >= 0; i--)
! 123: myfputc ((x_limb >> (i * BITS_PER_CHAR)) % (1 << BITS_PER_CHAR));
! 124: }
! 125: return ( ABS (out_bytesize) + 4);
! 126: }
! 127:
! 128:
! 129: /* mpz_inp_raw -- Input a mpz_t in raw, but endianess, and wordsize
! 130: independent format (as output by mpz_out_raw).
! 131:
! 132: Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc.
! 133:
! 134: This file is part of the GNU MP Library.
! 135:
! 136: The GNU MP Library is free software; you can redistribute it and/or modify
! 137: it under the terms of the GNU Library General Public License as published by
! 138: the Free Software Foundation; either version 2 of the License, or (at your
! 139: option) any later version.
! 140:
! 141: The GNU MP Library is distributed in the hope that it will be useful, but
! 142: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 143: or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
! 144: License for more details.
! 145:
! 146: You should have received a copy of the GNU Library General Public License
! 147: along with the GNU MP Library; see the file COPYING.LIB. If not, write to
! 148: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
! 149: MA 02111-1307, USA. */
! 150:
! 151:
! 152: static int myfgetc(struct cmoBuffer *cb)
! 153: {
! 154: int k;
! 155: if (cb->isStream) {
! 156: k = fp2fgetc(cb->fp);
! 157: }else{
! 158: k = ((unsigned char *)(cb->buf))[cb->rpos];
! 159: cb->rpos++;
! 160: if (cb->rpos > cb->pos) {
! 161: cb->rpos--;
! 162: errorCmo(" cmo-gmp.c : myfgetc(): no data in the buffer.");
! 163: }
! 164: return(k);
! 165: }
! 166: }
! 167: static int getRawInt32(struct cmoBuffer *cb)
! 168: {
! 169: char d[4];
! 170: int i;
! 171: for (i=0; i<4; i++) {
! 172: d[i] = myfgetc(cb);
! 173: }
! 174: return(ntohl(* ( (int *)d)));
! 175: }
! 176:
! 177: cmoGetGMPCoeff_old(MP_INT *x, struct cmoBuffer *cb)
! 178: {
! 179: int i;
! 180: mp_size_t s;
! 181: mp_size_t xsize;
! 182: mp_ptr xp;
! 183: unsigned int c;
! 184: mp_limb_t x_limb;
! 185: mp_size_t in_bytesize;
! 186: int neg_flag;
! 187:
! 188: /* Read 4-byte size */
! 189: in_bytesize = 0;
! 190: for (i = 4 - 1; i >= 0; i--)
! 191: {
! 192: c = myfgetc (cb);
! 193: in_bytesize = (in_bytesize << BITS_PER_CHAR) | c;
! 194: }
! 195:
! 196: /* Size is stored as a 32 bit word; sign extend in_bytesize for non-32 bit
! 197: machines. */
! 198: if (sizeof (mp_size_t) > 4)
! 199: in_bytesize |= (-(in_bytesize < 0)) << 31;
! 200:
! 201: neg_flag = in_bytesize < 0;
! 202: in_bytesize = ABS (in_bytesize);
! 203: xsize = (in_bytesize + BYTES_PER_MP_LIMB - 1) / BYTES_PER_MP_LIMB;
! 204:
! 205: if (xsize == 0)
! 206: {
! 207: x->_mp_size = 0;
! 208: return 4; /* we've read 4 bytes */
! 209: }
! 210:
! 211: if (x->_mp_alloc < xsize)
! 212: _mpz_realloc (x, xsize);
! 213: xp = x->_mp_d;
! 214:
! 215: x_limb = 0;
! 216: for (i = (in_bytesize - 1) % BYTES_PER_MP_LIMB; i >= 0; i--)
! 217: {
! 218: c = myfgetc (cb);
! 219: x_limb = (x_limb << BITS_PER_CHAR) | c;
! 220: }
! 221: xp[xsize - 1] = x_limb;
! 222:
! 223: for (s = xsize - 2; s >= 0; s--)
! 224: {
! 225: x_limb = 0;
! 226: for (i = BYTES_PER_MP_LIMB - 1; i >= 0; i--)
! 227: {
! 228: c = myfgetc (cb);
! 229: x_limb = (x_limb << BITS_PER_CHAR) | c;
! 230: }
! 231: xp[s] = x_limb;
! 232: }
! 233:
! 234: if (c == EOF)
! 235: return 0; /* error */
! 236:
! 237: MPN_NORMALIZE (xp, xsize);
! 238: x->_mp_size = neg_flag ? -xsize : xsize;
! 239: return in_bytesize + 4;
! 240: }
! 241:
! 242: /*****************************************************/
! 243: /***** new version for CMO_ZZ *********************/
! 244: /*****************************************************/
! 245: size_t
! 246: cmoOutGMPCoeff_new(mpz_srcptr x)
! 247: {
! 248: int i;
! 249: mp_size_t s;
! 250: mp_size_t xsize = ABS (x->_mp_size);
! 251: mp_srcptr xp = x->_mp_d;
! 252: mp_size_t out_bytesize;
! 253: mp_limb_t hi_limb;
! 254: int n_bytes_in_hi_limb;
! 255: cmoint tmp[1];
! 256: tmp[0] = htonl(CMO_ZZ);
! 257: cmoOutputToBuf(CMOPUT,tmp,sizeof(cmoint));
! 258:
! 259: if (BYTES_PER_MP_LIMB != 4) {
! 260: fprintf(stderr,"BYTES_PER_MP_LIMB = %d\n",BYTES_PER_MP_LIMB);
! 261: fprintf(stderr,"cmo-gmp.c does not work on this CPU.\n");
! 262: fprintf(stderr,"Read the GMP source code and rewrite cmo-gmp.c.\n");
! 263: exit(10);
! 264: }
! 265: if (BITS_PER_CHAR != 8) {
! 266: fprintf(stderr,"BITS_PER_CHAR = %d\n",BITS_PER_CHAR);
! 267: fprintf(stderr,"cmo-gmp.c does not work on this CPU.\n");
! 268: fprintf(stderr,"Read the GMP source code and rewrite cmo-gmp.c.\n");
! 269: exit(10);
! 270: }
! 271:
! 272: if (xsize == 0)
! 273: {
! 274: outRawInt32(0);
! 275: return 1;
! 276: }
! 277:
! 278: if (x->_mp_size >= 0)
! 279: outRawInt32(xsize);
! 280: else
! 281: outRawInt32(-xsize);
! 282:
! 283:
! 284: /* Output from the least significant limb to the most significant limb */
! 285: /* We assume that the size of limb is 4. */
! 286:
! 287: for (s = 0; s < xsize; s++)
! 288: {
! 289: outRawInt32((int) xp[s]);
! 290: }
! 291: return ( ABS (xsize) );
! 292: }
! 293:
! 294: cmoGetGMPCoeff_new(MP_INT *x, struct cmoBuffer *cb)
! 295: {
! 296: int i;
! 297: mp_size_t s;
! 298: mp_size_t xsize;
! 299: mp_ptr xp;
! 300: unsigned int c;
! 301: mp_limb_t x_limb;
! 302: mp_size_t in_bytesize;
! 303: int neg_flag;
! 304:
! 305: if (BYTES_PER_MP_LIMB != 4) {
! 306: fprintf(stderr,"BYTES_PER_MP_LIMB = %d\n",BYTES_PER_MP_LIMB);
! 307: fprintf(stderr,"cmo-gmp.c does not work on this CPU.\n");
! 308: fprintf(stderr,"Read the GMP source code and rewrite cmo-gmp.c.\n");
! 309: exit(10);
! 310: }
! 311: if (BITS_PER_CHAR != 8) {
! 312: fprintf(stderr,"BITS_PER_CHAR = %d\n",BITS_PER_CHAR);
! 313: fprintf(stderr,"cmo-gmp.c does not work on this CPU.\n");
! 314: fprintf(stderr,"Read the GMP source code and rewrite cmo-gmp.c.\n");
! 315: exit(10);
! 316: }
! 317:
! 318: /* Read 4-byte size */
! 319:
! 320: xsize = getRawInt32(cb);
! 321: neg_flag = xsize < 0;
! 322: xsize = ABS(xsize);
! 323:
! 324: if (xsize == 0)
! 325: {
! 326: x->_mp_size = 0;
! 327: return 1; /* we've read 4 bytes */
! 328: }
! 329:
! 330: if (x->_mp_alloc < xsize)
! 331: _mpz_realloc (x, xsize);
! 332: xp = x->_mp_d;
! 333:
! 334: for (i=0; i<xsize; i++) {
! 335: xp[i] = getRawInt32(cb);
! 336: }
! 337:
! 338: MPN_NORMALIZE (xp, xsize);
! 339: x->_mp_size = neg_flag ? -xsize : xsize;
! 340: return( xsize );
! 341: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>